@alfadocs/ui-kit-debug 1.67.0 → 1.68.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/_chunks/{address-fields-CJtu7LQU.js → address-fields-BUPRs3n-.js} +3 -3
- package/dist/_chunks/{address-fields-CJtu7LQU.js.map → address-fields-BUPRs3n-.js.map} +1 -1
- package/dist/_chunks/{agenda-card-DR9gDdKp.js → agenda-card-BDuvreCe.js} +2 -2
- package/dist/_chunks/{agenda-card-DR9gDdKp.js.map → agenda-card-BDuvreCe.js.map} +1 -1
- package/dist/_chunks/{agenda-tray-DGB1Zup-.js → agenda-tray-CfwylhWf.js} +3 -3
- package/dist/_chunks/{agenda-tray-DGB1Zup-.js.map → agenda-tray-CfwylhWf.js.map} +1 -1
- package/dist/_chunks/{ai-credits-exhausted-notice-DfAgfZDF.js → ai-credits-exhausted-notice-Bg8NpW2K.js} +2 -2
- package/dist/_chunks/{ai-credits-exhausted-notice-DfAgfZDF.js.map → ai-credits-exhausted-notice-Bg8NpW2K.js.map} +1 -1
- package/dist/_chunks/{ai-permission-notice-qsdm4Sx4.js → ai-permission-notice-C00i6VhY.js} +2 -2
- package/dist/_chunks/{ai-permission-notice-qsdm4Sx4.js.map → ai-permission-notice-C00i6VhY.js.map} +1 -1
- package/dist/_chunks/{ai-prompt-input-DSGSe4LH.js → ai-prompt-input-DzgyoKyk.js} +141 -139
- package/dist/_chunks/ai-prompt-input-DzgyoKyk.js.map +1 -0
- package/dist/_chunks/{alert-DjsJMGRE.js → alert-9kEwDza3.js} +122 -112
- package/dist/_chunks/alert-9kEwDza3.js.map +1 -0
- package/dist/_chunks/{alia-sidebar-qe0quZkB.js → alia-sidebar-B06ZSOaF.js} +3 -3
- package/dist/_chunks/{alia-sidebar-qe0quZkB.js.map → alia-sidebar-B06ZSOaF.js.map} +1 -1
- package/dist/_chunks/{anamnesis-summary-card-CMzBLTiN.js → anamnesis-summary-card-DQ3iE1gD.js} +2 -2
- package/dist/_chunks/{anamnesis-summary-card-CMzBLTiN.js.map → anamnesis-summary-card-DQ3iE1gD.js.map} +1 -1
- package/dist/_chunks/{anamnesis-summary-rows-BQ_EokKz.js → anamnesis-summary-rows-CNK0fIJk.js} +392 -388
- package/dist/_chunks/anamnesis-summary-rows-CNK0fIJk.js.map +1 -0
- package/dist/_chunks/{appointment-card-CL32sux-.js → appointment-card-5JMWi9_f.js} +2 -2
- package/dist/_chunks/{appointment-card-CL32sux-.js.map → appointment-card-5JMWi9_f.js.map} +1 -1
- package/dist/_chunks/{appointment-peek-B5mcDcXt.js → appointment-peek-D5XCfYKu.js} +2 -2
- package/dist/_chunks/{appointment-peek-B5mcDcXt.js.map → appointment-peek-D5XCfYKu.js.map} +1 -1
- package/dist/_chunks/{appointment-timeline-CCqjORFb.js → appointment-timeline-VFP6HoXT.js} +4 -4
- package/dist/_chunks/{appointment-timeline-CCqjORFb.js.map → appointment-timeline-VFP6HoXT.js.map} +1 -1
- package/dist/_chunks/{appointment-tray-qtpJt8e0.js → appointment-tray-B3PDER3I.js} +3 -3
- package/dist/_chunks/{appointment-tray-qtpJt8e0.js.map → appointment-tray-B3PDER3I.js.map} +1 -1
- package/dist/_chunks/{audio-recorder-B11RR-rC.js → audio-recorder-4Ll0pwYK.js} +3 -3
- package/dist/_chunks/{audio-recorder-B11RR-rC.js.map → audio-recorder-4Ll0pwYK.js.map} +1 -1
- package/dist/_chunks/{auth-form-parts-DwUTH6YN.js → auth-form-parts-B40zvD-a.js} +2 -2
- package/dist/_chunks/{auth-form-parts-DwUTH6YN.js.map → auth-form-parts-B40zvD-a.js.map} +1 -1
- package/dist/_chunks/avatar-BPiPL7ND.js +199 -0
- package/dist/_chunks/avatar-BPiPL7ND.js.map +1 -0
- package/dist/_chunks/{balance-badge-cell-DZNthHO1.js → balance-badge-cell-BG3DMly4.js} +4 -4
- package/dist/_chunks/{balance-badge-cell-DZNthHO1.js.map → balance-badge-cell-BG3DMly4.js.map} +1 -1
- package/dist/_chunks/{bishop-score-CaNTrikJ.js → bishop-score-Df8nF1qg.js} +2 -2
- package/dist/_chunks/{bishop-score-CaNTrikJ.js.map → bishop-score-Df8nF1qg.js.map} +1 -1
- package/dist/_chunks/{booking-tTVxKPQY.js → booking-B1pDbERi.js} +377 -335
- package/dist/_chunks/booking-B1pDbERi.js.map +1 -0
- package/dist/_chunks/{calendar-BhN-jisv.js → calendar-BvOM8rG3.js} +2 -2
- package/dist/_chunks/{calendar-BhN-jisv.js.map → calendar-BvOM8rG3.js.map} +1 -1
- package/dist/_chunks/{calendar-workspace-MRrzcxAy.js → calendar-workspace-CYK1M83j.js} +18 -18
- package/dist/_chunks/{calendar-workspace-MRrzcxAy.js.map → calendar-workspace-CYK1M83j.js.map} +1 -1
- package/dist/_chunks/{chat-message-fRLZ95O5.js → chat-message-Be-9vIIQ.js} +2 -2
- package/dist/_chunks/{chat-message-fRLZ95O5.js.map → chat-message-Be-9vIIQ.js.map} +1 -1
- package/dist/_chunks/{clinical-note-card-BnFTIs6x.js → clinical-note-card-Caidqcwa.js} +2 -2
- package/dist/_chunks/{clinical-note-card-BnFTIs6x.js.map → clinical-note-card-Caidqcwa.js.map} +1 -1
- package/dist/_chunks/{color-picker-BsggJovx.js → color-picker-AcaWuKah.js} +99 -95
- package/dist/_chunks/color-picker-AcaWuKah.js.map +1 -0
- package/dist/_chunks/{combobox-U5yfO6o0.js → combobox-vF9O-QoG.js} +92 -83
- package/dist/_chunks/combobox-vF9O-QoG.js.map +1 -0
- package/dist/_chunks/{contact-profile-card-C4-OCshj.js → contact-profile-card-CAwwOqHl.js} +40 -40
- package/dist/_chunks/contact-profile-card-CAwwOqHl.js.map +1 -0
- package/dist/_chunks/{control-room-rail-DUerqHeo.js → control-room-rail-BB6rCDWI.js} +3 -3
- package/dist/_chunks/{control-room-rail-DUerqHeo.js.map → control-room-rail-BB6rCDWI.js.map} +1 -1
- package/dist/_chunks/{country-select-DF5Bd_mn.js → country-select-CSE2Zm_s.js} +2 -2
- package/dist/_chunks/{country-select-DF5Bd_mn.js.map → country-select-CSE2Zm_s.js.map} +1 -1
- package/dist/_chunks/dashboard-grid-7JzaiKnk.js +1487 -0
- package/dist/_chunks/dashboard-grid-7JzaiKnk.js.map +1 -0
- package/dist/_chunks/{data-table-COoCQ4n_.js → data-table-Cty4-Jht.js} +3 -3
- package/dist/_chunks/{data-table-COoCQ4n_.js.map → data-table-Cty4-Jht.js.map} +1 -1
- package/dist/_chunks/{dependent-selector-DBr1AhLg.js → dependent-selector-C4kOgO8b.js} +2 -2
- package/dist/_chunks/{dependent-selector-DBr1AhLg.js.map → dependent-selector-C4kOgO8b.js.map} +1 -1
- package/dist/_chunks/{document-preview-VyQOjFVL.js → document-preview-513f3iPn.js} +4 -4
- package/dist/_chunks/{document-preview-VyQOjFVL.js.map → document-preview-513f3iPn.js.map} +1 -1
- package/dist/_chunks/{document-scanner-CXH_GYh4.js → document-scanner-Bd3wbzpI.js} +2 -2
- package/dist/_chunks/{document-scanner-CXH_GYh4.js.map → document-scanner-Bd3wbzpI.js.map} +1 -1
- package/dist/_chunks/{editable-description-ChGNdYY8.js → editable-description-DnAFi360.js} +2 -2
- package/dist/_chunks/{editable-description-ChGNdYY8.js.map → editable-description-DnAFi360.js.map} +1 -1
- package/dist/_chunks/{entity-summary-Bj-Wxq7Y.js → entity-summary-C2B8yNmc.js} +4 -4
- package/dist/_chunks/{entity-summary-Bj-Wxq7Y.js.map → entity-summary-C2B8yNmc.js.map} +1 -1
- package/dist/_chunks/{error-summary-PUE5Zxp9.js → error-summary-mGxIyDAY.js} +2 -2
- package/dist/_chunks/{error-summary-PUE5Zxp9.js.map → error-summary-mGxIyDAY.js.map} +1 -1
- package/dist/_chunks/{face-scheme-DAD-mXzM.js → face-scheme-CSJdRNad.js} +248 -244
- package/dist/_chunks/{face-scheme-DAD-mXzM.js.map → face-scheme-CSJdRNad.js.map} +1 -1
- package/dist/_chunks/{file-manager-RiV7-OEE.js → file-manager-D4cPnRhL.js} +3 -3
- package/dist/_chunks/{file-manager-RiV7-OEE.js.map → file-manager-D4cPnRhL.js.map} +1 -1
- package/dist/_chunks/{forgot-password-form-CPOfRE0C.js → forgot-password-form-Dqi7R-NL.js} +4 -4
- package/dist/_chunks/{forgot-password-form-CPOfRE0C.js.map → forgot-password-form-Dqi7R-NL.js.map} +1 -1
- package/dist/_chunks/format-number-DdzqwMs1.js +13 -0
- package/dist/_chunks/format-number-DdzqwMs1.js.map +1 -0
- package/dist/_chunks/{freemium-paywall-6DO7noHX.js → freemium-paywall-C73C8Rgd.js} +2 -2
- package/dist/_chunks/{freemium-paywall-6DO7noHX.js.map → freemium-paywall-C73C8Rgd.js.map} +1 -1
- package/dist/_chunks/{gestational-age-calculator-CZYa2D6m.js → gestational-age-calculator-Du53p8MH.js} +2 -2
- package/dist/_chunks/{gestational-age-calculator-CZYa2D6m.js.map → gestational-age-calculator-Du53p8MH.js.map} +1 -1
- package/dist/_chunks/{header-settings-BSH9Gk0J.js → header-settings-DlUbvAUx.js} +37 -36
- package/dist/_chunks/header-settings-DlUbvAUx.js.map +1 -0
- package/dist/_chunks/{heatmap-C1TeC7wT.js → heatmap-DbZIQg14.js} +4 -4
- package/dist/_chunks/{heatmap-C1TeC7wT.js.map → heatmap-DbZIQg14.js.map} +1 -1
- package/dist/_chunks/{help-me-write-templates-Bw3Q58x-.js → help-me-write-templates-5WkUfvc_.js} +3 -3
- package/dist/_chunks/{help-me-write-templates-Bw3Q58x-.js.map → help-me-write-templates-5WkUfvc_.js.map} +1 -1
- package/dist/_chunks/{kit-extensions-DWs1UEXb.js → kit-extensions-CYvLL4ee.js} +3 -3
- package/dist/_chunks/{kit-extensions-DWs1UEXb.js.map → kit-extensions-CYvLL4ee.js.map} +1 -1
- package/dist/_chunks/length-token-DwMnGEYT.js +24 -0
- package/dist/_chunks/length-token-DwMnGEYT.js.map +1 -0
- package/dist/_chunks/{link-cell-renderer-CtTsvfPY.js → link-cell-renderer-DtIsQWDO.js} +4 -4
- package/dist/_chunks/{link-cell-renderer-CtTsvfPY.js.map → link-cell-renderer-DtIsQWDO.js.map} +1 -1
- package/dist/_chunks/{login-dev-card-A-CL3mjt.js → login-dev-card-vEL-o5wq.js} +3 -3
- package/dist/_chunks/{login-dev-card-A-CL3mjt.js.map → login-dev-card-vEL-o5wq.js.map} +1 -1
- package/dist/_chunks/{map-view-BuVfJMEa.js → map-view-CtohteZD.js} +300 -191
- package/dist/_chunks/map-view-CtohteZD.js.map +1 -0
- package/dist/_chunks/{marketplace-app-shell-DtSX8sYb.js → marketplace-app-shell-CcLQ0Dn-.js} +4 -4
- package/dist/_chunks/{marketplace-app-shell-DtSX8sYb.js.map → marketplace-app-shell-CcLQ0Dn-.js.map} +1 -1
- package/dist/_chunks/{message-card-A3mJNqfy.js → message-card-C_ksqIYM.js} +2 -2
- package/dist/_chunks/{message-card-A3mJNqfy.js.map → message-card-C_ksqIYM.js.map} +1 -1
- package/dist/_chunks/{message-tray-Ft6vSr71.js → message-tray-DCoQ4GQb.js} +3 -3
- package/dist/_chunks/{message-tray-Ft6vSr71.js.map → message-tray-DCoQ4GQb.js.map} +1 -1
- package/dist/_chunks/{multi-select-CMaAQQgb.js → multi-select-BOad3za9.js} +110 -98
- package/dist/_chunks/multi-select-BOad3za9.js.map +1 -0
- package/dist/_chunks/{muscle-scheme-YoN3rYXV.js → muscle-scheme-C66WlCxG.js} +2 -2
- package/dist/_chunks/{muscle-scheme-YoN3rYXV.js.map → muscle-scheme-C66WlCxG.js.map} +1 -1
- package/dist/_chunks/{note-timeline-DDqNU46n.js → note-timeline-KzL52MmB.js} +2 -2
- package/dist/_chunks/{note-timeline-DDqNU46n.js.map → note-timeline-KzL52MmB.js.map} +1 -1
- package/dist/_chunks/{notes-panel-IdsmqRFC.js → notes-panel-BXN46XkF.js} +6 -6
- package/dist/_chunks/{notes-panel-IdsmqRFC.js.map → notes-panel-BXN46XkF.js.map} +1 -1
- package/dist/_chunks/notice-group-DkYzKyAZ.js +291 -0
- package/dist/_chunks/notice-group-DkYzKyAZ.js.map +1 -0
- package/dist/_chunks/{notification-tray-BR3seWA7.js → notification-tray-Cp18MW5b.js} +2 -2
- package/dist/_chunks/{notification-tray-BR3seWA7.js.map → notification-tray-Cp18MW5b.js.map} +1 -1
- package/dist/_chunks/{operator-hero-3_RG4Dkj.js → operator-hero-6aAIQaFZ.js} +83 -66
- package/dist/_chunks/operator-hero-6aAIQaFZ.js.map +1 -0
- package/dist/_chunks/{optical-prescription-CxfMsbxi.js → optical-prescription-ulXnDbBe.js} +525 -509
- package/dist/_chunks/optical-prescription-ulXnDbBe.js.map +1 -0
- package/dist/_chunks/panel-header-CbtlTe85.js +190 -0
- package/dist/_chunks/panel-header-CbtlTe85.js.map +1 -0
- package/dist/_chunks/{panel-subview-yP4qIbKS.js → panel-subview-BPU7220K.js} +2 -2
- package/dist/_chunks/{panel-subview-yP4qIbKS.js.map → panel-subview-BPU7220K.js.map} +1 -1
- package/dist/_chunks/{patient-details-C-EWQTms.js → patient-details-C4Dyo7Ck.js} +4 -4
- package/dist/_chunks/{patient-details-C-EWQTms.js.map → patient-details-C4Dyo7Ck.js.map} +1 -1
- package/dist/_chunks/{patient-field-row-lY-Tb5Mo.js → patient-field-row-DROvUkFu.js} +4 -4
- package/dist/_chunks/{patient-field-row-lY-Tb5Mo.js.map → patient-field-row-DROvUkFu.js.map} +1 -1
- package/dist/_chunks/{patient-search-DpAKidZ5.js → patient-search-BADdx3M1.js} +2 -2
- package/dist/_chunks/{patient-search-DpAKidZ5.js.map → patient-search-BADdx3M1.js.map} +1 -1
- package/dist/_chunks/{patient-summary-card-Bpto_VCD.js → patient-summary-card-CAimxbuI.js} +4 -4
- package/dist/_chunks/{patient-summary-card-Bpto_VCD.js.map → patient-summary-card-CAimxbuI.js.map} +1 -1
- package/dist/_chunks/{payment-automation-upsell-BQ307qEX.js → payment-automation-upsell-CiwF5UrC.js} +2 -2
- package/dist/_chunks/{payment-automation-upsell-BQ307qEX.js.map → payment-automation-upsell-CiwF5UrC.js.map} +1 -1
- package/dist/_chunks/{payment-form-XKtinW8r.js → payment-form-PBuh8PIa.js} +2 -2
- package/dist/_chunks/{payment-form-XKtinW8r.js.map → payment-form-PBuh8PIa.js.map} +1 -1
- package/dist/_chunks/{pdf-viewer-BvoVMjH4.js → pdf-viewer-gAsNUsA8.js} +2 -2
- package/dist/_chunks/{pdf-viewer-BvoVMjH4.js.map → pdf-viewer-gAsNUsA8.js.map} +1 -1
- package/dist/_chunks/{periodontal-risk-chart-CPy7CNFe.js → periodontal-risk-chart-B7S9OmPC.js} +97 -89
- package/dist/_chunks/periodontal-risk-chart-B7S9OmPC.js.map +1 -0
- package/dist/_chunks/practice-profile-hero-qfrsFQI_.js +236 -0
- package/dist/_chunks/practice-profile-hero-qfrsFQI_.js.map +1 -0
- package/dist/_chunks/{practice-results-BrUDDMXC.js → practice-results-BzThnpnm.js} +328 -298
- package/dist/_chunks/practice-results-BzThnpnm.js.map +1 -0
- package/dist/_chunks/{pregnancy-dating-B8wo4l_r.js → pregnancy-dating-EFcFUJkQ.js} +2 -2
- package/dist/_chunks/{pregnancy-dating-B8wo4l_r.js.map → pregnancy-dating-EFcFUJkQ.js.map} +1 -1
- package/dist/_chunks/{privacy-mask-Ch7743uk.js → privacy-mask-CCz9zuIh.js} +2 -2
- package/dist/_chunks/{privacy-mask-Ch7743uk.js.map → privacy-mask-CCz9zuIh.js.map} +1 -1
- package/dist/_chunks/{product-hub-panel-C_ZosrBt.js → product-hub-panel-YuFbNPlT.js} +2 -2
- package/dist/_chunks/{product-hub-panel-C_ZosrBt.js.map → product-hub-panel-YuFbNPlT.js.map} +1 -1
- package/dist/_chunks/progress-notice-DiHWZ8Ms.js +279 -0
- package/dist/_chunks/progress-notice-DiHWZ8Ms.js.map +1 -0
- package/dist/_chunks/{province-select-Bd20Z9Br.js → province-select-CDjs5obD.js} +2 -2
- package/dist/_chunks/{province-select-Bd20Z9Br.js.map → province-select-CDjs5obD.js.map} +1 -1
- package/dist/_chunks/{radiograph-panel.agent-8Ewv8-d7.js → radiograph-panel.agent-4UllIoTQ.js} +2 -2
- package/dist/_chunks/{radiograph-panel.agent-8Ewv8-d7.js.map → radiograph-panel.agent-4UllIoTQ.js.map} +1 -1
- package/dist/_chunks/{rating-C1Vrmpsi.js → rating-CGYpg5dj.js} +43 -44
- package/dist/_chunks/rating-CGYpg5dj.js.map +1 -0
- package/dist/_chunks/{registration-form-BxwqUZzk.js → registration-form-1B0PTDal.js} +4 -4
- package/dist/_chunks/{registration-form-BxwqUZzk.js.map → registration-form-1B0PTDal.js.map} +1 -1
- package/dist/_chunks/{reviews-panel-AvsVgtJu.js → reviews-panel-CosDZyow.js} +29 -7
- package/dist/_chunks/reviews-panel-CosDZyow.js.map +1 -0
- package/dist/_chunks/{rich-text-editor-aCIoptbg.js → rich-text-editor-56dSsyZI.js} +3 -3
- package/dist/_chunks/{rich-text-editor-aCIoptbg.js.map → rich-text-editor-56dSsyZI.js.map} +1 -1
- package/dist/_chunks/{select-k4gBdS8N.js → select-4S-eYZUf.js} +244 -214
- package/dist/_chunks/select-4S-eYZUf.js.map +1 -0
- package/dist/_chunks/{sign-document-D1P1nUQA.js → sign-document-BiOTs1P4.js} +2 -2
- package/dist/_chunks/{sign-document-D1P1nUQA.js.map → sign-document-BiOTs1P4.js.map} +1 -1
- package/dist/_chunks/{signature-request-3u6TvRt2.js → signature-request-DAmNj_uq.js} +5 -5
- package/dist/_chunks/{signature-request-3u6TvRt2.js.map → signature-request-DAmNj_uq.js.map} +1 -1
- package/dist/_chunks/skeleton-tTWJpvAq.js +415 -0
- package/dist/_chunks/skeleton-tTWJpvAq.js.map +1 -0
- package/dist/_chunks/{slot-grid-dj5f6R2w.js → slot-grid-D_gix9mJ.js} +2 -2
- package/dist/_chunks/{slot-grid-dj5f6R2w.js.map → slot-grid-D_gix9mJ.js.map} +1 -1
- package/dist/_chunks/{tabs-2x3L13jn.js → tabs-BTj-2qMZ.js} +2 -2
- package/dist/_chunks/{tabs-2x3L13jn.js.map → tabs-BTj-2qMZ.js.map} +1 -1
- package/dist/_chunks/{task-card-BS7Uqevr.js → task-card-Ci2XbLmq.js} +2 -2
- package/dist/_chunks/{task-card-BS7Uqevr.js.map → task-card-Ci2XbLmq.js.map} +1 -1
- package/dist/_chunks/{task-editor-Bb5MMcid.js → task-editor-BomyxGoZ.js} +8 -8
- package/dist/_chunks/{task-editor-Bb5MMcid.js.map → task-editor-BomyxGoZ.js.map} +1 -1
- package/dist/_chunks/{task-tray-eQU4KJcA.js → task-tray-Dnc72nl-.js} +3 -3
- package/dist/_chunks/{task-tray-eQU4KJcA.js.map → task-tray-Dnc72nl-.js.map} +1 -1
- package/dist/_chunks/{tasks-panel-BOb57Ysw.js → tasks-panel-ATz9JDy8.js} +6 -6
- package/dist/_chunks/{tasks-panel-BOb57Ysw.js.map → tasks-panel-ATz9JDy8.js.map} +1 -1
- package/dist/_chunks/{theme-toggle-Ctb77x6O.js → theme-toggle-DT_Jn4DC.js} +147 -138
- package/dist/_chunks/theme-toggle-DT_Jn4DC.js.map +1 -0
- package/dist/_chunks/{timeline-DEIuHrWz.js → timeline-wUuTDFY_.js} +2 -2
- package/dist/_chunks/{timeline-DEIuHrWz.js.map → timeline-wUuTDFY_.js.map} +1 -1
- package/dist/_chunks/{tool-rail-C-03rH2I.js → tool-rail-C-M3eVdY.js} +2 -2
- package/dist/_chunks/{tool-rail-C-03rH2I.js.map → tool-rail-C-M3eVdY.js.map} +1 -1
- package/dist/_chunks/{transcript-panel-XudW5l6l.js → transcript-panel-CoHHpcFg.js} +2 -2
- package/dist/_chunks/{transcript-panel-XudW5l6l.js.map → transcript-panel-CoHHpcFg.js.map} +1 -1
- package/dist/_chunks/{treatment-receipt-Cpm8tqQN.js → treatment-receipt-pFqWFyD_.js} +2 -2
- package/dist/_chunks/{treatment-receipt-Cpm8tqQN.js.map → treatment-receipt-pFqWFyD_.js.map} +1 -1
- package/dist/_chunks/{unit-converter-BPZ0Ldkb.js → unit-converter-CIoTmCmP.js} +2 -2
- package/dist/_chunks/{unit-converter-BPZ0Ldkb.js.map → unit-converter-CIoTmCmP.js.map} +1 -1
- package/dist/_chunks/{use-appointment-details-read-CVSPoP5j.js → use-appointment-details-read-CUGfE0hV.js} +12 -12
- package/dist/_chunks/{use-appointment-details-read-CVSPoP5j.js.map → use-appointment-details-read-CUGfE0hV.js.map} +1 -1
- package/dist/_chunks/use-dismissed-CTOWqA0e.js +177 -0
- package/dist/_chunks/use-dismissed-CTOWqA0e.js.map +1 -0
- package/dist/_chunks/{voice-control-panel-BJIEbDq6.js → voice-control-panel-B8Lrk0C4.js} +4 -4
- package/dist/_chunks/{voice-control-panel-BJIEbDq6.js.map → voice-control-panel-B8Lrk0C4.js.map} +1 -1
- package/dist/_chunks/{warning-stack-BdY-0bd3.js → warning-stack-BhHUmRiD.js} +2 -2
- package/dist/_chunks/{warning-stack-BdY-0bd3.js.map → warning-stack-BhHUmRiD.js.map} +1 -1
- package/dist/_chunks/{workflow-map-CYbRD9ek.js → workflow-map-ln4_OG8A.js} +2 -2
- package/dist/_chunks/{workflow-map-CYbRD9ek.js.map → workflow-map-ln4_OG8A.js.map} +1 -1
- package/dist/agent-catalog.json +172 -4
- package/dist/agent-i18n/en.json +25 -1
- package/dist/components/_shared/format-number.d.ts +20 -0
- package/dist/components/_shared/format-number.d.ts.map +1 -0
- package/dist/components/_shared/length-token.d.ts +12 -0
- package/dist/components/_shared/length-token.d.ts.map +1 -0
- package/dist/components/_shared/option.d.ts +1 -0
- package/dist/components/_shared/option.d.ts.map +1 -1
- package/dist/components/address-fields/index.js +1 -1
- package/dist/components/agenda-card/index.js +1 -1
- package/dist/components/agenda-tray/index.js +1 -1
- package/dist/components/ai-credits-notice/index.js +1 -1
- package/dist/components/ai-permission-notice/index.js +1 -1
- package/dist/components/ai-prompt-input/ai-prompt-input.d.ts.map +1 -1
- package/dist/components/ai-prompt-input/index.js +1 -1
- package/dist/components/alert/alert.d.ts +26 -0
- package/dist/components/alert/alert.d.ts.map +1 -1
- package/dist/components/alert/index.js +1 -1
- package/dist/components/anamnesis-summary-card/index.js +1 -1
- package/dist/components/appointment-card/index.js +2 -2
- package/dist/components/appointment-details-panel/index.js +1 -1
- package/dist/components/appointment-peek/index.js +1 -1
- package/dist/components/appointment-timeline/index.js +1 -1
- package/dist/components/audio-recorder/index.js +1 -1
- package/dist/components/avatar/avatar.d.ts +2 -0
- package/dist/components/avatar/avatar.d.ts.map +1 -1
- package/dist/components/avatar/index.js +1 -1
- package/dist/components/bishop-score/index.js +1 -1
- package/dist/components/booking/booking.d.ts.map +1 -1
- package/dist/components/booking/details-form.d.ts.map +1 -1
- package/dist/components/booking/index.js +1 -1
- package/dist/components/calendar/index.js +1 -1
- package/dist/components/chat-message/index.js +1 -1
- package/dist/components/clinical-note-card/index.js +1 -1
- package/dist/components/color-picker/color-picker.d.ts.map +1 -1
- package/dist/components/color-picker/index.js +1 -1
- package/dist/components/combobox/combobox.d.ts.map +1 -1
- package/dist/components/combobox/index.js +1 -1
- package/dist/components/contact-profile-card/index.js +1 -1
- package/dist/components/control-room-rail/index.js +1 -1
- package/dist/components/country-select/index.js +1 -1
- package/dist/components/dashboard-grid/dashboard-grid.agent.d.ts.map +1 -1
- package/dist/components/dashboard-grid/dashboard-grid.d.ts +20 -1
- package/dist/components/dashboard-grid/dashboard-grid.d.ts.map +1 -1
- package/dist/components/dashboard-grid/index.js +1 -1
- package/dist/components/data-table/index.js +2 -2
- package/dist/components/dependent-selector/index.js +1 -1
- package/dist/components/document-preview/index.js +1 -1
- package/dist/components/document-scanner/index.js +1 -1
- package/dist/components/editable-description/index.js +1 -1
- package/dist/components/entity-summary/index.js +1 -1
- package/dist/components/error-summary/index.js +1 -1
- package/dist/components/face-scheme/face-scheme.d.ts.map +1 -1
- package/dist/components/face-scheme/index.js +1 -1
- package/dist/components/file-manager/index.js +1 -1
- package/dist/components/freemium-paywall/index.js +1 -1
- package/dist/components/gestational-age-calculator/index.js +1 -1
- package/dist/components/header-settings/header-settings.d.ts.map +1 -1
- package/dist/components/header-settings/index.js +1 -1
- package/dist/components/heatmap/index.js +1 -1
- package/dist/components/index.d.ts +4 -2
- package/dist/components/index.d.ts.map +1 -1
- package/dist/components/map-view/index.d.ts +1 -1
- package/dist/components/map-view/index.d.ts.map +1 -1
- package/dist/components/map-view/index.js +1 -1
- package/dist/components/map-view/map-view.d.ts +51 -0
- package/dist/components/map-view/map-view.d.ts.map +1 -1
- package/dist/components/message-card/index.js +1 -1
- package/dist/components/message-tray/index.js +1 -1
- package/dist/components/multi-select/index.js +1 -1
- package/dist/components/multi-select/multi-select.d.ts.map +1 -1
- package/dist/components/muscle-scheme/index.js +1 -1
- package/dist/components/note-timeline/index.js +1 -1
- package/dist/components/notes-panel/index.js +1 -1
- package/dist/components/notice-group/index.d.ts +3 -0
- package/dist/components/notice-group/index.d.ts.map +1 -0
- package/dist/components/notice-group/index.js +6 -0
- package/dist/components/notice-group/index.js.map +1 -0
- package/dist/components/notice-group/notice-group.agent.d.ts +4 -0
- package/dist/components/notice-group/notice-group.agent.d.ts.map +1 -0
- package/dist/components/notice-group/notice-group.d.ts +43 -0
- package/dist/components/notice-group/notice-group.d.ts.map +1 -0
- package/dist/components/notification-tray/index.js +1 -1
- package/dist/components/operator-hero/index.js +1 -1
- package/dist/components/operator-hero/operator-hero.d.ts.map +1 -1
- package/dist/components/optical-prescription/index.js +1 -1
- package/dist/components/optical-prescription/optical-prescription-data.d.ts +8 -8
- package/dist/components/optical-prescription/optical-prescription-data.d.ts.map +1 -1
- package/dist/components/optical-prescription/optical-prescription.d.ts.map +1 -1
- package/dist/components/panel-header/index.js +1 -1
- package/dist/components/panel-header/panel-header.d.ts +10 -0
- package/dist/components/panel-header/panel-header.d.ts.map +1 -1
- package/dist/components/panel-subview/index.js +1 -1
- package/dist/components/patient-details/index.js +1 -1
- package/dist/components/patient-search/index.js +1 -1
- package/dist/components/patient-summary-card/index.js +1 -1
- package/dist/components/patient-table/index.js +1 -1
- package/dist/components/payment-form/index.js +1 -1
- package/dist/components/pdf-viewer/index.js +1 -1
- package/dist/components/periodontal-risk-chart/index.js +1 -1
- package/dist/components/periodontal-risk-chart/periodontal-risk-chart.d.ts.map +1 -1
- package/dist/components/practice-profile-hero/index.js +1 -1
- package/dist/components/practice-profile-hero/practice-profile-hero.d.ts +4 -1
- package/dist/components/practice-profile-hero/practice-profile-hero.d.ts.map +1 -1
- package/dist/components/practice-results/index.js +1 -1
- package/dist/components/practice-results/practice-results.d.ts +10 -2
- package/dist/components/practice-results/practice-results.d.ts.map +1 -1
- package/dist/components/pregnancy-dating/index.js +1 -1
- package/dist/components/product-hub-tray/index.js +1 -1
- package/dist/components/progress-notice/index.d.ts +3 -0
- package/dist/components/progress-notice/index.d.ts.map +1 -0
- package/dist/components/progress-notice/index.js +6 -0
- package/dist/components/progress-notice/index.js.map +1 -0
- package/dist/components/progress-notice/progress-notice.agent.d.ts +4 -0
- package/dist/components/progress-notice/progress-notice.agent.d.ts.map +1 -0
- package/dist/components/progress-notice/progress-notice.d.ts +81 -0
- package/dist/components/progress-notice/progress-notice.d.ts.map +1 -0
- package/dist/components/province-select/index.js +1 -1
- package/dist/components/radiograph-panel/index.js +1 -1
- package/dist/components/rating/index.js +1 -1
- package/dist/components/rating/rating.d.ts.map +1 -1
- package/dist/components/reviews-panel/index.js +1 -1
- package/dist/components/reviews-panel/reviews-panel.d.ts.map +1 -1
- package/dist/components/rich-text-editor/index.js +2 -2
- package/dist/components/select/index.js +1 -1
- package/dist/components/select/select.d.ts +6 -0
- package/dist/components/select/select.d.ts.map +1 -1
- package/dist/components/sign-document/index.js +1 -1
- package/dist/components/skeleton/index.d.ts +1 -1
- package/dist/components/skeleton/index.d.ts.map +1 -1
- package/dist/components/skeleton/index.js +1 -1
- package/dist/components/skeleton/skeleton.d.ts +41 -1
- package/dist/components/skeleton/skeleton.d.ts.map +1 -1
- package/dist/components/skeleton-scheme/index.js +1 -1
- package/dist/components/slot-grid/index.js +1 -1
- package/dist/components/tabs/index.js +1 -1
- package/dist/components/task-card/index.js +1 -1
- package/dist/components/task-editor/index.js +1 -1
- package/dist/components/task-tray/index.js +1 -1
- package/dist/components/tasks-panel/index.js +1 -1
- package/dist/components/theme-toggle/index.js +1 -1
- package/dist/components/theme-toggle/theme-toggle.d.ts.map +1 -1
- package/dist/components/timeline/index.js +1 -1
- package/dist/components/tool-rail/index.js +1 -1
- package/dist/components/transcript-panel/index.js +1 -1
- package/dist/components/treatment-receipt/index.js +1 -1
- package/dist/components/unit-converter/index.js +1 -1
- package/dist/components/voice-control-panel/index.js +1 -1
- package/dist/components/warning-stack/index.js +1 -1
- package/dist/components/workflow/index.js +1 -1
- package/dist/hooks/index.d.ts +1 -0
- package/dist/hooks/index.d.ts.map +1 -1
- package/dist/hooks/index.js +81 -76
- package/dist/hooks/index.js.map +1 -1
- package/dist/hooks/use-dismissed.d.ts +58 -0
- package/dist/hooks/use-dismissed.d.ts.map +1 -0
- package/dist/i18n/locales/ar.d.ts +22 -0
- package/dist/i18n/locales/ar.d.ts.map +1 -1
- package/dist/i18n/locales/ar.js +22 -0
- package/dist/i18n/locales/ar.js.map +1 -1
- package/dist/i18n/locales/de.d.ts +22 -0
- package/dist/i18n/locales/de.d.ts.map +1 -1
- package/dist/i18n/locales/de.js +22 -0
- package/dist/i18n/locales/de.js.map +1 -1
- package/dist/i18n/locales/el.d.ts +22 -0
- package/dist/i18n/locales/el.d.ts.map +1 -1
- package/dist/i18n/locales/el.js +22 -0
- package/dist/i18n/locales/el.js.map +1 -1
- package/dist/i18n/locales/en.d.ts +22 -0
- package/dist/i18n/locales/en.d.ts.map +1 -1
- package/dist/i18n/locales/en.js +22 -0
- package/dist/i18n/locales/en.js.map +1 -1
- package/dist/i18n/locales/es.d.ts +22 -0
- package/dist/i18n/locales/es.d.ts.map +1 -1
- package/dist/i18n/locales/es.js +22 -0
- package/dist/i18n/locales/es.js.map +1 -1
- package/dist/i18n/locales/fr.d.ts +22 -0
- package/dist/i18n/locales/fr.d.ts.map +1 -1
- package/dist/i18n/locales/fr.js +22 -0
- package/dist/i18n/locales/fr.js.map +1 -1
- package/dist/i18n/locales/hi.d.ts +22 -0
- package/dist/i18n/locales/hi.d.ts.map +1 -1
- package/dist/i18n/locales/hi.js +22 -0
- package/dist/i18n/locales/hi.js.map +1 -1
- package/dist/i18n/locales/it.d.ts +22 -0
- package/dist/i18n/locales/it.d.ts.map +1 -1
- package/dist/i18n/locales/it.js +22 -0
- package/dist/i18n/locales/it.js.map +1 -1
- package/dist/i18n/locales/ja.d.ts +22 -0
- package/dist/i18n/locales/ja.d.ts.map +1 -1
- package/dist/i18n/locales/ja.js +22 -0
- package/dist/i18n/locales/ja.js.map +1 -1
- package/dist/i18n/locales/nl.d.ts +22 -0
- package/dist/i18n/locales/nl.d.ts.map +1 -1
- package/dist/i18n/locales/nl.js +22 -0
- package/dist/i18n/locales/nl.js.map +1 -1
- package/dist/i18n/locales/pl.d.ts +22 -0
- package/dist/i18n/locales/pl.d.ts.map +1 -1
- package/dist/i18n/locales/pl.js +22 -0
- package/dist/i18n/locales/pl.js.map +1 -1
- package/dist/i18n/locales/pt.d.ts +22 -0
- package/dist/i18n/locales/pt.d.ts.map +1 -1
- package/dist/i18n/locales/pt.js +22 -0
- package/dist/i18n/locales/pt.js.map +1 -1
- package/dist/i18n/locales/ro.d.ts +22 -0
- package/dist/i18n/locales/ro.d.ts.map +1 -1
- package/dist/i18n/locales/ro.js +22 -0
- package/dist/i18n/locales/ro.js.map +1 -1
- package/dist/i18n/locales/ru.d.ts +22 -0
- package/dist/i18n/locales/ru.d.ts.map +1 -1
- package/dist/i18n/locales/ru.js +22 -0
- package/dist/i18n/locales/ru.js.map +1 -1
- package/dist/i18n/locales/sq.d.ts +22 -0
- package/dist/i18n/locales/sq.d.ts.map +1 -1
- package/dist/i18n/locales/sq.js +22 -0
- package/dist/i18n/locales/sq.js.map +1 -1
- package/dist/i18n/locales/sv.d.ts +22 -0
- package/dist/i18n/locales/sv.d.ts.map +1 -1
- package/dist/i18n/locales/sv.js +22 -0
- package/dist/i18n/locales/sv.js.map +1 -1
- package/dist/i18n/locales/tr.d.ts +22 -0
- package/dist/i18n/locales/tr.d.ts.map +1 -1
- package/dist/i18n/locales/tr.js +22 -0
- package/dist/i18n/locales/tr.js.map +1 -1
- package/dist/i18n/locales/zh.d.ts +22 -0
- package/dist/i18n/locales/zh.d.ts.map +1 -1
- package/dist/i18n/locales/zh.js +22 -0
- package/dist/i18n/locales/zh.js.map +1 -1
- package/dist/index.js +1194 -1183
- package/dist/index.js.map +1 -1
- package/dist/locales/ar.json +22 -0
- package/dist/locales/de.json +22 -0
- package/dist/locales/el.json +22 -0
- package/dist/locales/en.json +22 -0
- package/dist/locales/es.json +22 -0
- package/dist/locales/fr.json +22 -0
- package/dist/locales/hi.json +22 -0
- package/dist/locales/it.json +22 -0
- package/dist/locales/ja.json +22 -0
- package/dist/locales/nl.json +22 -0
- package/dist/locales/pl.json +22 -0
- package/dist/locales/pt.json +22 -0
- package/dist/locales/ro.json +22 -0
- package/dist/locales/ru.json +22 -0
- package/dist/locales/sq.json +22 -0
- package/dist/locales/sv.json +22 -0
- package/dist/locales/tr.json +22 -0
- package/dist/locales/zh.json +22 -0
- package/dist/patterns/alia-assistant/index.js +1 -1
- package/dist/patterns/anamnesis/anamnesis-export-pdf.d.ts.map +1 -1
- package/dist/patterns/anamnesis/index.js +1 -1
- package/dist/patterns/calendar/index.js +1 -1
- package/dist/patterns/forgot-password-form/index.js +1 -1
- package/dist/patterns/help-me-write-templates/index.js +2 -2
- package/dist/patterns/login-form/index.js +1 -1
- package/dist/patterns/marketplace-app-shell/index.js +1 -1
- package/dist/patterns/payment-automation-upsell/index.js +1 -1
- package/dist/patterns/registration-form/index.js +1 -1
- package/dist/patterns/signature-request/index.js +1 -1
- package/dist/tokens.css +1 -1
- package/package.json +9 -1
- package/dist/_chunks/ai-prompt-input-DSGSe4LH.js.map +0 -1
- package/dist/_chunks/alert-DjsJMGRE.js.map +0 -1
- package/dist/_chunks/anamnesis-summary-rows-BQ_EokKz.js.map +0 -1
- package/dist/_chunks/avatar-WZY3eGE7.js +0 -123
- package/dist/_chunks/avatar-WZY3eGE7.js.map +0 -1
- package/dist/_chunks/booking-tTVxKPQY.js.map +0 -1
- package/dist/_chunks/color-picker-BsggJovx.js.map +0 -1
- package/dist/_chunks/combobox-U5yfO6o0.js.map +0 -1
- package/dist/_chunks/contact-profile-card-C4-OCshj.js.map +0 -1
- package/dist/_chunks/dashboard-grid-B2MB7SRS.js +0 -1428
- package/dist/_chunks/dashboard-grid-B2MB7SRS.js.map +0 -1
- package/dist/_chunks/header-settings-BSH9Gk0J.js.map +0 -1
- package/dist/_chunks/map-view-BuVfJMEa.js.map +0 -1
- package/dist/_chunks/multi-select-CMaAQQgb.js.map +0 -1
- package/dist/_chunks/operator-hero-3_RG4Dkj.js.map +0 -1
- package/dist/_chunks/optical-prescription-CxfMsbxi.js.map +0 -1
- package/dist/_chunks/panel-header-BJkaUwnl.js +0 -128
- package/dist/_chunks/panel-header-BJkaUwnl.js.map +0 -1
- package/dist/_chunks/periodontal-risk-chart-CPy7CNFe.js.map +0 -1
- package/dist/_chunks/practice-profile-hero-Dfc0F60y.js +0 -193
- package/dist/_chunks/practice-profile-hero-Dfc0F60y.js.map +0 -1
- package/dist/_chunks/practice-results-BrUDDMXC.js.map +0 -1
- package/dist/_chunks/rating-C1Vrmpsi.js.map +0 -1
- package/dist/_chunks/reviews-panel-AvsVgtJu.js.map +0 -1
- package/dist/_chunks/select-k4gBdS8N.js.map +0 -1
- package/dist/_chunks/skeleton-B1KTdJ4N.js +0 -116
- package/dist/_chunks/skeleton-B1KTdJ4N.js.map +0 -1
- package/dist/_chunks/theme-toggle-Ctb77x6O.js.map +0 -1
package/dist/_chunks/{ai-permission-notice-qsdm4Sx4.js.map → ai-permission-notice-C00i6VhY.js.map}
RENAMED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ai-permission-notice-qsdm4Sx4.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 kit text flows through useTranslation('ui') against the */\n/* `aiConsentBanner.*` namespace. `subject` picks the kit-owned wording */\n/* preset; `copy` lets a host replace single strings with its own text. */\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/* Subject presets */\n/* -------------------------------------------------------------------- */\n\n/** What the consent covers; each subject has kit-owned, translated wording.\n * `'patient-record'` (default) is one patient's record. `'practice-statistics'`\n * is the practice's aggregate figures (totals, rates), never patient data. */\nexport type AiConsentSubject = 'patient-record' | 'practice-statistics';\n\ntype AiConsentSubjectField =\n | 'descriptionRequired'\n | 'descriptionGranted'\n | 'confirmLabel'\n | 'notAllowed';\n\n/* Only these four strings differ by subject; the rest share one key each. */\nconst SUBJECT_KEYS = {\n 'patient-record': {\n descriptionRequired: {\n key: 'aiConsentBanner.description.required',\n fallback: 'AI assistance requires recorded consent before it can run.',\n },\n descriptionGranted: {\n key: 'aiConsentBanner.description.granted',\n fallback: 'AI assistance is enabled for this record.',\n },\n confirmLabel: {\n key: 'aiConsentBanner.confirmLabel',\n fallback: 'I confirm consent has been obtained for AI assistance.',\n },\n notAllowed: {\n key: 'aiConsentBanner.notAllowed',\n fallback: 'You do not have permission to grant AI assistance consent.',\n },\n },\n 'practice-statistics': {\n descriptionRequired: {\n key: 'aiConsentBanner.practiceStatistics.description.required',\n fallback:\n \"AI assistance needs consent before it can read this practice's statistics. It uses aggregate figures only, never patient data.\",\n },\n descriptionGranted: {\n key: 'aiConsentBanner.practiceStatistics.description.granted',\n fallback:\n \"AI assistance can read this practice's statistics. It uses aggregate figures only, never patient data.\",\n },\n confirmLabel: {\n key: 'aiConsentBanner.practiceStatistics.confirmLabel',\n fallback:\n 'I may decide for this practice, and I agree to AI assistance reading its statistics.',\n },\n notAllowed: {\n key: 'aiConsentBanner.practiceStatistics.notAllowed',\n fallback:\n 'You do not have permission to grant AI assistance consent for this practice.',\n },\n },\n} as const satisfies Record<\n AiConsentSubject,\n Record<AiConsentSubjectField, { key: string; fallback: string }>\n>;\n\n/* -------------------------------------------------------------------- */\n/* Public types */\n/* -------------------------------------------------------------------- */\n\n/**\n * Patient AI-consent gate for an AI surface that sends patient data to a\n * service: the RichTextEditor's Help-me-write action and dictation mics, and\n * the VoiceControlPanel's microphone. Omit entirely for today's ungated\n * behaviour — no existing host breaks.\n *\n * Present and `granted: false`: the affordances stay visible (this never\n * hides a control), but using one shows the kit's `AiConsentBanner` instead\n * of starting the AI action. When `granted` flips `true` after a Grant click\n * in that banner, the surface resumes exactly the action it gated; when it\n * flips for any other reason (another patient, another tab) it only closes\n * the banner.\n *\n * Present and `granted: true`: normal behaviour.\n */\nexport interface AiConsentGate {\n /** Whether AI consent has already been recorded for the current patient. */\n granted: boolean;\n /** When consent was granted — passed straight to `AiConsentBanner`. */\n grantedAt?: string | number | Date;\n /** Who granted consent — passed straight to `AiConsentBanner`. */\n grantedBy?: string;\n /** Whether the signed-in reader may grant consent. Default `true`; treated\n * as `false` when `onGrant` is absent, so no dead Grant control shows. */\n canGrant?: boolean;\n /** The grant is being persisted server-side (host-driven busy state). */\n pending?: boolean;\n /**\n * Fired when the reader confirms the grant in the banner. A returned\n * promise drives the banner's own pending/Spinner state until it settles,\n * in addition to (or absent) a host-supplied `pending`.\n */\n onGrant?: () => void | Promise<void>;\n}\n\n/** Host-translated strings; the host owns their wording and translation.\n * Each one replaces the `subject` preset for that string only. Plain text,\n * not i18n keys: interpolate any values (a practice name) before passing. */\nexport interface AiConsentBannerCopy {\n /** Banner heading. */\n title?: string;\n /** Description in the required and pending states. */\n descriptionRequired?: string;\n /** Description in the granted state. */\n descriptionGranted?: string;\n /** Label of the confirmation checkbox. */\n confirmLabel?: string;\n /** Label of the Grant button. */\n grantButton?: string;\n /** Note shown instead of the grant controls when `canGrant` is false. */\n notAllowed?: string;\n /** Badge text in the granted state. */\n badgeGranted?: string;\n /** Busy text (and Spinner label) in the pending state. */\n pendingLabel?: string;\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 /** What the consent covers; picks the kit's translated wording. Default\n * `'patient-record'`, which renders exactly as before this prop existed. */\n subject?: AiConsentSubject;\n /** Host-translated strings; the host owns their wording and translation.\n * Each key overrides only its own string. `title` also names the region,\n * unless `aria-label` is passed. */\n copy?: Partial<AiConsentBannerCopy>;\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 subject = 'patient-record',\n copy,\n 'aria-label': ariaLabel,\n className,\n ...rest\n },\n ref,\n ) => {\n const { t } = useTranslation('ui');\n const state = deriveState(granted, pending);\n\n // A host string wins over the preset for that string only. A blank or\n // whitespace-only one counts as missing, so no control loses its name.\n const own = (value?: string) => value?.trim() || undefined;\n // An unknown subject from an untyped host falls back to the default.\n const keys = SUBJECT_KEYS[subject] ?? SUBJECT_KEYS['patient-record'];\n const text = {\n title:\n own(copy?.title) || t('aiConsentBanner.title', 'AI assistance consent'),\n descriptionRequired:\n own(copy?.descriptionRequired) ||\n t(keys.descriptionRequired.key, keys.descriptionRequired.fallback),\n descriptionGranted:\n own(copy?.descriptionGranted) ||\n t(keys.descriptionGranted.key, keys.descriptionGranted.fallback),\n confirmLabel:\n own(copy?.confirmLabel) ||\n t(keys.confirmLabel.key, keys.confirmLabel.fallback),\n grantButton:\n own(copy?.grantButton) ||\n t('aiConsentBanner.grantButton', 'Grant consent'),\n notAllowed:\n own(copy?.notAllowed) ||\n t(keys.notAllowed.key, keys.notAllowed.fallback),\n badgeGranted:\n own(copy?.badgeGranted) ||\n t('aiConsentBanner.badge.granted', 'Consent granted'),\n pendingLabel:\n own(copy?.pendingLabel) ||\n t('aiConsentBanner.pendingLabel', 'Saving consent…'),\n };\n\n // Grant stays disabled until the checkbox is ticked. Any change of subject\n // or statement unticks it, even back to an earlier one, so a tick only\n // confirms what was on screen when it was given.\n const statement = [\n subject,\n text.confirmLabel,\n text.descriptionRequired,\n ].join('\\u0000');\n const [ticked, setTicked] = useState(false);\n const [tickedFor, setTickedFor] = useState(statement);\n if (tickedFor !== statement) {\n setTickedFor(statement);\n setTicked(false);\n }\n const armed = ticked && tickedFor === statement;\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 // A host title also names the region, so the name matches the heading.\n const resolvedAriaLabel =\n own(ariaLabel) ||\n own(copy?.title) ||\n 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\">{text.badgeGranted}</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 variant=\"pulse\" size=\"sm\" label={text.pendingLabel} />\n <span className=\"type-body-sm ds:text-[color:var(--muted-foreground)]\">\n {text.pendingLabel}\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) => setTicked(next === true)}\n label={text.confirmLabel}\n />\n <Alert.Action>\n <Button\n intent=\"primary\"\n size=\"sm\"\n disabled={!armed}\n onClick={onGrantConsent}\n >\n {text.grantButton}\n </Button>\n </Alert.Action>\n </div>\n ) : (\n <p className=\"type-body-sm ds:m-0 ds:text-[color:var(--muted-foreground)]\">\n {text.notAllowed}\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 {text.title}\n </Alert.Title>\n <Alert.Description>\n {state === 'granted'\n ? text.descriptionGranted\n : text.descriptionRequired}\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","SUBJECT_KEYS","AiConsentBanner","forwardRef","id","grantedAt","grantedBy","canGrant","onGrantConsent","headingLevel","subject","copy","ariaLabel","className","rest","ref","useTranslation","state","own","value","keys","text","statement","ticked","setTicked","useState","tickedFor","setTickedFor","armed","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-C00i6VhY.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 kit text flows through useTranslation('ui') against the */\n/* `aiConsentBanner.*` namespace. `subject` picks the kit-owned wording */\n/* preset; `copy` lets a host replace single strings with its own text. */\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/* Subject presets */\n/* -------------------------------------------------------------------- */\n\n/** What the consent covers; each subject has kit-owned, translated wording.\n * `'patient-record'` (default) is one patient's record. `'practice-statistics'`\n * is the practice's aggregate figures (totals, rates), never patient data. */\nexport type AiConsentSubject = 'patient-record' | 'practice-statistics';\n\ntype AiConsentSubjectField =\n | 'descriptionRequired'\n | 'descriptionGranted'\n | 'confirmLabel'\n | 'notAllowed';\n\n/* Only these four strings differ by subject; the rest share one key each. */\nconst SUBJECT_KEYS = {\n 'patient-record': {\n descriptionRequired: {\n key: 'aiConsentBanner.description.required',\n fallback: 'AI assistance requires recorded consent before it can run.',\n },\n descriptionGranted: {\n key: 'aiConsentBanner.description.granted',\n fallback: 'AI assistance is enabled for this record.',\n },\n confirmLabel: {\n key: 'aiConsentBanner.confirmLabel',\n fallback: 'I confirm consent has been obtained for AI assistance.',\n },\n notAllowed: {\n key: 'aiConsentBanner.notAllowed',\n fallback: 'You do not have permission to grant AI assistance consent.',\n },\n },\n 'practice-statistics': {\n descriptionRequired: {\n key: 'aiConsentBanner.practiceStatistics.description.required',\n fallback:\n \"AI assistance needs consent before it can read this practice's statistics. It uses aggregate figures only, never patient data.\",\n },\n descriptionGranted: {\n key: 'aiConsentBanner.practiceStatistics.description.granted',\n fallback:\n \"AI assistance can read this practice's statistics. It uses aggregate figures only, never patient data.\",\n },\n confirmLabel: {\n key: 'aiConsentBanner.practiceStatistics.confirmLabel',\n fallback:\n 'I may decide for this practice, and I agree to AI assistance reading its statistics.',\n },\n notAllowed: {\n key: 'aiConsentBanner.practiceStatistics.notAllowed',\n fallback:\n 'You do not have permission to grant AI assistance consent for this practice.',\n },\n },\n} as const satisfies Record<\n AiConsentSubject,\n Record<AiConsentSubjectField, { key: string; fallback: string }>\n>;\n\n/* -------------------------------------------------------------------- */\n/* Public types */\n/* -------------------------------------------------------------------- */\n\n/**\n * Patient AI-consent gate for an AI surface that sends patient data to a\n * service: the RichTextEditor's Help-me-write action and dictation mics, and\n * the VoiceControlPanel's microphone. Omit entirely for today's ungated\n * behaviour — no existing host breaks.\n *\n * Present and `granted: false`: the affordances stay visible (this never\n * hides a control), but using one shows the kit's `AiConsentBanner` instead\n * of starting the AI action. When `granted` flips `true` after a Grant click\n * in that banner, the surface resumes exactly the action it gated; when it\n * flips for any other reason (another patient, another tab) it only closes\n * the banner.\n *\n * Present and `granted: true`: normal behaviour.\n */\nexport interface AiConsentGate {\n /** Whether AI consent has already been recorded for the current patient. */\n granted: boolean;\n /** When consent was granted — passed straight to `AiConsentBanner`. */\n grantedAt?: string | number | Date;\n /** Who granted consent — passed straight to `AiConsentBanner`. */\n grantedBy?: string;\n /** Whether the signed-in reader may grant consent. Default `true`; treated\n * as `false` when `onGrant` is absent, so no dead Grant control shows. */\n canGrant?: boolean;\n /** The grant is being persisted server-side (host-driven busy state). */\n pending?: boolean;\n /**\n * Fired when the reader confirms the grant in the banner. A returned\n * promise drives the banner's own pending/Spinner state until it settles,\n * in addition to (or absent) a host-supplied `pending`.\n */\n onGrant?: () => void | Promise<void>;\n}\n\n/** Host-translated strings; the host owns their wording and translation.\n * Each one replaces the `subject` preset for that string only. Plain text,\n * not i18n keys: interpolate any values (a practice name) before passing. */\nexport interface AiConsentBannerCopy {\n /** Banner heading. */\n title?: string;\n /** Description in the required and pending states. */\n descriptionRequired?: string;\n /** Description in the granted state. */\n descriptionGranted?: string;\n /** Label of the confirmation checkbox. */\n confirmLabel?: string;\n /** Label of the Grant button. */\n grantButton?: string;\n /** Note shown instead of the grant controls when `canGrant` is false. */\n notAllowed?: string;\n /** Badge text in the granted state. */\n badgeGranted?: string;\n /** Busy text (and Spinner label) in the pending state. */\n pendingLabel?: string;\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 /** What the consent covers; picks the kit's translated wording. Default\n * `'patient-record'`, which renders exactly as before this prop existed. */\n subject?: AiConsentSubject;\n /** Host-translated strings; the host owns their wording and translation.\n * Each key overrides only its own string. `title` also names the region,\n * unless `aria-label` is passed. */\n copy?: Partial<AiConsentBannerCopy>;\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 subject = 'patient-record',\n copy,\n 'aria-label': ariaLabel,\n className,\n ...rest\n },\n ref,\n ) => {\n const { t } = useTranslation('ui');\n const state = deriveState(granted, pending);\n\n // A host string wins over the preset for that string only. A blank or\n // whitespace-only one counts as missing, so no control loses its name.\n const own = (value?: string) => value?.trim() || undefined;\n // An unknown subject from an untyped host falls back to the default.\n const keys = SUBJECT_KEYS[subject] ?? SUBJECT_KEYS['patient-record'];\n const text = {\n title:\n own(copy?.title) || t('aiConsentBanner.title', 'AI assistance consent'),\n descriptionRequired:\n own(copy?.descriptionRequired) ||\n t(keys.descriptionRequired.key, keys.descriptionRequired.fallback),\n descriptionGranted:\n own(copy?.descriptionGranted) ||\n t(keys.descriptionGranted.key, keys.descriptionGranted.fallback),\n confirmLabel:\n own(copy?.confirmLabel) ||\n t(keys.confirmLabel.key, keys.confirmLabel.fallback),\n grantButton:\n own(copy?.grantButton) ||\n t('aiConsentBanner.grantButton', 'Grant consent'),\n notAllowed:\n own(copy?.notAllowed) ||\n t(keys.notAllowed.key, keys.notAllowed.fallback),\n badgeGranted:\n own(copy?.badgeGranted) ||\n t('aiConsentBanner.badge.granted', 'Consent granted'),\n pendingLabel:\n own(copy?.pendingLabel) ||\n t('aiConsentBanner.pendingLabel', 'Saving consent…'),\n };\n\n // Grant stays disabled until the checkbox is ticked. Any change of subject\n // or statement unticks it, even back to an earlier one, so a tick only\n // confirms what was on screen when it was given.\n const statement = [\n subject,\n text.confirmLabel,\n text.descriptionRequired,\n ].join('\\u0000');\n const [ticked, setTicked] = useState(false);\n const [tickedFor, setTickedFor] = useState(statement);\n if (tickedFor !== statement) {\n setTickedFor(statement);\n setTicked(false);\n }\n const armed = ticked && tickedFor === statement;\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 // A host title also names the region, so the name matches the heading.\n const resolvedAriaLabel =\n own(ariaLabel) ||\n own(copy?.title) ||\n 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\">{text.badgeGranted}</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 variant=\"pulse\" size=\"sm\" label={text.pendingLabel} />\n <span className=\"type-body-sm ds:text-[color:var(--muted-foreground)]\">\n {text.pendingLabel}\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) => setTicked(next === true)}\n label={text.confirmLabel}\n />\n <Alert.Action>\n <Button\n intent=\"primary\"\n size=\"sm\"\n disabled={!armed}\n onClick={onGrantConsent}\n >\n {text.grantButton}\n </Button>\n </Alert.Action>\n </div>\n ) : (\n <p className=\"type-body-sm ds:m-0 ds:text-[color:var(--muted-foreground)]\">\n {text.notAllowed}\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 {text.title}\n </Alert.Title>\n <Alert.Description>\n {state === 'granted'\n ? text.descriptionGranted\n : text.descriptionRequired}\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","SUBJECT_KEYS","AiConsentBanner","forwardRef","id","grantedAt","grantedBy","canGrant","onGrantConsent","headingLevel","subject","copy","ariaLabel","className","rest","ref","useTranslation","state","own","value","keys","text","statement","ticked","setTicked","useState","tickedFor","setTickedFor","armed","armedRef","useRef","useMemo","useAgentRegistration","resolvedAriaLabel","alertVariant","body","jsxs","jsx","Badge","Timestamp","Spinner","Checkbox","next","Alert","Button"],"mappings":"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"}
|
|
@@ -1,18 +1,19 @@
|
|
|
1
1
|
import { jsxs as u, jsx as a } from "react/jsx-runtime";
|
|
2
|
-
import { forwardRef as
|
|
3
|
-
import { c as
|
|
4
|
-
import { useTranslation as
|
|
5
|
-
import { u as
|
|
6
|
-
import { u as
|
|
2
|
+
import { forwardRef as Ce, useId as Oe, useRef as H, useCallback as v, useState as L, useImperativeHandle as $e, useMemo as De } from "react";
|
|
3
|
+
import { c as Re } from "./index-D2ZczOXr.js";
|
|
4
|
+
import { useTranslation as ae } from "react-i18next";
|
|
5
|
+
import { u as te } from "./use-controllable-state-BiY4xTzM.js";
|
|
6
|
+
import { u as _e } 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
|
-
import { u as
|
|
10
|
-
import { I as
|
|
11
|
-
import { S as We } from "./select-
|
|
12
|
-
import { b as
|
|
13
|
-
import {
|
|
14
|
-
import {
|
|
15
|
-
|
|
9
|
+
import { u as Le } from "./index-BcMWc8W2.js";
|
|
10
|
+
import { I as re } from "./icon-button-C_1TgRiK.js";
|
|
11
|
+
import { S as We } from "./select-4S-eYZUf.js";
|
|
12
|
+
import { b as Ae } from "./menu-row-BAr8bx1I.js";
|
|
13
|
+
import { a as W } from "./format-number-DdzqwMs1.js";
|
|
14
|
+
import { S as Ue } from "./send-C5kDJ-Mz.js";
|
|
15
|
+
import { X as Ge } from "./x-B5YnXwCz.js";
|
|
16
|
+
const Ze = {
|
|
16
17
|
id: "ai-prompt-input",
|
|
17
18
|
capabilities: ["edit_inline", "submit"],
|
|
18
19
|
state: {
|
|
@@ -54,8 +55,8 @@ const Ae = {
|
|
|
54
55
|
note: "Replace composer text."
|
|
55
56
|
}
|
|
56
57
|
],
|
|
57
|
-
invoke: (s,
|
|
58
|
-
s.setValue(
|
|
58
|
+
invoke: (s, o) => {
|
|
59
|
+
s.setValue(o.value);
|
|
59
60
|
}
|
|
60
61
|
},
|
|
61
62
|
clear: {
|
|
@@ -101,7 +102,7 @@ const Ae = {
|
|
|
101
102
|
description: "Sourced from the id prop; addresses a specific composer instance."
|
|
102
103
|
}
|
|
103
104
|
}
|
|
104
|
-
},
|
|
105
|
+
}, qe = Re(
|
|
105
106
|
[
|
|
106
107
|
"ds:flex ds:flex-col ds:gap-[var(--spacing-xs)] ds:w-full",
|
|
107
108
|
"ds:rounded-[var(--radius-md)] ds:border ds:border-[color:var(--control-border)] ds:bg-input",
|
|
@@ -120,58 +121,58 @@ const Ae = {
|
|
|
120
121
|
},
|
|
121
122
|
defaultVariants: { size: "md" }
|
|
122
123
|
}
|
|
123
|
-
),
|
|
124
|
+
), Qe = Ce(
|
|
124
125
|
({
|
|
125
126
|
commands: s = [],
|
|
126
|
-
models:
|
|
127
|
-
defaultModelId:
|
|
128
|
-
modelId:
|
|
129
|
-
onModelChange:
|
|
127
|
+
models: o,
|
|
128
|
+
defaultModelId: E,
|
|
129
|
+
modelId: T,
|
|
130
|
+
onModelChange: ne,
|
|
130
131
|
maxSize: h,
|
|
131
|
-
accept:
|
|
132
|
-
context:
|
|
132
|
+
accept: ie,
|
|
133
|
+
context: K,
|
|
133
134
|
onContextDismiss: b,
|
|
134
135
|
onSubmit: x,
|
|
135
136
|
onAttach: y,
|
|
136
137
|
onAttachmentRejected: I,
|
|
137
|
-
minRows:
|
|
138
|
-
maxRows:
|
|
139
|
-
value:
|
|
140
|
-
defaultValue:
|
|
141
|
-
size:
|
|
142
|
-
disabled:
|
|
143
|
-
className:
|
|
144
|
-
placeholder:
|
|
145
|
-
onChange:
|
|
146
|
-
onKeyDown:
|
|
147
|
-
onCompositionStart:
|
|
148
|
-
onCompositionEnd:
|
|
149
|
-
onPaste:
|
|
138
|
+
minRows: F = 2,
|
|
139
|
+
maxRows: A = 8,
|
|
140
|
+
value: U,
|
|
141
|
+
defaultValue: oe,
|
|
142
|
+
size: de = "md",
|
|
143
|
+
disabled: G,
|
|
144
|
+
className: le,
|
|
145
|
+
placeholder: ce,
|
|
146
|
+
onChange: B,
|
|
147
|
+
onKeyDown: C,
|
|
148
|
+
onCompositionStart: O,
|
|
149
|
+
onCompositionEnd: $,
|
|
150
|
+
onPaste: D,
|
|
150
151
|
id: R,
|
|
151
|
-
...
|
|
152
|
-
},
|
|
153
|
-
var
|
|
154
|
-
const { t:
|
|
152
|
+
...pe
|
|
153
|
+
}, ue) => {
|
|
154
|
+
var J;
|
|
155
|
+
const { t: d } = ae("ui"), me = Oe(), w = H(null), N = H(!1), fe = H(null), ve = v((e) => {
|
|
155
156
|
w.current = e;
|
|
156
|
-
}, []), [
|
|
157
|
-
value:
|
|
158
|
-
defaultValue: String(
|
|
159
|
-
}), i =
|
|
160
|
-
value:
|
|
161
|
-
defaultValue:
|
|
162
|
-
onChange:
|
|
163
|
-
}),
|
|
157
|
+
}, []), [ge, m] = te({
|
|
158
|
+
value: U === void 0 ? void 0 : String(U),
|
|
159
|
+
defaultValue: String(oe ?? "")
|
|
160
|
+
}), i = ge ?? "", [p, S] = L([]), [f, k] = L(!1), [he, M] = L(""), [be, xe] = te({
|
|
161
|
+
value: T,
|
|
162
|
+
defaultValue: E ?? ((J = o == null ? void 0 : o[0]) == null ? void 0 : J.id) ?? "",
|
|
163
|
+
onChange: ne
|
|
164
|
+
}), _ = be ?? "", Z = v(() => {
|
|
164
165
|
const e = w.current;
|
|
165
166
|
if (!e) return;
|
|
166
|
-
const t = window.getComputedStyle(e), n = parseFloat(t.lineHeight) || 24, r = parseFloat(t.paddingTop) || 0, c = parseFloat(t.paddingBottom) || 0, l = parseFloat(t.borderTopWidth) || 0,
|
|
167
|
+
const t = window.getComputedStyle(e), n = parseFloat(t.lineHeight) || 24, r = parseFloat(t.paddingTop) || 0, c = parseFloat(t.paddingBottom) || 0, l = parseFloat(t.borderTopWidth) || 0, j = parseFloat(t.borderBottomWidth) || 0, V = r + c + l + j, Fe = n * F + V, ee = n * A + V;
|
|
167
168
|
e.style.height = "auto";
|
|
168
|
-
const
|
|
169
|
-
e.style.height = `${
|
|
170
|
-
}, [
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
}, [
|
|
174
|
-
const
|
|
169
|
+
const Be = Math.max(Fe, Math.min(e.scrollHeight, ee));
|
|
170
|
+
e.style.height = `${Be}px`, e.style.overflowY = e.scrollHeight > ee ? "auto" : "hidden";
|
|
171
|
+
}, [F, A]);
|
|
172
|
+
_e(() => {
|
|
173
|
+
Z();
|
|
174
|
+
}, [Z, i]);
|
|
175
|
+
const ye = v((e, t) => {
|
|
175
176
|
const r = e.slice(0, t).lastIndexOf(`
|
|
176
177
|
`) + 1, c = e.slice(r, t);
|
|
177
178
|
if (c.startsWith("/")) {
|
|
@@ -182,16 +183,16 @@ const Ae = {
|
|
|
182
183
|
}
|
|
183
184
|
}
|
|
184
185
|
k(!1), M("");
|
|
185
|
-
}, []),
|
|
186
|
+
}, []), Ie = (e) => {
|
|
186
187
|
if (m(e.target.value), N.current) return;
|
|
187
|
-
|
|
188
|
+
B == null || B(e);
|
|
188
189
|
const t = e.target.selectionStart ?? e.target.value.length;
|
|
189
|
-
|
|
190
|
-
},
|
|
191
|
-
N.current = !0,
|
|
192
|
-
},
|
|
193
|
-
N.current = !1,
|
|
194
|
-
},
|
|
190
|
+
ye(e.target.value, t);
|
|
191
|
+
}, we = (e) => {
|
|
192
|
+
N.current = !0, O == null || O(e);
|
|
193
|
+
}, Ne = (e) => {
|
|
194
|
+
N.current = !1, $ == null || $(e);
|
|
195
|
+
}, Se = (e) => e.nativeEvent.isComposing || e.keyCode === 229 || N.current, P = v(() => {
|
|
195
196
|
if (!i.trim() && p.length === 0) return;
|
|
196
197
|
let t, n = i;
|
|
197
198
|
const r = i.match(/^\/(\S+)\s?/);
|
|
@@ -199,11 +200,11 @@ const Ae = {
|
|
|
199
200
|
text: n,
|
|
200
201
|
command: t,
|
|
201
202
|
attachments: p,
|
|
202
|
-
modelId:
|
|
203
|
+
modelId: _ || void 0
|
|
203
204
|
}), m(""), S([]);
|
|
204
|
-
}, [i, p, x,
|
|
205
|
-
$e(
|
|
206
|
-
const
|
|
205
|
+
}, [i, p, x, _, m]), q = H(null);
|
|
206
|
+
$e(ue, () => q.current, []);
|
|
207
|
+
const ke = De(
|
|
207
208
|
() => ({
|
|
208
209
|
getValue: () => i,
|
|
209
210
|
isEmpty: () => !i.trim() && p.length === 0,
|
|
@@ -224,16 +225,16 @@ const Ae = {
|
|
|
224
225
|
}),
|
|
225
226
|
[i, p, m, P]
|
|
226
227
|
);
|
|
227
|
-
je(
|
|
228
|
-
const
|
|
229
|
-
if (
|
|
228
|
+
je(Ze, ke, R);
|
|
229
|
+
const Me = (e) => {
|
|
230
|
+
if (C == null || C(e), !e.defaultPrevented && !Se(e)) {
|
|
230
231
|
if (f && e.key === "Escape") {
|
|
231
232
|
e.preventDefault(), k(!1);
|
|
232
233
|
return;
|
|
233
234
|
}
|
|
234
235
|
e.key === "Enter" && (e.metaKey || e.ctrlKey) && (e.preventDefault(), P());
|
|
235
236
|
}
|
|
236
|
-
},
|
|
237
|
+
}, Pe = (e) => {
|
|
237
238
|
const t = w.current;
|
|
238
239
|
if (!t) return;
|
|
239
240
|
const n = t.selectionStart ?? i.length, c = i.slice(0, n).lastIndexOf(`
|
|
@@ -241,10 +242,10 @@ const Ae = {
|
|
|
241
242
|
let l = n;
|
|
242
243
|
for (; l < i.length && !/\s/.test(i[l]); )
|
|
243
244
|
l += 1;
|
|
244
|
-
const
|
|
245
|
+
const j = i.slice(l), V = i.slice(0, c) + `/${e.id} ` + j;
|
|
245
246
|
m(V), k(!1), M(""), queueMicrotask(() => t.focus());
|
|
246
|
-
},
|
|
247
|
-
if (
|
|
247
|
+
}, ze = (e) => {
|
|
248
|
+
if (D == null || D(e), e.defaultPrevented) return;
|
|
248
249
|
const { clipboardData: t } = e;
|
|
249
250
|
if (!t) return;
|
|
250
251
|
const n = [];
|
|
@@ -255,15 +256,15 @@ const Ae = {
|
|
|
255
256
|
l && n.push(l);
|
|
256
257
|
}
|
|
257
258
|
}
|
|
258
|
-
n.length > 0 && (e.preventDefault(),
|
|
259
|
-
},
|
|
259
|
+
n.length > 0 && (e.preventDefault(), Q(n));
|
|
260
|
+
}, Q = v(
|
|
260
261
|
(e) => {
|
|
261
262
|
var n;
|
|
262
263
|
const t = [];
|
|
263
264
|
for (const r of e) {
|
|
264
265
|
if (typeof h == "number" && r.size > h) {
|
|
265
266
|
I == null || I(
|
|
266
|
-
|
|
267
|
+
d("chat.attachment.rejected", { reason: "size" })
|
|
267
268
|
);
|
|
268
269
|
continue;
|
|
269
270
|
}
|
|
@@ -274,36 +275,36 @@ const Ae = {
|
|
|
274
275
|
}
|
|
275
276
|
t.length > 0 && (S((r) => [...r, ...t]), y == null || y(t.map((r) => r.file)));
|
|
276
277
|
},
|
|
277
|
-
[h, y, I,
|
|
278
|
-
), { getRootProps:
|
|
279
|
-
onDrop:
|
|
278
|
+
[h, y, I, d]
|
|
279
|
+
), { getRootProps: Ve, getInputProps: He, isDragActive: Ee } = Le({
|
|
280
|
+
onDrop: Q,
|
|
280
281
|
maxSize: h,
|
|
281
|
-
accept:
|
|
282
|
+
accept: ie,
|
|
282
283
|
noClick: !0,
|
|
283
284
|
noKeyboard: !0
|
|
284
|
-
}),
|
|
285
|
+
}), Te = (e) => {
|
|
285
286
|
S((t) => t.filter((n) => n.id !== e));
|
|
286
|
-
}, z = R ??
|
|
287
|
+
}, z = R ?? me, X = `${z}-label`, Y = `${z}-slash-list`, Ke = (o == null ? void 0 : o.map((e) => ({ value: e.id, label: e.label }))) ?? [];
|
|
287
288
|
return /* @__PURE__ */ u(
|
|
288
289
|
"div",
|
|
289
290
|
{
|
|
290
|
-
ref:
|
|
291
|
-
...
|
|
291
|
+
ref: q,
|
|
292
|
+
...Ve({
|
|
292
293
|
className: [
|
|
293
|
-
|
|
294
|
-
|
|
294
|
+
qe({ size: de, className: le }),
|
|
295
|
+
Ee ? "ds:outline ds:outline-dashed ds:outline-[color:var(--primary)] ds:outline-offset-2 ds:bg-[color:var(--primary)]/5" : ""
|
|
295
296
|
].join(" ")
|
|
296
297
|
}),
|
|
297
|
-
"aria-label":
|
|
298
|
+
"aria-label": d("chat.attachmentZone"),
|
|
298
299
|
"data-component": "ai-prompt-input",
|
|
299
300
|
"data-component-id": R,
|
|
300
301
|
children: [
|
|
301
|
-
/* @__PURE__ */ a("input", { "aria-label":
|
|
302
|
-
|
|
302
|
+
/* @__PURE__ */ a("input", { "aria-label": d("chat.attachmentZone"), ...He() }),
|
|
303
|
+
K ? /* @__PURE__ */ a("div", { className: "ds:ps-[var(--spacing-sm)] ds:pe-[var(--spacing-xs)] ds:pt-[var(--spacing-xs)]", children: /* @__PURE__ */ a(
|
|
303
304
|
"button",
|
|
304
305
|
{
|
|
305
306
|
type: "button",
|
|
306
|
-
"aria-label":
|
|
307
|
+
"aria-label": d("chat.contextActive", { name: K }),
|
|
307
308
|
onClick: b,
|
|
308
309
|
onKeyDown: (e) => {
|
|
309
310
|
(e.key === "Backspace" || e.key === "Delete") && (e.preventDefault(), b == null || b());
|
|
@@ -318,29 +319,29 @@ const Ae = {
|
|
|
318
319
|
"ds:focus-visible:outline-[length:var(--focus-ring-width)] ds:focus-visible:outline-solid ds:focus-visible:outline-[color:var(--ring)]",
|
|
319
320
|
"ds:forced-colors:focus-visible:outline-[CanvasText]"
|
|
320
321
|
].join(" "),
|
|
321
|
-
children:
|
|
322
|
+
children: d("chat.contextActive", { name: K })
|
|
322
323
|
}
|
|
323
324
|
) }) : null,
|
|
324
|
-
/* @__PURE__ */ a("label", { id:
|
|
325
|
+
/* @__PURE__ */ a("label", { id: X, htmlFor: z, className: "ds:sr-only", children: d("chat.prompt") }),
|
|
325
326
|
/* @__PURE__ */ u("div", { className: "ds:relative", children: [
|
|
326
327
|
/* @__PURE__ */ a(
|
|
327
328
|
"textarea",
|
|
328
329
|
{
|
|
329
|
-
ref:
|
|
330
|
+
ref: ve,
|
|
330
331
|
id: z,
|
|
331
|
-
rows:
|
|
332
|
+
rows: F,
|
|
332
333
|
value: i,
|
|
333
|
-
disabled:
|
|
334
|
-
placeholder:
|
|
335
|
-
"aria-labelledby":
|
|
334
|
+
disabled: G,
|
|
335
|
+
placeholder: ce ?? d("chat.input.placeholder"),
|
|
336
|
+
"aria-labelledby": X,
|
|
336
337
|
role: f ? "combobox" : void 0,
|
|
337
|
-
"aria-controls": f ?
|
|
338
|
+
"aria-controls": f ? Y : void 0,
|
|
338
339
|
"aria-expanded": f ? !0 : void 0,
|
|
339
|
-
onChange:
|
|
340
|
-
onKeyDown:
|
|
341
|
-
onPaste:
|
|
342
|
-
onCompositionStart:
|
|
343
|
-
onCompositionEnd:
|
|
340
|
+
onChange: Ie,
|
|
341
|
+
onKeyDown: Me,
|
|
342
|
+
onPaste: ze,
|
|
343
|
+
onCompositionStart: we,
|
|
344
|
+
onCompositionEnd: Ne,
|
|
344
345
|
className: [
|
|
345
346
|
"ds:w-full ds:resize-none ds:bg-transparent ds:outline-none",
|
|
346
347
|
"ds:ps-[var(--spacing-md)] ds:pe-[var(--spacing-md)] ds:pt-[var(--spacing-sm)] ds:pb-[var(--spacing-xs)]",
|
|
@@ -348,13 +349,13 @@ const Ae = {
|
|
|
348
349
|
"ds:leading-[var(--line-height-base)]",
|
|
349
350
|
"ds:disabled:opacity-50 ds:disabled:cursor-not-allowed"
|
|
350
351
|
].join(" "),
|
|
351
|
-
...
|
|
352
|
+
...pe
|
|
352
353
|
}
|
|
353
354
|
),
|
|
354
355
|
f ? /* @__PURE__ */ a(
|
|
355
356
|
"div",
|
|
356
357
|
{
|
|
357
|
-
ref:
|
|
358
|
+
ref: fe,
|
|
358
359
|
className: [
|
|
359
360
|
"ds:absolute ds:start-[var(--spacing-md)] ds:top-full ds:z-50",
|
|
360
361
|
"ds:mt-[var(--spacing-xs)]",
|
|
@@ -367,29 +368,29 @@ const Ae = {
|
|
|
367
368
|
"ds:origin-top ds:motion-safe:animate-in ds:motion-safe:fade-in-0 ds:motion-safe:zoom-in-95",
|
|
368
369
|
"ds:duration-[var(--animation-duration)] ds:ease-[var(--ease-out)]"
|
|
369
370
|
].join(" "),
|
|
370
|
-
id:
|
|
371
|
-
children: /* @__PURE__ */ u(g, { label:
|
|
371
|
+
id: Y,
|
|
372
|
+
children: /* @__PURE__ */ u(g, { label: d("chat.slashMenu.label"), loop: !0, children: [
|
|
372
373
|
/* @__PURE__ */ a(
|
|
373
374
|
g.Input,
|
|
374
375
|
{
|
|
375
|
-
value:
|
|
376
|
+
value: he,
|
|
376
377
|
onValueChange: M,
|
|
377
378
|
className: "ds:sr-only"
|
|
378
379
|
}
|
|
379
380
|
),
|
|
380
381
|
/* @__PURE__ */ u(g.List, { className: "ds:max-h-60 ds:overflow-y-auto ds:pt-[var(--spacing-xs)] ds:pb-[var(--spacing-xs)]", children: [
|
|
381
|
-
/* @__PURE__ */ a(g.Empty, { className: "type-body-sm ds:text-[color:var(--muted-foreground)] ds:ps-[var(--spacing-md)] ds:pe-[var(--spacing-md)] ds:pt-[var(--spacing-sm)] ds:pb-[var(--spacing-sm)]", children:
|
|
382
|
+
/* @__PURE__ */ a(g.Empty, { className: "type-body-sm ds:text-[color:var(--muted-foreground)] ds:ps-[var(--spacing-md)] ds:pe-[var(--spacing-md)] ds:pt-[var(--spacing-sm)] ds:pb-[var(--spacing-sm)]", children: d("chat.slashMenu.empty") }),
|
|
382
383
|
s.map((e) => /* @__PURE__ */ u(
|
|
383
384
|
g.Item,
|
|
384
385
|
{
|
|
385
386
|
value: e.id,
|
|
386
|
-
onSelect: () =>
|
|
387
|
+
onSelect: () => Pe(e),
|
|
387
388
|
className: [
|
|
388
389
|
"ds:flex ds:flex-col ds:gap-[2px]",
|
|
389
390
|
"ds:ps-[var(--spacing-md)] ds:pe-[var(--spacing-md)]",
|
|
390
391
|
"ds:pt-[var(--spacing-xs)] ds:pb-[var(--spacing-xs)]",
|
|
391
392
|
"type-body-sm ds:cursor-pointer",
|
|
392
|
-
|
|
393
|
+
Ae.selected
|
|
393
394
|
].join(" "),
|
|
394
395
|
children: [
|
|
395
396
|
/* @__PURE__ */ u("span", { className: "ds:font-medium", children: [
|
|
@@ -410,40 +411,40 @@ const Ae = {
|
|
|
410
411
|
"div",
|
|
411
412
|
{
|
|
412
413
|
role: "group",
|
|
413
|
-
"aria-label":
|
|
414
|
+
"aria-label": d("chat.attachmentZone"),
|
|
414
415
|
className: "ds:flex ds:flex-wrap ds:gap-[var(--spacing-xs)] ds:ps-[var(--spacing-sm)] ds:pe-[var(--spacing-sm)]",
|
|
415
416
|
children: p.map((e) => /* @__PURE__ */ a(
|
|
416
|
-
|
|
417
|
+
Ye,
|
|
417
418
|
{
|
|
418
419
|
file: e.file,
|
|
419
|
-
onRemove: () =>
|
|
420
|
+
onRemove: () => Te(e.id)
|
|
420
421
|
},
|
|
421
422
|
e.id
|
|
422
423
|
))
|
|
423
424
|
}
|
|
424
425
|
) : null,
|
|
425
426
|
/* @__PURE__ */ u("div", { className: "ds:flex ds:items-center ds:gap-[var(--spacing-xs)] ds:ps-[var(--spacing-xs)] ds:pe-[var(--spacing-xs)] ds:pb-[var(--spacing-xs)]", children: [
|
|
426
|
-
|
|
427
|
+
o && o.length > 0 ? /* @__PURE__ */ a("div", { className: "ds:me-auto ds:min-w-[140px]", children: /* @__PURE__ */ a(
|
|
427
428
|
We,
|
|
428
429
|
{
|
|
429
|
-
"aria-label":
|
|
430
|
-
options:
|
|
431
|
-
value:
|
|
430
|
+
"aria-label": d("chat.model.select"),
|
|
431
|
+
options: Ke,
|
|
432
|
+
value: _ || "",
|
|
432
433
|
onValueChange: (e) => {
|
|
433
|
-
|
|
434
|
+
xe(e);
|
|
434
435
|
},
|
|
435
436
|
size: "sm"
|
|
436
437
|
}
|
|
437
438
|
) }) : /* @__PURE__ */ a("div", { className: "ds:me-auto" }),
|
|
438
|
-
/* @__PURE__ */ a("span", { className: "ds:sr-only", children:
|
|
439
|
+
/* @__PURE__ */ a("span", { className: "ds:sr-only", children: d("chat.input.sendHint") }),
|
|
439
440
|
/* @__PURE__ */ a(
|
|
440
|
-
|
|
441
|
+
re,
|
|
441
442
|
{
|
|
442
|
-
icon: /* @__PURE__ */ a(
|
|
443
|
-
"aria-label":
|
|
443
|
+
icon: /* @__PURE__ */ a(Ue, {}),
|
|
444
|
+
"aria-label": d("chat.send"),
|
|
444
445
|
intent: "primary",
|
|
445
446
|
size: "sm",
|
|
446
|
-
disabled:
|
|
447
|
+
disabled: G || !i.trim() && p.length === 0,
|
|
447
448
|
onClick: P,
|
|
448
449
|
"aria-keyshortcuts": "Meta+Enter Control+Enter"
|
|
449
450
|
}
|
|
@@ -454,15 +455,16 @@ const Ae = {
|
|
|
454
455
|
);
|
|
455
456
|
}
|
|
456
457
|
);
|
|
457
|
-
|
|
458
|
-
|
|
459
|
-
|
|
458
|
+
Qe.displayName = "AIPromptInput";
|
|
459
|
+
const se = { minimumFractionDigits: 1, maximumFractionDigits: 1 };
|
|
460
|
+
function Xe(s, o) {
|
|
461
|
+
return s < 1024 ? `${W(s, o, { useGrouping: !1 })} B` : s < 1024 * 1024 ? `${W(s / 1024, o, se)} KB` : `${W(s / (1024 * 1024), o, se)} MB`;
|
|
460
462
|
}
|
|
461
|
-
function
|
|
463
|
+
function Ye({
|
|
462
464
|
file: s,
|
|
463
|
-
onRemove:
|
|
465
|
+
onRemove: o
|
|
464
466
|
}) {
|
|
465
|
-
const { t: T } =
|
|
467
|
+
const { t: E, i18n: T } = ae("ui");
|
|
466
468
|
return /* @__PURE__ */ u(
|
|
467
469
|
"span",
|
|
468
470
|
{
|
|
@@ -478,15 +480,15 @@ function Qe({
|
|
|
478
480
|
].join(" "),
|
|
479
481
|
children: [
|
|
480
482
|
/* @__PURE__ */ a("span", { className: "ds:truncate ds:max-w-[16ch]", children: s.name }),
|
|
481
|
-
/* @__PURE__ */ a("span", { className: "ds:text-[color:var(--muted-foreground)] ds:tabular-nums", children:
|
|
483
|
+
/* @__PURE__ */ a("span", { className: "ds:text-[color:var(--muted-foreground)] ds:tabular-nums", children: Xe(s.size, T.language) }),
|
|
482
484
|
/* @__PURE__ */ a(
|
|
483
|
-
|
|
485
|
+
re,
|
|
484
486
|
{
|
|
485
|
-
icon: /* @__PURE__ */ a(
|
|
486
|
-
"aria-label":
|
|
487
|
+
icon: /* @__PURE__ */ a(Ge, {}),
|
|
488
|
+
"aria-label": E("chat.attachment.remove", { name: s.name }),
|
|
487
489
|
intent: "ghost",
|
|
488
490
|
size: "sm",
|
|
489
|
-
onClick:
|
|
491
|
+
onClick: o
|
|
490
492
|
}
|
|
491
493
|
)
|
|
492
494
|
]
|
|
@@ -494,7 +496,7 @@ function Qe({
|
|
|
494
496
|
);
|
|
495
497
|
}
|
|
496
498
|
export {
|
|
497
|
-
|
|
498
|
-
|
|
499
|
+
Qe as A,
|
|
500
|
+
Ze as a
|
|
499
501
|
};
|
|
500
|
-
//# sourceMappingURL=ai-prompt-input-
|
|
502
|
+
//# sourceMappingURL=ai-prompt-input-DzgyoKyk.js.map
|