@alfadocs/ui-kit-debug 1.50.1 → 1.51.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-DMittsR3.js → actions-cell-renderer-DBI33cMp.js} +4 -4
- package/dist/_chunks/{actions-cell-renderer-DMittsR3.js.map → actions-cell-renderer-DBI33cMp.js.map} +1 -1
- package/dist/_chunks/{agenda-tray-BhZASyJm.js → agenda-tray-CGhEEnFE.js} +3 -3
- package/dist/_chunks/{agenda-tray-BhZASyJm.js.map → agenda-tray-CGhEEnFE.js.map} +1 -1
- package/dist/_chunks/{ai-credits-notice-C-kz_RrY.js → ai-credits-notice-C9K_ley1.js} +3 -3
- package/dist/_chunks/{ai-credits-notice-C-kz_RrY.js.map → ai-credits-notice-C9K_ley1.js.map} +1 -1
- package/dist/_chunks/{ai-permission-notice-BRZeS3mT.js → ai-permission-notice-DMG1o4Qa.js} +2 -2
- package/dist/_chunks/{ai-permission-notice-BRZeS3mT.js.map → ai-permission-notice-DMG1o4Qa.js.map} +1 -1
- package/dist/_chunks/{ai-prompt-input-CxvnXsAs.js → ai-prompt-input-ucwO-z8g.js} +2 -2
- package/dist/_chunks/{ai-prompt-input-CxvnXsAs.js.map → ai-prompt-input-ucwO-z8g.js.map} +1 -1
- package/dist/_chunks/{alia-sidebar-Dx-oeOV2.js → alia-sidebar-K3gaNH94.js} +7 -7
- package/dist/_chunks/{alia-sidebar-Dx-oeOV2.js.map → alia-sidebar-K3gaNH94.js.map} +1 -1
- package/dist/_chunks/{anamnesis-card-D8Si-2GV.js → anamnesis-card-CPjry4ur.js} +2 -2
- package/dist/_chunks/{anamnesis-card-D8Si-2GV.js.map → anamnesis-card-CPjry4ur.js.map} +1 -1
- package/dist/_chunks/{anamnesis-summary-rows-CZirLRuv.js → anamnesis-summary-rows-D9LZZHLw.js} +9 -9
- package/dist/_chunks/{anamnesis-summary-rows-CZirLRuv.js.map → anamnesis-summary-rows-D9LZZHLw.js.map} +1 -1
- package/dist/_chunks/{appointment-card-BgLpE6T5.js → appointment-card-DETaIfBb.js} +2 -2
- package/dist/_chunks/{appointment-card-BgLpE6T5.js.map → appointment-card-DETaIfBb.js.map} +1 -1
- package/dist/_chunks/{appointment-peek-Dk11UOVW.js → appointment-peek-B79v56Zc.js} +4 -4
- package/dist/_chunks/{appointment-peek-Dk11UOVW.js.map → appointment-peek-B79v56Zc.js.map} +1 -1
- package/dist/_chunks/{appointment-timeline-wQ-PdkFV.js → appointment-timeline-tyJJPgVU.js} +5 -5
- package/dist/_chunks/{appointment-timeline-wQ-PdkFV.js.map → appointment-timeline-tyJJPgVU.js.map} +1 -1
- package/dist/_chunks/{appointment-tray-D7Gt6m8x.js → appointment-tray-Dq4zto_L.js} +4 -4
- package/dist/_chunks/{appointment-tray-D7Gt6m8x.js.map → appointment-tray-Dq4zto_L.js.map} +1 -1
- package/dist/_chunks/{audio-recorder-DZBtAvLH.js → audio-recorder-Ddlp5rVg.js} +3 -3
- package/dist/_chunks/{audio-recorder-DZBtAvLH.js.map → audio-recorder-Ddlp5rVg.js.map} +1 -1
- package/dist/_chunks/{balance-badge-cell-klaxFNL_.js → balance-badge-cell-BCEsdEOe.js} +4 -4
- package/dist/_chunks/{balance-badge-cell-klaxFNL_.js.map → balance-badge-cell-BCEsdEOe.js.map} +1 -1
- package/dist/_chunks/{bishop-score-BMLRvXYF.js → bishop-score-1NAiZh0K.js} +2 -2
- package/dist/_chunks/{bishop-score-BMLRvXYF.js.map → bishop-score-1NAiZh0K.js.map} +1 -1
- package/dist/_chunks/{bmi-calculator-DUhRyyrA.js → bmi-calculator-ZzzPZhhI.js} +2 -2
- package/dist/_chunks/{bmi-calculator-DUhRyyrA.js.map → bmi-calculator-ZzzPZhhI.js.map} +1 -1
- package/dist/_chunks/{booking-Cdzd8kyY.js → booking-DmyX24Ls.js} +5 -5
- package/dist/_chunks/{booking-Cdzd8kyY.js.map → booking-DmyX24Ls.js.map} +1 -1
- package/dist/_chunks/{button-18oBsI3n.js → button-CYPx2xFq.js} +38 -36
- package/dist/_chunks/button-CYPx2xFq.js.map +1 -0
- package/dist/_chunks/{button-group-BSDqso_C.js → button-group-t9RrsCS6.js} +3 -3
- package/dist/_chunks/{button-group-BSDqso_C.js.map → button-group-t9RrsCS6.js.map} +1 -1
- package/dist/_chunks/{calendar-E6Yu4lzC.js → calendar-aqzmITxw.js} +542 -510
- package/dist/_chunks/calendar-aqzmITxw.js.map +1 -0
- package/dist/_chunks/calendar-workspace-BqoPkCUp.js +10597 -0
- package/dist/_chunks/calendar-workspace-BqoPkCUp.js.map +1 -0
- package/dist/_chunks/{care-plan-card-ciBaaguw.js → care-plan-card-amX33mMF.js} +2 -2
- package/dist/_chunks/{care-plan-card-ciBaaguw.js.map → care-plan-card-amX33mMF.js.map} +1 -1
- package/dist/_chunks/{care-plan-entry-card-D7A0whiZ.js → care-plan-entry-card-DNkEucjN.js} +2 -2
- package/dist/_chunks/{care-plan-entry-card-D7A0whiZ.js.map → care-plan-entry-card-DNkEucjN.js.map} +1 -1
- package/dist/_chunks/{care-plan-header-DKV1gLqv.js → care-plan-header-CJi853Rf.js} +2 -2
- package/dist/_chunks/{care-plan-header-DKV1gLqv.js.map → care-plan-header-CJi853Rf.js.map} +1 -1
- package/dist/_chunks/{carousel.agent-DqDGR2yH.js → carousel.agent-2EhJsAtl.js} +2 -2
- package/dist/_chunks/{carousel.agent-DqDGR2yH.js.map → carousel.agent-2EhJsAtl.js.map} +1 -1
- package/dist/_chunks/{chart-VjuXDXOZ.js → chart-B2HnwMP5.js} +3 -3
- package/dist/_chunks/{chart-VjuXDXOZ.js.map → chart-B2HnwMP5.js.map} +1 -1
- package/dist/_chunks/{chat-input-BVho_SqP.js → chat-input-CHUsUFOD.js} +2 -2
- package/dist/_chunks/{chat-input-BVho_SqP.js.map → chat-input-CHUsUFOD.js.map} +1 -1
- package/dist/_chunks/{chat-message-B4ihjNy3.js → chat-message-DTcRGhNo.js} +3 -3
- package/dist/_chunks/{chat-message-B4ihjNy3.js.map → chat-message-DTcRGhNo.js.map} +1 -1
- package/dist/_chunks/{code-block-C_eNHWaa.js → code-block-BrwcZNPq.js} +2 -2
- package/dist/_chunks/{code-block-C_eNHWaa.js.map → code-block-BrwcZNPq.js.map} +1 -1
- package/dist/_chunks/{connection-status-Cfux3TvH.js → connection-status-DMheLE65.js} +3 -3
- package/dist/_chunks/{connection-status-Cfux3TvH.js.map → connection-status-DMheLE65.js.map} +1 -1
- package/dist/_chunks/{contact-profile-card-Dj4NgBL-.js → contact-profile-card-zQLGGFKG.js} +2 -2
- package/dist/_chunks/{contact-profile-card-Dj4NgBL-.js.map → contact-profile-card-zQLGGFKG.js.map} +1 -1
- package/dist/_chunks/{control-room-rail-DAO0qfOI.js → control-room-rail-5iuM3jcm.js} +3 -3
- package/dist/_chunks/{control-room-rail-DAO0qfOI.js.map → control-room-rail-5iuM3jcm.js.map} +1 -1
- package/dist/_chunks/{copy-field-Cm4y5Bff.js → copy-field-C-KvrgOG.js} +2 -2
- package/dist/_chunks/{copy-field-Cm4y5Bff.js.map → copy-field-C-KvrgOG.js.map} +1 -1
- package/dist/_chunks/{cycle-calculator-B9lBRNiZ.js → cycle-calculator-DQMCeEzn.js} +2 -2
- package/dist/_chunks/{cycle-calculator-B9lBRNiZ.js.map → cycle-calculator-DQMCeEzn.js.map} +1 -1
- package/dist/_chunks/{dashboard-grid-uX7x1ePj.js → dashboard-grid-H7uph3HO.js} +2 -2
- package/dist/_chunks/{dashboard-grid-uX7x1ePj.js.map → dashboard-grid-H7uph3HO.js.map} +1 -1
- package/dist/_chunks/{data-table-CrI3_bjH.js → data-table-C4yPR89K.js} +7 -7
- package/dist/_chunks/{data-table-CrI3_bjH.js.map → data-table-C4yPR89K.js.map} +1 -1
- package/dist/_chunks/{data-table-tabs-CzYYKp2_.js → data-table-tabs-Dd_O1nPY.js} +3 -3
- package/dist/_chunks/{data-table-tabs-CzYYKp2_.js.map → data-table-tabs-Dd_O1nPY.js.map} +1 -1
- package/dist/_chunks/{description-list-1A2DEbE6.js → description-list-DOPu69Jg.js} +2 -2
- package/dist/_chunks/{description-list-1A2DEbE6.js.map → description-list-DOPu69Jg.js.map} +1 -1
- package/dist/_chunks/{document-preview-Od2Hz4z5.js → document-preview-Dzh1YAz8.js} +3 -3
- package/dist/_chunks/{document-preview-Od2Hz4z5.js.map → document-preview-Dzh1YAz8.js.map} +1 -1
- package/dist/_chunks/{document-scanner-p0aGlzCy.js → document-scanner-BSVwMR4V.js} +2 -2
- package/dist/_chunks/{document-scanner-p0aGlzCy.js.map → document-scanner-BSVwMR4V.js.map} +1 -1
- package/dist/_chunks/dropdown-menu-DIzxr_lp.js +594 -0
- package/dist/_chunks/dropdown-menu-DIzxr_lp.js.map +1 -0
- package/dist/_chunks/{due-date-calculator-BVqJaxzd.js → due-date-calculator-DUjw4w5O.js} +2 -2
- package/dist/_chunks/{due-date-calculator-BVqJaxzd.js.map → due-date-calculator-DUjw4w5O.js.map} +1 -1
- package/dist/_chunks/{editable-currency-cell-renderer-D_G2Ap61.js → editable-currency-cell-renderer-Cch3RIJL.js} +3 -3
- package/dist/_chunks/{editable-currency-cell-renderer-D_G2Ap61.js.map → editable-currency-cell-renderer-Cch3RIJL.js.map} +1 -1
- package/dist/_chunks/{editable-description-B4NVdjvd.js → editable-description-CRQib91p.js} +3 -3
- package/dist/_chunks/{editable-description-B4NVdjvd.js.map → editable-description-CRQib91p.js.map} +1 -1
- package/dist/_chunks/{editor-overlay-BDiBvQmL.js → editor-overlay-DsA7vR5C.js} +2 -2
- package/dist/_chunks/{editor-overlay-BDiBvQmL.js.map → editor-overlay-DsA7vR5C.js.map} +1 -1
- package/dist/_chunks/{empty-state-DTBZ1ENT.js → empty-state-Ck1wVWdN.js} +2 -2
- package/dist/_chunks/{empty-state-DTBZ1ENT.js.map → empty-state-Ck1wVWdN.js.map} +1 -1
- package/dist/_chunks/{entity-summary-CFJfBdVP.js → entity-summary-Cvs21xPr.js} +3 -3
- package/dist/_chunks/{entity-summary-CFJfBdVP.js.map → entity-summary-Cvs21xPr.js.map} +1 -1
- package/dist/_chunks/{error-boundary-BxTqEXqj.js → error-boundary-C_HAzVLO.js} +2 -2
- package/dist/_chunks/{error-boundary-BxTqEXqj.js.map → error-boundary-C_HAzVLO.js.map} +1 -1
- package/dist/_chunks/{face-scheme-fku-RShg.js → face-scheme-DVZZTuXT.js} +5 -5
- package/dist/_chunks/{face-scheme-fku-RShg.js.map → face-scheme-DVZZTuXT.js.map} +1 -1
- package/dist/_chunks/{fetal-weight-B69yOS9W.js → fetal-weight-B-lO-948.js} +2 -2
- package/dist/_chunks/{fetal-weight-B69yOS9W.js.map → fetal-weight-B-lO-948.js.map} +1 -1
- package/dist/_chunks/{field-array-lIXrFWS0.js → field-array-B3IDOct8.js} +3 -3
- package/dist/_chunks/{field-array-lIXrFWS0.js.map → field-array-B3IDOct8.js.map} +1 -1
- package/dist/_chunks/{file-manager-C6QQPQV5.js → file-manager-COUb-w8j.js} +7 -7
- package/dist/_chunks/{file-manager-C6QQPQV5.js.map → file-manager-COUb-w8j.js.map} +1 -1
- package/dist/_chunks/{finished-terminal-B2oqXO0Y.js → finished-terminal-BrAWwfOw.js} +2 -2
- package/dist/_chunks/{finished-terminal-B2oqXO0Y.js.map → finished-terminal-BrAWwfOw.js.map} +1 -1
- package/dist/_chunks/{fiscal-code-input-BEF8eKIG.js → fiscal-code-input-CwUwhUZy.js} +2 -2
- package/dist/_chunks/{fiscal-code-input-BEF8eKIG.js.map → fiscal-code-input-CwUwhUZy.js.map} +1 -1
- package/dist/_chunks/floating-action-button-pojvb9gG.js.map +1 -1
- package/dist/_chunks/{freemium-paywall-B6JITu4l.js → freemium-paywall-DiPJrL18.js} +2 -2
- package/dist/_chunks/{freemium-paywall-B6JITu4l.js.map → freemium-paywall-DiPJrL18.js.map} +1 -1
- package/dist/_chunks/{gestational-age-calculator-DsGN6_HS.js → gestational-age-calculator-BVPtrWKf.js} +2 -2
- package/dist/_chunks/{gestational-age-calculator-DsGN6_HS.js.map → gestational-age-calculator-BVPtrWKf.js.map} +1 -1
- package/dist/_chunks/{hcg-doubling-D2SH-e7t.js → hcg-doubling-CPktiA3H.js} +2 -2
- package/dist/_chunks/{hcg-doubling-D2SH-e7t.js.map → hcg-doubling-CPktiA3H.js.map} +1 -1
- package/dist/_chunks/{header-CCjp5GvE.js → header-C8NbLgVq.js} +2 -2
- package/dist/_chunks/{header-CCjp5GvE.js.map → header-C8NbLgVq.js.map} +1 -1
- package/dist/_chunks/header-settings-D0M3WNTS.js +305 -0
- package/dist/_chunks/header-settings-D0M3WNTS.js.map +1 -0
- package/dist/_chunks/{help-me-write-templates-DQtT1qs_.js → help-me-write-templates-CYAKuXZ3.js} +5 -5
- package/dist/_chunks/{help-me-write-templates-DQtT1qs_.js.map → help-me-write-templates-CYAKuXZ3.js.map} +1 -1
- package/dist/_chunks/{hover-card-BplP5SzQ.js → hover-card-BM0vNmq4.js} +2 -2
- package/dist/_chunks/{hover-card-BplP5SzQ.js.map → hover-card-BM0vNmq4.js.map} +1 -1
- package/dist/_chunks/{icon-button-CY7GU_Se.js → icon-button-JAXAkqWC.js} +2 -2
- package/dist/_chunks/icon-button-JAXAkqWC.js.map +1 -0
- package/dist/_chunks/{icon-button-group-B_426QN_.js → icon-button-group-ud2BLmxe.js} +3 -3
- package/dist/_chunks/{icon-button-group-B_426QN_.js.map → icon-button-group-ud2BLmxe.js.map} +1 -1
- package/dist/_chunks/{icon-picker-ZLebyB0U.js → icon-picker-B1PwkUHy.js} +3 -3
- package/dist/_chunks/{icon-picker-ZLebyB0U.js.map → icon-picker-B1PwkUHy.js.map} +1 -1
- package/dist/_chunks/{image-cropper-_HiNN79d.js → image-cropper-DM6hpXUw.js} +2 -2
- package/dist/_chunks/{image-cropper-_HiNN79d.js.map → image-cropper-DM6hpXUw.js.map} +1 -1
- package/dist/_chunks/{info-tip-laBxZhKu.js → info-tip-CywkQ1NX.js} +2 -2
- package/dist/_chunks/{info-tip-laBxZhKu.js.map → info-tip-CywkQ1NX.js.map} +1 -1
- package/dist/_chunks/{insert-result-CSuPQyKL.js → insert-result-Fu9AHxR6.js} +2 -2
- package/dist/_chunks/{insert-result-CSuPQyKL.js.map → insert-result-Fu9AHxR6.js.map} +1 -1
- package/dist/_chunks/{key-value-pair-Dcdl3Gni.js → key-value-pair-BL1J3_Km.js} +2 -2
- package/dist/_chunks/{key-value-pair-Dcdl3Gni.js.map → key-value-pair-BL1J3_Km.js.map} +1 -1
- package/dist/_chunks/{kit-extensions-BTJSnM_H.js → kit-extensions-B9Qn6VIc.js} +6 -6
- package/dist/_chunks/{kit-extensions-BTJSnM_H.js.map → kit-extensions-B9Qn6VIc.js.map} +1 -1
- package/dist/_chunks/{link-cell-renderer-CkNbUsBM.js → link-cell-renderer-BcW3F1j9.js} +2 -2
- package/dist/_chunks/{link-cell-renderer-CkNbUsBM.js.map → link-cell-renderer-BcW3F1j9.js.map} +1 -1
- package/dist/_chunks/{locale-picker-DGkQmhV9.js → locale-picker-Z42P8T-i.js} +218 -213
- package/dist/_chunks/locale-picker-Z42P8T-i.js.map +1 -0
- package/dist/_chunks/{map-view-Bb7ClKSF.js → map-view-DxYPJjM9.js} +2 -2
- package/dist/_chunks/{map-view-Bb7ClKSF.js.map → map-view-DxYPJjM9.js.map} +1 -1
- package/dist/_chunks/{marketplace-app-shell-1uKqs4gD.js → marketplace-app-shell-rTTvWRrE.js} +6 -6
- package/dist/_chunks/{marketplace-app-shell-1uKqs4gD.js.map → marketplace-app-shell-rTTvWRrE.js.map} +1 -1
- package/dist/_chunks/{message-card-C2zsvyj0.js → message-card-CUBPPn4Z.js} +3 -3
- package/dist/_chunks/{message-card-C2zsvyj0.js.map → message-card-CUBPPn4Z.js.map} +1 -1
- package/dist/_chunks/{message-tray-CMlmxdH2.js → message-tray-uy3DAIbn.js} +4 -4
- package/dist/_chunks/{message-tray-CMlmxdH2.js.map → message-tray-uy3DAIbn.js.map} +1 -1
- package/dist/_chunks/{muscle-scheme-Co0NIgbU.js → muscle-scheme-CH-vQ7Ch.js} +2 -2
- package/dist/_chunks/{muscle-scheme-Co0NIgbU.js.map → muscle-scheme-CH-vQ7Ch.js.map} +1 -1
- package/dist/_chunks/{notes-panel-xxpFt-I1.js → notes-panel-Dka4Z2M7.js} +4 -4
- package/dist/_chunks/{notes-panel-xxpFt-I1.js.map → notes-panel-Dka4Z2M7.js.map} +1 -1
- package/dist/_chunks/{notification-card-DDzBCi8l.js → notification-card-Hy8w3UWx.js} +3 -3
- package/dist/_chunks/{notification-card-DDzBCi8l.js.map → notification-card-Hy8w3UWx.js.map} +1 -1
- package/dist/_chunks/{notification-tray-PnH2PBlZ.js → notification-tray-VuV3XXB8.js} +4 -4
- package/dist/_chunks/{notification-tray-PnH2PBlZ.js.map → notification-tray-VuV3XXB8.js.map} +1 -1
- package/dist/_chunks/{optical-prescription-DUufWXfZ.js → optical-prescription-C2n6d0HO.js} +2 -2
- package/dist/_chunks/{optical-prescription-DUufWXfZ.js.map → optical-prescription-C2n6d0HO.js.map} +1 -1
- package/dist/_chunks/{panel-subview-CzHutkA8.js → panel-subview-DAY-ToM3.js} +2 -2
- package/dist/_chunks/{panel-subview-CzHutkA8.js.map → panel-subview-DAY-ToM3.js.map} +1 -1
- package/dist/_chunks/{patient-details-tTlvrJSU.js → patient-details-D9sAM3qh.js} +3 -3
- package/dist/_chunks/{patient-details-tTlvrJSU.js.map → patient-details-D9sAM3qh.js.map} +1 -1
- package/dist/_chunks/{patient-field-row-DElFbpKc.js → patient-field-row-CT04C_lZ.js} +277 -257
- package/dist/_chunks/patient-field-row-CT04C_lZ.js.map +1 -0
- package/dist/_chunks/{patient-search-DgXdGkhK.js → patient-search-DkIukAMQ.js} +3 -3
- package/dist/_chunks/{patient-search-DgXdGkhK.js.map → patient-search-DkIukAMQ.js.map} +1 -1
- package/dist/_chunks/{patient-summary-card-DQ__6DR-.js → patient-summary-card-DI0BH-Fe.js} +5 -5
- package/dist/_chunks/{patient-summary-card-DQ__6DR-.js.map → patient-summary-card-DI0BH-Fe.js.map} +1 -1
- package/dist/_chunks/{payment-automation-upsell-ugi4np1l.js → payment-automation-upsell-vQBIyUky.js} +2 -2
- package/dist/_chunks/{payment-automation-upsell-ugi4np1l.js.map → payment-automation-upsell-vQBIyUky.js.map} +1 -1
- package/dist/_chunks/{payment-request-card-DMJB57Tv.js → payment-request-card-BSaJzhxz.js} +3 -3
- package/dist/_chunks/{payment-request-card-DMJB57Tv.js.map → payment-request-card-BSaJzhxz.js.map} +1 -1
- package/dist/_chunks/{periodontal-chart-DbGzKDj7.js → periodontal-chart-BcTcOc79.js} +2 -2
- package/dist/_chunks/{periodontal-chart-DbGzKDj7.js.map → periodontal-chart-BcTcOc79.js.map} +1 -1
- package/dist/_chunks/{periodontal-chart-card-DvHyP47v.js → periodontal-chart-card-NS_nToBf.js} +2 -2
- package/dist/_chunks/{periodontal-chart-card-DvHyP47v.js.map → periodontal-chart-card-NS_nToBf.js.map} +1 -1
- package/dist/_chunks/{popover-Dvb40vPH.js → popover-SASSeAdY.js} +2 -2
- package/dist/_chunks/{popover-Dvb40vPH.js.map → popover-SASSeAdY.js.map} +1 -1
- package/dist/_chunks/{practice-results-EKRiqWtQ.js → practice-results-C3ifcObw.js} +6 -6
- package/dist/_chunks/{practice-results-EKRiqWtQ.js.map → practice-results-C3ifcObw.js.map} +1 -1
- package/dist/_chunks/{pregnancy-dating-lfjjZVZH.js → pregnancy-dating-CpJ3iYvD.js} +2 -2
- package/dist/_chunks/{pregnancy-dating-lfjjZVZH.js.map → pregnancy-dating-CpJ3iYvD.js.map} +1 -1
- package/dist/_chunks/{pregnancy-weight-gain-WpNt-S0q.js → pregnancy-weight-gain-kDOhA2vZ.js} +2 -2
- package/dist/_chunks/{pregnancy-weight-gain-WpNt-S0q.js.map → pregnancy-weight-gain-kDOhA2vZ.js.map} +1 -1
- package/dist/_chunks/{privacy-lock-D6gq0GDg.js → privacy-lock-CEyvNpC8.js} +3 -3
- package/dist/_chunks/{privacy-lock-D6gq0GDg.js.map → privacy-lock-CEyvNpC8.js.map} +1 -1
- package/dist/_chunks/{privacy-mask-BC5lw2zB.js → privacy-mask-TzMlEu3Q.js} +2 -2
- package/dist/_chunks/{privacy-mask-BC5lw2zB.js.map → privacy-mask-TzMlEu3Q.js.map} +1 -1
- package/dist/_chunks/{product-hub-panel-CKeSCSeE.js → product-hub-panel-b70i9Hi1.js} +3 -3
- package/dist/_chunks/{product-hub-panel-CKeSCSeE.js.map → product-hub-panel-b70i9Hi1.js.map} +1 -1
- package/dist/_chunks/{public-header.agent-B9wDmUeB.js → public-header.agent-D0ApOrmx.js} +3 -3
- package/dist/_chunks/{public-header.agent-B9wDmUeB.js.map → public-header.agent-D0ApOrmx.js.map} +1 -1
- package/dist/_chunks/{radiograph-panel.agent-TmyIvTOa.js → radiograph-panel.agent-jhwaIW8U.js} +4 -4
- package/dist/_chunks/{radiograph-panel.agent-TmyIvTOa.js.map → radiograph-panel.agent-jhwaIW8U.js.map} +1 -1
- package/dist/_chunks/resource-chip-DQeCJzJf.js +143 -0
- package/dist/_chunks/resource-chip-DQeCJzJf.js.map +1 -0
- package/dist/_chunks/{reviews-panel-BdwFp_0c.js → reviews-panel-B5QC4FIp.js} +4 -4
- package/dist/_chunks/{reviews-panel-BdwFp_0c.js.map → reviews-panel-B5QC4FIp.js.map} +1 -1
- package/dist/_chunks/{rich-text-editor-y6ML0KeV.js → rich-text-editor-DoBXdwmx.js} +930 -943
- package/dist/_chunks/rich-text-editor-DoBXdwmx.js.map +1 -0
- package/dist/_chunks/{session-countdown-ACJyTXH2.js → session-countdown-26XB5u38.js} +2 -2
- package/dist/_chunks/{session-countdown-ACJyTXH2.js.map → session-countdown-26XB5u38.js.map} +1 -1
- package/dist/_chunks/{sheet-D0Lh0KR2.js → sheet-CwhNzxbr.js} +2 -2
- package/dist/_chunks/{sheet-D0Lh0KR2.js.map → sheet-CwhNzxbr.js.map} +1 -1
- package/dist/_chunks/{sign-in-with-alfadocs-button-CDyJAIzW.js → sign-in-with-alfadocs-button-jxbze77L.js} +2 -2
- package/dist/_chunks/{sign-in-with-alfadocs-button-CDyJAIzW.js.map → sign-in-with-alfadocs-button-jxbze77L.js.map} +1 -1
- package/dist/_chunks/{signature-request-BUGeG8oD.js → signature-request-BorHf3CY.js} +4 -4
- package/dist/_chunks/{signature-request-BUGeG8oD.js.map → signature-request-BorHf3CY.js.map} +1 -1
- package/dist/_chunks/{slot-grid-4fWH3Euk.js → slot-grid-xgf2UKLS.js} +4 -4
- package/dist/_chunks/{slot-grid-4fWH3Euk.js.map → slot-grid-xgf2UKLS.js.map} +1 -1
- package/dist/_chunks/social-sign-in-button-dlpPI5l7.js.map +1 -1
- package/dist/_chunks/{streaming-text-eRiizArc.js → streaming-text-Cos2fVTw.js} +2 -2
- package/dist/_chunks/{streaming-text-eRiizArc.js.map → streaming-text-Cos2fVTw.js.map} +1 -1
- package/dist/_chunks/{tab-bar-BHFf6knq.js → tab-bar-BrkMUW0c.js} +2 -2
- package/dist/_chunks/{tab-bar-BHFf6knq.js.map → tab-bar-BrkMUW0c.js.map} +1 -1
- package/dist/_chunks/tabs-tK22Mz7r.js +413 -0
- package/dist/_chunks/tabs-tK22Mz7r.js.map +1 -0
- package/dist/_chunks/{task-card-jaOhnj_q.js → task-card-CLpHmqEY.js} +2 -2
- package/dist/_chunks/{task-card-jaOhnj_q.js.map → task-card-CLpHmqEY.js.map} +1 -1
- package/dist/_chunks/{task-editor-DlvTwAfv.js → task-editor-B4UGsU7l.js} +6 -6
- package/dist/_chunks/{task-editor-DlvTwAfv.js.map → task-editor-B4UGsU7l.js.map} +1 -1
- package/dist/_chunks/{task-tray-HHyxi9ga.js → task-tray-dsmYgjVb.js} +4 -4
- package/dist/_chunks/{task-tray-HHyxi9ga.js.map → task-tray-dsmYgjVb.js.map} +1 -1
- package/dist/_chunks/{tasks-panel-DbSjq_mz.js → tasks-panel-CwwVw491.js} +6 -6
- package/dist/_chunks/{tasks-panel-DbSjq_mz.js.map → tasks-panel-CwwVw491.js.map} +1 -1
- package/dist/_chunks/{theme-toggle-LUBxlNDm.js → theme-toggle-jyoyhbJL.js} +4 -4
- package/dist/_chunks/{theme-toggle-LUBxlNDm.js.map → theme-toggle-jyoyhbJL.js.map} +1 -1
- package/dist/_chunks/{toast-CT8hjr9r.js → toast-FijDyPnv.js} +2 -2
- package/dist/_chunks/{toast-CT8hjr9r.js.map → toast-FijDyPnv.js.map} +1 -1
- package/dist/_chunks/{token-insert-menu-klwbxVKh.js → token-insert-menu-Cjf99IdN.js} +3 -3
- package/dist/_chunks/{token-insert-menu-klwbxVKh.js.map → token-insert-menu-Cjf99IdN.js.map} +1 -1
- package/dist/_chunks/{tool-rail-DEeX4PdN.js → tool-rail-DphMl1hX.js} +2 -2
- package/dist/_chunks/{tool-rail-DEeX4PdN.js.map → tool-rail-DphMl1hX.js.map} +1 -1
- package/dist/_chunks/{tooth-scheme-BkjhkI8g.js → tooth-scheme-BaCJnyg9.js} +663 -718
- package/dist/_chunks/tooth-scheme-BaCJnyg9.js.map +1 -0
- package/dist/_chunks/{unit-converter-Dp_KDxE6.js → unit-converter-CGpOgarU.js} +2 -2
- package/dist/_chunks/{unit-converter-Dp_KDxE6.js.map → unit-converter-CGpOgarU.js.map} +1 -1
- package/dist/_chunks/{use-appointment-details-read-5-hV-2xA.js → use-appointment-details-read-uEnJLVfA.js} +14 -14
- package/dist/_chunks/{use-appointment-details-read-5-hV-2xA.js.map → use-appointment-details-read-uEnJLVfA.js.map} +1 -1
- package/dist/_chunks/wallet-pay-button--dnR6NfJ.js.map +1 -1
- package/dist/_chunks/{warning-stack-CEgYkI1z.js → warning-stack-7Hffm7K1.js} +3 -3
- package/dist/_chunks/{warning-stack-CEgYkI1z.js.map → warning-stack-7Hffm7K1.js.map} +1 -1
- package/dist/_chunks/{workflow-map-qGkQTNvS.js → workflow-map-Jfe9L9Wt.js} +6 -6
- package/dist/_chunks/{workflow-map-qGkQTNvS.js.map → workflow-map-Jfe9L9Wt.js.map} +1 -1
- package/dist/_chunks/{workflow-status-ClHfz4Kr.js → workflow-status-jHfsIDzi.js} +2 -2
- package/dist/_chunks/{workflow-status-ClHfz4Kr.js.map → workflow-status-jHfsIDzi.js.map} +1 -1
- package/dist/agent-catalog.json +103 -38
- package/dist/agent-i18n/en.json +7 -4
- package/dist/components/_shared/entity-card/entity-card.d.ts +1 -1
- package/dist/components/_shared/field-visibility-cog.d.ts.map +1 -1
- package/dist/components/agenda-tray/index.js +1 -1
- package/dist/components/ai-credits-notice/index.js +1 -1
- package/dist/components/ai-permission-notice/index.js +1 -1
- package/dist/components/ai-prompt-input/index.js +1 -1
- package/dist/components/anamnesis-card/index.js +1 -1
- package/dist/components/anamnesis-summary-card/anamnesis-summary-card.d.ts +1 -1
- package/dist/components/appointment-card/index.js +2 -2
- package/dist/components/appointment-details-panel/index.js +1 -1
- package/dist/components/appointment-peek/index.js +1 -1
- package/dist/components/appointment-timeline/index.js +1 -1
- package/dist/components/audio-recorder/index.js +1 -1
- package/dist/components/bishop-score/index.js +1 -1
- package/dist/components/bmi-calculator/index.js +1 -1
- package/dist/components/booking/index.js +1 -1
- package/dist/components/button/button.d.ts +11 -0
- package/dist/components/button/button.d.ts.map +1 -1
- package/dist/components/button/icon-button.d.ts +4 -0
- package/dist/components/button/icon-button.d.ts.map +1 -1
- package/dist/components/button/index.js +2 -2
- package/dist/components/button-group/index.js +1 -1
- package/dist/components/calendar/calendar.d.ts +5 -3
- package/dist/components/calendar/calendar.d.ts.map +1 -1
- package/dist/components/calendar/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/chart.d.ts +1 -1
- package/dist/components/chart/index.js +1 -1
- package/dist/components/chat-input/index.js +1 -1
- package/dist/components/chat-message/index.js +1 -1
- package/dist/components/connection-status/index.js +1 -1
- package/dist/components/contact-profile-card/index.js +1 -1
- package/dist/components/control-room-rail/index.js +1 -1
- package/dist/components/copy-field/index.js +1 -1
- package/dist/components/cycle-calculator/index.js +1 -1
- package/dist/components/dashboard-grid/index.js +1 -1
- package/dist/components/data-table/index.js +4 -4
- package/dist/components/data-table-tabs/index.js +1 -1
- package/dist/components/description-list/index.js +1 -1
- package/dist/components/document-preview/index.js +1 -1
- package/dist/components/document-scanner/index.js +1 -1
- package/dist/components/dropdown-menu/dropdown-menu.agent.d.ts.map +1 -1
- package/dist/components/dropdown-menu/dropdown-menu.d.ts +52 -2
- package/dist/components/dropdown-menu/dropdown-menu.d.ts.map +1 -1
- package/dist/components/dropdown-menu/index.d.ts +1 -1
- package/dist/components/dropdown-menu/index.d.ts.map +1 -1
- package/dist/components/dropdown-menu/index.js +1 -1
- package/dist/components/due-date-calculator/index.js +1 -1
- package/dist/components/editable-description/index.js +1 -1
- package/dist/components/editor-overlay/index.js +1 -1
- package/dist/components/empty-state/index.js +1 -1
- package/dist/components/entity-summary/index.js +1 -1
- package/dist/components/error-boundary/index.js +1 -1
- package/dist/components/face-scheme/index.js +1 -1
- package/dist/components/fetal-weight/index.js +1 -1
- package/dist/components/field-array/index.js +1 -1
- package/dist/components/file-manager/index.js +1 -1
- package/dist/components/finished-terminal/index.js +1 -1
- package/dist/components/fiscal-code-input/index.js +1 -1
- package/dist/components/floating-action-button/floating-action-button.d.ts.map +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/header-settings.d.ts +3 -3
- package/dist/components/header-settings/header-settings.d.ts.map +1 -1
- package/dist/components/header-settings/index.js +1 -1
- package/dist/components/hover-card/index.js +1 -1
- package/dist/components/icon-button/index.js +1 -1
- package/dist/components/icon-button-group/index.js +1 -1
- package/dist/components/icon-picker/index.js +1 -1
- package/dist/components/image-cropper/index.js +1 -1
- package/dist/components/info-tip/index.js +1 -1
- package/dist/components/key-value-pair/index.js +1 -1
- package/dist/components/locale-picker/index.js +1 -1
- package/dist/components/locale-picker/locale-picker.d.ts +7 -0
- package/dist/components/locale-picker/locale-picker.d.ts.map +1 -1
- package/dist/components/map-view/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/muscle-scheme/index.js +1 -1
- package/dist/components/notes-panel/index.js +1 -1
- package/dist/components/notification-card/index.js +1 -1
- package/dist/components/notification-tray/index.js +1 -1
- package/dist/components/operator-hero/operator-hero.d.ts +1 -1
- package/dist/components/optical-prescription/index.js +1 -1
- package/dist/components/panel-subview/index.js +1 -1
- package/dist/components/patient-details/index.js +1 -1
- package/dist/components/patient-details/patient-details.d.ts +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 +1 -1
- package/dist/components/patient-table/index.js +1 -1
- package/dist/components/payment-card/index.js +1 -1
- package/dist/components/periodontal-chart/index.js +1 -1
- package/dist/components/periodontal-chart-card/index.js +1 -1
- package/dist/components/popover/index.js +1 -1
- package/dist/components/practice-results/index.js +1 -1
- package/dist/components/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/radiograph-panel/index.js +1 -1
- package/dist/components/resource-chip/index.d.ts +1 -1
- package/dist/components/resource-chip/index.d.ts.map +1 -1
- package/dist/components/resource-chip/index.js +3 -2
- package/dist/components/resource-chip/resource-chip.d.ts +20 -0
- package/dist/components/resource-chip/resource-chip.d.ts.map +1 -1
- package/dist/components/reviews-panel/index.js +1 -1
- package/dist/components/rich-text-editor/editor-toolbar.d.ts.map +1 -1
- package/dist/components/rich-text-editor/index.js +2 -2
- package/dist/components/session-countdown/index.js +1 -1
- package/dist/components/sheet/index.js +1 -1
- package/dist/components/sign-in-with-alfadocs-button/index.js +1 -1
- package/dist/components/skeleton-scheme/index.js +1 -1
- package/dist/components/slot-grid/index.js +1 -1
- package/dist/components/social-sign-in-button/social-sign-in-button.d.ts.map +1 -1
- package/dist/components/streaming-text/index.js +1 -1
- package/dist/components/tab-bar/index.js +1 -1
- package/dist/components/tabs/index.js +1 -1
- package/dist/components/tabs/tabs.d.ts.map +1 -1
- package/dist/components/task-card/index.js +1 -1
- package/dist/components/task-editor/index.js +1 -1
- package/dist/components/task-tray/index.js +1 -1
- package/dist/components/tasks-panel/index.js +1 -1
- package/dist/components/theme-toggle/index.js +1 -1
- package/dist/components/toast/index.js +1 -1
- package/dist/components/token-insert-menu/index.js +1 -1
- package/dist/components/tool-rail/index.js +1 -1
- package/dist/components/tooth-scheme/index.js +1 -1
- package/dist/components/tooth-scheme/tooth-scheme.d.ts +2 -2
- package/dist/components/tooth-scheme/tooth-scheme.d.ts.map +1 -1
- package/dist/components/unit-converter/index.js +1 -1
- package/dist/components/wallet-pay-button/wallet-pay-button.d.ts.map +1 -1
- package/dist/components/warning-stack/index.js +1 -1
- package/dist/components/workflow/index.js +1 -1
- package/dist/components/workflow/workflow-card.d.ts +1 -1
- package/dist/components/workflow-status/index.js +1 -1
- package/dist/i18n/locales/ar.d.ts +5 -0
- package/dist/i18n/locales/ar.d.ts.map +1 -1
- package/dist/i18n/locales/ar.js +5 -0
- package/dist/i18n/locales/ar.js.map +1 -1
- package/dist/i18n/locales/de.d.ts +5 -0
- package/dist/i18n/locales/de.d.ts.map +1 -1
- package/dist/i18n/locales/de.js +5 -0
- package/dist/i18n/locales/de.js.map +1 -1
- package/dist/i18n/locales/el.d.ts +5 -0
- package/dist/i18n/locales/el.d.ts.map +1 -1
- package/dist/i18n/locales/el.js +5 -0
- package/dist/i18n/locales/el.js.map +1 -1
- package/dist/i18n/locales/en.d.ts +5 -0
- package/dist/i18n/locales/en.d.ts.map +1 -1
- package/dist/i18n/locales/en.js +5 -0
- package/dist/i18n/locales/en.js.map +1 -1
- package/dist/i18n/locales/es.d.ts +5 -0
- package/dist/i18n/locales/es.d.ts.map +1 -1
- package/dist/i18n/locales/es.js +5 -0
- package/dist/i18n/locales/es.js.map +1 -1
- package/dist/i18n/locales/fr.d.ts +5 -0
- package/dist/i18n/locales/fr.d.ts.map +1 -1
- package/dist/i18n/locales/fr.js +5 -0
- package/dist/i18n/locales/fr.js.map +1 -1
- package/dist/i18n/locales/hi.d.ts +5 -0
- package/dist/i18n/locales/hi.d.ts.map +1 -1
- package/dist/i18n/locales/hi.js +5 -0
- package/dist/i18n/locales/hi.js.map +1 -1
- package/dist/i18n/locales/it.d.ts +5 -0
- package/dist/i18n/locales/it.d.ts.map +1 -1
- package/dist/i18n/locales/it.js +5 -0
- package/dist/i18n/locales/it.js.map +1 -1
- package/dist/i18n/locales/ja.d.ts +5 -0
- package/dist/i18n/locales/ja.d.ts.map +1 -1
- package/dist/i18n/locales/ja.js +5 -0
- package/dist/i18n/locales/ja.js.map +1 -1
- package/dist/i18n/locales/nl.d.ts +5 -0
- package/dist/i18n/locales/nl.d.ts.map +1 -1
- package/dist/i18n/locales/nl.js +5 -0
- package/dist/i18n/locales/nl.js.map +1 -1
- package/dist/i18n/locales/pl.d.ts +5 -0
- package/dist/i18n/locales/pl.d.ts.map +1 -1
- package/dist/i18n/locales/pl.js +5 -0
- package/dist/i18n/locales/pl.js.map +1 -1
- package/dist/i18n/locales/pt.d.ts +5 -0
- package/dist/i18n/locales/pt.d.ts.map +1 -1
- package/dist/i18n/locales/pt.js +5 -0
- package/dist/i18n/locales/pt.js.map +1 -1
- package/dist/i18n/locales/ro.d.ts +5 -0
- package/dist/i18n/locales/ro.d.ts.map +1 -1
- package/dist/i18n/locales/ro.js +5 -0
- package/dist/i18n/locales/ro.js.map +1 -1
- package/dist/i18n/locales/ru.d.ts +5 -0
- package/dist/i18n/locales/ru.d.ts.map +1 -1
- package/dist/i18n/locales/ru.js +5 -0
- package/dist/i18n/locales/ru.js.map +1 -1
- package/dist/i18n/locales/sq.d.ts +5 -0
- package/dist/i18n/locales/sq.d.ts.map +1 -1
- package/dist/i18n/locales/sq.js +5 -0
- package/dist/i18n/locales/sq.js.map +1 -1
- package/dist/i18n/locales/sv.d.ts +5 -0
- package/dist/i18n/locales/sv.d.ts.map +1 -1
- package/dist/i18n/locales/sv.js +5 -0
- package/dist/i18n/locales/sv.js.map +1 -1
- package/dist/i18n/locales/tr.d.ts +5 -0
- package/dist/i18n/locales/tr.d.ts.map +1 -1
- package/dist/i18n/locales/tr.js +5 -0
- package/dist/i18n/locales/tr.js.map +1 -1
- package/dist/i18n/locales/zh.d.ts +5 -0
- package/dist/i18n/locales/zh.d.ts.map +1 -1
- package/dist/i18n/locales/zh.js +5 -0
- package/dist/i18n/locales/zh.js.map +1 -1
- package/dist/index.js +477 -476
- package/dist/locales/ar.json +5 -0
- package/dist/locales/de.json +5 -0
- package/dist/locales/el.json +5 -0
- package/dist/locales/en.json +5 -0
- package/dist/locales/es.json +5 -0
- package/dist/locales/fr.json +5 -0
- package/dist/locales/hi.json +5 -0
- package/dist/locales/it.json +5 -0
- package/dist/locales/ja.json +5 -0
- package/dist/locales/nl.json +5 -0
- package/dist/locales/pl.json +5 -0
- package/dist/locales/pt.json +5 -0
- package/dist/locales/ro.json +5 -0
- package/dist/locales/ru.json +5 -0
- package/dist/locales/sq.json +5 -0
- package/dist/locales/sv.json +5 -0
- package/dist/locales/tr.json +5 -0
- package/dist/locales/zh.json +5 -0
- package/dist/patterns/alia-assistant/index.js +1 -1
- package/dist/patterns/anamnesis/index.js +1 -1
- package/dist/patterns/calendar/calendar.sheets.d.ts.map +1 -1
- package/dist/patterns/calendar/calendar.surface.d.ts +4 -1
- package/dist/patterns/calendar/calendar.surface.d.ts.map +1 -1
- package/dist/patterns/calendar/index.js +1 -1
- package/dist/patterns/help-me-write-templates/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 +2 -1
- package/package.json +1 -1
- package/dist/_chunks/button-18oBsI3n.js.map +0 -1
- package/dist/_chunks/calendar-E6Yu4lzC.js.map +0 -1
- package/dist/_chunks/calendar-workspace-DjbGFjg1.js +0 -10584
- package/dist/_chunks/calendar-workspace-DjbGFjg1.js.map +0 -1
- package/dist/_chunks/dropdown-menu-C8PaW3lR.js +0 -369
- package/dist/_chunks/dropdown-menu-C8PaW3lR.js.map +0 -1
- package/dist/_chunks/header-settings-ZXa6hXuu.js +0 -335
- package/dist/_chunks/header-settings-ZXa6hXuu.js.map +0 -1
- package/dist/_chunks/icon-button-CY7GU_Se.js.map +0 -1
- package/dist/_chunks/locale-picker-DGkQmhV9.js.map +0 -1
- package/dist/_chunks/patient-field-row-DElFbpKc.js.map +0 -1
- package/dist/_chunks/resource-chip-DYTG0IQQ.js +0 -83
- package/dist/_chunks/resource-chip-DYTG0IQQ.js.map +0 -1
- package/dist/_chunks/rich-text-editor-y6ML0KeV.js.map +0 -1
- package/dist/_chunks/tabs-CFsuMQ5H.js +0 -409
- package/dist/_chunks/tabs-CFsuMQ5H.js.map +0 -1
- package/dist/_chunks/tooth-scheme-BkjhkI8g.js.map +0 -1
package/dist/_chunks/{actions-cell-renderer-DMittsR3.js → actions-cell-renderer-DBI33cMp.js}
RENAMED
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import { jsxs as m, jsx as o } from "react/jsx-runtime";
|
|
2
2
|
import { isValidElement as w, cloneElement as A, forwardRef as B } from "react";
|
|
3
3
|
import { useTranslation as R } from "react-i18next";
|
|
4
|
-
import { I as f } from "./icon-button-
|
|
5
|
-
import { I as S } from "./icon-button-group-
|
|
6
|
-
import { D as l } from "./dropdown-menu-
|
|
4
|
+
import { I as f } from "./icon-button-JAXAkqWC.js";
|
|
5
|
+
import { I as S } from "./icon-button-group-ud2BLmxe.js";
|
|
6
|
+
import { D as l } from "./dropdown-menu-DIzxr_lp.js";
|
|
7
7
|
import { E as T } from "./ellipsis-dRo9ouSU.js";
|
|
8
8
|
function h(s) {
|
|
9
9
|
if (!w(s)) return s;
|
|
@@ -134,4 +134,4 @@ export {
|
|
|
134
134
|
V as A,
|
|
135
135
|
G as a
|
|
136
136
|
};
|
|
137
|
-
//# sourceMappingURL=actions-cell-renderer-
|
|
137
|
+
//# sourceMappingURL=actions-cell-renderer-DBI33cMp.js.map
|
package/dist/_chunks/{actions-cell-renderer-DMittsR3.js.map → actions-cell-renderer-DBI33cMp.js.map}
RENAMED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"actions-cell-renderer-DMittsR3.js","sources":["../../src/components/data-table/cell-renderers/actions-cell-renderer.tsx"],"sourcesContent":["import {\n type ReactElement,\n cloneElement,\n isValidElement,\n type ReactNode,\n forwardRef,\n type ForwardedRef,\n} from 'react';\nimport type { CustomCellRendererProps } from 'ag-grid-react';\nimport { useTranslation } from 'react-i18next';\nimport { Ellipsis } from 'lucide-react';\nimport { IconButton, type IconButtonProps } from '../../button/icon-button';\nimport { IconButtonGroup } from '../../icon-button-group';\nimport { DropdownMenu } from '../../dropdown-menu';\n\n// Lucide icons render at their intrinsic 24×24 unless given a `size` prop or\n// `size-*` class. The IconButton's wrapping span is only `size-4` (16px), so a\n// bare `<Trash2 />` overflows and, inside AG Grid's `overflow: hidden` cells,\n// gets clipped into horizontal slivers. Coerce icon nodes to the expected size.\nfunction sizeIcon(node: ReactNode): ReactNode {\n if (!isValidElement(node)) return node;\n const element = node as React.ReactElement<{\n className?: string;\n size?: number;\n }>;\n const existingClass = element.props.className ?? '';\n const className = /\\bsize-|\\bw-|\\bh-/.test(existingClass)\n ? existingClass\n : `${existingClass} size-4`.trim();\n return cloneElement(element, { className, size: element.props.size ?? 16 });\n}\n\nexport interface ActionDef<TData = unknown> {\n /** Lucide-style icon node. */\n icon: ReactNode;\n /** Accessible label — also used as the tooltip. */\n label: string;\n /** Invoked with the row data. */\n onClick: (data: TData) => void;\n /** Disable the action. Pass a predicate for per-row disablement. */\n disabled?: boolean | ((data: TData) => boolean);\n /** Human-readable reason shown in the tooltip when disabled. */\n disabledReason?: string;\n /** `destructive` swaps the button intent. */\n variant?: 'default' | 'destructive';\n /** Hide the action entirely. Pass a predicate for per-row hiding. */\n hidden?: boolean | ((data: TData) => boolean);\n}\n\nexport interface ActionsCellRendererParams<TData = unknown> {\n actions: ActionDef<TData>[];\n /** Intent of the inline buttons / the collapsed trigger (default `ghost`). */\n intent?: 'ghost' | 'outline';\n /**\n * Render the inline buttons as a connected `IconButtonGroup` (a segmented\n * control) rather than a loose row. Requires `label` for the group name.\n */\n group?: boolean;\n /** Accessible name for the group and the collapsed overflow trigger. */\n label?: string;\n /**\n * Collapse the actions into a single \"…\" overflow menu instead of inline\n * buttons. Pass a getter to flip it at runtime — call\n * `api.refreshCells({ force: true })` after the underlying value changes so\n * the cells re-read it (this preserves column state, unlike rebuilding defs).\n */\n collapsed?: boolean | (() => boolean);\n /**\n * Split button: keep the first `maxInline` visible actions as inline buttons\n * and fold the rest into a trailing \"…\" menu at the end of the row. The\n * column then needs `actionsColumnWidth(maxInline + 1)`. Ignored while\n * `collapsed`; `0` is the same as `collapsed`.\n */\n maxInline?: number;\n}\n\n/**\n * Pixel width an actions column needs so `count` inline `sm` IconButtons (32px\n * each — whether segmented via `group` or loose) plus the data-table cell's\n * inline padding never clip. AG Grid gives a column ONE width for every row, so\n * pass the TOTAL number of actions (the worst case where a single row shows them\n * all) — not the per-row visible count, which varies with `hidden` predicates.\n *\n * Use it as the column `width` so a fully-actioned row can't overflow:\n *\n * {\n * colId: 'actions',\n * cellRenderer: ActionsCellRenderer,\n * cellRendererParams: { actions, group: true },\n * width: actionsColumnWidth(actions.length),\n * // minWidth stays at the collapsed footprint when `collapsed` is used.\n * }\n */\nexport function actionsColumnWidth(count: number): number {\n const SM_BUTTON = 32; // sm IconButton (`w-8`)\n // Segmented-group chrome + the cell's inline padding:\n // 12 segmented-group borders and seams around the buttons\n // + 16 --spacing-sm each side, the reduced padding the theme gives\n // graphic-only cells (a text cell's 30px would clip the group).\n const CELL_INSET = 28;\n return Math.max(1, count) * SM_BUTTON + CELL_INSET;\n}\n\nfunction resolve<T>(\n flag: boolean | ((data: T) => boolean) | undefined,\n data: T,\n): boolean {\n if (typeof flag === 'function') return flag(data);\n return Boolean(flag);\n}\n\nconst destructiveInline =\n 'ds:text-[color:var(--destructive)] ds:hover:text-[color:var(--destructive-hover)]';\n\nexport function ActionsCellRenderer<TData = unknown>(\n props: CustomCellRendererProps<TData> & ActionsCellRendererParams<TData>,\n) {\n const {\n data,\n actions,\n intent = 'ghost',\n group,\n label,\n collapsed,\n maxInline,\n } = props;\n const { t } = useTranslation();\n if (!data) return null;\n\n const visible = actions.filter((action) => !resolve(action.hidden, data));\n const isCollapsed =\n typeof collapsed === 'function' ? collapsed() : Boolean(collapsed);\n const inline =\n maxInline === undefined\n ? visible\n : visible.slice(0, Math.max(0, maxInline));\n const overflow =\n maxInline === undefined ? [] : visible.slice(Math.max(0, maxInline));\n\n // Collapsed: one \"…\" trigger opening a DropdownMenu of the actions. Disabled\n // actions stay in the menu but inert (the per-action `disabledReason` is an\n // inline-only affordance — a menu row has no tooltip surface).\n if (isCollapsed) {\n return (\n <DropdownMenu.Root>\n <DropdownMenu.Trigger asChild>\n <IconButton\n size=\"sm\"\n intent={intent}\n icon={<Ellipsis aria-hidden />}\n aria-label={label ?? t('dataTable.actions', 'Actions')}\n />\n </DropdownMenu.Trigger>\n <DropdownMenu.Content align=\"end\">\n {visible.map((action, index) => (\n <DropdownMenu.Item\n // Action defs are referentially stable; index is safe as actions\n // do not reorder within a row.\n key={index}\n startIcon={sizeIcon(action.icon)}\n disabled={resolve(action.disabled, data)}\n onSelect={() => action.onClick(data)}\n className={\n action.variant === 'destructive'\n ? 'ds:text-[color:var(--destructive)]'\n : undefined\n }\n >\n {action.label}\n </DropdownMenu.Item>\n ))}\n </DropdownMenu.Content>\n </DropdownMenu.Root>\n );\n }\n\n const buttons = inline.map((action, index) => {\n const isDisabled = resolve(action.disabled, data);\n const tooltip =\n isDisabled && action.disabledReason\n ? action.disabledReason\n : action.label;\n return (\n <IconButton\n // See note above on index keys.\n key={index}\n size=\"sm\"\n intent={intent}\n icon={sizeIcon(action.icon)}\n tooltip={tooltip}\n aria-label={action.label}\n disabled={isDisabled}\n onClick={(event) => {\n event.stopPropagation();\n action.onClick(data);\n }}\n className={\n action.variant === 'destructive' ? destructiveInline : undefined\n }\n />\n );\n });\n\n const more =\n overflow.length > 0 ? (\n <OverflowActionsMenu\n key=\"overflow\"\n data={data}\n actions={overflow}\n intent={intent}\n label={label ?? t('dataTable.actions', 'Actions')}\n />\n ) : null;\n\n return group ? (\n <IconButtonGroup\n aria-label={label ?? t('dataTable.actions', 'Actions')}\n size=\"sm\"\n >\n {buttons}\n {more}\n </IconButtonGroup>\n ) : (\n <span className=\"ds:inline-flex ds:items-center ds:gap-[var(--spacing-xs)]\">\n {buttons}\n {more}\n </span>\n );\n}\n\ninterface OverflowActionsMenuProps<TData> extends Omit<\n IconButtonProps,\n 'icon' | 'aria-label' | 'onClick'\n> {\n data: TData;\n actions: ActionDef<TData>[];\n label: string;\n}\n\n/**\n * The \"…\" end of a split actions button. Forwards its ref and the rest of its\n * props to the trigger IconButton, so an IconButtonGroup can seat it as the\n * last segment exactly like a plain button (the same contract ExportMenu\n * follows in the toolbar).\n */\nconst OverflowActionsMenu = forwardRef(function OverflowActionsMenu<TData>(\n {\n data,\n actions,\n label,\n intent = 'ghost',\n ...rest\n }: OverflowActionsMenuProps<TData>,\n ref: ForwardedRef<HTMLButtonElement>,\n) {\n return (\n <DropdownMenu.Root>\n <DropdownMenu.Trigger asChild>\n <IconButton\n ref={ref}\n type=\"button\"\n size=\"sm\"\n intent={intent}\n icon={<Ellipsis aria-hidden />}\n tooltip={label}\n aria-label={label}\n onClick={(event) => event.stopPropagation()}\n {...rest}\n />\n </DropdownMenu.Trigger>\n <DropdownMenu.Content align=\"end\">\n {actions.map((action, index) => (\n <DropdownMenu.Item\n key={index}\n startIcon={sizeIcon(action.icon)}\n disabled={resolve(action.disabled, data)}\n onSelect={() => action.onClick(data)}\n className={\n action.variant === 'destructive'\n ? 'ds:text-[color:var(--destructive)]'\n : undefined\n }\n >\n {action.label}\n </DropdownMenu.Item>\n ))}\n </DropdownMenu.Content>\n </DropdownMenu.Root>\n );\n}) as <TData>(\n props: OverflowActionsMenuProps<TData> & {\n ref?: ForwardedRef<HTMLButtonElement>;\n },\n) => ReactElement;\n"],"names":["sizeIcon","node","isValidElement","element","existingClass","className","cloneElement","actionsColumnWidth","count","resolve","flag","data","destructiveInline","ActionsCellRenderer","props","actions","intent","group","label","collapsed","maxInline","t","useTranslation","visible","action","isCollapsed","inline","overflow","jsxs","DropdownMenu","jsx","IconButton","Ellipsis","index","buttons","isDisabled","tooltip","event","more","OverflowActionsMenu","IconButtonGroup","forwardRef","rest","ref"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"actions-cell-renderer-DBI33cMp.js","sources":["../../src/components/data-table/cell-renderers/actions-cell-renderer.tsx"],"sourcesContent":["import {\n type ReactElement,\n cloneElement,\n isValidElement,\n type ReactNode,\n forwardRef,\n type ForwardedRef,\n} from 'react';\nimport type { CustomCellRendererProps } from 'ag-grid-react';\nimport { useTranslation } from 'react-i18next';\nimport { Ellipsis } from 'lucide-react';\nimport { IconButton, type IconButtonProps } from '../../button/icon-button';\nimport { IconButtonGroup } from '../../icon-button-group';\nimport { DropdownMenu } from '../../dropdown-menu';\n\n// Lucide icons render at their intrinsic 24×24 unless given a `size` prop or\n// `size-*` class. The IconButton's wrapping span is only `size-4` (16px), so a\n// bare `<Trash2 />` overflows and, inside AG Grid's `overflow: hidden` cells,\n// gets clipped into horizontal slivers. Coerce icon nodes to the expected size.\nfunction sizeIcon(node: ReactNode): ReactNode {\n if (!isValidElement(node)) return node;\n const element = node as React.ReactElement<{\n className?: string;\n size?: number;\n }>;\n const existingClass = element.props.className ?? '';\n const className = /\\bsize-|\\bw-|\\bh-/.test(existingClass)\n ? existingClass\n : `${existingClass} size-4`.trim();\n return cloneElement(element, { className, size: element.props.size ?? 16 });\n}\n\nexport interface ActionDef<TData = unknown> {\n /** Lucide-style icon node. */\n icon: ReactNode;\n /** Accessible label — also used as the tooltip. */\n label: string;\n /** Invoked with the row data. */\n onClick: (data: TData) => void;\n /** Disable the action. Pass a predicate for per-row disablement. */\n disabled?: boolean | ((data: TData) => boolean);\n /** Human-readable reason shown in the tooltip when disabled. */\n disabledReason?: string;\n /** `destructive` swaps the button intent. */\n variant?: 'default' | 'destructive';\n /** Hide the action entirely. Pass a predicate for per-row hiding. */\n hidden?: boolean | ((data: TData) => boolean);\n}\n\nexport interface ActionsCellRendererParams<TData = unknown> {\n actions: ActionDef<TData>[];\n /** Intent of the inline buttons / the collapsed trigger (default `ghost`). */\n intent?: 'ghost' | 'outline';\n /**\n * Render the inline buttons as a connected `IconButtonGroup` (a segmented\n * control) rather than a loose row. Requires `label` for the group name.\n */\n group?: boolean;\n /** Accessible name for the group and the collapsed overflow trigger. */\n label?: string;\n /**\n * Collapse the actions into a single \"…\" overflow menu instead of inline\n * buttons. Pass a getter to flip it at runtime — call\n * `api.refreshCells({ force: true })` after the underlying value changes so\n * the cells re-read it (this preserves column state, unlike rebuilding defs).\n */\n collapsed?: boolean | (() => boolean);\n /**\n * Split button: keep the first `maxInline` visible actions as inline buttons\n * and fold the rest into a trailing \"…\" menu at the end of the row. The\n * column then needs `actionsColumnWidth(maxInline + 1)`. Ignored while\n * `collapsed`; `0` is the same as `collapsed`.\n */\n maxInline?: number;\n}\n\n/**\n * Pixel width an actions column needs so `count` inline `sm` IconButtons (32px\n * each — whether segmented via `group` or loose) plus the data-table cell's\n * inline padding never clip. AG Grid gives a column ONE width for every row, so\n * pass the TOTAL number of actions (the worst case where a single row shows them\n * all) — not the per-row visible count, which varies with `hidden` predicates.\n *\n * Use it as the column `width` so a fully-actioned row can't overflow:\n *\n * {\n * colId: 'actions',\n * cellRenderer: ActionsCellRenderer,\n * cellRendererParams: { actions, group: true },\n * width: actionsColumnWidth(actions.length),\n * // minWidth stays at the collapsed footprint when `collapsed` is used.\n * }\n */\nexport function actionsColumnWidth(count: number): number {\n const SM_BUTTON = 32; // sm IconButton (`w-8`)\n // Segmented-group chrome + the cell's inline padding:\n // 12 segmented-group borders and seams around the buttons\n // + 16 --spacing-sm each side, the reduced padding the theme gives\n // graphic-only cells (a text cell's 30px would clip the group).\n const CELL_INSET = 28;\n return Math.max(1, count) * SM_BUTTON + CELL_INSET;\n}\n\nfunction resolve<T>(\n flag: boolean | ((data: T) => boolean) | undefined,\n data: T,\n): boolean {\n if (typeof flag === 'function') return flag(data);\n return Boolean(flag);\n}\n\nconst destructiveInline =\n 'ds:text-[color:var(--destructive)] ds:hover:text-[color:var(--destructive-hover)]';\n\nexport function ActionsCellRenderer<TData = unknown>(\n props: CustomCellRendererProps<TData> & ActionsCellRendererParams<TData>,\n) {\n const {\n data,\n actions,\n intent = 'ghost',\n group,\n label,\n collapsed,\n maxInline,\n } = props;\n const { t } = useTranslation();\n if (!data) return null;\n\n const visible = actions.filter((action) => !resolve(action.hidden, data));\n const isCollapsed =\n typeof collapsed === 'function' ? collapsed() : Boolean(collapsed);\n const inline =\n maxInline === undefined\n ? visible\n : visible.slice(0, Math.max(0, maxInline));\n const overflow =\n maxInline === undefined ? [] : visible.slice(Math.max(0, maxInline));\n\n // Collapsed: one \"…\" trigger opening a DropdownMenu of the actions. Disabled\n // actions stay in the menu but inert (the per-action `disabledReason` is an\n // inline-only affordance — a menu row has no tooltip surface).\n if (isCollapsed) {\n return (\n <DropdownMenu.Root>\n <DropdownMenu.Trigger asChild>\n <IconButton\n size=\"sm\"\n intent={intent}\n icon={<Ellipsis aria-hidden />}\n aria-label={label ?? t('dataTable.actions', 'Actions')}\n />\n </DropdownMenu.Trigger>\n <DropdownMenu.Content align=\"end\">\n {visible.map((action, index) => (\n <DropdownMenu.Item\n // Action defs are referentially stable; index is safe as actions\n // do not reorder within a row.\n key={index}\n startIcon={sizeIcon(action.icon)}\n disabled={resolve(action.disabled, data)}\n onSelect={() => action.onClick(data)}\n className={\n action.variant === 'destructive'\n ? 'ds:text-[color:var(--destructive)]'\n : undefined\n }\n >\n {action.label}\n </DropdownMenu.Item>\n ))}\n </DropdownMenu.Content>\n </DropdownMenu.Root>\n );\n }\n\n const buttons = inline.map((action, index) => {\n const isDisabled = resolve(action.disabled, data);\n const tooltip =\n isDisabled && action.disabledReason\n ? action.disabledReason\n : action.label;\n return (\n <IconButton\n // See note above on index keys.\n key={index}\n size=\"sm\"\n intent={intent}\n icon={sizeIcon(action.icon)}\n tooltip={tooltip}\n aria-label={action.label}\n disabled={isDisabled}\n onClick={(event) => {\n event.stopPropagation();\n action.onClick(data);\n }}\n className={\n action.variant === 'destructive' ? destructiveInline : undefined\n }\n />\n );\n });\n\n const more =\n overflow.length > 0 ? (\n <OverflowActionsMenu\n key=\"overflow\"\n data={data}\n actions={overflow}\n intent={intent}\n label={label ?? t('dataTable.actions', 'Actions')}\n />\n ) : null;\n\n return group ? (\n <IconButtonGroup\n aria-label={label ?? t('dataTable.actions', 'Actions')}\n size=\"sm\"\n >\n {buttons}\n {more}\n </IconButtonGroup>\n ) : (\n <span className=\"ds:inline-flex ds:items-center ds:gap-[var(--spacing-xs)]\">\n {buttons}\n {more}\n </span>\n );\n}\n\ninterface OverflowActionsMenuProps<TData> extends Omit<\n IconButtonProps,\n 'icon' | 'aria-label' | 'onClick'\n> {\n data: TData;\n actions: ActionDef<TData>[];\n label: string;\n}\n\n/**\n * The \"…\" end of a split actions button. Forwards its ref and the rest of its\n * props to the trigger IconButton, so an IconButtonGroup can seat it as the\n * last segment exactly like a plain button (the same contract ExportMenu\n * follows in the toolbar).\n */\nconst OverflowActionsMenu = forwardRef(function OverflowActionsMenu<TData>(\n {\n data,\n actions,\n label,\n intent = 'ghost',\n ...rest\n }: OverflowActionsMenuProps<TData>,\n ref: ForwardedRef<HTMLButtonElement>,\n) {\n return (\n <DropdownMenu.Root>\n <DropdownMenu.Trigger asChild>\n <IconButton\n ref={ref}\n type=\"button\"\n size=\"sm\"\n intent={intent}\n icon={<Ellipsis aria-hidden />}\n tooltip={label}\n aria-label={label}\n onClick={(event) => event.stopPropagation()}\n {...rest}\n />\n </DropdownMenu.Trigger>\n <DropdownMenu.Content align=\"end\">\n {actions.map((action, index) => (\n <DropdownMenu.Item\n key={index}\n startIcon={sizeIcon(action.icon)}\n disabled={resolve(action.disabled, data)}\n onSelect={() => action.onClick(data)}\n className={\n action.variant === 'destructive'\n ? 'ds:text-[color:var(--destructive)]'\n : undefined\n }\n >\n {action.label}\n </DropdownMenu.Item>\n ))}\n </DropdownMenu.Content>\n </DropdownMenu.Root>\n );\n}) as <TData>(\n props: OverflowActionsMenuProps<TData> & {\n ref?: ForwardedRef<HTMLButtonElement>;\n },\n) => ReactElement;\n"],"names":["sizeIcon","node","isValidElement","element","existingClass","className","cloneElement","actionsColumnWidth","count","resolve","flag","data","destructiveInline","ActionsCellRenderer","props","actions","intent","group","label","collapsed","maxInline","t","useTranslation","visible","action","isCollapsed","inline","overflow","jsxs","DropdownMenu","jsx","IconButton","Ellipsis","index","buttons","isDisabled","tooltip","event","more","OverflowActionsMenu","IconButtonGroup","forwardRef","rest","ref"],"mappings":"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"}
|
|
@@ -2,9 +2,9 @@ import { jsx as e, jsxs as n } from "react/jsx-runtime";
|
|
|
2
2
|
import { forwardRef as P, useRef as T, useImperativeHandle as q, useMemo as B } from "react";
|
|
3
3
|
import { c as H } from "./index-D2ZczOXr.js";
|
|
4
4
|
import { useTranslation as K } from "react-i18next";
|
|
5
|
-
import { I as M } from "./icon-button-
|
|
5
|
+
import { I as M } from "./icon-button-JAXAkqWC.js";
|
|
6
6
|
import { S as A } from "./skeleton-B1KTdJ4N.js";
|
|
7
|
-
import { E as D } from "./empty-state-
|
|
7
|
+
import { E as D } from "./empty-state-Ck1wVWdN.js";
|
|
8
8
|
import { A as V } from "./agenda-card-CjjxlA9K.js";
|
|
9
9
|
import { u as F } from "./registry-DvAUVLHh.js";
|
|
10
10
|
import { C as G } from "./calendar-days-BGWklvE-.js";
|
|
@@ -212,4 +212,4 @@ export {
|
|
|
212
212
|
U as A,
|
|
213
213
|
L as a
|
|
214
214
|
};
|
|
215
|
-
//# sourceMappingURL=agenda-tray-
|
|
215
|
+
//# sourceMappingURL=agenda-tray-CGhEEnFE.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"agenda-tray-BhZASyJm.js","sources":["../../src/components/agenda-tray/agenda-tray.agent.ts","../../src/components/agenda-tray/agenda-tray.tsx"],"sourcesContent":["/* -------------------------------------------------------------------- */\n/* Agent adapter — AgendaTray. */\n/* */\n/* Tray-level surface: read appointment ids + lifecycle status (never */\n/* patient names / treatments), and route an activation through the */\n/* curated handle. AgendaTray is in-page (no open/close). */\n/* -------------------------------------------------------------------- */\n\nimport type { AgentAdapter } from '../../agent/types';\nimport type { AgendaTrayHandle } from './agenda-tray';\n\nexport const agendaTrayAgent: AgentAdapter<AgendaTrayHandle> = {\n id: 'agenda-tray',\n // `pick` (NON-persisting): select_item activates / opens an appointment by\n // firing onOpenAppointment — it does not store a \"selected\" value on the tray\n // (there is no selection state slot), so this is a pick, not select_single.\n capabilities: ['pick'],\n state: {\n items: {\n type: 'Array<{ id: string; status: string }>',\n descriptionKey: 'ui.agent.agendaTray.state.items',\n description:\n 'Currently-displayed appointments. Ids + status only — never patient identity.',\n read: (handle) => handle.getItems(),\n },\n },\n actions: {\n select_item: {\n // Activates (opens) an appointment — pure navigation, no data mutation.\n safety: 'read',\n argsType: '{ id: string }',\n argsSchema: {\n type: 'object',\n properties: { id: { type: 'string' } },\n required: ['id'],\n },\n descriptionKey: 'ui.agent.agendaTray.actions.selectItem',\n description: 'Activate the appointment with the given id.',\n examples: [\n { args: { id: 'appt-204' }, note: 'Open appointment appt-204.' },\n ],\n invoke: (handle, args: { id: string }) => {\n handle.selectItem(args.id);\n },\n },\n },\n domHooks: {\n root: {\n attr: 'data-component',\n value: 'agenda-tray',\n description: 'Marks the AgendaTray wrapper.',\n },\n instanceId: {\n attr: 'data-component-id',\n sourceProp: 'id',\n description:\n 'Sourced from the id prop. Required to address a specific tray from the agent.',\n },\n item: {\n attr: 'data-appointment-id',\n description:\n 'Stable appointment id emitted on each rendered AgendaCard inside the tray.',\n },\n },\n};\n","import {\n forwardRef,\n useImperativeHandle,\n useMemo,\n useRef,\n type HTMLAttributes,\n type ReactNode,\n} from 'react';\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport { useTranslation } from 'react-i18next';\nimport { CalendarDays, Plus } from 'lucide-react';\nimport { IconButton } from '../button/icon-button';\nimport { Skeleton } from '../skeleton/skeleton';\nimport { EmptyState } from '../empty-state/empty-state';\nimport { AgendaCard, type AgendaItem } from '../agenda-card';\nimport { useAgentRegistration } from '../../agent/registry';\nimport { agendaTrayAgent } from './agenda-tray.agent';\n\n/* ------------------------------------------------------------------ */\n/* CVA */\n/* ------------------------------------------------------------------ */\n\nconst agendaTrayVariants = cva(\n [\n 'ds:flex ds:flex-col',\n 'ds:rounded-[var(--radius-md)] ds:shadow-[var(--shadow-card)]',\n 'ds:border ds:border-[color:var(--card-border)] ds:[.theme-accessible_&]:border-2',\n 'ds:bg-[color:var(--card)] ds:text-[color:var(--card-foreground)]',\n 'ds:overflow-hidden',\n ].join(' '),\n {\n variants: {\n size: {\n sm: '',\n md: '',\n },\n },\n defaultVariants: {\n size: 'sm',\n },\n },\n);\n\n/* ------------------------------------------------------------------ */\n/* Types */\n/* ------------------------------------------------------------------ */\n\n/**\n * Curated imperative handle for AgendaTray. Exposed as the forwardRef\n * target so a future agent / MCP UI bridge can drive the tray without\n * touching the DOM. See `agenda-tray.agent.ts`.\n */\nexport interface AgendaTrayHandle {\n getItems: () => Array<{ id: string; status: string }>;\n selectItem: (id: string) => void;\n}\n\nexport interface AgendaTrayProps\n extends\n Omit<HTMLAttributes<HTMLElement>, 'onClick' | 'id'>,\n VariantProps<typeof agendaTrayVariants> {\n /**\n * Stable instance id. Surfaced on the root as `data-component-id` so\n * an agent / MCP UI bridge can address this specific tray.\n */\n id?: string;\n items: AgendaItem[];\n /** Section title — rendered in the header. Localised by the consumer. */\n title?: string;\n /** Optional small caption (e.g. localised date) shown next to the title. */\n caption?: string;\n size?: 'sm' | 'md';\n onOpenAppointment?: (item: AgendaItem) => void;\n onAddAppointment?: () => void;\n /** Localised label for the \"Add\" affordance. */\n addLabel?: string;\n loading?: boolean;\n emptyTitle?: string;\n emptyDescription?: string;\n /** Optional CTA wired into the empty state (EmptyState primaryAction). */\n emptyAction?: { label: string; onClick: () => void };\n /**\n * Pinned footer link (e.g. \"All upcoming appointments\"). Localised by\n * the consumer; rendered after the list, before the section closes.\n */\n viewAllLabel?: string;\n /** Fires when the footer link is activated. Required to render it. */\n onViewAll?: () => void;\n /**\n * Per-row trailing action toolbar, forwarded to each AgendaCard's\n * `actions` slot.\n */\n renderItemActions?: (item: AgendaItem) => ReactNode;\n /**\n * Constrain the list to the tray's own height and scroll inside it —\n * pair with a height/max-height on `className`. The scroll region is\n * keyboard-focusable so it stays operable without a pointer.\n */\n scrollable?: boolean;\n}\n\n/* ------------------------------------------------------------------ */\n/* Component */\n/* ------------------------------------------------------------------ */\n\nexport const AgendaTray = forwardRef<HTMLElement, AgendaTrayProps>(\n (\n {\n id,\n items,\n title,\n caption,\n size = 'sm',\n onOpenAppointment,\n onAddAppointment,\n addLabel,\n loading = false,\n emptyTitle,\n emptyDescription,\n emptyAction,\n viewAllLabel,\n onViewAll,\n renderItemActions,\n scrollable = false,\n className,\n ...rest\n },\n ref,\n ) => {\n const { t } = useTranslation();\n const heading = title ?? t('agendaTray.title', \"Today's appointments\");\n const resolvedAddLabel = addLabel ?? t('agendaTray.add', 'Add appointment');\n const isEmpty = !loading && items.length === 0;\n\n let body: ReactNode;\n if (loading) {\n body = (\n <div className=\"ds:flex ds:flex-col ds:gap-[var(--spacing-sm)] ds:p-[var(--spacing-sm)]\">\n {[0, 1, 2].map((i) => (\n <Skeleton key={i} variant=\"rectangular\" height=\"2.5rem\" />\n ))}\n </div>\n );\n } else if (isEmpty) {\n body = (\n <div className=\"ds:p-[var(--spacing-md)]\">\n <EmptyState\n variant=\"first-use\"\n size=\"sm\"\n title={emptyTitle ?? t('agendaTray.empty.title', 'No appointments')}\n description={\n emptyDescription ??\n t(\n 'agendaTray.empty.description',\n 'New appointments will appear here.',\n )\n }\n primaryAction={emptyAction}\n />\n </div>\n );\n } else {\n body = (\n <ul\n className={[\n // flex-1 unconditionally so a footer pins to the tray's\n // bottom edge in equal-height grid rows.\n 'ds:flex ds:list-none ds:flex-col ds:flex-1 ds:min-h-0',\n // Keyboard-focusable when it scrolls (axe\n // scrollable-region-focusable) — pair with a height on the\n // tray's className.\n scrollable ? 'ds:overflow-y-auto' : '',\n ]\n .filter(Boolean)\n .join(' ')}\n // eslint-disable-next-line jsx-a11y/no-noninteractive-tabindex -- scrollable list must be keyboard focusable (axe scrollable-region-focusable)\n tabIndex={scrollable ? 0 : undefined}\n aria-label={scrollable ? heading : undefined}\n >\n {items.map((item) => (\n <AgendaCard\n key={item.id}\n item={item}\n size={size}\n onActivate={onOpenAppointment}\n actions={renderItemActions?.(item)}\n data-appointment-id={item.id}\n />\n ))}\n </ul>\n );\n }\n\n /* Curated imperative handle for agent integration. See\n * agenda-tray.agent.ts. */\n const itemsRef = useRef<AgendaItem[]>(items);\n itemsRef.current = items;\n\n const innerRef = useRef<HTMLElement>(null);\n useImperativeHandle(ref, () => innerRef.current as HTMLElement, []);\n\n const handle = useMemo<AgendaTrayHandle>(\n () => ({\n getItems: () =>\n itemsRef.current.map((i) => ({\n id: i.id,\n status: i.status ?? 'confirmed',\n })),\n selectItem: (targetId: string) => {\n const found = itemsRef.current.find((i) => i.id === targetId);\n if (found) onOpenAppointment?.(found);\n },\n }),\n [onOpenAppointment],\n );\n\n useAgentRegistration(agendaTrayAgent, handle, id);\n\n return (\n <section\n ref={innerRef}\n aria-label={heading}\n data-component=\"agenda-tray\"\n data-component-id={id}\n className={agendaTrayVariants({ size, className })}\n {...rest}\n >\n <header className=\"ds:flex ds:items-center ds:justify-between ds:gap-[var(--spacing-sm)] ds:p-[var(--spacing-sm)]\">\n <div className=\"ds:flex ds:flex-col ds:gap-[var(--spacing-2xs)] ds:min-w-0\">\n <h3 className=\"ds:m-0 ds:inline-flex ds:items-center ds:gap-[var(--spacing-xs)] type-title-card\">\n <CalendarDays aria-hidden=\"true\" className=\"ds:size-4\" />\n {heading}\n </h3>\n {caption ? (\n <span className=\"type-eyebrow ds:text-[color:var(--muted-foreground)]\">\n {caption}\n </span>\n ) : null}\n </div>\n {onAddAppointment ? (\n <IconButton\n icon={<Plus />}\n intent=\"outline\"\n size=\"sm\"\n aria-label={resolvedAddLabel}\n onClick={onAddAppointment}\n />\n ) : null}\n </header>\n {body}\n {viewAllLabel && onViewAll && !isEmpty && !loading ? (\n <footer className=\"ds:[border-block-start:var(--border-width-sm)_solid_var(--card-border)] ds:p-[var(--spacing-sm)]\">\n <button\n type=\"button\"\n onClick={onViewAll}\n className={[\n 'type-label ds:text-[color:var(--link)] ds:underline ds:underline-offset-2 ds:hover:no-underline',\n 'ds:rounded-[var(--radius-sm)] ds:min-h-[var(--min-target-size)] ds:ps-[var(--spacing-xs)] ds:pe-[var(--spacing-xs)]',\n 'ds:focus-visible:outline-[length:var(--focus-ring-width)] ds:focus-visible:outline-solid',\n 'ds:focus-visible:outline-[color:var(--ring)] ds:focus-visible:outline-offset-[length:var(--focus-ring-offset)]',\n 'ds:forced-colors:focus-visible:outline-[CanvasText]',\n ].join(' ')}\n >\n {viewAllLabel}\n </button>\n </footer>\n ) : null}\n </section>\n );\n },\n);\n\nAgendaTray.displayName = 'AgendaTray';\n"],"names":["agendaTrayAgent","handle","args","agendaTrayVariants","cva","AgendaTray","forwardRef","id","items","title","caption","size","onOpenAppointment","onAddAppointment","addLabel","loading","emptyTitle","emptyDescription","emptyAction","viewAllLabel","onViewAll","renderItemActions","scrollable","className","rest","ref","t","useTranslation","heading","resolvedAddLabel","isEmpty","body","jsx","i","Skeleton","EmptyState","item","AgendaCard","itemsRef","useRef","innerRef","useImperativeHandle","useMemo","targetId","found","useAgentRegistration","jsxs","CalendarDays","IconButton","Plus"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"agenda-tray-CGhEEnFE.js","sources":["../../src/components/agenda-tray/agenda-tray.agent.ts","../../src/components/agenda-tray/agenda-tray.tsx"],"sourcesContent":["/* -------------------------------------------------------------------- */\n/* Agent adapter — AgendaTray. */\n/* */\n/* Tray-level surface: read appointment ids + lifecycle status (never */\n/* patient names / treatments), and route an activation through the */\n/* curated handle. AgendaTray is in-page (no open/close). */\n/* -------------------------------------------------------------------- */\n\nimport type { AgentAdapter } from '../../agent/types';\nimport type { AgendaTrayHandle } from './agenda-tray';\n\nexport const agendaTrayAgent: AgentAdapter<AgendaTrayHandle> = {\n id: 'agenda-tray',\n // `pick` (NON-persisting): select_item activates / opens an appointment by\n // firing onOpenAppointment — it does not store a \"selected\" value on the tray\n // (there is no selection state slot), so this is a pick, not select_single.\n capabilities: ['pick'],\n state: {\n items: {\n type: 'Array<{ id: string; status: string }>',\n descriptionKey: 'ui.agent.agendaTray.state.items',\n description:\n 'Currently-displayed appointments. Ids + status only — never patient identity.',\n read: (handle) => handle.getItems(),\n },\n },\n actions: {\n select_item: {\n // Activates (opens) an appointment — pure navigation, no data mutation.\n safety: 'read',\n argsType: '{ id: string }',\n argsSchema: {\n type: 'object',\n properties: { id: { type: 'string' } },\n required: ['id'],\n },\n descriptionKey: 'ui.agent.agendaTray.actions.selectItem',\n description: 'Activate the appointment with the given id.',\n examples: [\n { args: { id: 'appt-204' }, note: 'Open appointment appt-204.' },\n ],\n invoke: (handle, args: { id: string }) => {\n handle.selectItem(args.id);\n },\n },\n },\n domHooks: {\n root: {\n attr: 'data-component',\n value: 'agenda-tray',\n description: 'Marks the AgendaTray wrapper.',\n },\n instanceId: {\n attr: 'data-component-id',\n sourceProp: 'id',\n description:\n 'Sourced from the id prop. Required to address a specific tray from the agent.',\n },\n item: {\n attr: 'data-appointment-id',\n description:\n 'Stable appointment id emitted on each rendered AgendaCard inside the tray.',\n },\n },\n};\n","import {\n forwardRef,\n useImperativeHandle,\n useMemo,\n useRef,\n type HTMLAttributes,\n type ReactNode,\n} from 'react';\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport { useTranslation } from 'react-i18next';\nimport { CalendarDays, Plus } from 'lucide-react';\nimport { IconButton } from '../button/icon-button';\nimport { Skeleton } from '../skeleton/skeleton';\nimport { EmptyState } from '../empty-state/empty-state';\nimport { AgendaCard, type AgendaItem } from '../agenda-card';\nimport { useAgentRegistration } from '../../agent/registry';\nimport { agendaTrayAgent } from './agenda-tray.agent';\n\n/* ------------------------------------------------------------------ */\n/* CVA */\n/* ------------------------------------------------------------------ */\n\nconst agendaTrayVariants = cva(\n [\n 'ds:flex ds:flex-col',\n 'ds:rounded-[var(--radius-md)] ds:shadow-[var(--shadow-card)]',\n 'ds:border ds:border-[color:var(--card-border)] ds:[.theme-accessible_&]:border-2',\n 'ds:bg-[color:var(--card)] ds:text-[color:var(--card-foreground)]',\n 'ds:overflow-hidden',\n ].join(' '),\n {\n variants: {\n size: {\n sm: '',\n md: '',\n },\n },\n defaultVariants: {\n size: 'sm',\n },\n },\n);\n\n/* ------------------------------------------------------------------ */\n/* Types */\n/* ------------------------------------------------------------------ */\n\n/**\n * Curated imperative handle for AgendaTray. Exposed as the forwardRef\n * target so a future agent / MCP UI bridge can drive the tray without\n * touching the DOM. See `agenda-tray.agent.ts`.\n */\nexport interface AgendaTrayHandle {\n getItems: () => Array<{ id: string; status: string }>;\n selectItem: (id: string) => void;\n}\n\nexport interface AgendaTrayProps\n extends\n Omit<HTMLAttributes<HTMLElement>, 'onClick' | 'id'>,\n VariantProps<typeof agendaTrayVariants> {\n /**\n * Stable instance id. Surfaced on the root as `data-component-id` so\n * an agent / MCP UI bridge can address this specific tray.\n */\n id?: string;\n items: AgendaItem[];\n /** Section title — rendered in the header. Localised by the consumer. */\n title?: string;\n /** Optional small caption (e.g. localised date) shown next to the title. */\n caption?: string;\n size?: 'sm' | 'md';\n onOpenAppointment?: (item: AgendaItem) => void;\n onAddAppointment?: () => void;\n /** Localised label for the \"Add\" affordance. */\n addLabel?: string;\n loading?: boolean;\n emptyTitle?: string;\n emptyDescription?: string;\n /** Optional CTA wired into the empty state (EmptyState primaryAction). */\n emptyAction?: { label: string; onClick: () => void };\n /**\n * Pinned footer link (e.g. \"All upcoming appointments\"). Localised by\n * the consumer; rendered after the list, before the section closes.\n */\n viewAllLabel?: string;\n /** Fires when the footer link is activated. Required to render it. */\n onViewAll?: () => void;\n /**\n * Per-row trailing action toolbar, forwarded to each AgendaCard's\n * `actions` slot.\n */\n renderItemActions?: (item: AgendaItem) => ReactNode;\n /**\n * Constrain the list to the tray's own height and scroll inside it —\n * pair with a height/max-height on `className`. The scroll region is\n * keyboard-focusable so it stays operable without a pointer.\n */\n scrollable?: boolean;\n}\n\n/* ------------------------------------------------------------------ */\n/* Component */\n/* ------------------------------------------------------------------ */\n\nexport const AgendaTray = forwardRef<HTMLElement, AgendaTrayProps>(\n (\n {\n id,\n items,\n title,\n caption,\n size = 'sm',\n onOpenAppointment,\n onAddAppointment,\n addLabel,\n loading = false,\n emptyTitle,\n emptyDescription,\n emptyAction,\n viewAllLabel,\n onViewAll,\n renderItemActions,\n scrollable = false,\n className,\n ...rest\n },\n ref,\n ) => {\n const { t } = useTranslation();\n const heading = title ?? t('agendaTray.title', \"Today's appointments\");\n const resolvedAddLabel = addLabel ?? t('agendaTray.add', 'Add appointment');\n const isEmpty = !loading && items.length === 0;\n\n let body: ReactNode;\n if (loading) {\n body = (\n <div className=\"ds:flex ds:flex-col ds:gap-[var(--spacing-sm)] ds:p-[var(--spacing-sm)]\">\n {[0, 1, 2].map((i) => (\n <Skeleton key={i} variant=\"rectangular\" height=\"2.5rem\" />\n ))}\n </div>\n );\n } else if (isEmpty) {\n body = (\n <div className=\"ds:p-[var(--spacing-md)]\">\n <EmptyState\n variant=\"first-use\"\n size=\"sm\"\n title={emptyTitle ?? t('agendaTray.empty.title', 'No appointments')}\n description={\n emptyDescription ??\n t(\n 'agendaTray.empty.description',\n 'New appointments will appear here.',\n )\n }\n primaryAction={emptyAction}\n />\n </div>\n );\n } else {\n body = (\n <ul\n className={[\n // flex-1 unconditionally so a footer pins to the tray's\n // bottom edge in equal-height grid rows.\n 'ds:flex ds:list-none ds:flex-col ds:flex-1 ds:min-h-0',\n // Keyboard-focusable when it scrolls (axe\n // scrollable-region-focusable) — pair with a height on the\n // tray's className.\n scrollable ? 'ds:overflow-y-auto' : '',\n ]\n .filter(Boolean)\n .join(' ')}\n // eslint-disable-next-line jsx-a11y/no-noninteractive-tabindex -- scrollable list must be keyboard focusable (axe scrollable-region-focusable)\n tabIndex={scrollable ? 0 : undefined}\n aria-label={scrollable ? heading : undefined}\n >\n {items.map((item) => (\n <AgendaCard\n key={item.id}\n item={item}\n size={size}\n onActivate={onOpenAppointment}\n actions={renderItemActions?.(item)}\n data-appointment-id={item.id}\n />\n ))}\n </ul>\n );\n }\n\n /* Curated imperative handle for agent integration. See\n * agenda-tray.agent.ts. */\n const itemsRef = useRef<AgendaItem[]>(items);\n itemsRef.current = items;\n\n const innerRef = useRef<HTMLElement>(null);\n useImperativeHandle(ref, () => innerRef.current as HTMLElement, []);\n\n const handle = useMemo<AgendaTrayHandle>(\n () => ({\n getItems: () =>\n itemsRef.current.map((i) => ({\n id: i.id,\n status: i.status ?? 'confirmed',\n })),\n selectItem: (targetId: string) => {\n const found = itemsRef.current.find((i) => i.id === targetId);\n if (found) onOpenAppointment?.(found);\n },\n }),\n [onOpenAppointment],\n );\n\n useAgentRegistration(agendaTrayAgent, handle, id);\n\n return (\n <section\n ref={innerRef}\n aria-label={heading}\n data-component=\"agenda-tray\"\n data-component-id={id}\n className={agendaTrayVariants({ size, className })}\n {...rest}\n >\n <header className=\"ds:flex ds:items-center ds:justify-between ds:gap-[var(--spacing-sm)] ds:p-[var(--spacing-sm)]\">\n <div className=\"ds:flex ds:flex-col ds:gap-[var(--spacing-2xs)] ds:min-w-0\">\n <h3 className=\"ds:m-0 ds:inline-flex ds:items-center ds:gap-[var(--spacing-xs)] type-title-card\">\n <CalendarDays aria-hidden=\"true\" className=\"ds:size-4\" />\n {heading}\n </h3>\n {caption ? (\n <span className=\"type-eyebrow ds:text-[color:var(--muted-foreground)]\">\n {caption}\n </span>\n ) : null}\n </div>\n {onAddAppointment ? (\n <IconButton\n icon={<Plus />}\n intent=\"outline\"\n size=\"sm\"\n aria-label={resolvedAddLabel}\n onClick={onAddAppointment}\n />\n ) : null}\n </header>\n {body}\n {viewAllLabel && onViewAll && !isEmpty && !loading ? (\n <footer className=\"ds:[border-block-start:var(--border-width-sm)_solid_var(--card-border)] ds:p-[var(--spacing-sm)]\">\n <button\n type=\"button\"\n onClick={onViewAll}\n className={[\n 'type-label ds:text-[color:var(--link)] ds:underline ds:underline-offset-2 ds:hover:no-underline',\n 'ds:rounded-[var(--radius-sm)] ds:min-h-[var(--min-target-size)] ds:ps-[var(--spacing-xs)] ds:pe-[var(--spacing-xs)]',\n 'ds:focus-visible:outline-[length:var(--focus-ring-width)] ds:focus-visible:outline-solid',\n 'ds:focus-visible:outline-[color:var(--ring)] ds:focus-visible:outline-offset-[length:var(--focus-ring-offset)]',\n 'ds:forced-colors:focus-visible:outline-[CanvasText]',\n ].join(' ')}\n >\n {viewAllLabel}\n </button>\n </footer>\n ) : null}\n </section>\n );\n },\n);\n\nAgendaTray.displayName = 'AgendaTray';\n"],"names":["agendaTrayAgent","handle","args","agendaTrayVariants","cva","AgendaTray","forwardRef","id","items","title","caption","size","onOpenAppointment","onAddAppointment","addLabel","loading","emptyTitle","emptyDescription","emptyAction","viewAllLabel","onViewAll","renderItemActions","scrollable","className","rest","ref","t","useTranslation","heading","resolvedAddLabel","isEmpty","body","jsx","i","Skeleton","EmptyState","item","AgendaCard","itemsRef","useRef","innerRef","useImperativeHandle","useMemo","targetId","found","useAgentRegistration","jsxs","CalendarDays","IconButton","Plus"],"mappings":"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"}
|
|
@@ -2,9 +2,9 @@ import { jsxs as d, jsx as n } from "react/jsx-runtime";
|
|
|
2
2
|
import { forwardRef as f } from "react";
|
|
3
3
|
import { c as v } from "./index-D2ZczOXr.js";
|
|
4
4
|
import { useTranslation as x } from "react-i18next";
|
|
5
|
-
import { B as l } from "./button-
|
|
5
|
+
import { B as l } from "./button-CYPx2xFq.js";
|
|
6
6
|
import { P as y } from "./progress-CK8otcQ-.js";
|
|
7
|
-
import { H as o } from "./hover-card-
|
|
7
|
+
import { H as o } from "./hover-card-BM0vNmq4.js";
|
|
8
8
|
const w = v("ds:flex ds:flex-col ds:items-start", {
|
|
9
9
|
variants: {
|
|
10
10
|
mode: {
|
|
@@ -87,4 +87,4 @@ k.displayName = "AiCreditsNotice";
|
|
|
87
87
|
export {
|
|
88
88
|
k as A
|
|
89
89
|
};
|
|
90
|
-
//# sourceMappingURL=ai-credits-notice-
|
|
90
|
+
//# sourceMappingURL=ai-credits-notice-C9K_ley1.js.map
|
package/dist/_chunks/{ai-credits-notice-C-kz_RrY.js.map → ai-credits-notice-C9K_ley1.js.map}
RENAMED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ai-credits-notice-C-kz_RrY.js","sources":["../../src/components/ai-credits-notice/ai-credits-notice.tsx"],"sourcesContent":["import { forwardRef, type HTMLAttributes } from 'react';\nimport { cva } from 'class-variance-authority';\nimport { useTranslation } from 'react-i18next';\nimport { Button } from '../button';\nimport { Progress } from '../progress';\nimport { HoverCard } from '../hover-card';\n\n/* -------------------------------------------------------------------- */\n/* AiCreditsNotice */\n/* */\n/* The body of the hover card every AI action trigger in the kit shows: */\n/* AI features cost nothing extra today ('included'), or — once paid */\n/* credit bundles ship with a free tier underneath — a nudge toward */\n/* them ('bundles'). The host decides which by passing `mode`; nothing */\n/* here reaches a backend or owns the upsell page itself — `onViewBundles` */\n/* is a seam, not a router. */\n/* */\n/* Renders INSIDE a `HoverCard.Content` (it uses `HoverCard.Eyebrow` / */\n/* `.Heading` / `.Body` / `.Footer`, the same composition `AppointmentPeek` */\n/* uses) — it never renders its own `HoverCard.Root`/`Trigger`. Callers */\n/* wrap it: `<HoverCard><HoverCard.Trigger asChild>{button}</HoverCard.Trigger>` */\n/* `<HoverCard.Content side=\"bottom\" align=\"start\" size=\"sm\"><AiCreditsNotice … /></HoverCard.Content></HoverCard>`. */\n/* -------------------------------------------------------------------- */\n\nconst rootVariants = cva('ds:flex ds:flex-col ds:items-start', {\n variants: {\n mode: {\n included: '',\n bundles: '',\n },\n },\n defaultVariants: {\n mode: 'included',\n },\n});\n\n/** The practice's current AI allowance, when the host tracks one. */\nexport interface AiCreditsNoticeAllowance {\n /** AI actions left in the current period. */\n remaining: number;\n /** The monthly cap. */\n limit: number;\n /** When the allowance next resets. Omit if unknown. */\n resetsOn?: Date;\n}\n\ninterface AiCreditsNoticeSharedProps {\n /**\n * The practice's current AI allowance. In `included` mode it renders as an\n * optional usage line + meter; in `bundles` mode it drives the heading\n * (\"{{remaining}} of {{limit}} credits\") and the free-tier line in the\n * body. Omit either mode's allowance to fall back to a generic line.\n */\n allowance?: AiCreditsNoticeAllowance;\n className?: string;\n}\n\nexport interface AiCreditsNoticeIncludedProps extends AiCreditsNoticeSharedProps {\n mode: 'included';\n /** Shows a quiet \"Learn more\" link — wire it once the credits upsell page ships. */\n onLearnMore?: () => void;\n /**\n * Shows a quiet \"Don't show again\" link. The host decides what \"again\"\n * means — typically stop rendering `aiCreditsNotice` on the editor for the\n * rest of this mount, and persist the choice if it should survive a\n * reload (see the component's docs for a `usePersistentState` example).\n * Use a storage key scoped to the mode: switching from `included` to\n * `bundles` is a different message and should show once more.\n */\n onDismiss?: () => void;\n}\n\nexport interface AiCreditsNoticeBundlesProps extends AiCreditsNoticeSharedProps {\n mode: 'bundles';\n /** Opens the host's AI-credits bundle picker. The kit never builds that page itself. */\n onViewBundles: () => void;\n /** Shows a quiet \"What each action costs\" link. */\n onSeeCosts?: () => void;\n /** Shows a quiet \"Don't show again\" link. See the `included` prop of the\n * same name — the same mode-scoped-key guidance applies here too. */\n onDismiss?: () => void;\n}\n\nexport type AiCreditsNoticeProps =\n | AiCreditsNoticeIncludedProps\n | AiCreditsNoticeBundlesProps;\n\n/* Every callback either mode can carry, all optional at once. The footer\n reads them from `props`; this shape exists only so the component can\n destructure them OUT of the `rest` it spreads onto the root `<div>`.\n React resolves any `on[A-Z]…` prop as a DOM event, so leaving them in\n `rest` logged \"Unknown event handler property: onLearnMore\" (and one per\n sibling) on every render — and the editor renders this card on every AI\n trigger, so the warnings repeated on every hover (caught in review on\n #180). A cast, not four narrowed reads: `props` is a discriminated union\n and TypeScript refuses `onViewBundles` off the `included` arm. */\ntype AiCreditsNoticeCallbacks = Partial<\n Pick<AiCreditsNoticeIncludedProps, 'onLearnMore' | 'onDismiss'> &\n Pick<AiCreditsNoticeBundlesProps, 'onViewBundles' | 'onSeeCosts'>\n>;\n\nexport const AiCreditsNotice = forwardRef<\n HTMLDivElement,\n AiCreditsNoticeProps & Omit<HTMLAttributes<HTMLDivElement>, 'className'>\n>((props, ref) => {\n const { t, i18n } = useTranslation();\n // Two steps, not one. The first reads straight off `props` so that\n // `mode === 'included'` below still narrows `props` itself (TypeScript's\n // aliased-discriminant narrowing) — destructuring off a cast breaks that\n // link and the footer's `props.onLearnMore` stops compiling. The second\n // strips the callbacks out of what is left, so `rest` reaches the DOM node\n // carrying only real HTML attributes. See `AiCreditsNoticeCallbacks`.\n const { allowance, className, mode, ...restWithCallbacks } = props;\n const {\n onLearnMore: _onLearnMore,\n onDismiss: _onDismiss,\n onViewBundles: _onViewBundles,\n onSeeCosts: _onSeeCosts,\n ...rest\n } = restWithCallbacks as typeof restWithCallbacks & AiCreditsNoticeCallbacks;\n\n // A `limit` of 0 (a host still loading, or a plan with no allowance at\n // all) would divide by zero in the Progress meter — treat it the same as\n // no allowance rather than rendering a broken 0/0 meter.\n const hasUsableAllowance = Boolean(allowance && allowance.limit > 0);\n\n const resetsOnText =\n hasUsableAllowance && allowance?.resetsOn\n ? new Intl.DateTimeFormat(i18n.language, {\n day: 'numeric',\n month: 'long',\n }).format(allowance.resetsOn)\n : undefined;\n\n const allowanceLine = hasUsableAllowance\n ? t('aiCreditsNotice.included.allowance', {\n remaining: allowance!.remaining,\n limit: allowance!.limit,\n })\n : undefined;\n\n // `hasUsableAllowance`, not a bare `allowance` check: a host still loading\n // sends `{ remaining: 0, limit: 0 }`, which read literally becomes \"0 of 0\n // credits\" and \"the free tier includes 0 actions a month\" — two sentences\n // that are wrong rather than merely vague. `included` already treated a\n // zero limit as no allowance; `bundles` now agrees and falls back to the\n // generic lines (caught in review on #180).\n const heading =\n mode === 'included'\n ? t('aiCreditsNotice.included.heading')\n : hasUsableAllowance\n ? t('aiCreditsNotice.bundles.headingWithAllowance', {\n remaining: allowance!.remaining,\n limit: allowance!.limit,\n })\n : t('aiCreditsNotice.bundles.eyebrow');\n\n const body =\n mode === 'included'\n ? t('aiCreditsNotice.included.body')\n : hasUsableAllowance\n ? t('aiCreditsNotice.bundles.body', { limit: allowance!.limit })\n : t('aiCreditsNotice.bundles.bodyGeneric');\n\n return (\n <div\n {...rest}\n ref={ref}\n // AFTER `rest`, not before: these are the required agent-readiness DOM\n // hooks (see 26-agent-readiness.mdx §A3) and must always win over\n // anything a caller passes through the HTMLAttributes spread — a\n // caller-supplied `data-component` must never be able to replace the\n // component's own marker.\n data-component=\"ai-credits-notice\"\n data-mode={mode}\n className={rootVariants({ mode, className })}\n >\n <HoverCard.Eyebrow>\n {mode === 'included'\n ? t('aiCreditsNotice.included.eyebrow')\n : t('aiCreditsNotice.bundles.eyebrow')}\n </HoverCard.Eyebrow>\n <HoverCard.Heading>{heading}</HoverCard.Heading>\n <HoverCard.Body>\n <p className=\"ds:m-0\">{body}</p>\n {mode === 'included' && hasUsableAllowance ? (\n <div className=\"ds:flex ds:flex-col ds:gap-[var(--spacing-2xs)] ds:[margin-block-start:var(--spacing-sm)]\">\n <div className=\"ds:flex ds:items-center ds:gap-[var(--spacing-xs)]\">\n <span className=\"type-label\">{allowanceLine}</span>\n </div>\n <Progress\n value={Math.max(0, allowance!.limit - allowance!.remaining)}\n max={allowance!.limit}\n size=\"sm\"\n ariaLabel={t('aiCreditsNotice.included.eyebrow')}\n ariaValueText={allowanceLine}\n />\n {resetsOnText ? (\n <p className=\"ds:m-0 type-body-sm ds:text-[color:var(--muted-foreground)]\">\n {t('aiCreditsNotice.included.resetsOn', { date: resetsOnText })}\n </p>\n ) : null}\n </div>\n ) : null}\n </HoverCard.Body>\n {mode === 'included' ? (\n props.onLearnMore || props.onDismiss ? (\n <HoverCard.Footer>\n {props.onDismiss ? (\n <Button\n intent=\"link\"\n size=\"sm\"\n onClick={props.onDismiss}\n className=\"ds:me-auto\"\n >\n {t('aiCreditsNotice.dismiss')}\n </Button>\n ) : null}\n {props.onLearnMore ? (\n <Button intent=\"link\" size=\"sm\" onClick={props.onLearnMore}>\n {t('aiCreditsNotice.included.learnMore')}\n </Button>\n ) : null}\n </HoverCard.Footer>\n ) : null\n ) : (\n <HoverCard.Footer>\n {props.onSeeCosts || props.onDismiss ? (\n <div className=\"ds:me-auto ds:flex ds:items-center ds:gap-[var(--spacing-sm)]\">\n {props.onSeeCosts ? (\n <Button intent=\"link\" size=\"sm\" onClick={props.onSeeCosts}>\n {t('aiCreditsNotice.bundles.seeCosts')}\n </Button>\n ) : null}\n {props.onDismiss ? (\n <Button intent=\"link\" size=\"sm\" onClick={props.onDismiss}>\n {t('aiCreditsNotice.dismiss')}\n </Button>\n ) : null}\n </div>\n ) : null}\n <Button intent=\"tonal\" size=\"sm\" onClick={props.onViewBundles}>\n {t('aiCreditsNotice.bundles.viewBundles')}\n </Button>\n </HoverCard.Footer>\n )}\n </div>\n );\n});\nAiCreditsNotice.displayName = 'AiCreditsNotice';\n"],"names":["rootVariants","cva","AiCreditsNotice","forwardRef","props","ref","t","i18n","useTranslation","allowance","className","mode","restWithCallbacks","_onLearnMore","_onDismiss","_onViewBundles","_onSeeCosts","rest","hasUsableAllowance","resetsOnText","allowanceLine","heading","body","jsxs","jsx","HoverCard","Progress","Button"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"ai-credits-notice-C9K_ley1.js","sources":["../../src/components/ai-credits-notice/ai-credits-notice.tsx"],"sourcesContent":["import { forwardRef, type HTMLAttributes } from 'react';\nimport { cva } from 'class-variance-authority';\nimport { useTranslation } from 'react-i18next';\nimport { Button } from '../button';\nimport { Progress } from '../progress';\nimport { HoverCard } from '../hover-card';\n\n/* -------------------------------------------------------------------- */\n/* AiCreditsNotice */\n/* */\n/* The body of the hover card every AI action trigger in the kit shows: */\n/* AI features cost nothing extra today ('included'), or — once paid */\n/* credit bundles ship with a free tier underneath — a nudge toward */\n/* them ('bundles'). The host decides which by passing `mode`; nothing */\n/* here reaches a backend or owns the upsell page itself — `onViewBundles` */\n/* is a seam, not a router. */\n/* */\n/* Renders INSIDE a `HoverCard.Content` (it uses `HoverCard.Eyebrow` / */\n/* `.Heading` / `.Body` / `.Footer`, the same composition `AppointmentPeek` */\n/* uses) — it never renders its own `HoverCard.Root`/`Trigger`. Callers */\n/* wrap it: `<HoverCard><HoverCard.Trigger asChild>{button}</HoverCard.Trigger>` */\n/* `<HoverCard.Content side=\"bottom\" align=\"start\" size=\"sm\"><AiCreditsNotice … /></HoverCard.Content></HoverCard>`. */\n/* -------------------------------------------------------------------- */\n\nconst rootVariants = cva('ds:flex ds:flex-col ds:items-start', {\n variants: {\n mode: {\n included: '',\n bundles: '',\n },\n },\n defaultVariants: {\n mode: 'included',\n },\n});\n\n/** The practice's current AI allowance, when the host tracks one. */\nexport interface AiCreditsNoticeAllowance {\n /** AI actions left in the current period. */\n remaining: number;\n /** The monthly cap. */\n limit: number;\n /** When the allowance next resets. Omit if unknown. */\n resetsOn?: Date;\n}\n\ninterface AiCreditsNoticeSharedProps {\n /**\n * The practice's current AI allowance. In `included` mode it renders as an\n * optional usage line + meter; in `bundles` mode it drives the heading\n * (\"{{remaining}} of {{limit}} credits\") and the free-tier line in the\n * body. Omit either mode's allowance to fall back to a generic line.\n */\n allowance?: AiCreditsNoticeAllowance;\n className?: string;\n}\n\nexport interface AiCreditsNoticeIncludedProps extends AiCreditsNoticeSharedProps {\n mode: 'included';\n /** Shows a quiet \"Learn more\" link — wire it once the credits upsell page ships. */\n onLearnMore?: () => void;\n /**\n * Shows a quiet \"Don't show again\" link. The host decides what \"again\"\n * means — typically stop rendering `aiCreditsNotice` on the editor for the\n * rest of this mount, and persist the choice if it should survive a\n * reload (see the component's docs for a `usePersistentState` example).\n * Use a storage key scoped to the mode: switching from `included` to\n * `bundles` is a different message and should show once more.\n */\n onDismiss?: () => void;\n}\n\nexport interface AiCreditsNoticeBundlesProps extends AiCreditsNoticeSharedProps {\n mode: 'bundles';\n /** Opens the host's AI-credits bundle picker. The kit never builds that page itself. */\n onViewBundles: () => void;\n /** Shows a quiet \"What each action costs\" link. */\n onSeeCosts?: () => void;\n /** Shows a quiet \"Don't show again\" link. See the `included` prop of the\n * same name — the same mode-scoped-key guidance applies here too. */\n onDismiss?: () => void;\n}\n\nexport type AiCreditsNoticeProps =\n | AiCreditsNoticeIncludedProps\n | AiCreditsNoticeBundlesProps;\n\n/* Every callback either mode can carry, all optional at once. The footer\n reads them from `props`; this shape exists only so the component can\n destructure them OUT of the `rest` it spreads onto the root `<div>`.\n React resolves any `on[A-Z]…` prop as a DOM event, so leaving them in\n `rest` logged \"Unknown event handler property: onLearnMore\" (and one per\n sibling) on every render — and the editor renders this card on every AI\n trigger, so the warnings repeated on every hover (caught in review on\n #180). A cast, not four narrowed reads: `props` is a discriminated union\n and TypeScript refuses `onViewBundles` off the `included` arm. */\ntype AiCreditsNoticeCallbacks = Partial<\n Pick<AiCreditsNoticeIncludedProps, 'onLearnMore' | 'onDismiss'> &\n Pick<AiCreditsNoticeBundlesProps, 'onViewBundles' | 'onSeeCosts'>\n>;\n\nexport const AiCreditsNotice = forwardRef<\n HTMLDivElement,\n AiCreditsNoticeProps & Omit<HTMLAttributes<HTMLDivElement>, 'className'>\n>((props, ref) => {\n const { t, i18n } = useTranslation();\n // Two steps, not one. The first reads straight off `props` so that\n // `mode === 'included'` below still narrows `props` itself (TypeScript's\n // aliased-discriminant narrowing) — destructuring off a cast breaks that\n // link and the footer's `props.onLearnMore` stops compiling. The second\n // strips the callbacks out of what is left, so `rest` reaches the DOM node\n // carrying only real HTML attributes. See `AiCreditsNoticeCallbacks`.\n const { allowance, className, mode, ...restWithCallbacks } = props;\n const {\n onLearnMore: _onLearnMore,\n onDismiss: _onDismiss,\n onViewBundles: _onViewBundles,\n onSeeCosts: _onSeeCosts,\n ...rest\n } = restWithCallbacks as typeof restWithCallbacks & AiCreditsNoticeCallbacks;\n\n // A `limit` of 0 (a host still loading, or a plan with no allowance at\n // all) would divide by zero in the Progress meter — treat it the same as\n // no allowance rather than rendering a broken 0/0 meter.\n const hasUsableAllowance = Boolean(allowance && allowance.limit > 0);\n\n const resetsOnText =\n hasUsableAllowance && allowance?.resetsOn\n ? new Intl.DateTimeFormat(i18n.language, {\n day: 'numeric',\n month: 'long',\n }).format(allowance.resetsOn)\n : undefined;\n\n const allowanceLine = hasUsableAllowance\n ? t('aiCreditsNotice.included.allowance', {\n remaining: allowance!.remaining,\n limit: allowance!.limit,\n })\n : undefined;\n\n // `hasUsableAllowance`, not a bare `allowance` check: a host still loading\n // sends `{ remaining: 0, limit: 0 }`, which read literally becomes \"0 of 0\n // credits\" and \"the free tier includes 0 actions a month\" — two sentences\n // that are wrong rather than merely vague. `included` already treated a\n // zero limit as no allowance; `bundles` now agrees and falls back to the\n // generic lines (caught in review on #180).\n const heading =\n mode === 'included'\n ? t('aiCreditsNotice.included.heading')\n : hasUsableAllowance\n ? t('aiCreditsNotice.bundles.headingWithAllowance', {\n remaining: allowance!.remaining,\n limit: allowance!.limit,\n })\n : t('aiCreditsNotice.bundles.eyebrow');\n\n const body =\n mode === 'included'\n ? t('aiCreditsNotice.included.body')\n : hasUsableAllowance\n ? t('aiCreditsNotice.bundles.body', { limit: allowance!.limit })\n : t('aiCreditsNotice.bundles.bodyGeneric');\n\n return (\n <div\n {...rest}\n ref={ref}\n // AFTER `rest`, not before: these are the required agent-readiness DOM\n // hooks (see 26-agent-readiness.mdx §A3) and must always win over\n // anything a caller passes through the HTMLAttributes spread — a\n // caller-supplied `data-component` must never be able to replace the\n // component's own marker.\n data-component=\"ai-credits-notice\"\n data-mode={mode}\n className={rootVariants({ mode, className })}\n >\n <HoverCard.Eyebrow>\n {mode === 'included'\n ? t('aiCreditsNotice.included.eyebrow')\n : t('aiCreditsNotice.bundles.eyebrow')}\n </HoverCard.Eyebrow>\n <HoverCard.Heading>{heading}</HoverCard.Heading>\n <HoverCard.Body>\n <p className=\"ds:m-0\">{body}</p>\n {mode === 'included' && hasUsableAllowance ? (\n <div className=\"ds:flex ds:flex-col ds:gap-[var(--spacing-2xs)] ds:[margin-block-start:var(--spacing-sm)]\">\n <div className=\"ds:flex ds:items-center ds:gap-[var(--spacing-xs)]\">\n <span className=\"type-label\">{allowanceLine}</span>\n </div>\n <Progress\n value={Math.max(0, allowance!.limit - allowance!.remaining)}\n max={allowance!.limit}\n size=\"sm\"\n ariaLabel={t('aiCreditsNotice.included.eyebrow')}\n ariaValueText={allowanceLine}\n />\n {resetsOnText ? (\n <p className=\"ds:m-0 type-body-sm ds:text-[color:var(--muted-foreground)]\">\n {t('aiCreditsNotice.included.resetsOn', { date: resetsOnText })}\n </p>\n ) : null}\n </div>\n ) : null}\n </HoverCard.Body>\n {mode === 'included' ? (\n props.onLearnMore || props.onDismiss ? (\n <HoverCard.Footer>\n {props.onDismiss ? (\n <Button\n intent=\"link\"\n size=\"sm\"\n onClick={props.onDismiss}\n className=\"ds:me-auto\"\n >\n {t('aiCreditsNotice.dismiss')}\n </Button>\n ) : null}\n {props.onLearnMore ? (\n <Button intent=\"link\" size=\"sm\" onClick={props.onLearnMore}>\n {t('aiCreditsNotice.included.learnMore')}\n </Button>\n ) : null}\n </HoverCard.Footer>\n ) : null\n ) : (\n <HoverCard.Footer>\n {props.onSeeCosts || props.onDismiss ? (\n <div className=\"ds:me-auto ds:flex ds:items-center ds:gap-[var(--spacing-sm)]\">\n {props.onSeeCosts ? (\n <Button intent=\"link\" size=\"sm\" onClick={props.onSeeCosts}>\n {t('aiCreditsNotice.bundles.seeCosts')}\n </Button>\n ) : null}\n {props.onDismiss ? (\n <Button intent=\"link\" size=\"sm\" onClick={props.onDismiss}>\n {t('aiCreditsNotice.dismiss')}\n </Button>\n ) : null}\n </div>\n ) : null}\n <Button intent=\"tonal\" size=\"sm\" onClick={props.onViewBundles}>\n {t('aiCreditsNotice.bundles.viewBundles')}\n </Button>\n </HoverCard.Footer>\n )}\n </div>\n );\n});\nAiCreditsNotice.displayName = 'AiCreditsNotice';\n"],"names":["rootVariants","cva","AiCreditsNotice","forwardRef","props","ref","t","i18n","useTranslation","allowance","className","mode","restWithCallbacks","_onLearnMore","_onDismiss","_onViewBundles","_onSeeCosts","rest","hasUsableAllowance","resetsOnText","allowanceLine","heading","body","jsxs","jsx","HoverCard","Progress","Button"],"mappings":"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"}
|
|
@@ -4,7 +4,7 @@ import { c as R } from "./index-D2ZczOXr.js";
|
|
|
4
4
|
import { useTranslation as w } from "react-i18next";
|
|
5
5
|
import { A as d } from "./alert-CiQ5Pa3Q.js";
|
|
6
6
|
import { B as T } from "./badge-BAkd6_Pj.js";
|
|
7
|
-
import { B as V } from "./button-
|
|
7
|
+
import { B as V } from "./button-CYPx2xFq.js";
|
|
8
8
|
import { C as j } from "./checkbox-CZkipDn7.js";
|
|
9
9
|
import { S as z } from "./spinner-hbwuKwMf.js";
|
|
10
10
|
import { T as G } from "./timestamp-BV2lC-wV.js";
|
|
@@ -168,4 +168,4 @@ export {
|
|
|
168
168
|
D as A,
|
|
169
169
|
M as a
|
|
170
170
|
};
|
|
171
|
-
//# sourceMappingURL=ai-permission-notice-
|
|
171
|
+
//# sourceMappingURL=ai-permission-notice-DMG1o4Qa.js.map
|
package/dist/_chunks/{ai-permission-notice-BRZeS3mT.js.map → ai-permission-notice-DMG1o4Qa.js.map}
RENAMED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ai-permission-notice-BRZeS3mT.js","sources":["../../src/components/ai-permission-notice/ai-permission-notice.agent.ts","../../src/components/ai-permission-notice/ai-permission-notice.tsx"],"sourcesContent":["/* -------------------------------------------------------------------- */\n/* Agent adapter — AiConsentBanner. */\n/* */\n/* Read-only structural surface: the current consent state and whether */\n/* the grant affordance is armed. Identifiers / structural state ONLY — */\n/* never the grantee's name or any PHI. The real consent gate lives */\n/* server-side; this adapter does not expose a grant action so an agent */\n/* cannot consent on a user's behalf. */\n/* -------------------------------------------------------------------- */\n\nimport type { AgentAdapter } from '../../agent/types';\nimport type { AiConsentBannerHandle } from './ai-permission-notice';\n\nexport const aiConsentBannerAgent: AgentAdapter<AiConsentBannerHandle> = {\n id: 'ai-consent-banner',\n capabilities: [],\n state: {\n consentState: {\n type: \"'granted' | 'required' | 'pending'\",\n descriptionKey: 'ui.agent.aiConsentBanner.state.consentState',\n description:\n 'Current consent state. Structural only — never the grantee identity.',\n read: (handle) => handle.getState(),\n },\n armed: {\n type: 'boolean',\n descriptionKey: 'ui.agent.aiConsentBanner.state.armed',\n description:\n 'Whether the consent confirmation checkbox is ticked (required state only).',\n read: (handle) => handle.isArmed(),\n },\n },\n actions: {},\n domHooks: {\n root: {\n attr: 'data-component',\n value: 'ai-consent-banner',\n description: 'Marks the AiConsentBanner root region.',\n },\n instanceId: {\n attr: 'data-component-id',\n sourceProp: 'id',\n description:\n 'Sourced from the id prop. Required to address a specific banner from the agent.',\n },\n },\n};\n","import {\n forwardRef,\n useMemo,\n useRef,\n useState,\n type ComponentPropsWithoutRef,\n} from 'react';\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport { useTranslation } from 'react-i18next';\nimport { Alert } from '../alert/alert';\nimport { Badge } from '../badge/badge';\nimport { Button } from '../button/button';\nimport { Checkbox } from '../checkbox/checkbox';\nimport { Spinner } from '../spinner/spinner';\nimport { Timestamp } from '../timestamp/timestamp';\nimport { useAgentRegistration } from '../../agent/registry';\nimport { aiConsentBannerAgent } from './ai-permission-notice.agent';\n\n/* -------------------------------------------------------------------- */\n/* AiConsentBanner */\n/* */\n/* Presentational AI-consent gate surfaced above an AI-assisted surface */\n/* (e.g. Alfascribe consultation transcription). The SERVER owns the */\n/* real gate — this component only reflects the consent record and lets */\n/* the operator initiate a grant; it never enforces access itself. */\n/* */\n/* Three states drive the Alert variant + body: */\n/* - granted → success Alert with a Badge + when/who it was granted. */\n/* - required → info Alert with a Checkbox-gated Grant Button. */\n/* - pending → info Alert in a disabled, Spinner-busy state while the */\n/* server persists the grant. */\n/* */\n/* All visible text flows through useTranslation('ui') against the */\n/* `aiConsentBanner.*` namespace. */\n/* -------------------------------------------------------------------- */\n\n/* -------------------------------------------------------------------- */\n/* CVA — root */\n/* -------------------------------------------------------------------- */\n\nconst rootVariants = cva('ds:w-full ds:text-[color:var(--foreground)]', {\n variants: {\n state: {\n granted: '',\n required: '',\n pending: '',\n },\n },\n defaultVariants: {\n state: 'required',\n },\n});\n\n/* -------------------------------------------------------------------- */\n/* State derivation */\n/* -------------------------------------------------------------------- */\n\nexport type AiConsentState = NonNullable<\n VariantProps<typeof rootVariants>['state']\n>;\n\n/** Heading levels `AiConsentBanner.headingLevel` accepts. */\nexport type AiConsentBannerHeadingLevel = 1 | 2 | 3 | 4 | 5 | 6;\n\n/** Pending wins over granted/required so the busy state is never masked. */\nfunction deriveState(granted: boolean, pending: boolean): AiConsentState {\n if (pending) return 'pending';\n return granted ? 'granted' : 'required';\n}\n\n/* -------------------------------------------------------------------- */\n/* Public types */\n/* -------------------------------------------------------------------- */\n\n/** Agent-readiness curated handle. Exposes the structural consent state only. */\nexport interface AiConsentBannerHandle {\n /** Current derived state: 'granted' | 'required' | 'pending'. */\n getState: () => AiConsentState;\n /** Whether the Grant affordance is currently armed (checkbox ticked). */\n isArmed: () => boolean;\n}\n\nexport interface AiConsentBannerProps extends Omit<\n ComponentPropsWithoutRef<'div'>,\n 'aria-label' | 'children' | 'role'\n> {\n /**\n * Stable instance id. Surfaced on the root as `data-component-id` so an\n * agent / MCP UI bridge can address this specific banner. Mirrored to the\n * real DOM `id`.\n */\n id?: string;\n /** Whether consent has already been granted. Server-sourced. */\n granted: boolean;\n /**\n * When consent was granted — ISO-8601 string, ms-epoch, or Date. Rendered\n * via `Timestamp` in the granted state.\n */\n grantedAt?: string | number | Date;\n /** Who granted consent (operator display name / role). Granted state only. */\n grantedBy?: string;\n /**\n * Whether the current user is allowed to grant consent. When `false`, the\n * required-state Grant affordance is hidden and a not-allowed note shows.\n * Default `true`.\n */\n canGrant?: boolean;\n /** The grant is being persisted server-side — shows the busy Spinner state. */\n pending?: boolean;\n /** Fired when the operator confirms the consent grant. */\n onGrantConsent?: () => void;\n /**\n * Heading level for the banner's own title, so it can be nested under a\n * host section's heading without skipping levels (axe `heading-order`).\n * Additive: default `5` matches the banner's original, unconditional\n * `<h5>` — every existing consumer is unaffected.\n */\n headingLevel?: AiConsentBannerHeadingLevel;\n /** Override the region's accessible name. */\n 'aria-label'?: string;\n}\n\n/* -------------------------------------------------------------------- */\n/* Component */\n/* -------------------------------------------------------------------- */\n\nexport const AiConsentBanner = forwardRef<HTMLDivElement, AiConsentBannerProps>(\n (\n {\n id,\n granted,\n grantedAt,\n grantedBy,\n canGrant = true,\n pending = false,\n onGrantConsent,\n headingLevel = 5,\n 'aria-label': ariaLabel,\n className,\n ...rest\n },\n ref,\n ) => {\n const { t } = useTranslation();\n const state = deriveState(granted, pending);\n\n // Local arm switch — the required state gates the Grant Button behind an\n // explicit \"I understand\" checkbox so consent is never one mis-click away.\n const [armed, setArmed] = useState(false);\n\n const armedRef = useRef(armed);\n armedRef.current = armed;\n\n const handle = useMemo<AiConsentBannerHandle>(\n () => ({\n getState: () => deriveState(granted, pending),\n isArmed: () => armedRef.current,\n }),\n [granted, pending],\n );\n useAgentRegistration(aiConsentBannerAgent, handle, id);\n\n const resolvedAriaLabel =\n ariaLabel ?? t('aiConsentBanner.regionLabel', 'AI assistance consent');\n\n // Alert variant per state: granted → success, required/pending → info.\n const alertVariant = state === 'granted' ? 'success' : 'info';\n\n let body: React.ReactNode;\n if (state === 'granted') {\n body = (\n <div className=\"ds:flex ds:flex-col ds:gap-[var(--spacing-xs)]\">\n <div className=\"ds:flex ds:flex-wrap ds:items-center ds:gap-[var(--spacing-sm)]\">\n <Badge variant=\"success\">\n {t('aiConsentBanner.badge.granted', 'Consent granted')}\n </Badge>\n {grantedAt !== undefined ? (\n <span className=\"type-body-sm ds:text-[color:var(--muted-foreground)]\">\n {t('aiConsentBanner.grantedAtPrefix', 'Granted')}{' '}\n <Timestamp value={grantedAt} format=\"relative\" shape=\"inline\" />\n </span>\n ) : null}\n </div>\n {grantedBy ? (\n <p className=\"type-body-sm ds:m-0 ds:text-[color:var(--muted-foreground)]\">\n {t('aiConsentBanner.grantedBy', {\n name: grantedBy,\n defaultValue: 'By {{name}}',\n })}\n </p>\n ) : null}\n </div>\n );\n } else if (state === 'pending') {\n body = (\n <div className=\"ds:flex ds:items-center ds:gap-[var(--spacing-sm)]\">\n <Spinner\n variant=\"pulse\"\n size=\"sm\"\n label={t('aiConsentBanner.pendingLabel', 'Saving consent…')}\n />\n <span className=\"type-body-sm ds:text-[color:var(--muted-foreground)]\">\n {t('aiConsentBanner.pendingLabel', 'Saving consent…')}\n </span>\n </div>\n );\n } else {\n // required\n body = canGrant ? (\n <div className=\"ds:flex ds:flex-col ds:gap-[var(--spacing-sm)]\">\n <Checkbox\n checked={armed}\n onCheckedChange={(next) => setArmed(next === true)}\n label={t(\n 'aiConsentBanner.confirmLabel',\n 'I confirm consent has been obtained for AI assistance.',\n )}\n />\n <Alert.Action>\n <Button\n intent=\"primary\"\n size=\"sm\"\n disabled={!armed}\n onClick={onGrantConsent}\n >\n {t('aiConsentBanner.grantButton', 'Grant consent')}\n </Button>\n </Alert.Action>\n </div>\n ) : (\n <p className=\"type-body-sm ds:m-0 ds:text-[color:var(--muted-foreground)]\">\n {t(\n 'aiConsentBanner.notAllowed',\n 'You do not have permission to grant AI assistance consent.',\n )}\n </p>\n );\n }\n\n return (\n <div\n ref={ref}\n role=\"region\"\n aria-label={resolvedAriaLabel}\n aria-busy={state === 'pending' ? true : undefined}\n data-component=\"ai-consent-banner\"\n data-component-id={id}\n data-state={state}\n id={id}\n className={rootVariants({ state, className })}\n {...rest}\n >\n <Alert\n variant={alertVariant}\n icon={state === 'pending' ? null : undefined}\n >\n <Alert.Title as={`h${headingLevel}` as const}>\n {t('aiConsentBanner.title', 'AI assistance consent')}\n </Alert.Title>\n <Alert.Description>\n {state === 'granted'\n ? t(\n 'aiConsentBanner.description.granted',\n 'AI assistance is enabled for this record.',\n )\n : t(\n 'aiConsentBanner.description.required',\n 'AI assistance requires recorded consent before it can run.',\n )}\n </Alert.Description>\n {body}\n </Alert>\n </div>\n );\n },\n);\n\nAiConsentBanner.displayName = 'AiConsentBanner';\n"],"names":["aiConsentBannerAgent","handle","rootVariants","cva","deriveState","granted","pending","AiConsentBanner","forwardRef","id","grantedAt","grantedBy","canGrant","onGrantConsent","headingLevel","ariaLabel","className","rest","ref","t","useTranslation","state","armed","setArmed","useState","armedRef","useRef","useMemo","useAgentRegistration","resolvedAriaLabel","alertVariant","body","jsxs","jsx","Badge","Timestamp","Spinner","Checkbox","next","Alert","Button"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"ai-permission-notice-DMG1o4Qa.js","sources":["../../src/components/ai-permission-notice/ai-permission-notice.agent.ts","../../src/components/ai-permission-notice/ai-permission-notice.tsx"],"sourcesContent":["/* -------------------------------------------------------------------- */\n/* Agent adapter — AiConsentBanner. */\n/* */\n/* Read-only structural surface: the current consent state and whether */\n/* the grant affordance is armed. Identifiers / structural state ONLY — */\n/* never the grantee's name or any PHI. The real consent gate lives */\n/* server-side; this adapter does not expose a grant action so an agent */\n/* cannot consent on a user's behalf. */\n/* -------------------------------------------------------------------- */\n\nimport type { AgentAdapter } from '../../agent/types';\nimport type { AiConsentBannerHandle } from './ai-permission-notice';\n\nexport const aiConsentBannerAgent: AgentAdapter<AiConsentBannerHandle> = {\n id: 'ai-consent-banner',\n capabilities: [],\n state: {\n consentState: {\n type: \"'granted' | 'required' | 'pending'\",\n descriptionKey: 'ui.agent.aiConsentBanner.state.consentState',\n description:\n 'Current consent state. Structural only — never the grantee identity.',\n read: (handle) => handle.getState(),\n },\n armed: {\n type: 'boolean',\n descriptionKey: 'ui.agent.aiConsentBanner.state.armed',\n description:\n 'Whether the consent confirmation checkbox is ticked (required state only).',\n read: (handle) => handle.isArmed(),\n },\n },\n actions: {},\n domHooks: {\n root: {\n attr: 'data-component',\n value: 'ai-consent-banner',\n description: 'Marks the AiConsentBanner root region.',\n },\n instanceId: {\n attr: 'data-component-id',\n sourceProp: 'id',\n description:\n 'Sourced from the id prop. Required to address a specific banner from the agent.',\n },\n },\n};\n","import {\n forwardRef,\n useMemo,\n useRef,\n useState,\n type ComponentPropsWithoutRef,\n} from 'react';\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport { useTranslation } from 'react-i18next';\nimport { Alert } from '../alert/alert';\nimport { Badge } from '../badge/badge';\nimport { Button } from '../button/button';\nimport { Checkbox } from '../checkbox/checkbox';\nimport { Spinner } from '../spinner/spinner';\nimport { Timestamp } from '../timestamp/timestamp';\nimport { useAgentRegistration } from '../../agent/registry';\nimport { aiConsentBannerAgent } from './ai-permission-notice.agent';\n\n/* -------------------------------------------------------------------- */\n/* AiConsentBanner */\n/* */\n/* Presentational AI-consent gate surfaced above an AI-assisted surface */\n/* (e.g. Alfascribe consultation transcription). The SERVER owns the */\n/* real gate — this component only reflects the consent record and lets */\n/* the operator initiate a grant; it never enforces access itself. */\n/* */\n/* Three states drive the Alert variant + body: */\n/* - granted → success Alert with a Badge + when/who it was granted. */\n/* - required → info Alert with a Checkbox-gated Grant Button. */\n/* - pending → info Alert in a disabled, Spinner-busy state while the */\n/* server persists the grant. */\n/* */\n/* All visible text flows through useTranslation('ui') against the */\n/* `aiConsentBanner.*` namespace. */\n/* -------------------------------------------------------------------- */\n\n/* -------------------------------------------------------------------- */\n/* CVA — root */\n/* -------------------------------------------------------------------- */\n\nconst rootVariants = cva('ds:w-full ds:text-[color:var(--foreground)]', {\n variants: {\n state: {\n granted: '',\n required: '',\n pending: '',\n },\n },\n defaultVariants: {\n state: 'required',\n },\n});\n\n/* -------------------------------------------------------------------- */\n/* State derivation */\n/* -------------------------------------------------------------------- */\n\nexport type AiConsentState = NonNullable<\n VariantProps<typeof rootVariants>['state']\n>;\n\n/** Heading levels `AiConsentBanner.headingLevel` accepts. */\nexport type AiConsentBannerHeadingLevel = 1 | 2 | 3 | 4 | 5 | 6;\n\n/** Pending wins over granted/required so the busy state is never masked. */\nfunction deriveState(granted: boolean, pending: boolean): AiConsentState {\n if (pending) return 'pending';\n return granted ? 'granted' : 'required';\n}\n\n/* -------------------------------------------------------------------- */\n/* Public types */\n/* -------------------------------------------------------------------- */\n\n/** Agent-readiness curated handle. Exposes the structural consent state only. */\nexport interface AiConsentBannerHandle {\n /** Current derived state: 'granted' | 'required' | 'pending'. */\n getState: () => AiConsentState;\n /** Whether the Grant affordance is currently armed (checkbox ticked). */\n isArmed: () => boolean;\n}\n\nexport interface AiConsentBannerProps extends Omit<\n ComponentPropsWithoutRef<'div'>,\n 'aria-label' | 'children' | 'role'\n> {\n /**\n * Stable instance id. Surfaced on the root as `data-component-id` so an\n * agent / MCP UI bridge can address this specific banner. Mirrored to the\n * real DOM `id`.\n */\n id?: string;\n /** Whether consent has already been granted. Server-sourced. */\n granted: boolean;\n /**\n * When consent was granted — ISO-8601 string, ms-epoch, or Date. Rendered\n * via `Timestamp` in the granted state.\n */\n grantedAt?: string | number | Date;\n /** Who granted consent (operator display name / role). Granted state only. */\n grantedBy?: string;\n /**\n * Whether the current user is allowed to grant consent. When `false`, the\n * required-state Grant affordance is hidden and a not-allowed note shows.\n * Default `true`.\n */\n canGrant?: boolean;\n /** The grant is being persisted server-side — shows the busy Spinner state. */\n pending?: boolean;\n /** Fired when the operator confirms the consent grant. */\n onGrantConsent?: () => void;\n /**\n * Heading level for the banner's own title, so it can be nested under a\n * host section's heading without skipping levels (axe `heading-order`).\n * Additive: default `5` matches the banner's original, unconditional\n * `<h5>` — every existing consumer is unaffected.\n */\n headingLevel?: AiConsentBannerHeadingLevel;\n /** Override the region's accessible name. */\n 'aria-label'?: string;\n}\n\n/* -------------------------------------------------------------------- */\n/* Component */\n/* -------------------------------------------------------------------- */\n\nexport const AiConsentBanner = forwardRef<HTMLDivElement, AiConsentBannerProps>(\n (\n {\n id,\n granted,\n grantedAt,\n grantedBy,\n canGrant = true,\n pending = false,\n onGrantConsent,\n headingLevel = 5,\n 'aria-label': ariaLabel,\n className,\n ...rest\n },\n ref,\n ) => {\n const { t } = useTranslation();\n const state = deriveState(granted, pending);\n\n // Local arm switch — the required state gates the Grant Button behind an\n // explicit \"I understand\" checkbox so consent is never one mis-click away.\n const [armed, setArmed] = useState(false);\n\n const armedRef = useRef(armed);\n armedRef.current = armed;\n\n const handle = useMemo<AiConsentBannerHandle>(\n () => ({\n getState: () => deriveState(granted, pending),\n isArmed: () => armedRef.current,\n }),\n [granted, pending],\n );\n useAgentRegistration(aiConsentBannerAgent, handle, id);\n\n const resolvedAriaLabel =\n ariaLabel ?? t('aiConsentBanner.regionLabel', 'AI assistance consent');\n\n // Alert variant per state: granted → success, required/pending → info.\n const alertVariant = state === 'granted' ? 'success' : 'info';\n\n let body: React.ReactNode;\n if (state === 'granted') {\n body = (\n <div className=\"ds:flex ds:flex-col ds:gap-[var(--spacing-xs)]\">\n <div className=\"ds:flex ds:flex-wrap ds:items-center ds:gap-[var(--spacing-sm)]\">\n <Badge variant=\"success\">\n {t('aiConsentBanner.badge.granted', 'Consent granted')}\n </Badge>\n {grantedAt !== undefined ? (\n <span className=\"type-body-sm ds:text-[color:var(--muted-foreground)]\">\n {t('aiConsentBanner.grantedAtPrefix', 'Granted')}{' '}\n <Timestamp value={grantedAt} format=\"relative\" shape=\"inline\" />\n </span>\n ) : null}\n </div>\n {grantedBy ? (\n <p className=\"type-body-sm ds:m-0 ds:text-[color:var(--muted-foreground)]\">\n {t('aiConsentBanner.grantedBy', {\n name: grantedBy,\n defaultValue: 'By {{name}}',\n })}\n </p>\n ) : null}\n </div>\n );\n } else if (state === 'pending') {\n body = (\n <div className=\"ds:flex ds:items-center ds:gap-[var(--spacing-sm)]\">\n <Spinner\n variant=\"pulse\"\n size=\"sm\"\n label={t('aiConsentBanner.pendingLabel', 'Saving consent…')}\n />\n <span className=\"type-body-sm ds:text-[color:var(--muted-foreground)]\">\n {t('aiConsentBanner.pendingLabel', 'Saving consent…')}\n </span>\n </div>\n );\n } else {\n // required\n body = canGrant ? (\n <div className=\"ds:flex ds:flex-col ds:gap-[var(--spacing-sm)]\">\n <Checkbox\n checked={armed}\n onCheckedChange={(next) => setArmed(next === true)}\n label={t(\n 'aiConsentBanner.confirmLabel',\n 'I confirm consent has been obtained for AI assistance.',\n )}\n />\n <Alert.Action>\n <Button\n intent=\"primary\"\n size=\"sm\"\n disabled={!armed}\n onClick={onGrantConsent}\n >\n {t('aiConsentBanner.grantButton', 'Grant consent')}\n </Button>\n </Alert.Action>\n </div>\n ) : (\n <p className=\"type-body-sm ds:m-0 ds:text-[color:var(--muted-foreground)]\">\n {t(\n 'aiConsentBanner.notAllowed',\n 'You do not have permission to grant AI assistance consent.',\n )}\n </p>\n );\n }\n\n return (\n <div\n ref={ref}\n role=\"region\"\n aria-label={resolvedAriaLabel}\n aria-busy={state === 'pending' ? true : undefined}\n data-component=\"ai-consent-banner\"\n data-component-id={id}\n data-state={state}\n id={id}\n className={rootVariants({ state, className })}\n {...rest}\n >\n <Alert\n variant={alertVariant}\n icon={state === 'pending' ? null : undefined}\n >\n <Alert.Title as={`h${headingLevel}` as const}>\n {t('aiConsentBanner.title', 'AI assistance consent')}\n </Alert.Title>\n <Alert.Description>\n {state === 'granted'\n ? t(\n 'aiConsentBanner.description.granted',\n 'AI assistance is enabled for this record.',\n )\n : t(\n 'aiConsentBanner.description.required',\n 'AI assistance requires recorded consent before it can run.',\n )}\n </Alert.Description>\n {body}\n </Alert>\n </div>\n );\n },\n);\n\nAiConsentBanner.displayName = 'AiConsentBanner';\n"],"names":["aiConsentBannerAgent","handle","rootVariants","cva","deriveState","granted","pending","AiConsentBanner","forwardRef","id","grantedAt","grantedBy","canGrant","onGrantConsent","headingLevel","ariaLabel","className","rest","ref","t","useTranslation","state","armed","setArmed","useState","armedRef","useRef","useMemo","useAgentRegistration","resolvedAriaLabel","alertVariant","body","jsxs","jsx","Badge","Timestamp","Spinner","Checkbox","next","Alert","Button"],"mappings":"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"}
|
|
@@ -7,7 +7,7 @@ import { u as Re } from "./use-isomorphic-layout-effect-BGfaCOP1.js";
|
|
|
7
7
|
import { u as je } from "./registry-DvAUVLHh.js";
|
|
8
8
|
import { _ as g } from "./index-4xgbg-sn.js";
|
|
9
9
|
import { u as _e } from "./index-BcMWc8W2.js";
|
|
10
|
-
import { I as te } from "./icon-button-
|
|
10
|
+
import { I as te } from "./icon-button-JAXAkqWC.js";
|
|
11
11
|
import { S as We } from "./select-upNAltly.js";
|
|
12
12
|
import { b as De } from "./menu-row-BAr8bx1I.js";
|
|
13
13
|
import { S as Le } from "./send-C5kDJ-Mz.js";
|
|
@@ -497,4 +497,4 @@ export {
|
|
|
497
497
|
qe as A,
|
|
498
498
|
Ae as a
|
|
499
499
|
};
|
|
500
|
-
//# sourceMappingURL=ai-prompt-input-
|
|
500
|
+
//# sourceMappingURL=ai-prompt-input-ucwO-z8g.js.map
|