@alfadocs/ui-kit-debug 0.8.1 → 0.9.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/{agenda-card-CalZqycc.js → agenda-card-DU13wUTA.js} +4 -4
- package/dist/_chunks/agenda-card-DU13wUTA.js.map +1 -0
- package/dist/_chunks/{agenda-tray-3ffFDQZC.js → agenda-tray-gQUXklO4.js} +9 -9
- package/dist/_chunks/agenda-tray-gQUXklO4.js.map +1 -0
- package/dist/_chunks/{ai-prompt-input-DLgY8lrW.js → ai-prompt-input-bAJwYu84.js} +45 -45
- package/dist/_chunks/ai-prompt-input-bAJwYu84.js.map +1 -0
- package/dist/_chunks/{alert-CVMq99Cq.js → alert-pgdXrEO5.js} +2 -2
- package/dist/_chunks/{alert-CVMq99Cq.js.map → alert-pgdXrEO5.js.map} +1 -1
- package/dist/_chunks/{app-frame-CDJOgPXe.js → app-frame-BYx1gcV7.js} +2 -2
- package/dist/_chunks/{app-frame-CDJOgPXe.js.map → app-frame-BYx1gcV7.js.map} +1 -1
- package/dist/_chunks/{audio-recorder-cOl_Z_Pk.js → audio-recorder-BHBonrFf.js} +54 -54
- package/dist/_chunks/{audio-recorder-cOl_Z_Pk.js.map → audio-recorder-BHBonrFf.js.map} +1 -1
- package/dist/_chunks/{audio-visualiser-ByDEFLNm.js → audio-visualiser-I-T4Z7EU.js} +2 -2
- package/dist/_chunks/audio-visualiser-I-T4Z7EU.js.map +1 -0
- package/dist/_chunks/{autocomplete-D4oUZbsP.js → autocomplete-C34hbfKh.js} +6 -6
- package/dist/_chunks/autocomplete-C34hbfKh.js.map +1 -0
- package/dist/_chunks/{avatar-Dcr6XuDQ.js → avatar-I10iCDs8.js} +2 -2
- package/dist/_chunks/{avatar-Dcr6XuDQ.js.map → avatar-I10iCDs8.js.map} +1 -1
- package/dist/_chunks/{badge-DKFbntoa.js → badge-cLYVGlMh.js} +2 -2
- package/dist/_chunks/{badge-DKFbntoa.js.map → badge-cLYVGlMh.js.map} +1 -1
- package/dist/_chunks/{balance-cell-renderer-BuExGe6u.js → balance-cell-renderer-DWWtX-VM.js} +5 -5
- package/dist/_chunks/{balance-cell-renderer-BuExGe6u.js.map → balance-cell-renderer-DWWtX-VM.js.map} +1 -1
- package/dist/_chunks/{breadcrumb-D1snXjPb.js → breadcrumb--YI7lcHA.js} +4 -4
- package/dist/_chunks/breadcrumb--YI7lcHA.js.map +1 -0
- package/dist/_chunks/{button-group-CONver7M.js → button-group-Bh2g_Ng-.js} +2 -2
- package/dist/_chunks/button-group-Bh2g_Ng-.js.map +1 -0
- package/dist/_chunks/{chat-container-ClzsWXp2.js → chat-container-izziXViv.js} +4 -4
- package/dist/_chunks/chat-container-izziXViv.js.map +1 -0
- package/dist/_chunks/{chat-message-DoAhgUTj.js → chat-message-g3lxpXM_.js} +2 -2
- package/dist/_chunks/{chat-message-DoAhgUTj.js.map → chat-message-g3lxpXM_.js.map} +1 -1
- package/dist/_chunks/{checkbox-group-CarPLDIC.js → checkbox-group-Qkm3Rg1S.js} +6 -6
- package/dist/_chunks/checkbox-group-Qkm3Rg1S.js.map +1 -0
- package/dist/_chunks/{color-picker-CTIcHlDF.js → color-picker-BPfcByHH.js} +13 -13
- package/dist/_chunks/color-picker-BPfcByHH.js.map +1 -0
- package/dist/_chunks/{combobox-BLWruOxK.js → combobox-DUpWoPPk.js} +6 -6
- package/dist/_chunks/combobox-DUpWoPPk.js.map +1 -0
- package/dist/_chunks/{contact-card-DNyATxKv.js → contact-card-VJIUqKB2.js} +13 -13
- package/dist/_chunks/contact-card-VJIUqKB2.js.map +1 -0
- package/dist/_chunks/{date-picker-B1PO1ZQP.js → date-picker-BD5FYW08.js} +3 -3
- package/dist/_chunks/{date-picker-B1PO1ZQP.js.map → date-picker-BD5FYW08.js.map} +1 -1
- package/dist/_chunks/{date-range-picker-mix2nEVC.js → date-range-picker-BZLVgcXE.js} +27 -27
- package/dist/_chunks/date-range-picker-BZLVgcXE.js.map +1 -0
- package/dist/_chunks/{date-time-picker-Dnong_BY.js → date-time-picker-CCoRWX7R.js} +5 -5
- package/dist/_chunks/date-time-picker-CCoRWX7R.js.map +1 -0
- package/dist/_chunks/{description-list-BYA77Yud.js → description-list-y7Hk51KI.js} +16 -16
- package/dist/_chunks/description-list-y7Hk51KI.js.map +1 -0
- package/dist/_chunks/{dialog-W8uDfXD8.js → dialog-DRp6Dejy.js} +2 -2
- package/dist/_chunks/{dialog-W8uDfXD8.js.map → dialog-DRp6Dejy.js.map} +1 -1
- package/dist/_chunks/{file-upload-C947ACDK.js → file-upload-BVbfiANR.js} +81 -81
- package/dist/_chunks/file-upload-BVbfiANR.js.map +1 -0
- package/dist/_chunks/{floating-action-button-C8OYj8mE.js → floating-action-button-pojvb9gG.js} +6 -6
- package/dist/_chunks/{floating-action-button-C8OYj8mE.js.map → floating-action-button-pojvb9gG.js.map} +1 -1
- package/dist/_chunks/{form-field-Bmkeh7WY.js → form-field-BOm9hK35.js} +2 -2
- package/dist/_chunks/form-field-BOm9hK35.js.map +1 -0
- package/dist/_chunks/{freemium-paywall-B9kIDtm1.js → freemium-paywall-BTEiVkes.js} +29 -29
- package/dist/_chunks/freemium-paywall-BTEiVkes.js.map +1 -0
- package/dist/_chunks/{key-value-pair-CgWvAIGb.js → key-value-pair-AbrRwesr.js} +14 -14
- package/dist/_chunks/key-value-pair-AbrRwesr.js.map +1 -0
- package/dist/_chunks/{leo-sidebar-BWECDYpu.js → leo-sidebar-B054wsZm.js} +8 -8
- package/dist/_chunks/{leo-sidebar-BWECDYpu.js.map → leo-sidebar-B054wsZm.js.map} +1 -1
- package/dist/_chunks/{link-BcYW1eNM.js → link-BGpwaFik.js} +2 -2
- package/dist/_chunks/{link-BcYW1eNM.js.map → link-BGpwaFik.js.map} +1 -1
- package/dist/_chunks/{list-qP6p0NTw.js → list-DcjV0m5B.js} +2 -2
- package/dist/_chunks/list-DcjV0m5B.js.map +1 -0
- package/dist/_chunks/{message-card-DjvsB_3U.js → message-card-c6R0-qXq.js} +6 -6
- package/dist/_chunks/message-card-c6R0-qXq.js.map +1 -0
- package/dist/_chunks/{message-tray-BbnAzlLH.js → message-tray-Fsend-du.js} +21 -21
- package/dist/_chunks/message-tray-Fsend-du.js.map +1 -0
- package/dist/_chunks/{multi-select-wqqrgjUQ.js → multi-select-Bh-xR8kP.js} +10 -10
- package/dist/_chunks/multi-select-Bh-xR8kP.js.map +1 -0
- package/dist/_chunks/{navigation-menu-ClbHeawy.js → navigation-menu-Bav1d_wA.js} +2 -2
- package/dist/_chunks/navigation-menu-Bav1d_wA.js.map +1 -0
- package/dist/_chunks/{notification-card-uTPEvAQS.js → notification-card-CRIE2Cuk.js} +3 -3
- package/dist/_chunks/notification-card-CRIE2Cuk.js.map +1 -0
- package/dist/_chunks/{notification-tray-PGtMqXbP.js → notification-tray-CfXNYrxv.js} +21 -21
- package/dist/_chunks/notification-tray-CfXNYrxv.js.map +1 -0
- package/dist/_chunks/{number-input-Q7wkHnvQ.js → number-input-mpSLk-ld.js} +3 -3
- package/dist/_chunks/{number-input-Q7wkHnvQ.js.map → number-input-mpSLk-ld.js.map} +1 -1
- package/dist/_chunks/{otp-input-C9gUByF0.js → otp-input-CI-Zv5q6.js} +2 -2
- package/dist/_chunks/{otp-input-C9gUByF0.js.map → otp-input-CI-Zv5q6.js.map} +1 -1
- package/dist/_chunks/{pagination-3AC4zTsi.js → pagination-OQBlnb1H.js} +7 -7
- package/dist/_chunks/pagination-OQBlnb1H.js.map +1 -0
- package/dist/_chunks/{patient-shell-IhMULVrt.js → patient-shell-BS2V6V1b.js} +3 -3
- package/dist/_chunks/{patient-shell-IhMULVrt.js.map → patient-shell-BS2V6V1b.js.map} +1 -1
- package/dist/_chunks/{payment-form-C3HMAsGG.js → payment-form-CI77oIx1.js} +3 -3
- package/dist/_chunks/{payment-form-C3HMAsGG.js.map → payment-form-CI77oIx1.js.map} +1 -1
- package/dist/_chunks/{pdf-viewer-DO95bm2o.js → pdf-viewer-CNETPubN.js} +3 -3
- package/dist/_chunks/{pdf-viewer-DO95bm2o.js.map → pdf-viewer-CNETPubN.js.map} +1 -1
- package/dist/_chunks/{phone-input-CSHJOJ13.js → phone-input-DtBVs5fz.js} +7 -7
- package/dist/_chunks/phone-input-DtBVs5fz.js.map +1 -0
- package/dist/_chunks/{popover-DekUKNBk.js → popover--derJ_wq.js} +2 -2
- package/dist/_chunks/{popover-DekUKNBk.js.map → popover--derJ_wq.js.map} +1 -1
- package/dist/_chunks/{progress-C11tqhoI.js → progress-B-PSO5OS.js} +4 -4
- package/dist/_chunks/progress-B-PSO5OS.js.map +1 -0
- package/dist/_chunks/{recaptcha-widget-NyfOfLII.js → recaptcha-widget-Kp1XntuE.js} +3 -3
- package/dist/_chunks/recaptcha-widget-Kp1XntuE.js.map +1 -0
- package/dist/_chunks/{resizable-mpXXyIsN.js → resizable-COV-cnth.js} +3 -3
- package/dist/_chunks/resizable-COV-cnth.js.map +1 -0
- package/dist/_chunks/{search-bar-BTDfgYtg.js → search-bar-DmZZ9UvV.js} +2 -2
- package/dist/_chunks/{search-bar-BTDfgYtg.js.map → search-bar-DmZZ9UvV.js.map} +1 -1
- package/dist/_chunks/{search-input-CdJIEjFo.js → search-input-BBtSRH-Q.js} +4 -4
- package/dist/_chunks/{search-input-CdJIEjFo.js.map → search-input-BBtSRH-Q.js.map} +1 -1
- package/dist/_chunks/{select-BOU_Osnf.js → select-i9MwQeQy.js} +20 -20
- package/dist/_chunks/select-i9MwQeQy.js.map +1 -0
- package/dist/_chunks/{sheet-BAg7GY9j.js → sheet-BT0izeoI.js} +9 -9
- package/dist/_chunks/{sheet-BAg7GY9j.js.map → sheet-BT0izeoI.js.map} +1 -1
- package/dist/_chunks/{sidebar-Bx3wCDyy.js → sidebar-CoLHtVrP.js} +83 -83
- package/dist/_chunks/sidebar-CoLHtVrP.js.map +1 -0
- package/dist/_chunks/{sign-in-with-alfadocs-button-B9UrqOqH.js → sign-in-with-alfadocs-button-4zZC-I6y.js} +3 -3
- package/dist/_chunks/sign-in-with-alfadocs-button-4zZC-I6y.js.map +1 -0
- package/dist/_chunks/{skip-link-DmZ3c6cb.js → skip-link-BaSMtPwB.js} +2 -2
- package/dist/_chunks/{skip-link-DmZ3c6cb.js.map → skip-link-BaSMtPwB.js.map} +1 -1
- package/dist/_chunks/{slider-BT2bZWsy.js → slider-CkR6CLun.js} +3 -3
- package/dist/_chunks/slider-CkR6CLun.js.map +1 -0
- package/dist/_chunks/{sparkline-_gy8aJDG.js → sparkline-D4Np8ikf.js} +15 -15
- package/dist/_chunks/sparkline-D4Np8ikf.js.map +1 -0
- package/dist/_chunks/{spinner-DLaYfLPl.js → spinner-DirtWZNG.js} +2 -2
- package/dist/_chunks/spinner-DirtWZNG.js.map +1 -0
- package/dist/_chunks/{stat-B9PHSPbN.js → stat-CDQ_a0vk.js} +4 -4
- package/dist/_chunks/stat-CDQ_a0vk.js.map +1 -0
- package/dist/_chunks/{switch-C0psfIQF.js → switch-D916VW86.js} +2 -2
- package/dist/_chunks/{switch-C0psfIQF.js.map → switch-D916VW86.js.map} +1 -1
- package/dist/_chunks/{tabs-BZQy_Rmb.js → tabs-Cg794H0Q.js} +3 -3
- package/dist/_chunks/tabs-Cg794H0Q.js.map +1 -0
- package/dist/_chunks/{tag-DuLMjRbF.js → tag-CQmHRM4Y.js} +3 -3
- package/dist/_chunks/tag-CQmHRM4Y.js.map +1 -0
- package/dist/_chunks/{task-card-Dw_ZJDL8.js → task-card-BUVMh6HN.js} +2 -2
- package/dist/_chunks/task-card-BUVMh6HN.js.map +1 -0
- package/dist/_chunks/{task-tray-XlIW9ueh.js → task-tray-B3A2fRGR.js} +13 -13
- package/dist/_chunks/task-tray-B3A2fRGR.js.map +1 -0
- package/dist/_chunks/{text-area-CO9Dz0qX.js → text-area-DHtcpcLv.js} +13 -13
- package/dist/_chunks/{text-area-CO9Dz0qX.js.map → text-area-DHtcpcLv.js.map} +1 -1
- package/dist/_chunks/{text-input-DZwt9L8H.js → text-input-1oqFRbVI.js} +2 -2
- package/dist/_chunks/{text-input-DZwt9L8H.js.map → text-input-1oqFRbVI.js.map} +1 -1
- package/dist/_chunks/{theme-toggle-B3UR6ouK.js → theme-toggle-B3meAb3y.js} +14 -14
- package/dist/_chunks/theme-toggle-B3meAb3y.js.map +1 -0
- package/dist/_chunks/{time-picker-DvPUmHH-.js → time-picker-DeVZkIY2.js} +2 -2
- package/dist/_chunks/{time-picker-DvPUmHH-.js.map → time-picker-DeVZkIY2.js.map} +1 -1
- package/dist/_chunks/{timeline-BvmnQadS.js → timeline-BaSULpSJ.js} +2 -2
- package/dist/_chunks/{timeline-BvmnQadS.js.map → timeline-BaSULpSJ.js.map} +1 -1
- package/dist/_chunks/{toast.agent-DihA6MON.js → toast.agent-32WNQ-_x.js} +2 -2
- package/dist/_chunks/{toast.agent-DihA6MON.js.map → toast.agent-32WNQ-_x.js.map} +1 -1
- package/dist/_chunks/{transaction-chip-DE6DITun.js → transaction-chip-eVbolm0B.js} +2 -2
- package/dist/_chunks/{transaction-chip-DE6DITun.js.map → transaction-chip-eVbolm0B.js.map} +1 -1
- package/dist/_chunks/{transcript-panel-Bx5ANMsv.js → transcript-panel-BpJqPr7I.js} +8 -8
- package/dist/_chunks/transcript-panel-BpJqPr7I.js.map +1 -0
- package/dist/_chunks/{typing-indicator-BZ5jXZPn.js → typing-indicator-DHeVN4ob.js} +9 -9
- package/dist/_chunks/typing-indicator-DHeVN4ob.js.map +1 -0
- package/dist/_chunks/{use-password-requirements-DgEYdN4H.js → use-password-requirements-B1M8lE2t.js} +29 -32
- package/dist/_chunks/use-password-requirements-B1M8lE2t.js.map +1 -0
- package/dist/_chunks/{warning-stack-CdLIe534.js → warning-stack-CeRihME9.js} +15 -15
- package/dist/_chunks/warning-stack-CeRihME9.js.map +1 -0
- package/dist/_chunks/{workflow-map-CESZNNZe.js → workflow-map-D3MvrsZV.js} +4 -4
- package/dist/_chunks/{workflow-map-CESZNNZe.js.map → workflow-map-D3MvrsZV.js.map} +1 -1
- package/dist/agent-catalog.json +1 -1
- package/dist/components/agenda-card/index.js +1 -1
- package/dist/components/agenda-tray/index.js +1 -1
- package/dist/components/ai-prompt-input/index.js +1 -1
- package/dist/components/alert/index.js +1 -1
- package/dist/components/app-frame/index.js +1 -1
- package/dist/components/audio-recorder/index.js +1 -1
- package/dist/components/audio-visualiser/index.js +1 -1
- package/dist/components/autocomplete/index.js +1 -1
- package/dist/components/avatar/index.js +1 -1
- package/dist/components/badge/index.js +1 -1
- package/dist/components/breadcrumb/index.js +1 -1
- package/dist/components/button-group/index.js +1 -1
- package/dist/components/chat-container/index.js +1 -1
- package/dist/components/chat-message/index.js +1 -1
- package/dist/components/checkbox-group/index.js +1 -1
- package/dist/components/color-picker/index.js +1 -1
- package/dist/components/combobox/index.js +1 -1
- package/dist/components/contact-card/index.js +1 -1
- package/dist/components/data-table/index.js +1 -1
- package/dist/components/date-picker/index.js +1 -1
- package/dist/components/date-range-picker/index.js +1 -1
- package/dist/components/date-time-picker/index.js +1 -1
- package/dist/components/description-list/index.js +1 -1
- package/dist/components/dialog/index.js +1 -1
- package/dist/components/file-upload/index.js +1 -1
- package/dist/components/floating-action-button/index.js +1 -1
- package/dist/components/form-field/index.js +1 -1
- package/dist/components/freemium-paywall/freemium-paywall.d.ts +2 -2
- package/dist/components/freemium-paywall/freemium-paywall.d.ts.map +1 -1
- package/dist/components/freemium-paywall/index.js +1 -1
- package/dist/components/key-value-pair/index.js +1 -1
- package/dist/components/link/index.js +1 -1
- package/dist/components/list/index.js +1 -1
- package/dist/components/message-card/index.js +1 -1
- package/dist/components/message-tray/index.js +1 -1
- package/dist/components/multi-select/index.js +1 -1
- package/dist/components/navigation-menu/index.js +2 -2
- package/dist/components/notification-card/index.js +1 -1
- package/dist/components/notification-tray/index.js +1 -1
- package/dist/components/number-input/index.js +1 -1
- package/dist/components/otp-input/index.js +1 -1
- package/dist/components/pagination/index.js +1 -1
- package/dist/components/password-input/index.js +1 -1
- package/dist/components/password-input/password-input.d.ts.map +1 -1
- package/dist/components/payment-form/index.js +1 -1
- package/dist/components/pdf-viewer/index.js +1 -1
- package/dist/components/phone-input/index.js +1 -1
- package/dist/components/popover/index.js +1 -1
- package/dist/components/progress/index.js +1 -1
- package/dist/components/recaptcha-widget/index.js +1 -1
- package/dist/components/resizable/index.js +1 -1
- package/dist/components/search-bar/index.js +1 -1
- package/dist/components/search-input/index.js +1 -1
- package/dist/components/select/index.js +1 -1
- package/dist/components/sheet/index.js +1 -1
- package/dist/components/sidebar/index.js +1 -1
- package/dist/components/sidebar/sidebar.d.ts +1 -1
- package/dist/components/sign-in-with-alfadocs-button/index.js +1 -1
- package/dist/components/skip-link/index.js +1 -1
- package/dist/components/skip-link/skip-link.d.ts +1 -1
- package/dist/components/slider/index.js +1 -1
- package/dist/components/sparkline/index.js +1 -1
- package/dist/components/spinner/index.js +1 -1
- package/dist/components/stat/index.js +1 -1
- package/dist/components/switch/index.js +1 -1
- package/dist/components/tabs/index.js +1 -1
- package/dist/components/tag/index.js +1 -1
- package/dist/components/task-card/index.js +1 -1
- package/dist/components/task-tray/index.js +1 -1
- package/dist/components/text-area/index.js +1 -1
- package/dist/components/text-input/index.js +1 -1
- package/dist/components/theme-toggle/index.js +1 -1
- package/dist/components/time-picker/index.js +1 -1
- package/dist/components/timeline/index.js +1 -1
- package/dist/components/toast/index.js +1 -1
- package/dist/components/transaction-chip/index.js +1 -1
- package/dist/components/transcript-panel/index.js +1 -1
- package/dist/components/typing-indicator/index.js +1 -1
- package/dist/components/typing-indicator/typing-indicator.d.ts +1 -1
- package/dist/components/typing-indicator/typing-indicator.d.ts.map +1 -1
- package/dist/components/warning-stack/index.js +1 -1
- package/dist/components/workflow/index.js +1 -1
- package/dist/i18n/config.d.ts +2 -1
- package/dist/i18n/config.d.ts.map +1 -1
- package/dist/i18n/config.js +49 -31
- package/dist/i18n/config.js.map +1 -1
- package/dist/i18n/registerUiBundle.d.ts +15 -0
- package/dist/i18n/registerUiBundle.d.ts.map +1 -0
- package/dist/index.js +77 -77
- package/dist/patterns/leo-assistant/index.js +1 -1
- package/dist/patterns/patient-shell/index.js +1 -1
- package/dist/tokens.css +1 -1
- package/package.json +2 -1
- package/dist/_chunks/agenda-card-CalZqycc.js.map +0 -1
- package/dist/_chunks/agenda-tray-3ffFDQZC.js.map +0 -1
- package/dist/_chunks/ai-prompt-input-DLgY8lrW.js.map +0 -1
- package/dist/_chunks/audio-visualiser-ByDEFLNm.js.map +0 -1
- package/dist/_chunks/autocomplete-D4oUZbsP.js.map +0 -1
- package/dist/_chunks/breadcrumb-D1snXjPb.js.map +0 -1
- package/dist/_chunks/button-group-CONver7M.js.map +0 -1
- package/dist/_chunks/chat-container-ClzsWXp2.js.map +0 -1
- package/dist/_chunks/checkbox-group-CarPLDIC.js.map +0 -1
- package/dist/_chunks/color-picker-CTIcHlDF.js.map +0 -1
- package/dist/_chunks/combobox-BLWruOxK.js.map +0 -1
- package/dist/_chunks/contact-card-DNyATxKv.js.map +0 -1
- package/dist/_chunks/date-range-picker-mix2nEVC.js.map +0 -1
- package/dist/_chunks/date-time-picker-Dnong_BY.js.map +0 -1
- package/dist/_chunks/description-list-BYA77Yud.js.map +0 -1
- package/dist/_chunks/file-upload-C947ACDK.js.map +0 -1
- package/dist/_chunks/form-field-Bmkeh7WY.js.map +0 -1
- package/dist/_chunks/freemium-paywall-B9kIDtm1.js.map +0 -1
- package/dist/_chunks/key-value-pair-CgWvAIGb.js.map +0 -1
- package/dist/_chunks/list-qP6p0NTw.js.map +0 -1
- package/dist/_chunks/message-card-DjvsB_3U.js.map +0 -1
- package/dist/_chunks/message-tray-BbnAzlLH.js.map +0 -1
- package/dist/_chunks/multi-select-wqqrgjUQ.js.map +0 -1
- package/dist/_chunks/navigation-menu-ClbHeawy.js.map +0 -1
- package/dist/_chunks/notification-card-uTPEvAQS.js.map +0 -1
- package/dist/_chunks/notification-tray-PGtMqXbP.js.map +0 -1
- package/dist/_chunks/pagination-3AC4zTsi.js.map +0 -1
- package/dist/_chunks/phone-input-CSHJOJ13.js.map +0 -1
- package/dist/_chunks/progress-C11tqhoI.js.map +0 -1
- package/dist/_chunks/recaptcha-widget-NyfOfLII.js.map +0 -1
- package/dist/_chunks/resizable-mpXXyIsN.js.map +0 -1
- package/dist/_chunks/select-BOU_Osnf.js.map +0 -1
- package/dist/_chunks/sidebar-Bx3wCDyy.js.map +0 -1
- package/dist/_chunks/sign-in-with-alfadocs-button-B9UrqOqH.js.map +0 -1
- package/dist/_chunks/slider-BT2bZWsy.js.map +0 -1
- package/dist/_chunks/sparkline-_gy8aJDG.js.map +0 -1
- package/dist/_chunks/spinner-DLaYfLPl.js.map +0 -1
- package/dist/_chunks/stat-B9PHSPbN.js.map +0 -1
- package/dist/_chunks/tabs-BZQy_Rmb.js.map +0 -1
- package/dist/_chunks/tag-DuLMjRbF.js.map +0 -1
- package/dist/_chunks/task-card-Dw_ZJDL8.js.map +0 -1
- package/dist/_chunks/task-tray-XlIW9ueh.js.map +0 -1
- package/dist/_chunks/theme-toggle-B3UR6ouK.js.map +0 -1
- package/dist/_chunks/transcript-panel-Bx5ANMsv.js.map +0 -1
- package/dist/_chunks/typing-indicator-BZ5jXZPn.js.map +0 -1
- package/dist/_chunks/use-password-requirements-DgEYdN4H.js.map +0 -1
- package/dist/_chunks/warning-stack-CdLIe534.js.map +0 -1
|
@@ -72,7 +72,7 @@ const T = a(
|
|
|
72
72
|
mainClassName: b,
|
|
73
73
|
...u
|
|
74
74
|
}, h) => {
|
|
75
|
-
const { t: v } = _(), x = m ?? v("
|
|
75
|
+
const { t: v } = _(), x = m ?? v("navigation.main.label", "Main content"), [w, g] = S(!1), j = V((k) => {
|
|
76
76
|
const e = k.currentTarget.scrollTop > 0;
|
|
77
77
|
g((o) => o === e ? o : e);
|
|
78
78
|
}, []);
|
|
@@ -118,4 +118,4 @@ I.displayName = "AppFrame";
|
|
|
118
118
|
export {
|
|
119
119
|
I as A
|
|
120
120
|
};
|
|
121
|
-
//# sourceMappingURL=app-frame-
|
|
121
|
+
//# sourceMappingURL=app-frame-BYx1gcV7.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"app-frame-CDJOgPXe.js","sources":["../../src/components/app-frame/app-frame.tsx"],"sourcesContent":["/* -------------------------------------------------------------------- */\n/* AppFrame — the always-present application shell. */\n/* */\n/* Layout */\n/* ------ */\n/* */\n/* ┌───────────────────────────────────────────────────────────┐ */\n/* │ Header (100% inline-size, block-start) │ */\n/* ├──────────┬──────────────────────────────────┬──────────────┤ */\n/* │ Sidebar │ Main (<main>) │ endSidebar │ */\n/* │ │ │ (optional) │ */\n/* │ │ │ │ */\n/* ├──────────┴──────────────────────────────────┴──────────────┤ */\n/* │ Footer (optional) │ */\n/* └───────────────────────────────────────────────────────────┘ */\n/* */\n/* Header spans the full inline-size of the shell. Sidebar sits beneath */\n/* the header on the inline-start edge and shares the row with <main>. */\n/* `endSidebar`, when provided, sits on the inline-end edge of the same */\n/* row — used for co-pilot / assistant panels (e.g. LeoSidebar) that */\n/* should dock opposite the nav rail. Footer, when provided, spans the */\n/* full inline-size at the block-end. */\n/* */\n/* Responsive behaviour */\n/* --------------------- */\n/* ≥ md viewports: the sidebar slot renders inline-start of the row */\n/* below the header, sticky to the header's block-end, full remaining */\n/* viewport height. */\n/* < md viewports: the sidebar slot is hidden from the inline flow. */\n/* Consumers should control their sidebar's `state` to `'overlay'` */\n/* on small viewports (the Sidebar portals via Radix Dialog so it */\n/* renders outside AppFrame's subtree in that mode) and wire the */\n/* `<HeaderMenuButton>` to toggle it. */\n/* -------------------------------------------------------------------- */\n\nimport {\n forwardRef,\n useCallback,\n useState,\n type HTMLAttributes,\n type ReactNode,\n type UIEvent,\n} from 'react';\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport { useTranslation } from 'react-i18next';\n\n/* ------------------------------------------------------------------ */\n/* CVA */\n/* ------------------------------------------------------------------ */\n\n// Canonical app-shell layout: the root is a VIEWPORT-SIZED flex-col with\n// its own overflow clamp. Header and the row fill it together. The only\n// element that scrolls is <main> — so the header never leaves the top\n// and the sidebar never needs position: sticky. This matches the way\n// Gmail / Linear / Notion frame their app surfaces and avoids the\n// flex-item-sticky edge cases that position: sticky has inside a\n// column-flex container.\n//\n// Because the viewport itself never scrolls in this model, the Header's\n// built-in IntersectionObserver (which watches a sentinel against the\n// viewport) cannot detect scroll. AppFrame instead tracks `<main>`'s\n// scrollTop, reflects it onto the root via `data-app-scrolled`, and the\n// descendant selectors below drive the `<header role=\"banner\">` border\n// and shadow — producing the same elevation the Header would show in a\n// viewport-scroll context.\nconst rootVariants = cva(\n [\n 'ds:h-dvh ds:w-full',\n 'ds:flex ds:flex-col',\n 'ds:overflow-hidden',\n 'ds:bg-[var(--background)] ds:text-[color:var(--foreground)]',\n // Elevation cascade driven by main's scrollTop (data-app-scrolled).\n // Mirrors the Header's native scroll-linked recipe (see `Brand/Shadows`\n // — one tier up from rest, never two) so the banner looks identical\n // whether it's in a viewport-scroll context (sticky) or slotted into\n // AppFrame where <main> owns the scroll.\n 'ds:data-[app-scrolled=true]:[&_[role=banner]]:shadow-[var(--shadow-md)]',\n 'ds:data-[app-scrolled=true]:[&_[role=banner]]:[border-block-end-color:var(--border)]',\n // Forced-colors: UA strips box-shadow, so the border is the only\n // separation cue. Always render it.\n 'ds:forced-colors:[&_[role=banner]]:[border-block-end-color:CanvasText]',\n // Print: strip shadow, keep border so the banner still reads on paper.\n 'ds:print:[&_[role=banner]]:shadow-none',\n 'ds:print:[&_[role=banner]]:[border-block-end-color:var(--border)]',\n ].join(' '),\n);\n\nconst rowVariants = cva(\n ['ds:flex ds:flex-1 ds:items-stretch ds:min-h-0'].join(' '),\n);\n\nconst sidebarSlotVariants = cva(\n [\n // Hidden in the inline flow on mobile — consumers should flip their\n // Sidebar into overlay mode at narrow viewports, where it portals via\n // Radix Dialog and therefore renders outside AppFrame entirely.\n 'ds:hidden ds:md:flex',\n 'ds:shrink-0',\n // The rail fills the row's full height because the row is `flex\n // items-stretch`. No sticky needed — the row itself never scrolls.\n 'ds:h-full',\n ].join(' '),\n);\n\n// Inline-end slot — same hide-on-mobile behaviour as the nav rail because\n// a 22rem co-pilot panel can't share a phone viewport. Consuming apps\n// should flip Leo (or any inline-end panel) to its overlay/popout mode\n// at narrow viewports.\nconst endSidebarSlotVariants = cva(\n ['ds:hidden ds:md:flex', 'ds:shrink-0', 'ds:h-full'].join(' '),\n);\n\nconst mainVariants = cva(\n [\n // <main> owns the scroll: the viewport body never scrolls, but this\n // element does. That keeps the header + sidebar pinned as chrome.\n 'ds:flex-1 ds:min-w-0 ds:overflow-auto',\n // Focusable via the header's SkipLink — tabIndex={-1} is on the\n // element itself so keyboard users land inside the main region.\n 'ds:focus:outline-none',\n ].join(' '),\n {\n variants: {\n padded: {\n true: [\n 'ds:ps-[var(--spacing-md)] ds:pe-[var(--spacing-md)]',\n 'ds:pt-[var(--spacing-md)] ds:pb-[var(--spacing-md)]',\n ].join(' '),\n false: '',\n },\n },\n defaultVariants: { padded: true },\n },\n);\n\nconst footerSlotVariants = cva('ds:shrink-0');\n\n/* ------------------------------------------------------------------ */\n/* Root */\n/* ------------------------------------------------------------------ */\n\nexport interface AppFrameProps\n extends\n Omit<HTMLAttributes<HTMLDivElement>, 'children'>,\n VariantProps<typeof mainVariants> {\n /** `<Header>` instance rendered full-width at the block-start of the shell. */\n header: ReactNode;\n /** `<Sidebar>` instance rendered inline-start of the row beneath the header on ≥ md viewports. */\n sidebar: ReactNode;\n /** Main content — rendered inside a `<main>` landmark. */\n children: ReactNode;\n /** Optional inline-end docked panel (typically `<LeoSidebar />`) sharing the same row as the main region on ≥ md viewports. Hidden on narrow viewports — consumers should flip to an overlay/popout mode there. */\n endSidebar?: ReactNode;\n /** Optional block-end footer — renders full-width below the sidebar + main row. */\n footer?: ReactNode;\n /**\n * Id applied to the `<main>` element so `<HeaderSkipLink href=\"#{mainId}\" />`\n * can target it. Must be a valid HTML id (letters, digits, `-`, `_`, no\n * spaces). Defaults to `'main-content'`.\n */\n mainId?: string;\n /**\n * Override the landmark's accessible name. Defaults to the i18n'd\n * `ui.navigation.main.label` (\"Main content\").\n */\n mainAriaLabel?: string;\n /** Extra classes applied to the `<main>` landmark. */\n mainClassName?: string;\n}\n\nexport const AppFrame = forwardRef<HTMLDivElement, AppFrameProps>(\n (\n {\n header,\n sidebar,\n children,\n endSidebar,\n footer,\n mainId = 'main-content',\n mainAriaLabel,\n padded = true,\n className,\n mainClassName,\n ...rest\n },\n ref,\n ) => {\n const { t } = useTranslation();\n const mainLabel =\n mainAriaLabel ?? t('ui.navigation.main.label', 'Main content');\n\n const [mainScrolled, setMainScrolled] = useState(false);\n const handleMainScroll = useCallback((event: UIEvent<HTMLElement>) => {\n const next = event.currentTarget.scrollTop > 0;\n setMainScrolled((prev) => (prev === next ? prev : next));\n }, []);\n\n return (\n <div\n ref={ref}\n data-app-scrolled={mainScrolled ? 'true' : undefined}\n data-component=\"app-frame\"\n className={rootVariants({ className })}\n {...rest}\n >\n {/* Header is rendered as a direct flex child — NOT wrapped in a slot\n div — so it sits at the block-start of the shell. The root's\n `overflow-hidden` keeps it pinned; no `position: sticky` needed. */}\n {header}\n <div className={rowVariants()} data-app-frame-slot=\"row\">\n <div className={sidebarSlotVariants()} data-app-frame-slot=\"sidebar\">\n {sidebar}\n </div>\n <main\n id={mainId}\n tabIndex={-1}\n aria-label={mainLabel}\n onScroll={handleMainScroll}\n className={mainVariants({ padded, className: mainClassName })}\n >\n {children}\n </main>\n {endSidebar ? (\n <div\n className={endSidebarSlotVariants()}\n data-app-frame-slot=\"end-sidebar\"\n >\n {endSidebar}\n </div>\n ) : null}\n </div>\n {footer ? (\n <div className={footerSlotVariants()} data-app-frame-slot=\"footer\">\n {footer}\n </div>\n ) : null}\n </div>\n );\n },\n);\nAppFrame.displayName = 'AppFrame';\n"],"names":["rootVariants","cva","rowVariants","sidebarSlotVariants","endSidebarSlotVariants","mainVariants","footerSlotVariants","AppFrame","forwardRef","header","sidebar","children","endSidebar","footer","mainId","mainAriaLabel","padded","className","mainClassName","rest","ref","t","useTranslation","mainLabel","mainScrolled","setMainScrolled","useState","handleMainScroll","useCallback","event","next","prev","jsxs","jsx"],"mappings":";;;;AAiEA,MAAMA,IAAeC;AAAA,EACnB;AAAA,IACE;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAMA;AAAA,IACA;AAAA;AAAA;AAAA,IAGA;AAAA;AAAA,IAEA;AAAA,IACA;AAAA,EAAA,EACA,KAAK,GAAG;AACZ,GAEMC,IAAcD;AAAA,EAClB,CAAC,+CAA+C,EAAE,KAAK,GAAG;AAC5D,GAEME,IAAsBF;AAAA,EAC1B;AAAA;AAAA;AAAA;AAAA,IAIE;AAAA,IACA;AAAA;AAAA;AAAA,IAGA;AAAA,EAAA,EACA,KAAK,GAAG;AACZ,GAMMG,IAAyBH;AAAA,EAC7B,CAAC,wBAAwB,eAAe,WAAW,EAAE,KAAK,GAAG;AAC/D,GAEMI,IAAeJ;AAAA,EACnB;AAAA;AAAA;AAAA,IAGE;AAAA;AAAA;AAAA,IAGA;AAAA,EAAA,EACA,KAAK,GAAG;AAAA,EACV;AAAA,IACE,UAAU;AAAA,MACR,QAAQ;AAAA,QACN,MAAM;AAAA,UACJ;AAAA,UACA;AAAA,QAAA,EACA,KAAK,GAAG;AAAA,QACV,OAAO;AAAA,MAAA;AAAA,IACT;AAAA,IAEF,iBAAiB,EAAE,QAAQ,GAAA;AAAA,EAAK;AAEpC,GAEMK,IAAqBL,EAAI,aAAa,GAmC/BM,IAAWC;AAAA,EACtB,CACE;AAAA,IACE,QAAAC;AAAA,IACA,SAAAC;AAAA,IACA,UAAAC;AAAA,IACA,YAAAC;AAAA,IACA,QAAAC;AAAA,IACA,QAAAC,IAAS;AAAA,IACT,eAAAC;AAAA,IACA,QAAAC,IAAS;AAAA,IACT,WAAAC;AAAA,IACA,eAAAC;AAAA,IACA,GAAGC;AAAA,EAAA,GAELC,MACG;AACH,UAAM,EAAE,GAAAC,EAAA,IAAMC,EAAA,GACRC,IACJR,KAAiBM,EAAE,4BAA4B,cAAc,GAEzD,CAACG,GAAcC,CAAe,IAAIC,EAAS,EAAK,GAChDC,IAAmBC,EAAY,CAACC,MAAgC;AACpE,YAAMC,IAAOD,EAAM,cAAc,YAAY;AAC7C,MAAAJ,EAAgB,CAACM,MAAUA,MAASD,IAAOC,IAAOD,CAAK;AAAA,IACzD,GAAG,CAAA,CAAE;AAEL,WACE,gBAAAE;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,KAAAZ;AAAA,QACA,qBAAmBI,IAAe,SAAS;AAAA,QAC3C,kBAAe;AAAA,QACf,WAAWxB,EAAa,EAAE,WAAAiB,GAAW;AAAA,QACpC,GAAGE;AAAA,QAKH,UAAA;AAAA,UAAAV;AAAA,4BACA,OAAA,EAAI,WAAWP,EAAA,GAAe,uBAAoB,OACjD,UAAA;AAAA,YAAA,gBAAA+B,EAAC,SAAI,WAAW9B,EAAA,GAAuB,uBAAoB,WACxD,UAAAO,GACH;AAAA,YACA,gBAAAuB;AAAA,cAAC;AAAA,cAAA;AAAA,gBACC,IAAInB;AAAA,gBACJ,UAAU;AAAA,gBACV,cAAYS;AAAA,gBACZ,UAAUI;AAAA,gBACV,WAAWtB,EAAa,EAAE,QAAAW,GAAQ,WAAWE,GAAe;AAAA,gBAE3D,UAAAP;AAAA,cAAA;AAAA,YAAA;AAAA,YAEFC,IACC,gBAAAqB;AAAA,cAAC;AAAA,cAAA;AAAA,gBACC,WAAW7B,EAAA;AAAA,gBACX,uBAAoB;AAAA,gBAEnB,UAAAQ;AAAA,cAAA;AAAA,YAAA,IAED;AAAA,UAAA,GACN;AAAA,UACCC,sBACE,OAAA,EAAI,WAAWP,KAAsB,uBAAoB,UACvD,UAAAO,EAAA,CACH,IACE;AAAA,QAAA;AAAA,MAAA;AAAA,IAAA;AAAA,EAGV;AACF;AACAN,EAAS,cAAc;"}
|
|
1
|
+
{"version":3,"file":"app-frame-BYx1gcV7.js","sources":["../../src/components/app-frame/app-frame.tsx"],"sourcesContent":["/* -------------------------------------------------------------------- */\n/* AppFrame — the always-present application shell. */\n/* */\n/* Layout */\n/* ------ */\n/* */\n/* ┌───────────────────────────────────────────────────────────┐ */\n/* │ Header (100% inline-size, block-start) │ */\n/* ├──────────┬──────────────────────────────────┬──────────────┤ */\n/* │ Sidebar │ Main (<main>) │ endSidebar │ */\n/* │ │ │ (optional) │ */\n/* │ │ │ │ */\n/* ├──────────┴──────────────────────────────────┴──────────────┤ */\n/* │ Footer (optional) │ */\n/* └───────────────────────────────────────────────────────────┘ */\n/* */\n/* Header spans the full inline-size of the shell. Sidebar sits beneath */\n/* the header on the inline-start edge and shares the row with <main>. */\n/* `endSidebar`, when provided, sits on the inline-end edge of the same */\n/* row — used for co-pilot / assistant panels (e.g. LeoSidebar) that */\n/* should dock opposite the nav rail. Footer, when provided, spans the */\n/* full inline-size at the block-end. */\n/* */\n/* Responsive behaviour */\n/* --------------------- */\n/* ≥ md viewports: the sidebar slot renders inline-start of the row */\n/* below the header, sticky to the header's block-end, full remaining */\n/* viewport height. */\n/* < md viewports: the sidebar slot is hidden from the inline flow. */\n/* Consumers should control their sidebar's `state` to `'overlay'` */\n/* on small viewports (the Sidebar portals via Radix Dialog so it */\n/* renders outside AppFrame's subtree in that mode) and wire the */\n/* `<HeaderMenuButton>` to toggle it. */\n/* -------------------------------------------------------------------- */\n\nimport {\n forwardRef,\n useCallback,\n useState,\n type HTMLAttributes,\n type ReactNode,\n type UIEvent,\n} from 'react';\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport { useTranslation } from 'react-i18next';\n\n/* ------------------------------------------------------------------ */\n/* CVA */\n/* ------------------------------------------------------------------ */\n\n// Canonical app-shell layout: the root is a VIEWPORT-SIZED flex-col with\n// its own overflow clamp. Header and the row fill it together. The only\n// element that scrolls is <main> — so the header never leaves the top\n// and the sidebar never needs position: sticky. This matches the way\n// Gmail / Linear / Notion frame their app surfaces and avoids the\n// flex-item-sticky edge cases that position: sticky has inside a\n// column-flex container.\n//\n// Because the viewport itself never scrolls in this model, the Header's\n// built-in IntersectionObserver (which watches a sentinel against the\n// viewport) cannot detect scroll. AppFrame instead tracks `<main>`'s\n// scrollTop, reflects it onto the root via `data-app-scrolled`, and the\n// descendant selectors below drive the `<header role=\"banner\">` border\n// and shadow — producing the same elevation the Header would show in a\n// viewport-scroll context.\nconst rootVariants = cva(\n [\n 'ds:h-dvh ds:w-full',\n 'ds:flex ds:flex-col',\n 'ds:overflow-hidden',\n 'ds:bg-[var(--background)] ds:text-[color:var(--foreground)]',\n // Elevation cascade driven by main's scrollTop (data-app-scrolled).\n // Mirrors the Header's native scroll-linked recipe (see `Brand/Shadows`\n // — one tier up from rest, never two) so the banner looks identical\n // whether it's in a viewport-scroll context (sticky) or slotted into\n // AppFrame where <main> owns the scroll.\n 'ds:data-[app-scrolled=true]:[&_[role=banner]]:shadow-[var(--shadow-md)]',\n 'ds:data-[app-scrolled=true]:[&_[role=banner]]:[border-block-end-color:var(--border)]',\n // Forced-colors: UA strips box-shadow, so the border is the only\n // separation cue. Always render it.\n 'ds:forced-colors:[&_[role=banner]]:[border-block-end-color:CanvasText]',\n // Print: strip shadow, keep border so the banner still reads on paper.\n 'ds:print:[&_[role=banner]]:shadow-none',\n 'ds:print:[&_[role=banner]]:[border-block-end-color:var(--border)]',\n ].join(' '),\n);\n\nconst rowVariants = cva(\n ['ds:flex ds:flex-1 ds:items-stretch ds:min-h-0'].join(' '),\n);\n\nconst sidebarSlotVariants = cva(\n [\n // Hidden in the inline flow on mobile — consumers should flip their\n // Sidebar into overlay mode at narrow viewports, where it portals via\n // Radix Dialog and therefore renders outside AppFrame entirely.\n 'ds:hidden ds:md:flex',\n 'ds:shrink-0',\n // The rail fills the row's full height because the row is `flex\n // items-stretch`. No sticky needed — the row itself never scrolls.\n 'ds:h-full',\n ].join(' '),\n);\n\n// Inline-end slot — same hide-on-mobile behaviour as the nav rail because\n// a 22rem co-pilot panel can't share a phone viewport. Consuming apps\n// should flip Leo (or any inline-end panel) to its overlay/popout mode\n// at narrow viewports.\nconst endSidebarSlotVariants = cva(\n ['ds:hidden ds:md:flex', 'ds:shrink-0', 'ds:h-full'].join(' '),\n);\n\nconst mainVariants = cva(\n [\n // <main> owns the scroll: the viewport body never scrolls, but this\n // element does. That keeps the header + sidebar pinned as chrome.\n 'ds:flex-1 ds:min-w-0 ds:overflow-auto',\n // Focusable via the header's SkipLink — tabIndex={-1} is on the\n // element itself so keyboard users land inside the main region.\n 'ds:focus:outline-none',\n ].join(' '),\n {\n variants: {\n padded: {\n true: [\n 'ds:ps-[var(--spacing-md)] ds:pe-[var(--spacing-md)]',\n 'ds:pt-[var(--spacing-md)] ds:pb-[var(--spacing-md)]',\n ].join(' '),\n false: '',\n },\n },\n defaultVariants: { padded: true },\n },\n);\n\nconst footerSlotVariants = cva('ds:shrink-0');\n\n/* ------------------------------------------------------------------ */\n/* Root */\n/* ------------------------------------------------------------------ */\n\nexport interface AppFrameProps\n extends\n Omit<HTMLAttributes<HTMLDivElement>, 'children'>,\n VariantProps<typeof mainVariants> {\n /** `<Header>` instance rendered full-width at the block-start of the shell. */\n header: ReactNode;\n /** `<Sidebar>` instance rendered inline-start of the row beneath the header on ≥ md viewports. */\n sidebar: ReactNode;\n /** Main content — rendered inside a `<main>` landmark. */\n children: ReactNode;\n /** Optional inline-end docked panel (typically `<LeoSidebar />`) sharing the same row as the main region on ≥ md viewports. Hidden on narrow viewports — consumers should flip to an overlay/popout mode there. */\n endSidebar?: ReactNode;\n /** Optional block-end footer — renders full-width below the sidebar + main row. */\n footer?: ReactNode;\n /**\n * Id applied to the `<main>` element so `<HeaderSkipLink href=\"#{mainId}\" />`\n * can target it. Must be a valid HTML id (letters, digits, `-`, `_`, no\n * spaces). Defaults to `'main-content'`.\n */\n mainId?: string;\n /**\n * Override the landmark's accessible name. Defaults to the i18n'd\n * `ui.navigation.main.label` (\"Main content\").\n */\n mainAriaLabel?: string;\n /** Extra classes applied to the `<main>` landmark. */\n mainClassName?: string;\n}\n\nexport const AppFrame = forwardRef<HTMLDivElement, AppFrameProps>(\n (\n {\n header,\n sidebar,\n children,\n endSidebar,\n footer,\n mainId = 'main-content',\n mainAriaLabel,\n padded = true,\n className,\n mainClassName,\n ...rest\n },\n ref,\n ) => {\n const { t } = useTranslation();\n const mainLabel =\n mainAriaLabel ?? t('navigation.main.label', 'Main content');\n\n const [mainScrolled, setMainScrolled] = useState(false);\n const handleMainScroll = useCallback((event: UIEvent<HTMLElement>) => {\n const next = event.currentTarget.scrollTop > 0;\n setMainScrolled((prev) => (prev === next ? prev : next));\n }, []);\n\n return (\n <div\n ref={ref}\n data-app-scrolled={mainScrolled ? 'true' : undefined}\n data-component=\"app-frame\"\n className={rootVariants({ className })}\n {...rest}\n >\n {/* Header is rendered as a direct flex child — NOT wrapped in a slot\n div — so it sits at the block-start of the shell. The root's\n `overflow-hidden` keeps it pinned; no `position: sticky` needed. */}\n {header}\n <div className={rowVariants()} data-app-frame-slot=\"row\">\n <div className={sidebarSlotVariants()} data-app-frame-slot=\"sidebar\">\n {sidebar}\n </div>\n <main\n id={mainId}\n tabIndex={-1}\n aria-label={mainLabel}\n onScroll={handleMainScroll}\n className={mainVariants({ padded, className: mainClassName })}\n >\n {children}\n </main>\n {endSidebar ? (\n <div\n className={endSidebarSlotVariants()}\n data-app-frame-slot=\"end-sidebar\"\n >\n {endSidebar}\n </div>\n ) : null}\n </div>\n {footer ? (\n <div className={footerSlotVariants()} data-app-frame-slot=\"footer\">\n {footer}\n </div>\n ) : null}\n </div>\n );\n },\n);\nAppFrame.displayName = 'AppFrame';\n"],"names":["rootVariants","cva","rowVariants","sidebarSlotVariants","endSidebarSlotVariants","mainVariants","footerSlotVariants","AppFrame","forwardRef","header","sidebar","children","endSidebar","footer","mainId","mainAriaLabel","padded","className","mainClassName","rest","ref","t","useTranslation","mainLabel","mainScrolled","setMainScrolled","useState","handleMainScroll","useCallback","event","next","prev","jsxs","jsx"],"mappings":";;;;AAiEA,MAAMA,IAAeC;AAAA,EACnB;AAAA,IACE;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAMA;AAAA,IACA;AAAA;AAAA;AAAA,IAGA;AAAA;AAAA,IAEA;AAAA,IACA;AAAA,EAAA,EACA,KAAK,GAAG;AACZ,GAEMC,IAAcD;AAAA,EAClB,CAAC,+CAA+C,EAAE,KAAK,GAAG;AAC5D,GAEME,IAAsBF;AAAA,EAC1B;AAAA;AAAA;AAAA;AAAA,IAIE;AAAA,IACA;AAAA;AAAA;AAAA,IAGA;AAAA,EAAA,EACA,KAAK,GAAG;AACZ,GAMMG,IAAyBH;AAAA,EAC7B,CAAC,wBAAwB,eAAe,WAAW,EAAE,KAAK,GAAG;AAC/D,GAEMI,IAAeJ;AAAA,EACnB;AAAA;AAAA;AAAA,IAGE;AAAA;AAAA;AAAA,IAGA;AAAA,EAAA,EACA,KAAK,GAAG;AAAA,EACV;AAAA,IACE,UAAU;AAAA,MACR,QAAQ;AAAA,QACN,MAAM;AAAA,UACJ;AAAA,UACA;AAAA,QAAA,EACA,KAAK,GAAG;AAAA,QACV,OAAO;AAAA,MAAA;AAAA,IACT;AAAA,IAEF,iBAAiB,EAAE,QAAQ,GAAA;AAAA,EAAK;AAEpC,GAEMK,IAAqBL,EAAI,aAAa,GAmC/BM,IAAWC;AAAA,EACtB,CACE;AAAA,IACE,QAAAC;AAAA,IACA,SAAAC;AAAA,IACA,UAAAC;AAAA,IACA,YAAAC;AAAA,IACA,QAAAC;AAAA,IACA,QAAAC,IAAS;AAAA,IACT,eAAAC;AAAA,IACA,QAAAC,IAAS;AAAA,IACT,WAAAC;AAAA,IACA,eAAAC;AAAA,IACA,GAAGC;AAAA,EAAA,GAELC,MACG;AACH,UAAM,EAAE,GAAAC,EAAA,IAAMC,EAAA,GACRC,IACJR,KAAiBM,EAAE,yBAAyB,cAAc,GAEtD,CAACG,GAAcC,CAAe,IAAIC,EAAS,EAAK,GAChDC,IAAmBC,EAAY,CAACC,MAAgC;AACpE,YAAMC,IAAOD,EAAM,cAAc,YAAY;AAC7C,MAAAJ,EAAgB,CAACM,MAAUA,MAASD,IAAOC,IAAOD,CAAK;AAAA,IACzD,GAAG,CAAA,CAAE;AAEL,WACE,gBAAAE;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,KAAAZ;AAAA,QACA,qBAAmBI,IAAe,SAAS;AAAA,QAC3C,kBAAe;AAAA,QACf,WAAWxB,EAAa,EAAE,WAAAiB,GAAW;AAAA,QACpC,GAAGE;AAAA,QAKH,UAAA;AAAA,UAAAV;AAAA,4BACA,OAAA,EAAI,WAAWP,EAAA,GAAe,uBAAoB,OACjD,UAAA;AAAA,YAAA,gBAAA+B,EAAC,SAAI,WAAW9B,EAAA,GAAuB,uBAAoB,WACxD,UAAAO,GACH;AAAA,YACA,gBAAAuB;AAAA,cAAC;AAAA,cAAA;AAAA,gBACC,IAAInB;AAAA,gBACJ,UAAU;AAAA,gBACV,cAAYS;AAAA,gBACZ,UAAUI;AAAA,gBACV,WAAWtB,EAAa,EAAE,QAAAW,GAAQ,WAAWE,GAAe;AAAA,gBAE3D,UAAAP;AAAA,cAAA;AAAA,YAAA;AAAA,YAEFC,IACC,gBAAAqB;AAAA,cAAC;AAAA,cAAA;AAAA,gBACC,WAAW7B,EAAA;AAAA,gBACX,uBAAoB;AAAA,gBAEnB,UAAAQ;AAAA,cAAA;AAAA,YAAA,IAED;AAAA,UAAA,GACN;AAAA,UACCC,sBACE,OAAA,EAAI,WAAWP,KAAsB,uBAAoB,UACvD,UAAAO,EAAA,CACH,IACE;AAAA,QAAA;AAAA,MAAA;AAAA,IAAA;AAAA,EAGV;AACF;AACAN,EAAS,cAAc;"}
|
|
@@ -1,12 +1,12 @@
|
|
|
1
|
-
import { jsxs as b, jsx as s, Fragment as
|
|
1
|
+
import { jsxs as b, jsx as s, Fragment as ie } from "react/jsx-runtime";
|
|
2
2
|
import { forwardRef as se, useReducer as ae, useState as x, useRef as m, useEffect as D, useCallback as h, useMemo as ne, useImperativeHandle as de } from "react";
|
|
3
3
|
import { c as ce } from "./index-D2ZczOXr.js";
|
|
4
4
|
import { useTranslation as oe } from "react-i18next";
|
|
5
5
|
import { B as G } from "./button-DD_0Xdmr.js";
|
|
6
6
|
import { I as N } from "./icon-button-C4CGcYuz.js";
|
|
7
|
-
import { S as ue } from "./select-
|
|
8
|
-
import { A as pe } from "./audio-visualiser-
|
|
9
|
-
import { A as F } from "./alert-
|
|
7
|
+
import { S as ue } from "./select-i9MwQeQy.js";
|
|
8
|
+
import { A as pe } from "./audio-visualiser-I-T4Z7EU.js";
|
|
9
|
+
import { A as F } from "./alert-pgdXrEO5.js";
|
|
10
10
|
import { u as le } from "./registry-C9nwlNyL.js";
|
|
11
11
|
import { c as V } from "./createLucideIcon-CrFbzy84.js";
|
|
12
12
|
import { S as me } from "./square-CZoGU14v.js";
|
|
@@ -54,19 +54,19 @@ const ke = [
|
|
|
54
54
|
type: "boolean",
|
|
55
55
|
descriptionKey: "ui.agent.audioRecorder.state.isRecording",
|
|
56
56
|
description: "True while actively capturing audio (not paused).",
|
|
57
|
-
read: (
|
|
57
|
+
read: (r) => r.isRecording()
|
|
58
58
|
},
|
|
59
59
|
duration: {
|
|
60
60
|
type: "number",
|
|
61
61
|
descriptionKey: "ui.agent.audioRecorder.state.duration",
|
|
62
62
|
description: "Elapsed recording time in milliseconds (paused time excluded).",
|
|
63
|
-
read: (
|
|
63
|
+
read: (r) => r.getDuration()
|
|
64
64
|
},
|
|
65
65
|
hasRecording: {
|
|
66
66
|
type: "boolean",
|
|
67
67
|
descriptionKey: "ui.agent.audioRecorder.state.hasRecording",
|
|
68
68
|
description: "True when a completed recording is available for submission.",
|
|
69
|
-
read: (
|
|
69
|
+
read: (r) => r.hasRecording()
|
|
70
70
|
}
|
|
71
71
|
},
|
|
72
72
|
actions: {
|
|
@@ -74,30 +74,30 @@ const ke = [
|
|
|
74
74
|
safety: "write",
|
|
75
75
|
descriptionKey: "ui.agent.audioRecorder.actions.startRecording",
|
|
76
76
|
description: "Request microphone permission and begin recording.",
|
|
77
|
-
invoke: (
|
|
77
|
+
invoke: (r) => r.startRecording()
|
|
78
78
|
},
|
|
79
79
|
stop_recording: {
|
|
80
80
|
safety: "write",
|
|
81
81
|
descriptionKey: "ui.agent.audioRecorder.actions.stopRecording",
|
|
82
82
|
description: "Stop the current recording and finalise the blob.",
|
|
83
|
-
invoke: (
|
|
84
|
-
|
|
83
|
+
invoke: (r) => {
|
|
84
|
+
r.stopRecording();
|
|
85
85
|
}
|
|
86
86
|
},
|
|
87
87
|
discard: {
|
|
88
88
|
safety: "destructive",
|
|
89
89
|
descriptionKey: "ui.agent.audioRecorder.actions.discard",
|
|
90
90
|
description: "Cancel the recording. Irreversible — the captured audio is dropped.",
|
|
91
|
-
invoke: (
|
|
92
|
-
|
|
91
|
+
invoke: (r) => {
|
|
92
|
+
r.discard();
|
|
93
93
|
}
|
|
94
94
|
},
|
|
95
95
|
submit: {
|
|
96
96
|
safety: "write",
|
|
97
97
|
descriptionKey: "ui.agent.audioRecorder.actions.submit",
|
|
98
98
|
description: "Stop the active recording, finalising it via onRecordingComplete.",
|
|
99
|
-
invoke: (
|
|
100
|
-
|
|
99
|
+
invoke: (r) => {
|
|
100
|
+
r.stopRecording();
|
|
101
101
|
}
|
|
102
102
|
}
|
|
103
103
|
},
|
|
@@ -114,24 +114,24 @@ const ke = [
|
|
|
114
114
|
}
|
|
115
115
|
}
|
|
116
116
|
};
|
|
117
|
-
function we(
|
|
117
|
+
function we(r, u) {
|
|
118
118
|
switch (u.type) {
|
|
119
119
|
case "request":
|
|
120
120
|
return { kind: "requesting" };
|
|
121
121
|
case "start":
|
|
122
122
|
return { kind: "recording", startedAt: Date.now(), pausedMs: 0 };
|
|
123
123
|
case "pause":
|
|
124
|
-
return
|
|
124
|
+
return r.kind !== "recording" ? r : {
|
|
125
125
|
kind: "paused",
|
|
126
|
-
startedAt:
|
|
127
|
-
pausedMs:
|
|
126
|
+
startedAt: r.startedAt,
|
|
127
|
+
pausedMs: r.pausedMs,
|
|
128
128
|
pausedAt: Date.now()
|
|
129
129
|
};
|
|
130
130
|
case "resume":
|
|
131
|
-
return
|
|
131
|
+
return r.kind !== "paused" ? r : {
|
|
132
132
|
kind: "recording",
|
|
133
|
-
startedAt:
|
|
134
|
-
pausedMs:
|
|
133
|
+
startedAt: r.startedAt,
|
|
134
|
+
pausedMs: r.pausedMs + (Date.now() - r.pausedAt)
|
|
135
135
|
};
|
|
136
136
|
case "stop":
|
|
137
137
|
return { kind: "stopped", duration: u.duration };
|
|
@@ -142,7 +142,7 @@ function we(i, u) {
|
|
|
142
142
|
case "reset":
|
|
143
143
|
return { kind: "idle" };
|
|
144
144
|
default:
|
|
145
|
-
return
|
|
145
|
+
return r;
|
|
146
146
|
}
|
|
147
147
|
}
|
|
148
148
|
const Ae = ce(
|
|
@@ -170,20 +170,20 @@ const Ae = ce(
|
|
|
170
170
|
];
|
|
171
171
|
function xe() {
|
|
172
172
|
if (!(typeof MediaRecorder > "u")) {
|
|
173
|
-
for (const
|
|
174
|
-
if (MediaRecorder.isTypeSupported(
|
|
173
|
+
for (const r of Me)
|
|
174
|
+
if (MediaRecorder.isTypeSupported(r)) return r;
|
|
175
175
|
}
|
|
176
176
|
}
|
|
177
|
-
function De(
|
|
178
|
-
const l = Math.max(0, Math.floor(
|
|
179
|
-
return `${v(
|
|
177
|
+
function De(r, u) {
|
|
178
|
+
const l = Math.max(0, Math.floor(r / 1e3)), i = Math.floor(l / 60), f = l % 60, v = (S) => new Intl.NumberFormat(u, { minimumIntegerDigits: 2 }).format(S);
|
|
179
|
+
return `${v(i)}:${v(f)}`;
|
|
180
180
|
}
|
|
181
181
|
const Ne = se(
|
|
182
182
|
({
|
|
183
|
-
size:
|
|
183
|
+
size: r = "md",
|
|
184
184
|
onRecordingComplete: u,
|
|
185
185
|
onCancel: l,
|
|
186
|
-
onError:
|
|
186
|
+
onError: i,
|
|
187
187
|
maxDurationMs: f = 1800 * 1e3,
|
|
188
188
|
maxBytes: v = 250 * 1024 * 1024,
|
|
189
189
|
className: S,
|
|
@@ -207,7 +207,7 @@ const Ne = se(
|
|
|
207
207
|
e == null || e.getTracks().forEach((a) => a.stop()), g.current = null, T(null);
|
|
208
208
|
}, [z]), A = h(async () => {
|
|
209
209
|
if (!k) {
|
|
210
|
-
p({ type: "error", kind: "unsupported" }),
|
|
210
|
+
p({ type: "error", kind: "unsupported" }), i == null || i("unsupported");
|
|
211
211
|
return;
|
|
212
212
|
}
|
|
213
213
|
p({ type: "request" }), w.current = !1;
|
|
@@ -227,7 +227,7 @@ const Ne = se(
|
|
|
227
227
|
c.current = o, y.current = [], _.current = 0, o.ondataavailable = (n) => {
|
|
228
228
|
var X;
|
|
229
229
|
if (n.data && n.data.size > 0 && (y.current.push(n.data), _.current += n.data.size, typeof v == "number" && _.current >= v && ((X = c.current) == null ? void 0 : X.state) === "recording")) {
|
|
230
|
-
|
|
230
|
+
i == null || i("max-size");
|
|
231
231
|
try {
|
|
232
232
|
c.current.stop();
|
|
233
233
|
} catch {
|
|
@@ -244,12 +244,12 @@ const Ne = se(
|
|
|
244
244
|
}, o.start(1e3), p({ type: "start" });
|
|
245
245
|
} catch (e) {
|
|
246
246
|
const a = e instanceof Error ? e.name : "";
|
|
247
|
-
a === "NotAllowedError" || a === "SecurityError" ? (p({ type: "error", kind: "permission-denied" }),
|
|
247
|
+
a === "NotAllowedError" || a === "SecurityError" ? (p({ type: "error", kind: "permission-denied" }), i == null || i("permission-denied")) : a === "NotFoundError" || a === "OverconstrainedError" ? (p({ type: "error", kind: "no-device" }), i == null || i("no-device")) : (p({ type: "error", kind: "capture-failed" }), i == null || i("capture-failed"));
|
|
248
248
|
}
|
|
249
|
-
}, [
|
|
249
|
+
}, [i, u, R, k]), te = h(() => {
|
|
250
250
|
var e;
|
|
251
251
|
(e = c.current) == null || e.pause(), p({ type: "pause" });
|
|
252
|
-
}, []),
|
|
252
|
+
}, []), re = h(() => {
|
|
253
253
|
var e;
|
|
254
254
|
(e = c.current) == null || e.resume(), p({ type: "resume" });
|
|
255
255
|
}, []), q = h(() => {
|
|
@@ -276,7 +276,7 @@ const Ne = se(
|
|
|
276
276
|
const e = Date.now() - t.startedAt - t.pausedMs, a = Math.max(0, f - e), o = window.setTimeout(() => {
|
|
277
277
|
var n;
|
|
278
278
|
if (((n = c.current) == null ? void 0 : n.state) === "recording") {
|
|
279
|
-
|
|
279
|
+
i == null || i("max-duration");
|
|
280
280
|
try {
|
|
281
281
|
c.current.stop();
|
|
282
282
|
} catch {
|
|
@@ -284,7 +284,7 @@ const Ne = se(
|
|
|
284
284
|
}
|
|
285
285
|
}, a);
|
|
286
286
|
return () => window.clearTimeout(o);
|
|
287
|
-
}, [t, f,
|
|
287
|
+
}, [t, f, i]), D(() => () => {
|
|
288
288
|
var e, a;
|
|
289
289
|
B.current = !0;
|
|
290
290
|
try {
|
|
@@ -307,21 +307,21 @@ const Ne = se(
|
|
|
307
307
|
de(J, () => P, [P]), le(Re, P, I.id);
|
|
308
308
|
const C = Z.map((e) => ({
|
|
309
309
|
value: e.deviceId,
|
|
310
|
-
label: e.label || d("
|
|
310
|
+
label: e.label || d("chat.audio.selectDevice")
|
|
311
311
|
})), O = (() => {
|
|
312
312
|
switch (t.kind) {
|
|
313
313
|
case "idle":
|
|
314
|
-
return d("
|
|
314
|
+
return d("chat.audio.idle");
|
|
315
315
|
case "requesting":
|
|
316
|
-
return d("
|
|
316
|
+
return d("common.loading");
|
|
317
317
|
case "recording":
|
|
318
|
-
return d("
|
|
318
|
+
return d("chat.audio.recording");
|
|
319
319
|
case "paused":
|
|
320
|
-
return d("
|
|
320
|
+
return d("chat.audio.paused");
|
|
321
321
|
case "stopped":
|
|
322
|
-
return d("
|
|
322
|
+
return d("chat.audio.idle");
|
|
323
323
|
case "error":
|
|
324
|
-
return t.type === "permission-denied" ? d("
|
|
324
|
+
return t.type === "permission-denied" ? d("chat.audio.permissionDenied") : t.type === "unsupported" ? d("chat.audio.unsupported") : d("chat.audio.idle");
|
|
325
325
|
}
|
|
326
326
|
})(), M = t.kind === "recording", L = t.kind === "paused", U = t.kind === "error";
|
|
327
327
|
return /* @__PURE__ */ b(
|
|
@@ -329,7 +329,7 @@ const Ne = se(
|
|
|
329
329
|
{
|
|
330
330
|
"data-component": "audio-recorder",
|
|
331
331
|
"data-component-id": I.id,
|
|
332
|
-
className: Ae({ size:
|
|
332
|
+
className: Ae({ size: r, className: S }),
|
|
333
333
|
...I,
|
|
334
334
|
children: [
|
|
335
335
|
/* @__PURE__ */ b("div", { className: "ds:flex ds:items-center ds:gap-[var(--spacing-sm)]", children: [
|
|
@@ -383,14 +383,14 @@ const Ne = se(
|
|
|
383
383
|
startIcon: /* @__PURE__ */ s(he, {}),
|
|
384
384
|
onClick: A,
|
|
385
385
|
disabled: !k,
|
|
386
|
-
children: d("
|
|
386
|
+
children: d("chat.audio.record")
|
|
387
387
|
}
|
|
388
388
|
) : null,
|
|
389
389
|
M ? /* @__PURE__ */ s(
|
|
390
390
|
N,
|
|
391
391
|
{
|
|
392
392
|
icon: /* @__PURE__ */ s(ye, {}),
|
|
393
|
-
"aria-label": d("
|
|
393
|
+
"aria-label": d("chat.audio.pause"),
|
|
394
394
|
intent: "secondary",
|
|
395
395
|
size: "sm",
|
|
396
396
|
onClick: te
|
|
@@ -400,18 +400,18 @@ const Ne = se(
|
|
|
400
400
|
N,
|
|
401
401
|
{
|
|
402
402
|
icon: /* @__PURE__ */ s(be, {}),
|
|
403
|
-
"aria-label": d("
|
|
403
|
+
"aria-label": d("chat.audio.resume"),
|
|
404
404
|
intent: "secondary",
|
|
405
405
|
size: "sm",
|
|
406
|
-
onClick:
|
|
406
|
+
onClick: re
|
|
407
407
|
}
|
|
408
408
|
) : null,
|
|
409
|
-
M || L ? /* @__PURE__ */ b(
|
|
409
|
+
M || L ? /* @__PURE__ */ b(ie, { children: [
|
|
410
410
|
/* @__PURE__ */ s(
|
|
411
411
|
N,
|
|
412
412
|
{
|
|
413
413
|
icon: /* @__PURE__ */ s(me, {}),
|
|
414
|
-
"aria-label": d("
|
|
414
|
+
"aria-label": d("chat.audio.stop"),
|
|
415
415
|
intent: "primary",
|
|
416
416
|
size: "sm",
|
|
417
417
|
onClick: q
|
|
@@ -421,7 +421,7 @@ const Ne = se(
|
|
|
421
421
|
N,
|
|
422
422
|
{
|
|
423
423
|
icon: /* @__PURE__ */ s(fe, {}),
|
|
424
|
-
"aria-label": d("
|
|
424
|
+
"aria-label": d("chat.audio.cancel"),
|
|
425
425
|
intent: "ghost",
|
|
426
426
|
size: "sm",
|
|
427
427
|
onClick: K
|
|
@@ -431,7 +431,7 @@ const Ne = se(
|
|
|
431
431
|
t.kind === "idle" && C.length > 1 ? /* @__PURE__ */ s("div", { className: "ds:ms-auto ds:min-w-[160px]", children: /* @__PURE__ */ s(
|
|
432
432
|
ue,
|
|
433
433
|
{
|
|
434
|
-
"aria-label": d("
|
|
434
|
+
"aria-label": d("chat.audio.selectDevice"),
|
|
435
435
|
options: C,
|
|
436
436
|
value: R,
|
|
437
437
|
onValueChange: (e) => ee(e),
|
|
@@ -442,7 +442,7 @@ const Ne = se(
|
|
|
442
442
|
] }),
|
|
443
443
|
U && t.kind === "error" ? /* @__PURE__ */ b(F, { variant: "error", live: "polite", children: [
|
|
444
444
|
/* @__PURE__ */ s(F.Description, { children: O }),
|
|
445
|
-
t.type === "permission-denied" ? /* @__PURE__ */ s(F.Action, { children: /* @__PURE__ */ s(G, { intent: "ghost", size: "sm", onClick: A, children: d("
|
|
445
|
+
t.type === "permission-denied" ? /* @__PURE__ */ s(F.Action, { children: /* @__PURE__ */ s(G, { intent: "ghost", size: "sm", onClick: A, children: d("chat.audio.retry") }) }) : null
|
|
446
446
|
] }) : null
|
|
447
447
|
]
|
|
448
448
|
}
|
|
@@ -454,4 +454,4 @@ export {
|
|
|
454
454
|
Ne as A,
|
|
455
455
|
Re as a
|
|
456
456
|
};
|
|
457
|
-
//# sourceMappingURL=audio-recorder-
|
|
457
|
+
//# sourceMappingURL=audio-recorder-BHBonrFf.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"audio-recorder-cOl_Z_Pk.js","sources":["../../node_modules/lucide-react/dist/esm/icons/mic.js","../../node_modules/lucide-react/dist/esm/icons/pause.js","../../node_modules/lucide-react/dist/esm/icons/play.js","../../src/components/audio-recorder/audio-recorder.agent.ts","../../src/components/audio-recorder/audio-recorder.tsx"],"sourcesContent":["/**\n * @license lucide-react v1.8.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst __iconNode = [\n [\"path\", { d: \"M12 19v3\", key: \"npa21l\" }],\n [\"path\", { d: \"M19 10v2a7 7 0 0 1-14 0v-2\", key: \"1vc78b\" }],\n [\"rect\", { x: \"9\", y: \"2\", width: \"6\", height: \"13\", rx: \"3\", key: \"s6n7sd\" }]\n];\nconst Mic = createLucideIcon(\"mic\", __iconNode);\n\nexport { __iconNode, Mic as default };\n//# sourceMappingURL=mic.js.map\n","/**\n * @license lucide-react v1.8.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst __iconNode = [\n [\"rect\", { x: \"14\", y: \"3\", width: \"5\", height: \"18\", rx: \"1\", key: \"kaeet6\" }],\n [\"rect\", { x: \"5\", y: \"3\", width: \"5\", height: \"18\", rx: \"1\", key: \"1wsw3u\" }]\n];\nconst Pause = createLucideIcon(\"pause\", __iconNode);\n\nexport { __iconNode, Pause as default };\n//# sourceMappingURL=pause.js.map\n","/**\n * @license lucide-react v1.8.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst __iconNode = [\n [\n \"path\",\n {\n d: \"M5 5a2 2 0 0 1 3.008-1.728l11.997 6.998a2 2 0 0 1 .003 3.458l-12 7A2 2 0 0 1 5 19z\",\n key: \"10ikf1\"\n }\n ]\n];\nconst Play = createLucideIcon(\"play\", __iconNode);\n\nexport { __iconNode, Play as default };\n//# sourceMappingURL=play.js.map\n","/* -------------------------------------------------------------------- */\n/* Agent adapter — AudioRecorder. */\n/* -------------------------------------------------------------------- */\n\nimport type { AgentAdapter } from '../../agent/types';\nimport type { AudioRecorderHandle } from './audio-recorder';\n\nexport const audioRecorderAgent: AgentAdapter<AudioRecorderHandle> = {\n id: 'audio-recorder',\n capabilities: ['submit'],\n state: {\n isRecording: {\n type: 'boolean',\n descriptionKey: 'ui.agent.audioRecorder.state.isRecording',\n description: 'True while actively capturing audio (not paused).',\n read: (handle) => handle.isRecording(),\n },\n duration: {\n type: 'number',\n descriptionKey: 'ui.agent.audioRecorder.state.duration',\n description:\n 'Elapsed recording time in milliseconds (paused time excluded).',\n read: (handle) => handle.getDuration(),\n },\n hasRecording: {\n type: 'boolean',\n descriptionKey: 'ui.agent.audioRecorder.state.hasRecording',\n description:\n 'True when a completed recording is available for submission.',\n read: (handle) => handle.hasRecording(),\n },\n },\n actions: {\n start_recording: {\n safety: 'write',\n descriptionKey: 'ui.agent.audioRecorder.actions.startRecording',\n description: 'Request microphone permission and begin recording.',\n invoke: (handle) => handle.startRecording(),\n },\n stop_recording: {\n safety: 'write',\n descriptionKey: 'ui.agent.audioRecorder.actions.stopRecording',\n description: 'Stop the current recording and finalise the blob.',\n invoke: (handle) => {\n handle.stopRecording();\n },\n },\n discard: {\n safety: 'destructive',\n descriptionKey: 'ui.agent.audioRecorder.actions.discard',\n description:\n 'Cancel the recording. Irreversible — the captured audio is dropped.',\n invoke: (handle) => {\n handle.discard();\n },\n },\n submit: {\n safety: 'write',\n descriptionKey: 'ui.agent.audioRecorder.actions.submit',\n description:\n 'Stop the active recording, finalising it via onRecordingComplete.',\n invoke: (handle) => {\n handle.stopRecording();\n },\n },\n },\n domHooks: {\n root: {\n attr: 'data-component',\n value: 'audio-recorder',\n description: 'Marks the AudioRecorder wrapper.',\n },\n instanceId: {\n attr: 'data-component-id',\n sourceProp: 'id',\n description: 'Sourced from the id prop.',\n },\n },\n};\n","import {\n forwardRef,\n useCallback,\n useEffect,\n useImperativeHandle,\n useMemo,\n useReducer,\n useRef,\n useState,\n type HTMLAttributes,\n} from 'react';\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport { useTranslation } from 'react-i18next';\nimport { Mic, Pause, Play, Square, X } from 'lucide-react';\nimport { IconButton, Button } from '../button';\nimport { Select, type SelectOption } from '../select/select';\nimport { AudioVisualiser } from '../audio-visualiser';\nimport { Alert } from '../alert';\nimport { useAgentRegistration } from '../../agent/registry';\nimport { audioRecorderAgent } from './audio-recorder.agent';\n\ntype State =\n | { kind: 'idle' }\n | { kind: 'requesting' }\n | { kind: 'recording'; startedAt: number; pausedMs: number }\n | { kind: 'paused'; startedAt: number; pausedMs: number; pausedAt: number }\n | { kind: 'stopped'; duration: number }\n | {\n kind: 'error';\n type:\n | 'permission-denied'\n | 'no-device'\n | 'unsupported'\n | 'capture-failed';\n };\n\ntype Action =\n | { type: 'request' }\n | { type: 'start' }\n | { type: 'pause' }\n | { type: 'resume' }\n | { type: 'stop'; duration: number }\n | { type: 'cancel' }\n | {\n type: 'error';\n kind:\n | 'permission-denied'\n | 'no-device'\n | 'unsupported'\n | 'capture-failed';\n }\n | { type: 'reset' };\n\nfunction reducer(state: State, action: Action): State {\n switch (action.type) {\n case 'request':\n return { kind: 'requesting' };\n case 'start':\n return { kind: 'recording', startedAt: Date.now(), pausedMs: 0 };\n case 'pause':\n if (state.kind !== 'recording') return state;\n return {\n kind: 'paused',\n startedAt: state.startedAt,\n pausedMs: state.pausedMs,\n pausedAt: Date.now(),\n };\n case 'resume':\n if (state.kind !== 'paused') return state;\n return {\n kind: 'recording',\n startedAt: state.startedAt,\n pausedMs: state.pausedMs + (Date.now() - state.pausedAt),\n };\n case 'stop':\n return { kind: 'stopped', duration: action.duration };\n case 'cancel':\n return { kind: 'idle' };\n case 'error':\n return { kind: 'error', type: action.kind };\n case 'reset':\n return { kind: 'idle' };\n default:\n return state;\n }\n}\n\nconst rootVariants = cva(\n [\n 'ds:inline-flex ds:flex-col ds:items-stretch ds:gap-[var(--spacing-sm)]',\n 'ds:rounded-[var(--radius-md)] ds:border ds:border-border',\n 'ds:ps-[var(--spacing-md)] ds:pe-[var(--spacing-md)] ds:pt-[var(--spacing-sm)] ds:pb-[var(--spacing-sm)]',\n 'ds:bg-background',\n ].join(' '),\n {\n variants: {\n size: {\n sm: '',\n md: '',\n lg: '',\n },\n },\n defaultVariants: { size: 'md' },\n },\n);\n\nconst MIME_PREFERENCES = [\n 'audio/webm;codecs=opus',\n 'audio/webm',\n 'audio/mp4',\n 'audio/ogg;codecs=opus',\n];\n\nfunction pickMimeType(): string | undefined {\n if (typeof MediaRecorder === 'undefined') return undefined;\n for (const mime of MIME_PREFERENCES) {\n if (MediaRecorder.isTypeSupported(mime)) return mime;\n }\n return undefined;\n}\n\nfunction formatTimer(ms: number, locale: string): string {\n const total = Math.max(0, Math.floor(ms / 1000));\n const minutes = Math.floor(total / 60);\n const seconds = total % 60;\n const fmt = (n: number) =>\n new Intl.NumberFormat(locale, { minimumIntegerDigits: 2 }).format(n);\n return `${fmt(minutes)}:${fmt(seconds)}`;\n}\n\n/** Curated imperative handle for agent / external automation. */\nexport interface AudioRecorderHandle {\n isRecording: () => boolean;\n getDuration: () => number;\n hasRecording: () => boolean;\n startRecording: () => Promise<void> | void;\n stopRecording: () => void;\n discard: () => void;\n}\n\nexport interface AudioRecorderProps\n extends\n Omit<HTMLAttributes<HTMLDivElement>, 'children' | 'onError'>,\n VariantProps<typeof rootVariants> {\n /** Called on stop with the final blob + duration in ms. */\n onRecordingComplete?: (blob: Blob, durationMs: number) => void;\n /** Called when recording is cancelled. */\n onCancel?: () => void;\n /** Called when an error occurs. */\n onError?: (\n error:\n | 'permission-denied'\n | 'no-device'\n | 'unsupported'\n | 'capture-failed'\n | 'max-duration'\n | 'max-size',\n ) => void;\n /**\n * Auto-stop after this many milliseconds of active recording. Default\n * 30 minutes. Set `null` to disable.\n */\n maxDurationMs?: number | null;\n /**\n * Auto-stop when the accumulated blob chunks exceed this many bytes.\n * Default 250 MB. Set `null` to disable.\n */\n maxBytes?: number | null;\n}\n\nexport const AudioRecorder = forwardRef<\n AudioRecorderHandle,\n AudioRecorderProps\n>(\n (\n {\n size = 'md',\n onRecordingComplete,\n onCancel,\n onError,\n maxDurationMs = 30 * 60 * 1000,\n maxBytes = 250 * 1024 * 1024,\n className,\n ...rest\n },\n ref,\n ) => {\n const { t, i18n } = useTranslation();\n const [state, dispatch] = useReducer(reducer, { kind: 'idle' });\n const [stream, setStream] = useState<MediaStream | null>(null);\n const [now, setNow] = useState<number>(Date.now());\n const [devices, setDevices] = useState<MediaDeviceInfo[]>([]);\n const [selectedDeviceId, setSelectedDeviceId] = useState<string>('');\n\n const recorderRef = useRef<MediaRecorder | null>(null);\n const chunksRef = useRef<Blob[]>([]);\n // Running total of bytes accumulated in `chunksRef` — reading\n // `chunksRef.current.reduce(...)` on every ondataavailable scales\n // poorly; maintain the sum incrementally instead.\n const byteCountRef = useRef<number>(0);\n const durationAtStopRef = useRef<number>(0);\n // Tracks the *currently-held* MediaStream in a ref so the unmount\n // cleanup effect (which closes over [] deps) sees the latest value.\n // Without this, a unmount while getUserMedia is pending would never\n // stop() tracks and the browser mic indicator stays on.\n const streamRef = useRef<MediaStream | null>(null);\n // Flips to true on unmount; consulted inside the getUserMedia promise\n // resolution so we don't try to setStream() on a dead component and\n // so the freshly-acquired tracks get released immediately.\n const unmountedRef = useRef<boolean>(false);\n // Flips to true when cancel() is called; the onstop handler reads it\n // so `onRecordingComplete` is NOT invoked on a cancel path with a blank\n // blob. Reset on each recording start.\n const cancelledRef = useRef<boolean>(false);\n\n const supported = typeof MediaRecorder !== 'undefined';\n\n /* ── Enumerate devices once (after any prior permission grant) ── */\n useEffect(() => {\n if (!supported || !navigator.mediaDevices?.enumerateDevices) return;\n navigator.mediaDevices\n .enumerateDevices()\n .then((list) => {\n const mics = list.filter((d) => d.kind === 'audioinput');\n setDevices(mics);\n })\n .catch(() => {\n /* ignore */\n });\n }, [supported]);\n\n /* ── Timer tick ── */\n useEffect(() => {\n if (state.kind !== 'recording') return;\n const handle = window.setInterval(() => setNow(Date.now()), 250);\n return () => window.clearInterval(handle);\n }, [state.kind]);\n\n const cleanupStream = useCallback(() => {\n const held = streamRef.current ?? stream;\n held?.getTracks().forEach((t) => t.stop());\n streamRef.current = null;\n setStream(null);\n }, [stream]);\n\n const requestAndStart = useCallback(async () => {\n if (!supported) {\n dispatch({ type: 'error', kind: 'unsupported' });\n onError?.('unsupported');\n return;\n }\n dispatch({ type: 'request' });\n cancelledRef.current = false;\n try {\n const nextStream = await navigator.mediaDevices.getUserMedia({\n audio: selectedDeviceId\n ? { deviceId: { exact: selectedDeviceId } }\n : true,\n });\n // Guard against the component unmounting between the permission\n // prompt and the promise resolution — otherwise the freshly-acquired\n // tracks leak and the browser's mic indicator stays live.\n if (unmountedRef.current) {\n nextStream.getTracks().forEach((tr) => tr.stop());\n return;\n }\n streamRef.current = nextStream;\n setStream(nextStream);\n const mimeType = pickMimeType();\n const recorder = new MediaRecorder(\n nextStream,\n mimeType ? { mimeType } : undefined,\n );\n recorderRef.current = recorder;\n chunksRef.current = [];\n byteCountRef.current = 0;\n recorder.ondataavailable = (event) => {\n if (event.data && event.data.size > 0) {\n chunksRef.current.push(event.data);\n byteCountRef.current += event.data.size;\n // Byte-cap: auto-stop if the recording would exceed maxBytes.\n // Cheaper than summing on every tick; stop once and bail.\n if (\n typeof maxBytes === 'number' &&\n byteCountRef.current >= maxBytes &&\n recorderRef.current?.state === 'recording'\n ) {\n onError?.('max-size');\n try {\n recorderRef.current.stop();\n } catch {\n /* ignore */\n }\n }\n }\n };\n recorder.onstop = () => {\n // Cancel path: drop the blob on the floor — consumers who called\n // cancel() must not receive a silent empty recording.\n if (!cancelledRef.current) {\n const blob = new Blob(chunksRef.current, {\n type: mimeType ?? 'audio/webm',\n });\n onRecordingComplete?.(blob, durationAtStopRef.current);\n }\n chunksRef.current = [];\n recorderRef.current = null;\n nextStream.getTracks().forEach((tr) => tr.stop());\n streamRef.current = null;\n setStream(null);\n cancelledRef.current = false;\n };\n recorder.start(1000);\n dispatch({ type: 'start' });\n } catch (err: unknown) {\n const errorName = err instanceof Error ? err.name : '';\n if (errorName === 'NotAllowedError' || errorName === 'SecurityError') {\n dispatch({ type: 'error', kind: 'permission-denied' });\n onError?.('permission-denied');\n } else if (\n errorName === 'NotFoundError' ||\n errorName === 'OverconstrainedError'\n ) {\n dispatch({ type: 'error', kind: 'no-device' });\n onError?.('no-device');\n } else {\n dispatch({ type: 'error', kind: 'capture-failed' });\n onError?.('capture-failed');\n }\n }\n }, [onError, onRecordingComplete, selectedDeviceId, supported]);\n\n const pause = useCallback(() => {\n recorderRef.current?.pause();\n dispatch({ type: 'pause' });\n }, []);\n\n const resume = useCallback(() => {\n recorderRef.current?.resume();\n dispatch({ type: 'resume' });\n }, []);\n\n const stop = useCallback(() => {\n if (state.kind === 'recording' || state.kind === 'paused') {\n const started = state.startedAt;\n const pausedMs = state.pausedMs;\n const duration = Date.now() - started - pausedMs;\n durationAtStopRef.current = Math.max(0, duration);\n dispatch({ type: 'stop', duration: duration });\n }\n try {\n recorderRef.current?.stop();\n } catch {\n /* stop() throws on non-recording state; safe to swallow */\n }\n }, [state]);\n\n const cancel = useCallback(() => {\n // Flip the cancelled flag BEFORE asking MediaRecorder to stop so the\n // async onstop handler sees it and skips onRecordingComplete.\n cancelledRef.current = true;\n try {\n recorderRef.current?.stop();\n } catch {\n /* ignore */\n }\n chunksRef.current = [];\n recorderRef.current = null;\n cleanupStream();\n dispatch({ type: 'cancel' });\n onCancel?.();\n }, [cleanupStream, onCancel]);\n\n /* ── Max-duration auto-stop ── */\n useEffect(() => {\n if (state.kind !== 'recording') return;\n if (typeof maxDurationMs !== 'number' || maxDurationMs <= 0) return;\n const alreadyElapsed = Date.now() - state.startedAt - state.pausedMs;\n const remaining = Math.max(0, maxDurationMs - alreadyElapsed);\n const handle = window.setTimeout(() => {\n if (recorderRef.current?.state === 'recording') {\n onError?.('max-duration');\n try {\n recorderRef.current.stop();\n } catch {\n /* ignore */\n }\n }\n }, remaining);\n return () => window.clearTimeout(handle);\n }, [state, maxDurationMs, onError]);\n\n /* ── Unmount cleanup: release mic if still held ── */\n useEffect(() => {\n return () => {\n unmountedRef.current = true;\n try {\n recorderRef.current?.stop();\n } catch {\n /* ignore */\n }\n // Use streamRef so we see a stream that was acquired by an\n // in-flight getUserMedia resolution — not just the one captured\n // by the closure at mount.\n streamRef.current?.getTracks().forEach((tr) => tr.stop());\n streamRef.current = null;\n };\n }, []);\n\n const elapsedMs =\n state.kind === 'recording'\n ? now - state.startedAt - state.pausedMs\n : state.kind === 'paused'\n ? state.pausedAt - state.startedAt - state.pausedMs\n : state.kind === 'stopped'\n ? state.duration\n : 0;\n\n const agentHandle = useMemo<AudioRecorderHandle>(\n () => ({\n isRecording: () => state.kind === 'recording',\n getDuration: () => elapsedMs,\n hasRecording: () => state.kind === 'stopped',\n startRecording: () => requestAndStart(),\n stopRecording: () => stop(),\n discard: () => cancel(),\n }),\n [state, elapsedMs, requestAndStart, stop, cancel],\n );\n useImperativeHandle(ref, () => agentHandle, [agentHandle]);\n useAgentRegistration(audioRecorderAgent, agentHandle, rest.id);\n\n const deviceOptions: SelectOption<string>[] = devices.map((d) => ({\n value: d.deviceId,\n label: d.label || t('ui.chat.audio.selectDevice'),\n }));\n\n const statusText = (() => {\n switch (state.kind) {\n case 'idle':\n return t('ui.chat.audio.idle');\n case 'requesting':\n return t('ui.common.loading');\n case 'recording':\n return t('ui.chat.audio.recording');\n case 'paused':\n return t('ui.chat.audio.paused');\n case 'stopped':\n return t('ui.chat.audio.idle');\n case 'error':\n if (state.type === 'permission-denied')\n return t('ui.chat.audio.permissionDenied');\n if (state.type === 'unsupported')\n return t('ui.chat.audio.unsupported');\n return t('ui.chat.audio.idle');\n }\n })();\n\n const isRecording = state.kind === 'recording';\n const isPaused = state.kind === 'paused';\n const hasError = state.kind === 'error';\n\n return (\n <div\n data-component=\"audio-recorder\"\n data-component-id={rest.id}\n className={rootVariants({ size, className })}\n {...rest}\n >\n <div className=\"ds:flex ds:items-center ds:gap-[var(--spacing-sm)]\">\n <span\n aria-hidden=\"true\"\n className={[\n 'ds:relative ds:inline-flex ds:size-3 ds:items-center ds:justify-center ds:rounded-[var(--radius-full)]',\n isRecording\n ? 'ds:bg-[color:var(--destructive)]'\n : 'ds:bg-[color:var(--muted)]',\n ].join(' ')}\n >\n {isRecording ? (\n <span\n className={[\n 'ds:absolute ds:inset-0 ds:rounded-[var(--radius-full)]',\n 'ds:bg-[color:var(--destructive)]',\n 'ds:motion-safe:animate-[recorder-pulse_1.2s_ease-out_infinite]',\n 'ds:[.theme-accessible_&]:animate-none',\n ].join(' ')}\n />\n ) : null}\n </span>\n <AudioVisualiser\n stream={stream}\n size=\"sm\"\n aria-hidden=\"true\"\n className=\"ds:flex-1\"\n />\n <time\n dir=\"ltr\"\n aria-hidden=\"true\"\n className=\"ds:tabular-nums type-meta ds:text-[color:var(--muted-foreground)]\"\n >\n {formatTimer(elapsedMs, i18n.language)}\n </time>\n </div>\n\n <span role=\"status\" aria-live=\"polite\" className=\"ds:sr-only\">\n {statusText}\n </span>\n\n <div className=\"ds:flex ds:items-center ds:gap-[var(--spacing-xs)]\">\n {state.kind === 'idle' || state.kind === 'stopped' || hasError ? (\n <Button\n intent=\"primary\"\n size=\"sm\"\n startIcon={<Mic />}\n onClick={requestAndStart}\n disabled={!supported}\n >\n {t('ui.chat.audio.record')}\n </Button>\n ) : null}\n {isRecording ? (\n <IconButton\n icon={<Pause />}\n aria-label={t('ui.chat.audio.pause')}\n intent=\"secondary\"\n size=\"sm\"\n onClick={pause}\n />\n ) : null}\n {isPaused ? (\n <IconButton\n icon={<Play />}\n aria-label={t('ui.chat.audio.resume')}\n intent=\"secondary\"\n size=\"sm\"\n onClick={resume}\n />\n ) : null}\n {isRecording || isPaused ? (\n <>\n <IconButton\n icon={<Square />}\n aria-label={t('ui.chat.audio.stop')}\n intent=\"primary\"\n size=\"sm\"\n onClick={stop}\n />\n <IconButton\n icon={<X />}\n aria-label={t('ui.chat.audio.cancel')}\n intent=\"ghost\"\n size=\"sm\"\n onClick={cancel}\n />\n </>\n ) : null}\n {state.kind === 'idle' && deviceOptions.length > 1 ? (\n <div className=\"ds:ms-auto ds:min-w-[160px]\">\n <Select\n aria-label={t('ui.chat.audio.selectDevice')}\n options={deviceOptions}\n value={selectedDeviceId}\n onValueChange={(v) => setSelectedDeviceId(v)}\n size=\"sm\"\n clearable\n />\n </div>\n ) : null}\n </div>\n\n {hasError && state.kind === 'error' ? (\n <Alert variant=\"error\" live=\"polite\">\n <Alert.Description>{statusText}</Alert.Description>\n {state.type === 'permission-denied' ? (\n <Alert.Action>\n <Button intent=\"ghost\" size=\"sm\" onClick={requestAndStart}>\n {t('ui.chat.audio.retry')}\n </Button>\n </Alert.Action>\n ) : null}\n </Alert>\n ) : null}\n </div>\n );\n },\n);\n\nAudioRecorder.displayName = 'AudioRecorder';\n"],"names":["__iconNode","Mic","createLucideIcon","Pause","Play","audioRecorderAgent","handle","reducer","state","action","rootVariants","cva","MIME_PREFERENCES","pickMimeType","mime","formatTimer","ms","locale","total","minutes","seconds","fmt","n","AudioRecorder","forwardRef","size","onRecordingComplete","onCancel","onError","maxDurationMs","maxBytes","className","rest","ref","t","i18n","useTranslation","dispatch","useReducer","stream","setStream","useState","now","setNow","devices","setDevices","selectedDeviceId","setSelectedDeviceId","recorderRef","useRef","chunksRef","byteCountRef","durationAtStopRef","streamRef","unmountedRef","cancelledRef","supported","useEffect","_a","list","mics","d","cleanupStream","useCallback","held","requestAndStart","nextStream","tr","mimeType","recorder","event","blob","err","errorName","pause","resume","stop","started","pausedMs","duration","cancel","alreadyElapsed","remaining","_b","elapsedMs","agentHandle","useMemo","useImperativeHandle","useAgentRegistration","deviceOptions","statusText","isRecording","isPaused","hasError","jsxs","jsx","AudioVisualiser","Button","IconButton","Fragment","Square","X","Select","v","Alert"],"mappings":"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","x_google_ignoreList":[0,1,2]}
|
|
1
|
+
{"version":3,"file":"audio-recorder-BHBonrFf.js","sources":["../../node_modules/lucide-react/dist/esm/icons/mic.js","../../node_modules/lucide-react/dist/esm/icons/pause.js","../../node_modules/lucide-react/dist/esm/icons/play.js","../../src/components/audio-recorder/audio-recorder.agent.ts","../../src/components/audio-recorder/audio-recorder.tsx"],"sourcesContent":["/**\n * @license lucide-react v1.8.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst __iconNode = [\n [\"path\", { d: \"M12 19v3\", key: \"npa21l\" }],\n [\"path\", { d: \"M19 10v2a7 7 0 0 1-14 0v-2\", key: \"1vc78b\" }],\n [\"rect\", { x: \"9\", y: \"2\", width: \"6\", height: \"13\", rx: \"3\", key: \"s6n7sd\" }]\n];\nconst Mic = createLucideIcon(\"mic\", __iconNode);\n\nexport { __iconNode, Mic as default };\n//# sourceMappingURL=mic.js.map\n","/**\n * @license lucide-react v1.8.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst __iconNode = [\n [\"rect\", { x: \"14\", y: \"3\", width: \"5\", height: \"18\", rx: \"1\", key: \"kaeet6\" }],\n [\"rect\", { x: \"5\", y: \"3\", width: \"5\", height: \"18\", rx: \"1\", key: \"1wsw3u\" }]\n];\nconst Pause = createLucideIcon(\"pause\", __iconNode);\n\nexport { __iconNode, Pause as default };\n//# sourceMappingURL=pause.js.map\n","/**\n * @license lucide-react v1.8.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst __iconNode = [\n [\n \"path\",\n {\n d: \"M5 5a2 2 0 0 1 3.008-1.728l11.997 6.998a2 2 0 0 1 .003 3.458l-12 7A2 2 0 0 1 5 19z\",\n key: \"10ikf1\"\n }\n ]\n];\nconst Play = createLucideIcon(\"play\", __iconNode);\n\nexport { __iconNode, Play as default };\n//# sourceMappingURL=play.js.map\n","/* -------------------------------------------------------------------- */\n/* Agent adapter — AudioRecorder. */\n/* -------------------------------------------------------------------- */\n\nimport type { AgentAdapter } from '../../agent/types';\nimport type { AudioRecorderHandle } from './audio-recorder';\n\nexport const audioRecorderAgent: AgentAdapter<AudioRecorderHandle> = {\n id: 'audio-recorder',\n capabilities: ['submit'],\n state: {\n isRecording: {\n type: 'boolean',\n descriptionKey: 'ui.agent.audioRecorder.state.isRecording',\n description: 'True while actively capturing audio (not paused).',\n read: (handle) => handle.isRecording(),\n },\n duration: {\n type: 'number',\n descriptionKey: 'ui.agent.audioRecorder.state.duration',\n description:\n 'Elapsed recording time in milliseconds (paused time excluded).',\n read: (handle) => handle.getDuration(),\n },\n hasRecording: {\n type: 'boolean',\n descriptionKey: 'ui.agent.audioRecorder.state.hasRecording',\n description:\n 'True when a completed recording is available for submission.',\n read: (handle) => handle.hasRecording(),\n },\n },\n actions: {\n start_recording: {\n safety: 'write',\n descriptionKey: 'ui.agent.audioRecorder.actions.startRecording',\n description: 'Request microphone permission and begin recording.',\n invoke: (handle) => handle.startRecording(),\n },\n stop_recording: {\n safety: 'write',\n descriptionKey: 'ui.agent.audioRecorder.actions.stopRecording',\n description: 'Stop the current recording and finalise the blob.',\n invoke: (handle) => {\n handle.stopRecording();\n },\n },\n discard: {\n safety: 'destructive',\n descriptionKey: 'ui.agent.audioRecorder.actions.discard',\n description:\n 'Cancel the recording. Irreversible — the captured audio is dropped.',\n invoke: (handle) => {\n handle.discard();\n },\n },\n submit: {\n safety: 'write',\n descriptionKey: 'ui.agent.audioRecorder.actions.submit',\n description:\n 'Stop the active recording, finalising it via onRecordingComplete.',\n invoke: (handle) => {\n handle.stopRecording();\n },\n },\n },\n domHooks: {\n root: {\n attr: 'data-component',\n value: 'audio-recorder',\n description: 'Marks the AudioRecorder wrapper.',\n },\n instanceId: {\n attr: 'data-component-id',\n sourceProp: 'id',\n description: 'Sourced from the id prop.',\n },\n },\n};\n","import {\n forwardRef,\n useCallback,\n useEffect,\n useImperativeHandle,\n useMemo,\n useReducer,\n useRef,\n useState,\n type HTMLAttributes,\n} from 'react';\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport { useTranslation } from 'react-i18next';\nimport { Mic, Pause, Play, Square, X } from 'lucide-react';\nimport { IconButton, Button } from '../button';\nimport { Select, type SelectOption } from '../select/select';\nimport { AudioVisualiser } from '../audio-visualiser';\nimport { Alert } from '../alert';\nimport { useAgentRegistration } from '../../agent/registry';\nimport { audioRecorderAgent } from './audio-recorder.agent';\n\ntype State =\n | { kind: 'idle' }\n | { kind: 'requesting' }\n | { kind: 'recording'; startedAt: number; pausedMs: number }\n | { kind: 'paused'; startedAt: number; pausedMs: number; pausedAt: number }\n | { kind: 'stopped'; duration: number }\n | {\n kind: 'error';\n type:\n | 'permission-denied'\n | 'no-device'\n | 'unsupported'\n | 'capture-failed';\n };\n\ntype Action =\n | { type: 'request' }\n | { type: 'start' }\n | { type: 'pause' }\n | { type: 'resume' }\n | { type: 'stop'; duration: number }\n | { type: 'cancel' }\n | {\n type: 'error';\n kind:\n | 'permission-denied'\n | 'no-device'\n | 'unsupported'\n | 'capture-failed';\n }\n | { type: 'reset' };\n\nfunction reducer(state: State, action: Action): State {\n switch (action.type) {\n case 'request':\n return { kind: 'requesting' };\n case 'start':\n return { kind: 'recording', startedAt: Date.now(), pausedMs: 0 };\n case 'pause':\n if (state.kind !== 'recording') return state;\n return {\n kind: 'paused',\n startedAt: state.startedAt,\n pausedMs: state.pausedMs,\n pausedAt: Date.now(),\n };\n case 'resume':\n if (state.kind !== 'paused') return state;\n return {\n kind: 'recording',\n startedAt: state.startedAt,\n pausedMs: state.pausedMs + (Date.now() - state.pausedAt),\n };\n case 'stop':\n return { kind: 'stopped', duration: action.duration };\n case 'cancel':\n return { kind: 'idle' };\n case 'error':\n return { kind: 'error', type: action.kind };\n case 'reset':\n return { kind: 'idle' };\n default:\n return state;\n }\n}\n\nconst rootVariants = cva(\n [\n 'ds:inline-flex ds:flex-col ds:items-stretch ds:gap-[var(--spacing-sm)]',\n 'ds:rounded-[var(--radius-md)] ds:border ds:border-border',\n 'ds:ps-[var(--spacing-md)] ds:pe-[var(--spacing-md)] ds:pt-[var(--spacing-sm)] ds:pb-[var(--spacing-sm)]',\n 'ds:bg-background',\n ].join(' '),\n {\n variants: {\n size: {\n sm: '',\n md: '',\n lg: '',\n },\n },\n defaultVariants: { size: 'md' },\n },\n);\n\nconst MIME_PREFERENCES = [\n 'audio/webm;codecs=opus',\n 'audio/webm',\n 'audio/mp4',\n 'audio/ogg;codecs=opus',\n];\n\nfunction pickMimeType(): string | undefined {\n if (typeof MediaRecorder === 'undefined') return undefined;\n for (const mime of MIME_PREFERENCES) {\n if (MediaRecorder.isTypeSupported(mime)) return mime;\n }\n return undefined;\n}\n\nfunction formatTimer(ms: number, locale: string): string {\n const total = Math.max(0, Math.floor(ms / 1000));\n const minutes = Math.floor(total / 60);\n const seconds = total % 60;\n const fmt = (n: number) =>\n new Intl.NumberFormat(locale, { minimumIntegerDigits: 2 }).format(n);\n return `${fmt(minutes)}:${fmt(seconds)}`;\n}\n\n/** Curated imperative handle for agent / external automation. */\nexport interface AudioRecorderHandle {\n isRecording: () => boolean;\n getDuration: () => number;\n hasRecording: () => boolean;\n startRecording: () => Promise<void> | void;\n stopRecording: () => void;\n discard: () => void;\n}\n\nexport interface AudioRecorderProps\n extends\n Omit<HTMLAttributes<HTMLDivElement>, 'children' | 'onError'>,\n VariantProps<typeof rootVariants> {\n /** Called on stop with the final blob + duration in ms. */\n onRecordingComplete?: (blob: Blob, durationMs: number) => void;\n /** Called when recording is cancelled. */\n onCancel?: () => void;\n /** Called when an error occurs. */\n onError?: (\n error:\n | 'permission-denied'\n | 'no-device'\n | 'unsupported'\n | 'capture-failed'\n | 'max-duration'\n | 'max-size',\n ) => void;\n /**\n * Auto-stop after this many milliseconds of active recording. Default\n * 30 minutes. Set `null` to disable.\n */\n maxDurationMs?: number | null;\n /**\n * Auto-stop when the accumulated blob chunks exceed this many bytes.\n * Default 250 MB. Set `null` to disable.\n */\n maxBytes?: number | null;\n}\n\nexport const AudioRecorder = forwardRef<\n AudioRecorderHandle,\n AudioRecorderProps\n>(\n (\n {\n size = 'md',\n onRecordingComplete,\n onCancel,\n onError,\n maxDurationMs = 30 * 60 * 1000,\n maxBytes = 250 * 1024 * 1024,\n className,\n ...rest\n },\n ref,\n ) => {\n const { t, i18n } = useTranslation();\n const [state, dispatch] = useReducer(reducer, { kind: 'idle' });\n const [stream, setStream] = useState<MediaStream | null>(null);\n const [now, setNow] = useState<number>(Date.now());\n const [devices, setDevices] = useState<MediaDeviceInfo[]>([]);\n const [selectedDeviceId, setSelectedDeviceId] = useState<string>('');\n\n const recorderRef = useRef<MediaRecorder | null>(null);\n const chunksRef = useRef<Blob[]>([]);\n // Running total of bytes accumulated in `chunksRef` — reading\n // `chunksRef.current.reduce(...)` on every ondataavailable scales\n // poorly; maintain the sum incrementally instead.\n const byteCountRef = useRef<number>(0);\n const durationAtStopRef = useRef<number>(0);\n // Tracks the *currently-held* MediaStream in a ref so the unmount\n // cleanup effect (which closes over [] deps) sees the latest value.\n // Without this, a unmount while getUserMedia is pending would never\n // stop() tracks and the browser mic indicator stays on.\n const streamRef = useRef<MediaStream | null>(null);\n // Flips to true on unmount; consulted inside the getUserMedia promise\n // resolution so we don't try to setStream() on a dead component and\n // so the freshly-acquired tracks get released immediately.\n const unmountedRef = useRef<boolean>(false);\n // Flips to true when cancel() is called; the onstop handler reads it\n // so `onRecordingComplete` is NOT invoked on a cancel path with a blank\n // blob. Reset on each recording start.\n const cancelledRef = useRef<boolean>(false);\n\n const supported = typeof MediaRecorder !== 'undefined';\n\n /* ── Enumerate devices once (after any prior permission grant) ── */\n useEffect(() => {\n if (!supported || !navigator.mediaDevices?.enumerateDevices) return;\n navigator.mediaDevices\n .enumerateDevices()\n .then((list) => {\n const mics = list.filter((d) => d.kind === 'audioinput');\n setDevices(mics);\n })\n .catch(() => {\n /* ignore */\n });\n }, [supported]);\n\n /* ── Timer tick ── */\n useEffect(() => {\n if (state.kind !== 'recording') return;\n const handle = window.setInterval(() => setNow(Date.now()), 250);\n return () => window.clearInterval(handle);\n }, [state.kind]);\n\n const cleanupStream = useCallback(() => {\n const held = streamRef.current ?? stream;\n held?.getTracks().forEach((t) => t.stop());\n streamRef.current = null;\n setStream(null);\n }, [stream]);\n\n const requestAndStart = useCallback(async () => {\n if (!supported) {\n dispatch({ type: 'error', kind: 'unsupported' });\n onError?.('unsupported');\n return;\n }\n dispatch({ type: 'request' });\n cancelledRef.current = false;\n try {\n const nextStream = await navigator.mediaDevices.getUserMedia({\n audio: selectedDeviceId\n ? { deviceId: { exact: selectedDeviceId } }\n : true,\n });\n // Guard against the component unmounting between the permission\n // prompt and the promise resolution — otherwise the freshly-acquired\n // tracks leak and the browser's mic indicator stays live.\n if (unmountedRef.current) {\n nextStream.getTracks().forEach((tr) => tr.stop());\n return;\n }\n streamRef.current = nextStream;\n setStream(nextStream);\n const mimeType = pickMimeType();\n const recorder = new MediaRecorder(\n nextStream,\n mimeType ? { mimeType } : undefined,\n );\n recorderRef.current = recorder;\n chunksRef.current = [];\n byteCountRef.current = 0;\n recorder.ondataavailable = (event) => {\n if (event.data && event.data.size > 0) {\n chunksRef.current.push(event.data);\n byteCountRef.current += event.data.size;\n // Byte-cap: auto-stop if the recording would exceed maxBytes.\n // Cheaper than summing on every tick; stop once and bail.\n if (\n typeof maxBytes === 'number' &&\n byteCountRef.current >= maxBytes &&\n recorderRef.current?.state === 'recording'\n ) {\n onError?.('max-size');\n try {\n recorderRef.current.stop();\n } catch {\n /* ignore */\n }\n }\n }\n };\n recorder.onstop = () => {\n // Cancel path: drop the blob on the floor — consumers who called\n // cancel() must not receive a silent empty recording.\n if (!cancelledRef.current) {\n const blob = new Blob(chunksRef.current, {\n type: mimeType ?? 'audio/webm',\n });\n onRecordingComplete?.(blob, durationAtStopRef.current);\n }\n chunksRef.current = [];\n recorderRef.current = null;\n nextStream.getTracks().forEach((tr) => tr.stop());\n streamRef.current = null;\n setStream(null);\n cancelledRef.current = false;\n };\n recorder.start(1000);\n dispatch({ type: 'start' });\n } catch (err: unknown) {\n const errorName = err instanceof Error ? err.name : '';\n if (errorName === 'NotAllowedError' || errorName === 'SecurityError') {\n dispatch({ type: 'error', kind: 'permission-denied' });\n onError?.('permission-denied');\n } else if (\n errorName === 'NotFoundError' ||\n errorName === 'OverconstrainedError'\n ) {\n dispatch({ type: 'error', kind: 'no-device' });\n onError?.('no-device');\n } else {\n dispatch({ type: 'error', kind: 'capture-failed' });\n onError?.('capture-failed');\n }\n }\n }, [onError, onRecordingComplete, selectedDeviceId, supported]);\n\n const pause = useCallback(() => {\n recorderRef.current?.pause();\n dispatch({ type: 'pause' });\n }, []);\n\n const resume = useCallback(() => {\n recorderRef.current?.resume();\n dispatch({ type: 'resume' });\n }, []);\n\n const stop = useCallback(() => {\n if (state.kind === 'recording' || state.kind === 'paused') {\n const started = state.startedAt;\n const pausedMs = state.pausedMs;\n const duration = Date.now() - started - pausedMs;\n durationAtStopRef.current = Math.max(0, duration);\n dispatch({ type: 'stop', duration: duration });\n }\n try {\n recorderRef.current?.stop();\n } catch {\n /* stop() throws on non-recording state; safe to swallow */\n }\n }, [state]);\n\n const cancel = useCallback(() => {\n // Flip the cancelled flag BEFORE asking MediaRecorder to stop so the\n // async onstop handler sees it and skips onRecordingComplete.\n cancelledRef.current = true;\n try {\n recorderRef.current?.stop();\n } catch {\n /* ignore */\n }\n chunksRef.current = [];\n recorderRef.current = null;\n cleanupStream();\n dispatch({ type: 'cancel' });\n onCancel?.();\n }, [cleanupStream, onCancel]);\n\n /* ── Max-duration auto-stop ── */\n useEffect(() => {\n if (state.kind !== 'recording') return;\n if (typeof maxDurationMs !== 'number' || maxDurationMs <= 0) return;\n const alreadyElapsed = Date.now() - state.startedAt - state.pausedMs;\n const remaining = Math.max(0, maxDurationMs - alreadyElapsed);\n const handle = window.setTimeout(() => {\n if (recorderRef.current?.state === 'recording') {\n onError?.('max-duration');\n try {\n recorderRef.current.stop();\n } catch {\n /* ignore */\n }\n }\n }, remaining);\n return () => window.clearTimeout(handle);\n }, [state, maxDurationMs, onError]);\n\n /* ── Unmount cleanup: release mic if still held ── */\n useEffect(() => {\n return () => {\n unmountedRef.current = true;\n try {\n recorderRef.current?.stop();\n } catch {\n /* ignore */\n }\n // Use streamRef so we see a stream that was acquired by an\n // in-flight getUserMedia resolution — not just the one captured\n // by the closure at mount.\n streamRef.current?.getTracks().forEach((tr) => tr.stop());\n streamRef.current = null;\n };\n }, []);\n\n const elapsedMs =\n state.kind === 'recording'\n ? now - state.startedAt - state.pausedMs\n : state.kind === 'paused'\n ? state.pausedAt - state.startedAt - state.pausedMs\n : state.kind === 'stopped'\n ? state.duration\n : 0;\n\n const agentHandle = useMemo<AudioRecorderHandle>(\n () => ({\n isRecording: () => state.kind === 'recording',\n getDuration: () => elapsedMs,\n hasRecording: () => state.kind === 'stopped',\n startRecording: () => requestAndStart(),\n stopRecording: () => stop(),\n discard: () => cancel(),\n }),\n [state, elapsedMs, requestAndStart, stop, cancel],\n );\n useImperativeHandle(ref, () => agentHandle, [agentHandle]);\n useAgentRegistration(audioRecorderAgent, agentHandle, rest.id);\n\n const deviceOptions: SelectOption<string>[] = devices.map((d) => ({\n value: d.deviceId,\n label: d.label || t('chat.audio.selectDevice'),\n }));\n\n const statusText = (() => {\n switch (state.kind) {\n case 'idle':\n return t('chat.audio.idle');\n case 'requesting':\n return t('common.loading');\n case 'recording':\n return t('chat.audio.recording');\n case 'paused':\n return t('chat.audio.paused');\n case 'stopped':\n return t('chat.audio.idle');\n case 'error':\n if (state.type === 'permission-denied')\n return t('chat.audio.permissionDenied');\n if (state.type === 'unsupported')\n return t('chat.audio.unsupported');\n return t('chat.audio.idle');\n }\n })();\n\n const isRecording = state.kind === 'recording';\n const isPaused = state.kind === 'paused';\n const hasError = state.kind === 'error';\n\n return (\n <div\n data-component=\"audio-recorder\"\n data-component-id={rest.id}\n className={rootVariants({ size, className })}\n {...rest}\n >\n <div className=\"ds:flex ds:items-center ds:gap-[var(--spacing-sm)]\">\n <span\n aria-hidden=\"true\"\n className={[\n 'ds:relative ds:inline-flex ds:size-3 ds:items-center ds:justify-center ds:rounded-[var(--radius-full)]',\n isRecording\n ? 'ds:bg-[color:var(--destructive)]'\n : 'ds:bg-[color:var(--muted)]',\n ].join(' ')}\n >\n {isRecording ? (\n <span\n className={[\n 'ds:absolute ds:inset-0 ds:rounded-[var(--radius-full)]',\n 'ds:bg-[color:var(--destructive)]',\n 'ds:motion-safe:animate-[recorder-pulse_1.2s_ease-out_infinite]',\n 'ds:[.theme-accessible_&]:animate-none',\n ].join(' ')}\n />\n ) : null}\n </span>\n <AudioVisualiser\n stream={stream}\n size=\"sm\"\n aria-hidden=\"true\"\n className=\"ds:flex-1\"\n />\n <time\n dir=\"ltr\"\n aria-hidden=\"true\"\n className=\"ds:tabular-nums type-meta ds:text-[color:var(--muted-foreground)]\"\n >\n {formatTimer(elapsedMs, i18n.language)}\n </time>\n </div>\n\n <span role=\"status\" aria-live=\"polite\" className=\"ds:sr-only\">\n {statusText}\n </span>\n\n <div className=\"ds:flex ds:items-center ds:gap-[var(--spacing-xs)]\">\n {state.kind === 'idle' || state.kind === 'stopped' || hasError ? (\n <Button\n intent=\"primary\"\n size=\"sm\"\n startIcon={<Mic />}\n onClick={requestAndStart}\n disabled={!supported}\n >\n {t('chat.audio.record')}\n </Button>\n ) : null}\n {isRecording ? (\n <IconButton\n icon={<Pause />}\n aria-label={t('chat.audio.pause')}\n intent=\"secondary\"\n size=\"sm\"\n onClick={pause}\n />\n ) : null}\n {isPaused ? (\n <IconButton\n icon={<Play />}\n aria-label={t('chat.audio.resume')}\n intent=\"secondary\"\n size=\"sm\"\n onClick={resume}\n />\n ) : null}\n {isRecording || isPaused ? (\n <>\n <IconButton\n icon={<Square />}\n aria-label={t('chat.audio.stop')}\n intent=\"primary\"\n size=\"sm\"\n onClick={stop}\n />\n <IconButton\n icon={<X />}\n aria-label={t('chat.audio.cancel')}\n intent=\"ghost\"\n size=\"sm\"\n onClick={cancel}\n />\n </>\n ) : null}\n {state.kind === 'idle' && deviceOptions.length > 1 ? (\n <div className=\"ds:ms-auto ds:min-w-[160px]\">\n <Select\n aria-label={t('chat.audio.selectDevice')}\n options={deviceOptions}\n value={selectedDeviceId}\n onValueChange={(v) => setSelectedDeviceId(v)}\n size=\"sm\"\n clearable\n />\n </div>\n ) : null}\n </div>\n\n {hasError && state.kind === 'error' ? (\n <Alert variant=\"error\" live=\"polite\">\n <Alert.Description>{statusText}</Alert.Description>\n {state.type === 'permission-denied' ? (\n <Alert.Action>\n <Button intent=\"ghost\" size=\"sm\" onClick={requestAndStart}>\n {t('chat.audio.retry')}\n </Button>\n </Alert.Action>\n ) : null}\n </Alert>\n ) : null}\n </div>\n );\n },\n);\n\nAudioRecorder.displayName = 'AudioRecorder';\n"],"names":["__iconNode","Mic","createLucideIcon","Pause","Play","audioRecorderAgent","handle","reducer","state","action","rootVariants","cva","MIME_PREFERENCES","pickMimeType","mime","formatTimer","ms","locale","total","minutes","seconds","fmt","n","AudioRecorder","forwardRef","size","onRecordingComplete","onCancel","onError","maxDurationMs","maxBytes","className","rest","ref","t","i18n","useTranslation","dispatch","useReducer","stream","setStream","useState","now","setNow","devices","setDevices","selectedDeviceId","setSelectedDeviceId","recorderRef","useRef","chunksRef","byteCountRef","durationAtStopRef","streamRef","unmountedRef","cancelledRef","supported","useEffect","_a","list","mics","d","cleanupStream","useCallback","held","requestAndStart","nextStream","tr","mimeType","recorder","event","blob","err","errorName","pause","resume","stop","started","pausedMs","duration","cancel","alreadyElapsed","remaining","_b","elapsedMs","agentHandle","useMemo","useImperativeHandle","useAgentRegistration","deviceOptions","statusText","isRecording","isPaused","hasError","jsxs","jsx","AudioVisualiser","Button","IconButton","Fragment","Square","X","Select","v","Alert"],"mappings":"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","x_google_ignoreList":[0,1,2]}
|
|
@@ -98,7 +98,7 @@ const K = H(
|
|
|
98
98
|
b(() => {
|
|
99
99
|
o.current.length > t && (o.current.length = t);
|
|
100
100
|
}, [t]);
|
|
101
|
-
const P = V ?? M("
|
|
101
|
+
const P = V ?? M("chat.audio.visualiserLabel"), g = A ? M("chat.audio.device", { name: A }) : null, F = G();
|
|
102
102
|
return /* @__PURE__ */ C(
|
|
103
103
|
"div",
|
|
104
104
|
{
|
|
@@ -142,4 +142,4 @@ O.displayName = "AudioVisualiser";
|
|
|
142
142
|
export {
|
|
143
143
|
O as A
|
|
144
144
|
};
|
|
145
|
-
//# sourceMappingURL=audio-visualiser-
|
|
145
|
+
//# sourceMappingURL=audio-visualiser-I-T4Z7EU.js.map
|