@alfadocs/ui-kit-debug 0.8.0 → 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 +4 -3
- 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
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"spinner-DirtWZNG.js","sources":["../../src/components/spinner/spinner.tsx"],"sourcesContent":["import { forwardRef, type HTMLAttributes } from 'react';\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport { useTranslation } from 'react-i18next';\n\nconst spinnerVariants = cva('ds:inline-block ds:shrink-0 ds:text-current', {\n variants: {\n size: {\n sm: 'ds:size-3',\n md: 'ds:size-4',\n lg: 'ds:size-5',\n },\n variant: {\n pulse: '',\n chase: '',\n prism: '',\n },\n speed: {\n slower: '',\n slow: '',\n normal: '',\n fast: '',\n faster: '',\n },\n },\n compoundVariants: [\n {\n variant: 'pulse',\n speed: 'slower',\n class: 'ds:[--spinner-duration:2400ms]',\n },\n {\n variant: 'pulse',\n speed: 'slow',\n class: 'ds:[--spinner-duration:1800ms]',\n },\n {\n variant: 'pulse',\n speed: 'normal',\n class: 'ds:[--spinner-duration:1200ms]',\n },\n { variant: 'pulse', speed: 'fast', class: 'ds:[--spinner-duration:900ms]' },\n {\n variant: 'pulse',\n speed: 'faster',\n class: 'ds:[--spinner-duration:600ms]',\n },\n {\n variant: 'chase',\n speed: 'slower',\n class: 'ds:[--spinner-duration:2400ms]',\n },\n {\n variant: 'chase',\n speed: 'slow',\n class: 'ds:[--spinner-duration:1800ms]',\n },\n {\n variant: 'chase',\n speed: 'normal',\n class: 'ds:[--spinner-duration:1200ms]',\n },\n { variant: 'chase', speed: 'fast', class: 'ds:[--spinner-duration:900ms]' },\n {\n variant: 'chase',\n speed: 'faster',\n class: 'ds:[--spinner-duration:600ms]',\n },\n // prism runs 2× so each of the 4 brand hues has room to read.\n {\n variant: 'prism',\n speed: 'slower',\n class: 'ds:[--spinner-duration:4800ms]',\n },\n {\n variant: 'prism',\n speed: 'slow',\n class: 'ds:[--spinner-duration:3600ms]',\n },\n {\n variant: 'prism',\n speed: 'normal',\n class: 'ds:[--spinner-duration:2400ms]',\n },\n {\n variant: 'prism',\n speed: 'fast',\n class: 'ds:[--spinner-duration:1800ms]',\n },\n {\n variant: 'prism',\n speed: 'faster',\n class: 'ds:[--spinner-duration:1200ms]',\n },\n ],\n defaultVariants: { size: 'md', variant: 'pulse', speed: 'normal' },\n});\n\nconst shapeVariants = cva(\n [\n 'ds:fill-current',\n 'ds:[transform-box:fill-box] ds:[transform-origin:center]',\n 'ds:motion-reduce:animate-none',\n 'ds:[animation-delay:calc(var(--spinner-duration)/4*var(--spinner-position))]',\n ].join(' '),\n {\n variants: {\n variant: {\n pulse:\n 'ds:animate-[spinner-pulse_var(--spinner-duration)_ease-in-out_infinite]',\n chase:\n 'ds:animate-[spinner-chase_var(--spinner-duration)_ease-out_infinite]',\n prism:\n 'ds:animate-[spinner-prism_var(--spinner-duration)_linear_infinite] ds:motion-reduce:fill-[var(--color-violet-500)]',\n },\n position: {\n top: 'ds:[--spinner-position:0]',\n right: 'ds:[--spinner-position:1]',\n bottom: 'ds:[--spinner-position:2]',\n left: 'ds:[--spinner-position:3]',\n },\n },\n defaultVariants: { variant: 'pulse', position: 'top' },\n },\n);\n\nexport type SpinnerVariant = 'pulse' | 'chase' | 'prism';\nexport type SpinnerSpeed = 'slower' | 'slow' | 'normal' | 'fast' | 'faster';\n\nexport interface SpinnerProps\n extends\n Omit<HTMLAttributes<HTMLSpanElement>, 'role' | 'children'>,\n VariantProps<typeof spinnerVariants> {\n size?: 'sm' | 'md' | 'lg';\n variant?: SpinnerVariant;\n speed?: SpinnerSpeed;\n label?: string;\n}\n\nexport const Spinner = forwardRef<HTMLSpanElement, SpinnerProps>(\n (\n {\n size = 'md',\n variant = 'pulse',\n speed = 'normal',\n label,\n className,\n ...props\n },\n ref,\n ) => {\n const { t } = useTranslation();\n const accessibleLabel = label ?? t('common.loading', 'Loading…');\n\n return (\n <span\n ref={ref}\n role=\"status\"\n aria-live=\"polite\"\n data-component=\"spinner\"\n className={spinnerVariants({ size, variant, speed, className })}\n {...props}\n >\n <svg aria-hidden=\"true\" viewBox=\"0 0 148 148\" className=\"ds:size-full\">\n <g\n data-shape=\"top\"\n className={shapeVariants({ variant, position: 'top' })}\n >\n <rect\n x=\"53.04\"\n y=\"2.54\"\n width=\"33.99\"\n height=\"49.34\"\n rx=\"4.56\"\n ry=\"4.56\"\n transform=\"translate(-4.66 19.05) rotate(-15)\"\n />\n </g>\n <g\n data-shape=\"right\"\n className={shapeVariants({ variant, position: 'right' })}\n >\n <rect\n x=\"96.12\"\n y=\"53.04\"\n width=\"49.34\"\n height=\"33.99\"\n rx=\"4.56\"\n ry=\"4.56\"\n transform=\"translate(-14.01 33.65) rotate(-15)\"\n />\n </g>\n <g\n data-shape=\"bottom\"\n className={shapeVariants({ variant, position: 'bottom' })}\n >\n <rect\n x=\"60.97\"\n y=\"96.12\"\n width=\"33.99\"\n height=\"49.34\"\n rx=\"4.56\"\n ry=\"4.56\"\n transform=\"translate(-28.61 24.29) rotate(-15)\"\n />\n </g>\n <g\n data-shape=\"left\"\n className={shapeVariants({ variant, position: 'left' })}\n >\n <path d=\"M47.82,59.56c-.65-2.43-3.15-3.87-5.58-3.22L3.38,66.75c-2.43.65-3.87,3.15-3.22,5.58l6.44,24.03c.65,2.43,3.15,3.87,5.58,3.22l38.86-10.41c2.43-.65,3.87-3.15,3.22-5.58l-6.44-24.03Z\" />\n </g>\n </svg>\n <span className=\"ds:sr-only\">{accessibleLabel}</span>\n </span>\n );\n },\n);\n\nSpinner.displayName = 'Spinner';\n"],"names":["spinnerVariants","cva","shapeVariants","Spinner","forwardRef","size","variant","speed","label","className","props","ref","t","useTranslation","accessibleLabel","jsxs","jsx"],"mappings":"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"}
|
|
@@ -97,9 +97,9 @@ const y = p("ds:flex ds:flex-col", {
|
|
|
97
97
|
}
|
|
98
98
|
}
|
|
99
99
|
), T = { up: "↑", down: "↓", flat: "→" }, F = {
|
|
100
|
-
up: "
|
|
101
|
-
down: "
|
|
102
|
-
flat: "
|
|
100
|
+
up: "stat.trend.up",
|
|
101
|
+
down: "stat.trend.down",
|
|
102
|
+
flat: "stat.trend.flat"
|
|
103
103
|
};
|
|
104
104
|
function R({
|
|
105
105
|
trend: s,
|
|
@@ -225,4 +225,4 @@ D.displayName = "Stat";
|
|
|
225
225
|
export {
|
|
226
226
|
D as S
|
|
227
227
|
};
|
|
228
|
-
//# sourceMappingURL=stat-
|
|
228
|
+
//# sourceMappingURL=stat-CDQ_a0vk.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stat-CDQ_a0vk.js","sources":["../../src/components/stat/stat.tsx"],"sourcesContent":["import { forwardRef, useId, type HTMLAttributes, type ReactNode } from 'react';\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport { useTranslation } from 'react-i18next';\n\n/* ------------------------------------------------------------------ */\n/* CVA — stat root */\n/* ------------------------------------------------------------------ */\n\nconst statVariants = cva('ds:flex ds:flex-col', {\n variants: {\n variant: {\n default: 'ds:gap-[var(--spacing-xs)]',\n outlined: [\n 'ds:gap-[var(--spacing-xs)]',\n 'ds:border ds:border-[color:var(--border)]',\n 'ds:rounded-[var(--radius-md)]',\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 // White card surface with the shared card shadow — matches\n // `Card variant=\"elevated\"` tokens (`--card` + `--shadow-card`) so\n // a grid of elevated Stats reads as a set of shaded panels without\n // nesting a Card around each one.\n elevated: [\n 'ds:gap-[var(--spacing-xs)]',\n 'ds:bg-[var(--card)]',\n 'ds:text-[var(--card-foreground)]',\n 'ds:shadow-[var(--shadow-card)]',\n 'ds:rounded-[var(--radius-lg)]',\n 'ds:ps-[var(--spacing-md)] ds:pe-[var(--spacing-md)]',\n 'ds:pt-[var(--spacing-md)] ds:pb-[var(--spacing-md)]',\n // Forced-colors: UA strips shadow, so render a border as the\n // separation cue — mirrors Card's forced-colors behaviour.\n 'ds:forced-colors:border ds:forced-colors:border-[CanvasText]',\n ].join(' '),\n compact: 'ds:gap-[var(--spacing-none)]',\n },\n size: {\n sm: '',\n md: '',\n lg: '',\n },\n align: {\n start: 'ds:items-start ds:text-start',\n center: 'ds:items-center ds:text-center',\n end: 'ds:items-end ds:text-end',\n },\n },\n defaultVariants: {\n variant: 'default',\n size: 'md',\n align: 'start',\n },\n});\n\n/* ------------------------------------------------------------------ */\n/* CVA — value element */\n/* ------------------------------------------------------------------ */\n\nconst valueVariants = cva('type-metric ds:text-[var(--foreground)]', {\n variants: {\n size: {\n sm: 'ds:[--type-metric-size:var(--font-size-xl)]',\n md: 'ds:[--type-metric-size:var(--font-size-3xl)]',\n lg: 'ds:[--type-metric-size:var(--font-size-5xl)]',\n },\n variant: {\n default: '',\n outlined: '',\n elevated: '',\n compact: '',\n },\n },\n compoundVariants: [\n {\n variant: 'compact',\n size: 'sm',\n className: 'ds:[--type-metric-size:var(--font-size-lg)]',\n },\n {\n variant: 'compact',\n size: 'md',\n className: 'ds:[--type-metric-size:var(--font-size-xl)]',\n },\n {\n variant: 'compact',\n size: 'lg',\n className: 'ds:[--type-metric-size:var(--font-size-2xl)]',\n },\n ],\n defaultVariants: {\n size: 'md',\n variant: 'default',\n },\n});\n\n/* ------------------------------------------------------------------ */\n/* CVA — trend element */\n/* ------------------------------------------------------------------ */\n\nconst trendVariants = cva(\n 'ds:inline-flex ds:items-center ds:gap-[var(--spacing-xs)] type-label',\n {\n variants: {\n trend: {\n up: 'ds:text-[var(--success)]',\n down: 'ds:text-[var(--destructive)]',\n flat: 'ds:text-[var(--muted-foreground)]',\n },\n },\n defaultVariants: {\n trend: 'flat',\n },\n },\n);\n\n/* ------------------------------------------------------------------ */\n/* StatTrend (internal — not exported) */\n/* ------------------------------------------------------------------ */\n\ninterface StatTrendProps {\n trend: 'up' | 'down' | 'flat';\n delta: number | string;\n deltaFormat?: 'decimal' | 'percent';\n locale?: string;\n}\n\nconst ARROW = { up: '↑', down: '↓', flat: '→' } as const;\nconst TREND_KEY = {\n up: 'stat.trend.up',\n down: 'stat.trend.down',\n flat: 'stat.trend.flat',\n} as const;\n\nfunction StatTrend({\n trend,\n delta,\n deltaFormat = 'decimal',\n locale,\n}: StatTrendProps) {\n const { t, i18n } = useTranslation();\n\n const formattedDelta =\n typeof delta === 'string'\n ? delta\n : new Intl.NumberFormat(locale ?? i18n.language, {\n style: deltaFormat === 'percent' ? 'percent' : 'decimal',\n }).format(deltaFormat === 'percent' ? delta / 100 : delta);\n\n return (\n <span className={trendVariants({ trend })}>\n <span aria-hidden=\"true\">{ARROW[trend]}</span>\n <span className=\"ds:sr-only\">{t(TREND_KEY[trend])}</span>\n {formattedDelta}\n </span>\n );\n}\n\n/* ------------------------------------------------------------------ */\n/* StatProps */\n/* ------------------------------------------------------------------ */\n\nexport interface StatProps\n extends HTMLAttributes<HTMLDivElement>, VariantProps<typeof statVariants> {\n /** Metric label rendered above the value. */\n label: string;\n /** Numeric or pre-formatted string value. */\n value: number | string;\n /** Number formatting style. Omit to use default decimal formatting. */\n format?: 'decimal' | 'currency' | 'percent';\n /** ISO 4217 currency code — required when format=\"currency\". */\n currency?: string;\n /** BCP 47 locale override. Defaults to the active i18n language. */\n locale?: string;\n /** Trend direction. Requires `delta` to render the trend row. */\n trend?: 'up' | 'down' | 'flat';\n /** Trend delta magnitude, e.g. 12 for \"↑ 12%\". */\n delta?: number | string;\n /** Number formatting style for the delta. Default \"decimal\". */\n deltaFormat?: 'decimal' | 'percent';\n /** Optional leading icon rendered at the start of the label row. */\n icon?: ReactNode;\n /** Renders animated skeleton placeholders instead of content. */\n loading?: boolean;\n}\n\n/* ------------------------------------------------------------------ */\n/* Stat */\n/* ------------------------------------------------------------------ */\n\nexport const Stat = forwardRef<HTMLDivElement, StatProps>(\n (\n {\n label,\n value,\n format,\n currency,\n locale,\n trend,\n delta,\n deltaFormat = 'decimal',\n icon,\n loading = false,\n variant = 'default',\n size = 'md',\n align = 'start',\n className,\n ...props\n },\n ref,\n ) => {\n const { i18n } = useTranslation();\n const labelId = useId();\n\n const formatValue = (): string => {\n if (typeof value === 'string') return value;\n const lang = locale ?? i18n.language;\n\n switch (format) {\n case 'currency':\n return new Intl.NumberFormat(lang, {\n style: 'currency',\n currency: currency ?? 'USD',\n }).format(value);\n case 'percent':\n return new Intl.NumberFormat(lang, { style: 'percent' }).format(\n value,\n );\n case 'decimal':\n return new Intl.NumberFormat(lang, { style: 'decimal' }).format(\n value,\n );\n default:\n return new Intl.NumberFormat(lang).format(value);\n }\n };\n\n if (loading) {\n return (\n <div\n ref={ref}\n role=\"group\"\n aria-busy=\"true\"\n aria-label={label}\n data-component=\"stat\"\n className={statVariants({ variant, size, align, className })}\n {...props}\n >\n <div className=\"ds:h-[var(--skeleton-label-h)] ds:w-[var(--skeleton-label-w)] ds:animate-pulse ds:rounded-[var(--radius-sm)] ds:bg-[var(--muted)]\" />\n <div className=\"ds:h-[var(--skeleton-value-h)] ds:w-[var(--skeleton-value-w)] ds:animate-pulse ds:rounded-[var(--radius-sm)] ds:bg-[var(--muted)]\" />\n </div>\n );\n }\n\n return (\n <div\n ref={ref}\n role=\"group\"\n aria-labelledby={labelId}\n data-component=\"stat\"\n className={statVariants({ variant, size, align, className })}\n {...props}\n >\n <span className=\"ds:inline-flex ds:items-center\">\n {icon && (\n <span\n aria-hidden=\"true\"\n className={[\n 'ds:me-[var(--spacing-xs)] ds:inline-flex ds:shrink-0',\n // Accent tint on the leading icon. The icon is decorative\n // (aria-hidden), so magenta-500's 3.2:1 contrast on white\n // is acceptable here — the Stat label + value still\n // carry the accessible name at `--foreground`.\n 'ds:text-[color:var(--accent)]',\n 'ds:forced-colors:text-[CanvasText]',\n ].join(' ')}\n >\n {icon}\n </span>\n )}\n <span\n id={labelId}\n className=\"type-label ds:text-[var(--muted-foreground)]\"\n >\n {label}\n </span>\n </span>\n <span className={valueVariants({ size, variant })}>\n {formatValue()}\n </span>\n {trend != null && delta != null && (\n <StatTrend\n trend={trend}\n delta={delta}\n deltaFormat={deltaFormat}\n locale={locale}\n />\n )}\n </div>\n );\n },\n);\n\nStat.displayName = 'Stat';\n"],"names":["statVariants","cva","valueVariants","trendVariants","ARROW","TREND_KEY","StatTrend","trend","delta","deltaFormat","locale","t","i18n","useTranslation","formattedDelta","jsx","Stat","forwardRef","label","value","format","currency","icon","loading","variant","size","align","className","props","ref","labelId","useId","formatValue","lang","jsxs"],"mappings":"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"}
|
|
@@ -142,7 +142,7 @@ const D = {
|
|
|
142
142
|
[]
|
|
143
143
|
);
|
|
144
144
|
O(D, j, f);
|
|
145
|
-
const R = a ? g("
|
|
145
|
+
const R = a ? g("inputs.switch.on", "On") : g("inputs.switch.off", "Off");
|
|
146
146
|
return /* @__PURE__ */ B("div", { className: $({ labelSide: r }), children: [
|
|
147
147
|
/* @__PURE__ */ t(
|
|
148
148
|
w.Root,
|
|
@@ -193,4 +193,4 @@ J.displayName = "Switch";
|
|
|
193
193
|
export {
|
|
194
194
|
J as S
|
|
195
195
|
};
|
|
196
|
-
//# sourceMappingURL=switch-
|
|
196
|
+
//# sourceMappingURL=switch-D916VW86.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"switch-C0psfIQF.js","sources":["../../src/components/switch/switch.agent.ts","../../src/components/switch/switch.tsx"],"sourcesContent":["/* -------------------------------------------------------------------- */\n/* Agent adapter — Switch. */\n/* */\n/* See `src/docs/26-agent-readiness.mdx` for the contract. */\n/* -------------------------------------------------------------------- */\n\nimport type { AgentAdapter } from '../../agent/types';\nimport type { SwitchHandle } from './switch';\n\nexport const switchAgent: AgentAdapter<SwitchHandle> = {\n id: 'switch',\n capabilities: ['select_single'],\n state: {\n checked: {\n type: 'boolean',\n descriptionKey: 'ui.agent.switch.state.checked',\n description: 'Whether the switch is on.',\n read: (handle) => handle.getChecked(),\n },\n },\n actions: {\n set_checked: {\n safety: 'write',\n argsType: '{ checked: boolean }',\n descriptionKey: 'ui.agent.switch.actions.setChecked',\n description: 'Set the on/off state to a specific value.',\n invoke: (handle, args: { checked: boolean }) => {\n handle.setChecked(args.checked);\n },\n },\n toggle: {\n safety: 'write',\n descriptionKey: 'ui.agent.switch.actions.toggle',\n description: 'Flip the on/off state.',\n invoke: (handle) => {\n handle.toggle();\n },\n },\n },\n domHooks: {\n root: {\n attr: 'data-component',\n value: 'switch',\n description: 'Marks the Switch root.',\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 useContext,\n useMemo,\n useRef,\n useState,\n type ComponentPropsWithoutRef,\n type ReactNode,\n} from 'react';\nimport * as RadixSwitch from '@radix-ui/react-switch';\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport { useTranslation } from 'react-i18next';\nimport {\n FormFieldContext,\n useFormField,\n} from '../form-field/form-field-context';\nimport { useAgentRegistration } from '../../agent';\nimport { switchAgent } from './switch.agent';\n\n/** Agent-readiness curated handle for Switch. */\nexport interface SwitchHandle {\n getChecked: () => boolean;\n setChecked: (checked: boolean) => void;\n toggle: () => void;\n}\n\nconst switchVariants = cva(\n [\n 'ds:inline-flex ds:shrink-0 ds:cursor-pointer ds:items-center',\n 'ds:rounded-[var(--radius-full)]',\n 'ds:border-2 ds:border-transparent',\n 'ds:bg-muted',\n 'ds:data-[state=checked]:bg-primary',\n 'ds:transition-colors ds:duration-[var(--animation-duration)] ds:motion-reduce:transition-none',\n 'ds:focus-visible:outline-[length:var(--focus-ring-width)] ds:focus-visible:outline-solid',\n 'ds:focus-visible:outline-ring ds:focus-visible:outline-offset-[length:var(--focus-ring-offset)]',\n 'ds:disabled:cursor-not-allowed ds:disabled:opacity-50',\n ].join(' '),\n {\n variants: {\n size: {\n sm: 'ds:h-4 ds:w-7',\n md: 'ds:h-5 ds:w-9',\n lg: 'ds:h-6 ds:w-11',\n },\n },\n defaultVariants: { size: 'md' },\n },\n);\n\nconst thumbVariants = cva(\n [\n 'ds:pointer-events-none ds:flex ds:items-center ds:justify-center ds:rounded-full ds:bg-background ds:text-foreground ds:shadow-[var(--shadow-sm)]',\n 'ds:transition-transform ds:duration-[var(--animation-duration)] ds:motion-reduce:transition-none',\n 'ds:data-[state=checked]:translate-x-full ds:rtl:data-[state=checked]:-translate-x-full',\n 'ds:data-[state=unchecked]:translate-x-0',\n ].join(' '),\n {\n variants: {\n size: {\n sm: 'ds:size-3',\n md: 'ds:size-4',\n lg: 'ds:size-5',\n },\n },\n defaultVariants: { size: 'md' },\n },\n);\n\nconst wrapperVariants = cva(\n 'ds:inline-flex ds:items-center ds:gap-3 ds:min-h-[var(--min-target-size)]',\n {\n variants: {\n labelSide: {\n start: 'ds:flex-row-reverse',\n end: '',\n },\n },\n defaultVariants: { labelSide: 'end' },\n },\n);\n\nconst labelVariants = cva('type-label ds:text-foreground ds:select-none', {\n variants: {\n disabled: {\n true: 'ds:cursor-not-allowed ds:opacity-50',\n false: 'ds:cursor-pointer',\n },\n },\n defaultVariants: { disabled: false },\n});\n\nconst iconSizeBySwitchSize = {\n sm: 'ds:size-2',\n md: 'ds:size-2.5',\n lg: 'ds:size-3',\n} as const;\n\nexport interface SwitchIcon {\n on: ReactNode;\n off: ReactNode;\n}\n\ntype RadixRootProps = ComponentPropsWithoutRef<typeof RadixSwitch.Root>;\n\nexport interface SwitchProps\n extends\n Omit<RadixRootProps, 'children'>,\n VariantProps<typeof switchVariants> {\n label: string;\n labelSide?: 'start' | 'end';\n size?: 'sm' | 'md' | 'lg';\n icon?: SwitchIcon;\n showStateText?: boolean;\n}\n\nexport const Switch = forwardRef<HTMLButtonElement, SwitchProps>(\n (\n {\n label,\n labelSide = 'end',\n size = 'md',\n icon,\n showStateText = false,\n checked,\n defaultChecked,\n onCheckedChange,\n disabled,\n id,\n className,\n ...props\n },\n ref,\n ) => {\n const { t } = useTranslation();\n const ctx = useFormField();\n const inFormField = useContext(FormFieldContext) !== null;\n const switchId = id ?? ctx.id;\n\n const [internalChecked, setInternalChecked] = useState<boolean>(\n checked ?? defaultChecked ?? false,\n );\n const isControlled = typeof checked === 'boolean';\n const currentChecked = isControlled ? checked : internalChecked;\n\n const handleCheckedChange = (next: boolean) => {\n if (!isControlled) setInternalChecked(next);\n onCheckedChange?.(next);\n };\n\n const effectiveDisabled = ctx.disabled || disabled;\n const describedBy = ctx.describedBy || undefined;\n\n const checkedRef = useRef<boolean>(currentChecked);\n checkedRef.current = currentChecked;\n\n const agentHandle = useMemo<SwitchHandle>(\n () => ({\n getChecked: () => checkedRef.current,\n setChecked: (next) => handleCheckedChange(next),\n toggle: () => handleCheckedChange(!checkedRef.current),\n }),\n // handleCheckedChange closes over isControlled / onCheckedChange and is\n // recreated each render; we accept the re-registration cost.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [],\n );\n useAgentRegistration(switchAgent, agentHandle, id);\n\n const stateText = currentChecked\n ? t('ui.inputs.switch.on', 'On')\n : t('ui.inputs.switch.off', 'Off');\n\n return (\n <div className={wrapperVariants({ labelSide })}>\n <RadixSwitch.Root\n ref={ref}\n id={switchId}\n checked={isControlled ? checked : undefined}\n defaultChecked={!isControlled ? defaultChecked : undefined}\n onCheckedChange={handleCheckedChange}\n disabled={effectiveDisabled}\n aria-describedby={describedBy}\n aria-invalid={ctx.invalid || undefined}\n aria-required={ctx.required || undefined}\n data-component=\"switch\"\n data-component-id={id}\n className={switchVariants({ size, className })}\n {...props}\n >\n <RadixSwitch.Thumb className={thumbVariants({ size })}>\n {icon ? (\n <span\n aria-hidden=\"true\"\n className={`${iconSizeBySwitchSize[size]} ds:inline-flex ds:items-center ds:justify-center ds:[&_svg]:size-full`}\n >\n {currentChecked ? icon.on : icon.off}\n </span>\n ) : null}\n </RadixSwitch.Thumb>\n </RadixSwitch.Root>\n {showStateText ? (\n <span\n aria-hidden=\"true\"\n className=\"type-meta ds:text-muted-foreground ds:select-none\"\n >\n {stateText}\n </span>\n ) : null}\n {!inFormField ? (\n <label\n htmlFor={switchId}\n className={labelVariants({ disabled: Boolean(effectiveDisabled) })}\n >\n {label}\n </label>\n ) : null}\n </div>\n );\n },\n);\n\nSwitch.displayName = 'Switch';\n"],"names":["switchAgent","handle","args","switchVariants","cva","thumbVariants","wrapperVariants","labelVariants","iconSizeBySwitchSize","Switch","forwardRef","label","labelSide","size","icon","showStateText","checked","defaultChecked","onCheckedChange","disabled","id","className","props","ref","t","useTranslation","ctx","useFormField","inFormField","useContext","FormFieldContext","switchId","internalChecked","setInternalChecked","useState","isControlled","currentChecked","handleCheckedChange","next","effectiveDisabled","describedBy","checkedRef","useRef","agentHandle","useMemo","useAgentRegistration","stateText","jsx","RadixSwitch"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"switch-D916VW86.js","sources":["../../src/components/switch/switch.agent.ts","../../src/components/switch/switch.tsx"],"sourcesContent":["/* -------------------------------------------------------------------- */\n/* Agent adapter — Switch. */\n/* */\n/* See `src/docs/26-agent-readiness.mdx` for the contract. */\n/* -------------------------------------------------------------------- */\n\nimport type { AgentAdapter } from '../../agent/types';\nimport type { SwitchHandle } from './switch';\n\nexport const switchAgent: AgentAdapter<SwitchHandle> = {\n id: 'switch',\n capabilities: ['select_single'],\n state: {\n checked: {\n type: 'boolean',\n descriptionKey: 'ui.agent.switch.state.checked',\n description: 'Whether the switch is on.',\n read: (handle) => handle.getChecked(),\n },\n },\n actions: {\n set_checked: {\n safety: 'write',\n argsType: '{ checked: boolean }',\n descriptionKey: 'ui.agent.switch.actions.setChecked',\n description: 'Set the on/off state to a specific value.',\n invoke: (handle, args: { checked: boolean }) => {\n handle.setChecked(args.checked);\n },\n },\n toggle: {\n safety: 'write',\n descriptionKey: 'ui.agent.switch.actions.toggle',\n description: 'Flip the on/off state.',\n invoke: (handle) => {\n handle.toggle();\n },\n },\n },\n domHooks: {\n root: {\n attr: 'data-component',\n value: 'switch',\n description: 'Marks the Switch root.',\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 useContext,\n useMemo,\n useRef,\n useState,\n type ComponentPropsWithoutRef,\n type ReactNode,\n} from 'react';\nimport * as RadixSwitch from '@radix-ui/react-switch';\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport { useTranslation } from 'react-i18next';\nimport {\n FormFieldContext,\n useFormField,\n} from '../form-field/form-field-context';\nimport { useAgentRegistration } from '../../agent';\nimport { switchAgent } from './switch.agent';\n\n/** Agent-readiness curated handle for Switch. */\nexport interface SwitchHandle {\n getChecked: () => boolean;\n setChecked: (checked: boolean) => void;\n toggle: () => void;\n}\n\nconst switchVariants = cva(\n [\n 'ds:inline-flex ds:shrink-0 ds:cursor-pointer ds:items-center',\n 'ds:rounded-[var(--radius-full)]',\n 'ds:border-2 ds:border-transparent',\n 'ds:bg-muted',\n 'ds:data-[state=checked]:bg-primary',\n 'ds:transition-colors ds:duration-[var(--animation-duration)] ds:motion-reduce:transition-none',\n 'ds:focus-visible:outline-[length:var(--focus-ring-width)] ds:focus-visible:outline-solid',\n 'ds:focus-visible:outline-ring ds:focus-visible:outline-offset-[length:var(--focus-ring-offset)]',\n 'ds:disabled:cursor-not-allowed ds:disabled:opacity-50',\n ].join(' '),\n {\n variants: {\n size: {\n sm: 'ds:h-4 ds:w-7',\n md: 'ds:h-5 ds:w-9',\n lg: 'ds:h-6 ds:w-11',\n },\n },\n defaultVariants: { size: 'md' },\n },\n);\n\nconst thumbVariants = cva(\n [\n 'ds:pointer-events-none ds:flex ds:items-center ds:justify-center ds:rounded-full ds:bg-background ds:text-foreground ds:shadow-[var(--shadow-sm)]',\n 'ds:transition-transform ds:duration-[var(--animation-duration)] ds:motion-reduce:transition-none',\n 'ds:data-[state=checked]:translate-x-full ds:rtl:data-[state=checked]:-translate-x-full',\n 'ds:data-[state=unchecked]:translate-x-0',\n ].join(' '),\n {\n variants: {\n size: {\n sm: 'ds:size-3',\n md: 'ds:size-4',\n lg: 'ds:size-5',\n },\n },\n defaultVariants: { size: 'md' },\n },\n);\n\nconst wrapperVariants = cva(\n 'ds:inline-flex ds:items-center ds:gap-3 ds:min-h-[var(--min-target-size)]',\n {\n variants: {\n labelSide: {\n start: 'ds:flex-row-reverse',\n end: '',\n },\n },\n defaultVariants: { labelSide: 'end' },\n },\n);\n\nconst labelVariants = cva('type-label ds:text-foreground ds:select-none', {\n variants: {\n disabled: {\n true: 'ds:cursor-not-allowed ds:opacity-50',\n false: 'ds:cursor-pointer',\n },\n },\n defaultVariants: { disabled: false },\n});\n\nconst iconSizeBySwitchSize = {\n sm: 'ds:size-2',\n md: 'ds:size-2.5',\n lg: 'ds:size-3',\n} as const;\n\nexport interface SwitchIcon {\n on: ReactNode;\n off: ReactNode;\n}\n\ntype RadixRootProps = ComponentPropsWithoutRef<typeof RadixSwitch.Root>;\n\nexport interface SwitchProps\n extends\n Omit<RadixRootProps, 'children'>,\n VariantProps<typeof switchVariants> {\n label: string;\n labelSide?: 'start' | 'end';\n size?: 'sm' | 'md' | 'lg';\n icon?: SwitchIcon;\n showStateText?: boolean;\n}\n\nexport const Switch = forwardRef<HTMLButtonElement, SwitchProps>(\n (\n {\n label,\n labelSide = 'end',\n size = 'md',\n icon,\n showStateText = false,\n checked,\n defaultChecked,\n onCheckedChange,\n disabled,\n id,\n className,\n ...props\n },\n ref,\n ) => {\n const { t } = useTranslation();\n const ctx = useFormField();\n const inFormField = useContext(FormFieldContext) !== null;\n const switchId = id ?? ctx.id;\n\n const [internalChecked, setInternalChecked] = useState<boolean>(\n checked ?? defaultChecked ?? false,\n );\n const isControlled = typeof checked === 'boolean';\n const currentChecked = isControlled ? checked : internalChecked;\n\n const handleCheckedChange = (next: boolean) => {\n if (!isControlled) setInternalChecked(next);\n onCheckedChange?.(next);\n };\n\n const effectiveDisabled = ctx.disabled || disabled;\n const describedBy = ctx.describedBy || undefined;\n\n const checkedRef = useRef<boolean>(currentChecked);\n checkedRef.current = currentChecked;\n\n const agentHandle = useMemo<SwitchHandle>(\n () => ({\n getChecked: () => checkedRef.current,\n setChecked: (next) => handleCheckedChange(next),\n toggle: () => handleCheckedChange(!checkedRef.current),\n }),\n // handleCheckedChange closes over isControlled / onCheckedChange and is\n // recreated each render; we accept the re-registration cost.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [],\n );\n useAgentRegistration(switchAgent, agentHandle, id);\n\n const stateText = currentChecked\n ? t('inputs.switch.on', 'On')\n : t('inputs.switch.off', 'Off');\n\n return (\n <div className={wrapperVariants({ labelSide })}>\n <RadixSwitch.Root\n ref={ref}\n id={switchId}\n checked={isControlled ? checked : undefined}\n defaultChecked={!isControlled ? defaultChecked : undefined}\n onCheckedChange={handleCheckedChange}\n disabled={effectiveDisabled}\n aria-describedby={describedBy}\n aria-invalid={ctx.invalid || undefined}\n aria-required={ctx.required || undefined}\n data-component=\"switch\"\n data-component-id={id}\n className={switchVariants({ size, className })}\n {...props}\n >\n <RadixSwitch.Thumb className={thumbVariants({ size })}>\n {icon ? (\n <span\n aria-hidden=\"true\"\n className={`${iconSizeBySwitchSize[size]} ds:inline-flex ds:items-center ds:justify-center ds:[&_svg]:size-full`}\n >\n {currentChecked ? icon.on : icon.off}\n </span>\n ) : null}\n </RadixSwitch.Thumb>\n </RadixSwitch.Root>\n {showStateText ? (\n <span\n aria-hidden=\"true\"\n className=\"type-meta ds:text-muted-foreground ds:select-none\"\n >\n {stateText}\n </span>\n ) : null}\n {!inFormField ? (\n <label\n htmlFor={switchId}\n className={labelVariants({ disabled: Boolean(effectiveDisabled) })}\n >\n {label}\n </label>\n ) : null}\n </div>\n );\n },\n);\n\nSwitch.displayName = 'Switch';\n"],"names":["switchAgent","handle","args","switchVariants","cva","thumbVariants","wrapperVariants","labelVariants","iconSizeBySwitchSize","Switch","forwardRef","label","labelSide","size","icon","showStateText","checked","defaultChecked","onCheckedChange","disabled","id","className","props","ref","t","useTranslation","ctx","useFormField","inFormField","useContext","FormFieldContext","switchId","internalChecked","setInternalChecked","useState","isControlled","currentChecked","handleCheckedChange","next","effectiveDisabled","describedBy","checkedRef","useRef","agentHandle","useMemo","useAgentRegistration","stateText","jsx","RadixSwitch"],"mappings":"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"}
|
|
@@ -6,7 +6,7 @@ import { a as N, c as q } from "./index-D2ZczOXr.js";
|
|
|
6
6
|
import { useTranslation as Z } from "react-i18next";
|
|
7
7
|
import { u as K } from "./use-direction-D6rvvG9G.js";
|
|
8
8
|
import { c as D } from "./compose-refs-C0k0tdqF.js";
|
|
9
|
-
import { S as ee } from "./select-
|
|
9
|
+
import { S as ee } from "./select-i9MwQeQy.js";
|
|
10
10
|
import { X as te } from "./x-CCcI3eJp.js";
|
|
11
11
|
import { u as se } from "./registry-C9nwlNyL.js";
|
|
12
12
|
import { C as ae } from "./chevron-down-BX_NP2Yh.js";
|
|
@@ -177,7 +177,7 @@ const re = {
|
|
|
177
177
|
L.displayName = "Tabs";
|
|
178
178
|
const $ = S(
|
|
179
179
|
({ className: o, children: s, "aria-label": d, ...n }, i) => {
|
|
180
|
-
const { variant: u, size: t, orientation: p, overflow: l, value: f, setValue: g } = P(A), { t: w } = Z(
|
|
180
|
+
const { variant: u, size: t, orientation: p, overflow: l, value: f, setValue: g } = P(A), { t: w } = Z(), b = O(null), [v, z] = H([]), m = p === "horizontal", h = l === "dropdown" && m;
|
|
181
181
|
M(() => {
|
|
182
182
|
if (!h) {
|
|
183
183
|
z([]);
|
|
@@ -396,4 +396,4 @@ export {
|
|
|
396
396
|
F as c,
|
|
397
397
|
re as t
|
|
398
398
|
};
|
|
399
|
-
//# sourceMappingURL=tabs-
|
|
399
|
+
//# sourceMappingURL=tabs-Cg794H0Q.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tabs-Cg794H0Q.js","sources":["../../src/components/tabs/tabs.agent.ts","../../src/components/tabs/tabs.tsx"],"sourcesContent":["import type { AgentAdapter } from '../../agent/types';\nimport type { TabsHandle } from './tabs';\n\nexport const tabsAgent: AgentAdapter<TabsHandle> = {\n id: 'tabs',\n capabilities: ['select_single', 'navigate'],\n state: {\n activeTab: {\n type: 'string | null',\n description: 'Value of the currently-active tab.',\n read: (handle) => handle.getActiveTab(),\n },\n },\n actions: {\n select_tab: {\n safety: 'read',\n argsType: '{ value: string }',\n description: 'Activate the tab with the given value.',\n invoke: (handle, args: { value: string }) => {\n handle.selectTab(args.value);\n },\n },\n },\n domHooks: {\n root: { attr: 'data-component', value: 'tabs' },\n instanceId: {\n attr: 'data-component-id',\n sourceProp: 'id',\n description: 'Sourced from the id prop on Tabs.Root.',\n },\n item: {\n attr: 'data-tab-id',\n description: 'Each Tab.Trigger emits its value as data-tab-id.',\n },\n },\n};\n","import {\n Children,\n createContext,\n forwardRef,\n isValidElement,\n useCallback,\n useContext,\n useEffect,\n useMemo,\n useRef,\n useState,\n type ComponentPropsWithoutRef,\n type MutableRefObject,\n type ReactElement,\n type ReactNode,\n} from 'react';\nimport * as TabsPrimitive from '@radix-ui/react-tabs';\nimport * as DropdownMenuPrimitive from '@radix-ui/react-dropdown-menu';\nimport { cva, cx, type VariantProps } from 'class-variance-authority';\nimport { X, ChevronDown } from 'lucide-react';\nimport { useTranslation } from 'react-i18next';\nimport { useDirection } from '../_shared/use-direction';\nimport { composeRefs } from '../_shared/compose-refs';\nimport { Select, type SelectOption } from '../select/select';\nimport { useAgentRegistration } from '../../agent';\nimport { tabsAgent } from './tabs.agent';\n\n// ---------------------------------------------------------------------------\n// CVA recipes\n// ---------------------------------------------------------------------------\n\nexport const tabsListVariants = cva('ds:relative ds:flex', {\n variants: {\n variant: {\n // Shadcn-style segmented control: light container, white active card\n default:\n 'ds:flex-1 ds:min-w-0 ds:items-center ds:bg-muted/10 ds:rounded-[var(--radius-md)] ds:p-1',\n // Classic underline tabs: bottom border with colored active indicator\n underlined:\n 'ds:flex-1 ds:min-w-0 ds:items-end ds:[border-block-end:1px_solid_var(--border)]',\n // Segmented control: warm secondary container, content-width\n pills:\n 'ds:items-center ds:bg-secondary ds:rounded-[var(--radius-md)] ds:p-1',\n },\n orientation: {\n horizontal: 'ds:flex-row ds:overflow-hidden',\n vertical: 'ds:flex-col',\n },\n },\n defaultVariants: {\n variant: 'default',\n orientation: 'horizontal',\n },\n});\n\nexport const tabsTriggerVariants = cva(\n [\n 'ds:relative ds:inline-flex ds:items-center ds:justify-center ds:whitespace-nowrap ds:border-0',\n 'ds:gap-2 ds:font-medium ds:transition-colors',\n 'ds:duration-[var(--animation-duration)] ds:motion-reduce:transition-none',\n 'ds:cursor-pointer ds:select-none',\n 'ds:disabled:pointer-events-none ds:disabled:opacity-50',\n 'ds:focus-visible:outline-[length:var(--focus-ring-width)] ds:focus-visible:outline-solid',\n 'ds:focus-visible:outline-ring ds:focus-visible:outline-offset-[length:var(--focus-ring-offset)]',\n ].join(' '),\n {\n variants: {\n variant: {\n default: [\n 'ds:rounded-[var(--radius-sm)] ds:bg-transparent ds:text-muted-foreground',\n 'ds:hover:bg-muted/10 ds:hover:text-foreground',\n 'ds:data-[state=active]:bg-background ds:data-[state=active]:text-foreground',\n 'ds:data-[state=active]:shadow-sm',\n ].join(' '),\n underlined: [\n 'ds:bg-transparent ds:text-muted-foreground',\n 'ds:[border-block-end:2px_solid_transparent]',\n 'ds:hover:bg-muted/10 ds:hover:text-foreground',\n 'ds:data-[state=active]:[border-block-end-color:var(--primary)]',\n 'ds:data-[state=active]:text-foreground ds:data-[state=active]:[margin-block-end:-1px]',\n ].join(' '),\n pills: [\n 'ds:rounded-[var(--radius-full)] ds:bg-transparent ds:text-muted-foreground',\n 'ds:hover:bg-muted/20 ds:hover:text-foreground',\n 'ds:data-[state=active]:bg-primary ds:data-[state=active]:text-primary-foreground',\n ].join(' '),\n },\n size: {\n sm: 'ds:h-8 ds:px-[var(--spacing-sm)] ds:text-[length:var(--font-size-sm)]',\n md: 'ds:h-10 ds:px-[var(--spacing-md)] ds:text-[length:var(--font-size-base)]',\n lg: 'ds:h-12 ds:px-[var(--spacing-lg)] ds:text-[length:var(--font-size-lg)]',\n },\n orientation: {\n horizontal: '',\n vertical: 'ds:w-full ds:justify-start',\n },\n },\n defaultVariants: {\n variant: 'default',\n size: 'md',\n orientation: 'horizontal',\n },\n },\n);\n\n// ---------------------------------------------------------------------------\n// Context\n// ---------------------------------------------------------------------------\n\ntype TabsOverflow = 'dropdown' | 'select';\n\ninterface TabsContextValue {\n variant: 'default' | 'underlined' | 'pills';\n size: 'sm' | 'md' | 'lg';\n orientation: 'horizontal' | 'vertical';\n overflow: TabsOverflow;\n value: string;\n setValue: (value: string) => void;\n}\n\nconst TabsContext = createContext<TabsContextValue>({\n variant: 'default',\n size: 'md',\n orientation: 'horizontal',\n overflow: 'dropdown',\n value: '',\n setValue: () => {},\n});\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\n// Curated agent-readiness handle — see tabs.agent.ts.\nexport interface TabsHandle {\n getActiveTab: () => string | null;\n selectTab: (value: string) => void;\n}\n\nexport interface TabsRootProps extends Omit<\n ComponentPropsWithoutRef<typeof TabsPrimitive.Root>,\n 'orientation'\n> {\n variant?: 'default' | 'underlined' | 'pills';\n size?: 'sm' | 'md' | 'lg';\n orientation?: 'horizontal' | 'vertical';\n /**\n * Strategy for tabs that don't fit horizontally.\n *\n * - `'dropdown'` (default) — overflowing tabs collapse into a \"More\"\n * `DropdownMenu` rendered next to the visible tab list. Most tabs\n * stay visible inline; the few that don't fit hide behind the menu.\n * Best when there are 5–7 tabs at moderately narrow viewports.\n * - `'select'` — at narrow container widths (under the `@md` breakpoint)\n * the entire tab strip collapses into a single `Select` whose value\n * is the active tab. Best when there are many tabs and the panel is\n * genuinely cramped (mobile, side-panel host). Above `@md`, the\n * inline tab list reappears unchanged.\n *\n * Limitation: the Select mirror builds option labels from each\n * `Tabs.Trigger`'s `children`. Plain string / number children are\n * used verbatim; richer children (icon + text, fragments) fall back\n * to the trigger's `value` so the option remains selectable. Prefer\n * plain-text trigger children when using `overflow=\"select\"`, or use\n * the trigger's `icon` prop for the icon and keep `children` a\n * plain string.\n *\n * @default 'dropdown'\n */\n overflow?: TabsOverflow;\n}\n\nexport interface TabsListProps extends ComponentPropsWithoutRef<\n typeof TabsPrimitive.List\n> {\n 'aria-label'?: string;\n}\n\nexport interface TabsTriggerProps\n extends\n ComponentPropsWithoutRef<typeof TabsPrimitive.Trigger>,\n VariantProps<typeof tabsTriggerVariants> {\n icon?: ReactNode;\n badge?: ReactNode;\n dismissible?: boolean;\n onDismiss?: () => void;\n}\n\nexport type TabsContentProps = ComponentPropsWithoutRef<\n typeof TabsPrimitive.Content\n>;\n\n// ---------------------------------------------------------------------------\n// TabsRoot\n// ---------------------------------------------------------------------------\n\nconst TabsRoot = forwardRef<HTMLDivElement, TabsRootProps>(\n (\n {\n variant = 'default',\n size = 'md',\n orientation = 'horizontal',\n overflow = 'dropdown',\n className,\n children,\n value: valueProp,\n defaultValue,\n onValueChange,\n id,\n ...props\n },\n ref,\n ) => {\n const rootRef = useRef<HTMLDivElement>(null);\n const composedRef = composeRefs(ref, rootRef);\n const dir = useDirection(rootRef);\n\n // Track the active tab so the `overflow=\"select\"` mirror can read it\n // without forcing consumers into controlled mode. If `value` is passed\n // we honour it; otherwise we manage internal state seeded from\n // `defaultValue` and notify consumers via `onValueChange`. Net effect\n // is identical to Radix's own controlled / uncontrolled split — we\n // just shadow the value into context so the Select can mirror it.\n const isControlled = valueProp !== undefined;\n const [internalValue, setInternalValue] = useState<string>(\n defaultValue ?? '',\n );\n const value = isControlled ? (valueProp ?? '') : internalValue;\n const setValue = useCallback(\n (next: string) => {\n if (!isControlled) setInternalValue(next);\n onValueChange?.(next);\n },\n [isControlled, onValueChange],\n );\n\n const ctxValue = useMemo(\n () => ({ variant, size, orientation, overflow, value, setValue }),\n [variant, size, orientation, overflow, value, setValue],\n );\n\n // Agent handle — ref mirrors value for fresh reads.\n const valueRef = useRef<string>(value);\n useEffect(() => {\n valueRef.current = value;\n }, [value]);\n\n const agentHandle = useMemo<TabsHandle>(\n () => ({\n getActiveTab: () => valueRef.current || null,\n selectTab: (next) => setValue(next),\n }),\n [setValue],\n );\n useAgentRegistration(tabsAgent, agentHandle, id);\n\n return (\n <TabsContext.Provider value={ctxValue}>\n <TabsPrimitive.Root\n ref={composedRef}\n orientation={orientation}\n dir={dir}\n // We always run Radix in controlled mode against our shadow state\n // (seeded from `defaultValue`) so the `overflow=\"select\"` mirror\n // can read the active value via context without DOM observation.\n value={value}\n onValueChange={setValue}\n id={id}\n data-component=\"tabs\"\n data-component-id={id}\n className={cx(\n 'ds:flex',\n orientation === 'vertical'\n ? 'ds:flex-row ds:gap-[var(--spacing-md)]'\n : 'ds:flex-col',\n className,\n )}\n {...props}\n >\n {children}\n </TabsPrimitive.Root>\n </TabsContext.Provider>\n );\n },\n);\nTabsRoot.displayName = 'Tabs';\n\n// ---------------------------------------------------------------------------\n// TabsList — with overflow detection\n// ---------------------------------------------------------------------------\n\nconst TabsList = forwardRef<HTMLDivElement, TabsListProps>(\n ({ className, children, 'aria-label': ariaLabel, ...props }, ref) => {\n const { variant, size, orientation, overflow, value, setValue } =\n useContext(TabsContext);\n const { t } = useTranslation();\n\n const listRef = useRef<HTMLDivElement>(null);\n const [overflowTabs, setOverflowTabs] = useState<\n { value: string; label: string }[]\n >([]);\n const isHorizontal = orientation === 'horizontal';\n // The `select` overflow strategy renders a Select mirror at narrow\n // container widths and skips the DropdownMenu overflow detector\n // (it's the wrong UX for that case — a select-and-a-dropdown would\n // double up). The dropdown detector only runs when `overflow` is\n // `dropdown` and the strip is horizontal.\n const isDropdownOverflow = overflow === 'dropdown' && isHorizontal;\n\n useEffect(() => {\n if (!isDropdownOverflow) {\n setOverflowTabs([]);\n return;\n }\n const el = listRef.current;\n if (!el) return;\n\n const detectOverflow = () => {\n const containerRight = el.getBoundingClientRect().right;\n const hidden: { value: string; label: string }[] = [];\n el.querySelectorAll<HTMLButtonElement>('[role=\"tab\"]').forEach(\n (tab) => {\n const rect = tab.getBoundingClientRect();\n if (rect.right > containerRight + 2) {\n const value =\n tab.getAttribute('data-value') ?? tab.dataset['value'] ?? '';\n const label = tab.textContent?.trim() ?? value;\n hidden.push({ value, label });\n }\n },\n );\n setOverflowTabs(hidden);\n };\n\n const ro = new ResizeObserver(detectOverflow);\n ro.observe(el);\n detectOverflow();\n return () => ro.disconnect();\n }, [isDropdownOverflow, children]);\n\n const combinedRef = (node: HTMLDivElement | null) => {\n (listRef as MutableRefObject<HTMLDivElement | null>).current = node;\n if (typeof ref === 'function') ref(node);\n else if (ref)\n (ref as MutableRefObject<HTMLDivElement | null>).current = node;\n };\n\n // For `overflow=\"select\"` we mirror the Trigger children as Select\n // options. Triggers may carry icon + text; for the Select label we\n // prefer the trigger's plain-text children — anything else falls\n // back to the trigger's `value` so the option is at least selectable.\n const selectOptions = useMemo<SelectOption<string>[]>(() => {\n if (overflow !== 'select') return [];\n return Children.toArray(children)\n .filter((child): child is ReactElement<TabsTriggerProps> =>\n isValidElement(child),\n )\n .filter(\n (child) =>\n typeof child.props.value === 'string' &&\n child.props.value.length > 0,\n )\n .map((child) => {\n const triggerValue = child.props.value as string;\n const labelChild = child.props.children;\n const label =\n typeof labelChild === 'string'\n ? labelChild\n : typeof labelChild === 'number'\n ? String(labelChild)\n : triggerValue;\n return { value: triggerValue, label };\n });\n }, [children, overflow]);\n\n if (overflow === 'select' && isHorizontal) {\n // Container queries gate the swap: above `@md` (Tailwind v4 default\n // 28rem container width) the inline tab strip renders; below it,\n // the Select takes over. The Tabs.List markup stays mounted in\n // both modes so Radix's roving-tabindex / ARIA wiring is preserved\n // even when the strip is visually hidden — keyboard users who land\n // on the panel via skip-link still get to the active tab.\n return (\n <div className=\"ds:@container/tabs ds:relative ds:w-full\">\n {/* Select mirror — visible at narrow container widths only. */}\n <div className=\"ds:block ds:@md/tabs:hidden\">\n <Select\n options={selectOptions}\n value={value}\n onValueChange={(next) => {\n if (typeof next === 'string' && next.length > 0) setValue(next);\n }}\n size={size}\n aria-label={ariaLabel ?? t('tabs.selectLabel')}\n />\n </div>\n {/* Inline tab strip — visible at wider container widths. */}\n <div className=\"ds:hidden ds:@md/tabs:flex ds:relative ds:items-center\">\n <TabsPrimitive.List\n ref={combinedRef}\n aria-label={ariaLabel}\n className={tabsListVariants({ variant, orientation, className })}\n {...props}\n >\n {children}\n </TabsPrimitive.List>\n </div>\n </div>\n );\n }\n\n return (\n <div className=\"ds:relative ds:flex ds:items-center\">\n <TabsPrimitive.List\n ref={combinedRef}\n aria-label={ariaLabel}\n className={tabsListVariants({ variant, orientation, className })}\n {...props}\n >\n {children}\n </TabsPrimitive.List>\n\n {isDropdownOverflow && overflowTabs.length > 0 && (\n <OverflowMenu\n tabs={overflowTabs}\n label={t('tabs.moreTabs')}\n size={size}\n />\n )}\n </div>\n );\n },\n);\nTabsList.displayName = 'TabsList';\n\n// ---------------------------------------------------------------------------\n// OverflowMenu (internal)\n// ---------------------------------------------------------------------------\n\ninterface OverflowMenuProps {\n tabs: { value: string; label: string }[];\n label: string;\n size: 'sm' | 'md' | 'lg';\n}\n\nfunction OverflowMenu({ tabs, label, size }: OverflowMenuProps) {\n const { variant } = useContext(TabsContext);\n\n return (\n <DropdownMenuPrimitive.Root>\n <DropdownMenuPrimitive.Trigger\n className={cx(\n tabsTriggerVariants({ variant, size, orientation: 'horizontal' }),\n 'ds:shrink-0 ds:ms-1',\n )}\n aria-label={label}\n >\n {label}\n <ChevronDown aria-hidden=\"true\" className=\"ds:size-4\" />\n </DropdownMenuPrimitive.Trigger>\n <DropdownMenuPrimitive.Portal>\n <DropdownMenuPrimitive.Content\n sideOffset={4}\n className={cx(\n 'ds:z-50 ds:min-w-40 ds:overflow-hidden ds:rounded-[var(--radius-md)]',\n 'ds:border ds:border-border ds:bg-popover ds:p-1 ds:shadow-md',\n 'ds:data-[state=open]:animate-in ds:data-[state=closed]:animate-out',\n 'ds:data-[state=closed]:fade-out-0 ds:data-[state=open]:fade-in-0',\n 'ds:data-[state=closed]:zoom-out-95 ds:data-[state=open]:zoom-in-95',\n )}\n >\n {tabs.map(({ value, label: tabLabel }) => (\n <DropdownMenuPrimitive.Item\n key={value}\n className={cx(\n 'ds:relative ds:flex ds:cursor-pointer ds:select-none ds:items-center',\n 'ds:rounded-[var(--radius-sm)] ds:px-[var(--spacing-sm)] ds:py-[var(--spacing-xs)]',\n 'ds:text-[var(--font-size-sm)] ds:text-foreground ds:outline-none',\n 'ds:hover:bg-muted ds:focus:bg-muted',\n 'ds:data-[disabled]:pointer-events-none ds:data-[disabled]:opacity-50',\n )}\n onSelect={() => {\n const tab = document.querySelector<HTMLButtonElement>(\n `[role=\"tab\"][data-value=\"${CSS.escape(value)}\"]`,\n );\n tab?.click();\n tab?.scrollIntoView({ inline: 'nearest' });\n }}\n >\n {tabLabel}\n </DropdownMenuPrimitive.Item>\n ))}\n </DropdownMenuPrimitive.Content>\n </DropdownMenuPrimitive.Portal>\n </DropdownMenuPrimitive.Root>\n );\n}\n\n// ---------------------------------------------------------------------------\n// TabsTrigger\n// ---------------------------------------------------------------------------\n\nconst TabsTrigger = forwardRef<HTMLButtonElement, TabsTriggerProps>(\n (\n {\n variant: variantProp,\n size: sizeProp,\n orientation: orientationProp,\n icon,\n badge,\n dismissible = false,\n onDismiss,\n className,\n children,\n value,\n onKeyDown,\n ...props\n },\n ref,\n ) => {\n const ctx = useContext(TabsContext);\n const variant = variantProp ?? ctx.variant;\n const size = sizeProp ?? ctx.size;\n const orientation = orientationProp ?? ctx.orientation;\n\n const handleKeyDown = (e: React.KeyboardEvent<HTMLButtonElement>) => {\n // APG dismissible-tab pattern: Delete/Backspace while trigger is focused closes the tab.\n // The visual X is pointer-only (aria-hidden) to avoid nested-interactive HTML violation.\n if (dismissible && (e.key === 'Delete' || e.key === 'Backspace')) {\n e.preventDefault();\n onDismiss?.();\n }\n onKeyDown?.(e);\n };\n\n return (\n <TabsPrimitive.Trigger\n ref={ref}\n value={value}\n data-value={value}\n className={tabsTriggerVariants({\n variant,\n size,\n orientation,\n className,\n })}\n onKeyDown={handleKeyDown}\n {...props}\n >\n {icon && (\n <span aria-hidden=\"true\" className=\"ds:shrink-0 ds:size-4\">\n {icon}\n </span>\n )}\n {children}\n {badge && <span className=\"ds:shrink-0\">{badge}</span>}\n {dismissible && (\n // Visual-only dismiss indicator — pointer dismiss fires here; keyboard dismiss fires via Delete/Backspace on the trigger above.\n // No role/tabIndex to avoid nested-interactive (interactive content inside <button> is invalid HTML).\n <span\n aria-hidden=\"true\"\n className={cx(\n 'ds:inline-flex ds:items-center ds:justify-center ds:shrink-0',\n 'ds:size-6 ds:rounded-[var(--radius-sm)]',\n 'ds:hover:bg-muted-foreground/20',\n )}\n onPointerDown={(e) => {\n e.stopPropagation();\n e.preventDefault();\n onDismiss?.();\n }}\n >\n <X className=\"ds:size-3.5\" />\n </span>\n )}\n </TabsPrimitive.Trigger>\n );\n },\n);\nTabsTrigger.displayName = 'TabsTrigger';\n\n// ---------------------------------------------------------------------------\n// TabsContent\n// ---------------------------------------------------------------------------\n\nconst TabsContent = forwardRef<HTMLDivElement, TabsContentProps>(\n ({ className, children, ...props }, ref) => (\n <TabsPrimitive.Content\n ref={ref}\n className={cx(\n 'ds:mt-[var(--spacing-sm)] ds:outline-none',\n 'ds:focus-visible:outline-[length:var(--focus-ring-width)] ds:focus-visible:outline-solid',\n 'ds:focus-visible:outline-ring ds:focus-visible:outline-offset-[length:var(--focus-ring-offset)]',\n className,\n )}\n {...props}\n >\n {children}\n </TabsPrimitive.Content>\n ),\n);\nTabsContent.displayName = 'TabsContent';\n\n// ---------------------------------------------------------------------------\n// Compound export\n// ---------------------------------------------------------------------------\n\nexport const Tabs = Object.assign(TabsRoot, {\n Root: TabsRoot,\n List: TabsList,\n Trigger: TabsTrigger,\n Content: TabsContent,\n});\n\nexport { TabsList, TabsTrigger, TabsContent };\n"],"names":["tabsAgent","handle","args","tabsListVariants","cva","tabsTriggerVariants","TabsContext","createContext","TabsRoot","forwardRef","variant","size","orientation","overflow","className","children","valueProp","defaultValue","onValueChange","id","props","ref","rootRef","useRef","composedRef","composeRefs","dir","useDirection","isControlled","internalValue","setInternalValue","useState","value","setValue","useCallback","next","ctxValue","useMemo","valueRef","useEffect","agentHandle","useAgentRegistration","jsx","TabsPrimitive","cx","TabsList","ariaLabel","useContext","t","useTranslation","listRef","overflowTabs","setOverflowTabs","isHorizontal","isDropdownOverflow","el","detectOverflow","containerRight","hidden","tab","label","_a","ro","combinedRef","node","selectOptions","Children","child","isValidElement","triggerValue","labelChild","jsxs","Select","OverflowMenu","tabs","DropdownMenuPrimitive","ChevronDown","tabLabel","TabsTrigger","variantProp","sizeProp","orientationProp","icon","badge","dismissible","onDismiss","onKeyDown","ctx","handleKeyDown","e","X","TabsContent","Tabs"],"mappings":"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"}
|
|
@@ -152,7 +152,7 @@ const V = B(
|
|
|
152
152
|
const W = (s) => {
|
|
153
153
|
(s.key === "Backspace" || s.key === "Delete") && t && !e && (s.preventDefault(), x(), setTimeout(t, 100));
|
|
154
154
|
}, x = () => {
|
|
155
|
-
R(w("
|
|
155
|
+
R(w("tag.removed", { label: n }));
|
|
156
156
|
}, K = () => {
|
|
157
157
|
!e && t && (x(), setTimeout(t, 100));
|
|
158
158
|
}, d = !!t, N = !!b && !d, T = V({
|
|
@@ -182,7 +182,7 @@ const V = B(
|
|
|
182
182
|
"button",
|
|
183
183
|
{
|
|
184
184
|
type: "button",
|
|
185
|
-
"aria-label": w("
|
|
185
|
+
"aria-label": w("tag.remove", { label: n }),
|
|
186
186
|
onClick: K,
|
|
187
187
|
disabled: e,
|
|
188
188
|
tabIndex: -1,
|
|
@@ -252,4 +252,4 @@ M.displayName = "Tag";
|
|
|
252
252
|
export {
|
|
253
253
|
M as T
|
|
254
254
|
};
|
|
255
|
-
//# sourceMappingURL=tag-
|
|
255
|
+
//# sourceMappingURL=tag-CQmHRM4Y.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tag-CQmHRM4Y.js","sources":["../../src/components/tag/tag.tsx"],"sourcesContent":["import { forwardRef, useRef, useState, useEffect, type ReactNode } from 'react';\nimport { cva } from 'class-variance-authority';\nimport { useTranslation } from 'react-i18next';\nimport { X } from 'lucide-react';\nimport { Tooltip } from '../tooltip';\n\n/* ------------------------------------------------------------------ */\n/* CVA — tag pill */\n/* ------------------------------------------------------------------ */\n\nconst tagVariants = cva(\n [\n 'ds:inline-flex ds:items-center ds:gap-[var(--spacing-xs)]',\n 'ds:rounded-[var(--radius-full)]',\n 'type-eyebrow ds:whitespace-nowrap',\n 'ds:transition-colors ds:duration-[var(--animation-duration)] ds:motion-reduce:transition-none',\n 'ds:focus-visible:outline-[length:var(--focus-ring-width)] ds:focus-visible:outline-solid',\n 'ds:focus-visible:outline-[color:var(--ring)] ds:focus-visible:outline-offset-[length:var(--focus-ring-offset)]',\n 'ds:aria-disabled:cursor-not-allowed ds:aria-disabled:opacity-50',\n 'ds:disabled:cursor-not-allowed ds:disabled:opacity-50',\n ].join(' '),\n {\n variants: {\n variant: {\n neutral: '',\n info: '',\n success: '',\n warning: '',\n error: '',\n brand: '',\n },\n fill: {\n solid: '',\n outline: 'ds:border ds:bg-transparent',\n },\n size: {\n // Symmetric start/end padding — close button uses negative margin to stay flush.\n // Size is the only eyebrow-role axis that varies per Tag size; weight, transform,\n // tracking, line-height, and features all come from `.type-eyebrow` on the base.\n sm: 'ds:h-[calc(var(--spacing)*4)] ds:ps-[var(--spacing-xs)] ds:pe-[var(--spacing-xs)] ds:[--type-eyebrow-size:var(--font-size-2xs)]',\n md: 'ds:h-[calc(var(--spacing)*5)] ds:ps-[var(--spacing-sm)] ds:pe-[var(--spacing-sm)] ds:[--type-eyebrow-size:var(--font-size-2xs)]',\n lg: 'ds:h-[calc(var(--spacing)*6)] ds:ps-[var(--spacing-sm)] ds:pe-[var(--spacing-sm)] ds:[--type-eyebrow-size:var(--font-size-xs)]',\n },\n },\n compoundVariants: [\n // Solid fills — foreground tokens adapt per theme\n {\n fill: 'solid',\n variant: 'neutral',\n className: 'ds:bg-muted/20 ds:text-muted-foreground',\n },\n {\n fill: 'solid',\n variant: 'info',\n className: 'ds:bg-info ds:text-[color:var(--info-solid-foreground)]',\n },\n {\n fill: 'solid',\n variant: 'success',\n className:\n 'ds:bg-success ds:text-[color:var(--success-solid-foreground)]',\n },\n {\n fill: 'solid',\n variant: 'warning',\n className: 'ds:bg-warning ds:text-foreground',\n },\n {\n fill: 'solid',\n variant: 'error',\n className: 'ds:bg-destructive ds:text-destructive-foreground',\n },\n {\n fill: 'solid',\n variant: 'brand',\n className: 'ds:bg-primary ds:text-primary-foreground',\n },\n // Outline fills\n {\n fill: 'outline',\n variant: 'neutral',\n className: 'ds:border-muted ds:text-muted-foreground',\n },\n {\n fill: 'outline',\n variant: 'info',\n className: 'ds:border-info ds:text-[var(--info-foreground)]',\n },\n {\n fill: 'outline',\n variant: 'success',\n className: 'ds:border-success ds:text-[var(--success-foreground)]',\n },\n {\n fill: 'outline',\n variant: 'warning',\n className: 'ds:border-warning ds:text-[var(--warning-foreground)]',\n },\n {\n fill: 'outline',\n variant: 'error',\n className: 'ds:border-destructive ds:text-[var(--error-foreground)]',\n },\n {\n fill: 'outline',\n variant: 'brand',\n className: 'ds:border-primary ds:text-primary',\n },\n ],\n defaultVariants: {\n variant: 'neutral',\n fill: 'solid',\n size: 'md',\n },\n },\n);\n\n/* ------------------------------------------------------------------ */\n/* CVA — close button */\n/* ------------------------------------------------------------------ */\n\nconst closeButtonVariants = cva(\n [\n 'ds:inline-flex ds:items-center ds:justify-center ds:shrink-0 ds:rounded-full',\n // Negative end margin keeps the button flush with the pill edge\n 'ds:-me-[var(--spacing-xs)]',\n 'ds:hover:bg-foreground/10',\n 'ds:transition-colors ds:duration-[var(--animation-duration)] ds:motion-reduce:transition-none',\n 'ds:focus-visible:outline-[length:var(--focus-ring-width)] ds:focus-visible:outline-solid',\n 'ds:focus-visible:outline-[color:var(--ring)] ds:focus-visible:outline-offset-[length:var(--focus-ring-offset)]',\n 'ds:disabled:cursor-not-allowed ds:disabled:opacity-50',\n ].join(' '),\n {\n variants: {\n size: {\n sm: 'ds:p-1 ds:[&>svg]:size-3',\n md: 'ds:p-1 ds:[&>svg]:size-3.5',\n lg: 'ds:p-1.5 ds:[&>svg]:size-4',\n },\n },\n defaultVariants: { size: 'md' },\n },\n);\n\n/* ------------------------------------------------------------------ */\n/* TagProps */\n/* ------------------------------------------------------------------ */\n\nexport interface TagProps {\n /** The visible label text */\n label: string;\n /** Semantic colour variant */\n variant?: 'neutral' | 'info' | 'success' | 'warning' | 'error' | 'brand';\n /** Visual fill style */\n fill?: 'solid' | 'outline';\n /** Size */\n size?: 'sm' | 'md' | 'lg';\n /** Leading slot — icon element or dot */\n leading?: ReactNode;\n /** Called when the tag is removed (enables close button + Backspace/Delete) */\n onRemove?: () => void;\n /** Called when the tag is clicked (non-removable interactive tag) */\n onClick?: () => void;\n /** Disabled state */\n disabled?: boolean;\n /** Max inline size before truncation with tooltip — default 'none' */\n maxInlineSize?: string | 'none';\n /** Additional class names */\n className?: string;\n}\n\n/* ------------------------------------------------------------------ */\n/* Tag */\n/* ------------------------------------------------------------------ */\n\nexport const Tag = forwardRef<HTMLElement, TagProps>(\n (\n {\n label,\n variant = 'neutral',\n fill = 'solid',\n size = 'md',\n leading,\n onRemove,\n onClick,\n disabled = false,\n maxInlineSize = 'none',\n className,\n },\n ref,\n ) => {\n const { t } = useTranslation();\n const labelRef = useRef<HTMLSpanElement>(null);\n const [isOverflowing, setIsOverflowing] = useState(false);\n const [announcement, setAnnouncement] = useState('');\n\n useEffect(() => {\n const el = labelRef.current;\n if (!el || maxInlineSize === 'none') return;\n\n const check = () => setIsOverflowing(el.scrollWidth > el.clientWidth);\n const observer = new ResizeObserver(check);\n observer.observe(el);\n check();\n return () => observer.disconnect();\n }, [maxInlineSize]);\n\n const handleKeyDown = (e: React.KeyboardEvent) => {\n if (\n (e.key === 'Backspace' || e.key === 'Delete') &&\n onRemove &&\n !disabled\n ) {\n e.preventDefault();\n announce();\n // Delay gives the live region one render cycle before unmount\n setTimeout(onRemove, 100);\n }\n };\n\n const announce = () => {\n setAnnouncement(t('tag.removed', { label }));\n };\n\n const handleRemove = () => {\n if (!disabled && onRemove) {\n announce();\n setTimeout(onRemove, 100);\n }\n };\n\n const isRemovable = !!onRemove;\n const isClickable = !!onClick && !isRemovable;\n\n const rootClasses = tagVariants({\n variant,\n fill,\n size,\n className: [\n isClickable && !disabled\n ? 'ds:hover:brightness-90 ds:cursor-pointer'\n : '',\n className ?? '',\n ]\n .filter(Boolean)\n .join(' '),\n });\n\n const leadingEl = leading ? (\n <span\n aria-hidden=\"true\"\n className=\"ds:shrink-0 ds:inline-flex ds:items-center ds:[&>svg]:size-3.5\"\n >\n {leading}\n </span>\n ) : null;\n\n // Consumer-controlled layout constraint — not a design token.\n // maxInlineSize is an arbitrary caller-supplied value that cannot be expressed\n // as a static Tailwind class; the style prop is the only cross-browser option.\n const labelEl = (\n <span\n ref={labelRef}\n className={\n maxInlineSize !== 'none'\n ? 'ds:overflow-hidden ds:text-ellipsis ds:whitespace-nowrap'\n : undefined\n }\n // eslint-disable-next-line react/forbid-dom-props -- caller-supplied maxInlineSize, runtime-computed\n style={maxInlineSize !== 'none' ? { maxInlineSize } : undefined}\n >\n {label}\n </span>\n );\n\n // Live region — only for removable tags; must be a sibling outside the button.\n const liveRegion = (\n <span role=\"status\" aria-live=\"polite\" className=\"ds:sr-only\">\n {announcement}\n </span>\n );\n\n const closeButton = isRemovable ? (\n <button\n type=\"button\"\n aria-label={t('tag.remove', { label })}\n onClick={handleRemove}\n disabled={disabled}\n // Intentionally excluded from tab order: Backspace/Delete on the focused\n // group element provides the same keyboard action.\n tabIndex={-1}\n className={closeButtonVariants({ size })}\n >\n <X aria-hidden=\"true\" />\n </button>\n ) : null;\n\n const shouldWrapTooltip = maxInlineSize !== 'none' && isOverflowing;\n\n // Clickable tag — renders as <button>; live region is a sibling, not inside button\n if (isClickable) {\n const tagEl = (\n <button\n ref={ref as React.Ref<HTMLButtonElement>}\n type=\"button\"\n onClick={!disabled ? onClick : undefined}\n disabled={disabled}\n data-component=\"tag\"\n className={rootClasses}\n >\n {leadingEl}\n {labelEl}\n </button>\n );\n return shouldWrapTooltip ? (\n <Tooltip label={label}>{tagEl}</Tooltip>\n ) : (\n tagEl\n );\n }\n\n // Removable tag — focusable <span> with embedded close button\n if (isRemovable) {\n const tagEl = (\n // eslint-disable-next-line jsx-a11y/no-noninteractive-element-interactions -- removable tag is focusable as a group; Backspace/Delete keyboard removal handled via onKeyDown\n <span\n ref={ref as React.Ref<HTMLSpanElement>}\n role=\"group\"\n aria-label={label}\n tabIndex={disabled ? -1 : 0}\n aria-disabled={disabled || undefined}\n onKeyDown={handleKeyDown}\n data-component=\"tag\"\n className={rootClasses}\n >\n {liveRegion}\n {leadingEl}\n {labelEl}\n {closeButton}\n </span>\n );\n return shouldWrapTooltip ? (\n <Tooltip label={label}>{tagEl}</Tooltip>\n ) : (\n tagEl\n );\n }\n\n // Decorative tag — plain <span>, no interactive role\n const tagEl = (\n <span\n ref={ref as React.Ref<HTMLSpanElement>}\n data-component=\"tag\"\n className={tagVariants({ variant, fill, size, className })}\n >\n {leadingEl}\n {labelEl}\n </span>\n );\n return shouldWrapTooltip ? <Tooltip label={label}>{tagEl}</Tooltip> : tagEl;\n },\n);\n\nTag.displayName = 'Tag';\n"],"names":["tagVariants","cva","closeButtonVariants","Tag","forwardRef","label","variant","fill","size","leading","onRemove","onClick","disabled","maxInlineSize","className","ref","t","useTranslation","labelRef","useRef","isOverflowing","setIsOverflowing","useState","announcement","setAnnouncement","useEffect","el","check","observer","handleKeyDown","e","announce","handleRemove","isRemovable","isClickable","rootClasses","leadingEl","jsx","labelEl","liveRegion","closeButton","X","shouldWrapTooltip","tagEl","jsxs","Tooltip"],"mappings":"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"}
|
|
@@ -53,7 +53,7 @@ function T({
|
|
|
53
53
|
}
|
|
54
54
|
const w = v(
|
|
55
55
|
({ item: s, size: a = "sm", onActivate: r, className: u, ...f }, p) => {
|
|
56
|
-
const { t: m } = b(), t = !!r, h = !!s.url && S(s.url), n = m("
|
|
56
|
+
const { t: m } = b(), t = !!r, h = !!s.url && S(s.url), n = m("taskCard.itemLabel", {
|
|
57
57
|
title: s.title,
|
|
58
58
|
due: s.dueLabel ?? "",
|
|
59
59
|
defaultValue: '{{title}}{{due, prepend, " · "}}'
|
|
@@ -114,4 +114,4 @@ export {
|
|
|
114
114
|
w as T,
|
|
115
115
|
S as i
|
|
116
116
|
};
|
|
117
|
-
//# sourceMappingURL=task-card-
|
|
117
|
+
//# sourceMappingURL=task-card-BUVMh6HN.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"task-card-BUVMh6HN.js","sources":["../../src/components/task-card/task-card.tsx"],"sourcesContent":["import { forwardRef, type HTMLAttributes, type ReactNode } from 'react';\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport { useTranslation } from 'react-i18next';\nimport { CheckSquare, Square, AlertCircle, ChevronRight } from 'lucide-react';\n\n/* ------------------------------------------------------------------ */\n/* Types */\n/* ------------------------------------------------------------------ */\n\nexport type TaskStatus = 'open' | 'in-progress' | 'done';\nexport type TaskPriority = 'low' | 'normal' | 'high';\n\nexport interface TaskItem {\n /** Unique identifier for the task. */\n id: string;\n /** Title — single line, primary content. */\n title: string;\n /** Optional secondary line (e.g. \"Patient A · Due today\"). */\n description?: string;\n /**\n * Localised due-date hint (e.g. \"Due today\" / \"Tomorrow\"). Rendered as a\n * trailing eyebrow chip when set; consumers compute the bucket and pass\n * the localised string.\n */\n dueLabel?: string;\n /** Lifecycle state — drives the leading icon. */\n status?: TaskStatus;\n /** Priority — `high` colours the leading icon as `--destructive`. */\n priority?: TaskPriority;\n /** Optional deep link — when present the row is an anchor. */\n url?: string;\n}\n\nexport interface TaskCardProps\n extends\n Omit<HTMLAttributes<HTMLDivElement>, 'onClick' | 'role' | 'title'>,\n VariantProps<typeof taskCardVariants> {\n /** The task to render. */\n item: TaskItem;\n /** Visual density. */\n size?: 'sm' | 'md';\n /** Fires when the row is activated (click / Enter / Space). */\n onActivate?: (item: TaskItem) => void;\n}\n\n/* ------------------------------------------------------------------ */\n/* CVA */\n/* ------------------------------------------------------------------ */\n\nconst taskCardVariants = cva(\n [\n 'ds:relative ds:flex ds:items-start ds:gap-[var(--spacing-sm)]',\n 'ds:rounded-[var(--radius-sm)]',\n 'ds:transition-colors',\n 'ds:motion-reduce:transition-none',\n 'ds:text-start ds:group',\n 'ds:forced-colors:border ds:forced-colors:border-[CanvasText]',\n ].join(' '),\n {\n variants: {\n size: {\n sm: 'ds:p-[var(--spacing-sm)]',\n md: 'ds:p-[var(--spacing-md)]',\n },\n interactive: {\n true: 'ds:hover:bg-[color:var(--muted)]/40 ds:cursor-pointer',\n false: '',\n },\n },\n defaultVariants: {\n size: 'sm',\n interactive: false,\n },\n },\n);\n\nconst stretchedLinkClass = [\n 'ds:focus-visible:outline-none',\n \"ds:after:content-[''] ds:after:absolute ds:after:inset-0 ds:after:rounded-[var(--radius-sm)]\",\n 'ds:after:pointer-events-auto',\n 'ds:focus-visible:after:outline-[length:var(--focus-ring-width)]',\n 'ds:focus-visible:after:outline-solid',\n 'ds:focus-visible:after:outline-[color:var(--ring)]',\n 'ds:focus-visible:after:outline-offset-[length:var(--focus-ring-offset)]',\n 'ds:forced-colors:focus-visible:after:outline-[CanvasText]',\n].join(' ');\n\n/* ------------------------------------------------------------------ */\n/* Helpers */\n/* ------------------------------------------------------------------ */\n\nexport function isSafeTaskUrl(url: string): boolean {\n return /^(https?:\\/\\/(?!\\/)|\\/(?!\\/)|#)/.test(url);\n}\n\nfunction StatusIcon({\n status,\n priority,\n}: {\n status?: TaskStatus;\n priority?: TaskPriority;\n}): ReactNode {\n const tone =\n priority === 'high'\n ? 'ds:text-[color:var(--destructive)]'\n : 'ds:text-[color:var(--muted-foreground)]';\n if (status === 'done') {\n return <CheckSquare aria-hidden=\"true\" className={`ds:size-4 ${tone}`} />;\n }\n if (priority === 'high') {\n return <AlertCircle aria-hidden=\"true\" className={`ds:size-4 ${tone}`} />;\n }\n return <Square aria-hidden=\"true\" className={`ds:size-4 ${tone}`} />;\n}\n\n/* ------------------------------------------------------------------ */\n/* Component */\n/* ------------------------------------------------------------------ */\n\nexport const TaskCard = forwardRef<HTMLDivElement, TaskCardProps>(\n ({ item, size = 'sm', onActivate, className, ...rest }, ref) => {\n const { t } = useTranslation();\n const interactive = !!onActivate;\n const hasSafeUrl = !!item.url && isSafeTaskUrl(item.url);\n const ariaLabel = t('taskCard.itemLabel', {\n title: item.title,\n due: item.dueLabel ?? '',\n defaultValue: '{{title}}{{due, prepend, \" · \"}}',\n });\n\n const titleNode = (\n <span className=\"ds:flex-1 ds:min-w-0 ds:truncate type-body-sm ds:text-[color:var(--foreground)]\">\n {item.title}\n </span>\n );\n\n let activator: ReactNode;\n if (interactive && hasSafeUrl) {\n activator = (\n <a\n href={item.url}\n aria-label={ariaLabel}\n className={stretchedLinkClass + ' ds:contents'}\n onClick={(e) => {\n if (e.defaultPrevented || e.metaKey || e.ctrlKey || e.shiftKey)\n return;\n onActivate?.(item);\n }}\n >\n {titleNode}\n </a>\n );\n } else if (interactive) {\n activator = (\n <button\n type=\"button\"\n aria-label={ariaLabel}\n className={\n stretchedLinkClass +\n ' ds:contents ds:bg-transparent ds:border-0 ds:p-0 ds:text-start'\n }\n onClick={() => onActivate?.(item)}\n >\n {titleNode}\n </button>\n );\n } else {\n activator = titleNode;\n }\n\n return (\n <div\n ref={ref}\n role=\"listitem\"\n data-component=\"task-card\"\n data-component-id={item.id}\n data-status={item.status ?? 'open'}\n data-priority={item.priority ?? 'normal'}\n className={taskCardVariants({ size, interactive, className })}\n {...rest}\n >\n <span className=\"ds:mt-[var(--spacing-2xs)] ds:shrink-0\">\n <StatusIcon status={item.status} priority={item.priority} />\n </span>\n\n <div className=\"ds:flex-1 ds:min-w-0 ds:flex ds:flex-col ds:gap-[var(--spacing-2xs)]\">\n {activator}\n {item.description ? (\n <span className=\"type-body-sm ds:text-[color:var(--muted-foreground)] ds:truncate\">\n {item.description}\n </span>\n ) : null}\n {item.dueLabel ? (\n <span className=\"type-eyebrow ds:text-[color:var(--muted-foreground)]\">\n {item.dueLabel}\n </span>\n ) : null}\n </div>\n\n {interactive ? (\n <ChevronRight\n aria-hidden=\"true\"\n className=\"ds:mt-[var(--spacing-2xs)] ds:size-4 ds:shrink-0 ds:text-[color:var(--muted-foreground)] ds:opacity-0 ds:transition-opacity ds:motion-reduce:transition-none ds:group-hover:opacity-100 ds:group-focus-within:opacity-100 ds:rtl:rotate-180\"\n />\n ) : null}\n </div>\n );\n },\n);\n\nTaskCard.displayName = 'TaskCard';\n"],"names":["taskCardVariants","cva","stretchedLinkClass","isSafeTaskUrl","url","StatusIcon","status","priority","tone","CheckSquare","AlertCircle","Square","TaskCard","forwardRef","item","size","onActivate","className","rest","ref","t","useTranslation","interactive","hasSafeUrl","ariaLabel","titleNode","jsx","activator","e","jsxs","ChevronRight"],"mappings":"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"}
|
|
@@ -5,7 +5,7 @@ import { useTranslation as _ } from "react-i18next";
|
|
|
5
5
|
import { I as C } from "./icon-button-C4CGcYuz.js";
|
|
6
6
|
import { S as K } from "./skeleton-CZbwyJAA.js";
|
|
7
7
|
import { E } from "./empty-state-3CLJIXSj.js";
|
|
8
|
-
import { T as L } from "./task-card-
|
|
8
|
+
import { T as L } from "./task-card-BUVMh6HN.js";
|
|
9
9
|
import { u as P } from "./registry-C9nwlNyL.js";
|
|
10
10
|
import { c as H } from "./createLucideIcon-CrFbzy84.js";
|
|
11
11
|
import { P as V } from "./plus-CYKNmfuA.js";
|
|
@@ -100,33 +100,33 @@ const B = [
|
|
|
100
100
|
id: e,
|
|
101
101
|
items: s,
|
|
102
102
|
title: v,
|
|
103
|
-
size:
|
|
103
|
+
size: f = "sm",
|
|
104
104
|
onOpenTask: r,
|
|
105
105
|
onToggleDone: n,
|
|
106
106
|
onDismissTask: c,
|
|
107
|
-
onAddTask:
|
|
107
|
+
onAddTask: y,
|
|
108
108
|
addLabel: x,
|
|
109
|
-
loading:
|
|
109
|
+
loading: u = !1,
|
|
110
110
|
emptyTitle: w,
|
|
111
111
|
emptyDescription: I,
|
|
112
112
|
className: N,
|
|
113
113
|
...T
|
|
114
114
|
}, b) => {
|
|
115
|
-
const { t: l } = _(), h = v ?? l("
|
|
115
|
+
const { t: l } = _(), h = v ?? l("taskTray.title", "Tasks"), R = x ?? l("taskTray.add", "Add task"), A = !u && s.length === 0;
|
|
116
116
|
let m;
|
|
117
|
-
|
|
117
|
+
u ? m = /* @__PURE__ */ a("div", { className: "ds:flex ds:flex-col ds:gap-[var(--spacing-sm)] ds:p-[var(--spacing-sm)]", children: [0, 1, 2].map((t) => /* @__PURE__ */ a(K, { variant: "rectangular", height: "2.5rem" }, t)) }) : A ? m = /* @__PURE__ */ a("div", { className: "ds:p-[var(--spacing-md)]", children: /* @__PURE__ */ a(
|
|
118
118
|
E,
|
|
119
119
|
{
|
|
120
120
|
variant: "first-use",
|
|
121
121
|
size: "sm",
|
|
122
|
-
title: w ?? l("
|
|
123
|
-
description: I ?? l("
|
|
122
|
+
title: w ?? l("taskTray.empty.title", "No tasks yet"),
|
|
123
|
+
description: I ?? l("taskTray.empty.description", "New tasks will appear here.")
|
|
124
124
|
}
|
|
125
125
|
) }) : m = /* @__PURE__ */ a("ul", { className: "ds:flex ds:list-none ds:flex-col", children: s.map((t) => /* @__PURE__ */ a(
|
|
126
126
|
L,
|
|
127
127
|
{
|
|
128
128
|
item: t,
|
|
129
|
-
size:
|
|
129
|
+
size: f,
|
|
130
130
|
onActivate: r,
|
|
131
131
|
"data-task-id": t.id
|
|
132
132
|
},
|
|
@@ -162,7 +162,7 @@ const B = [
|
|
|
162
162
|
"aria-label": h,
|
|
163
163
|
"data-component": "task-tray",
|
|
164
164
|
"data-component-id": e,
|
|
165
|
-
className: J({ size:
|
|
165
|
+
className: J({ size: f, className: N }),
|
|
166
166
|
...T,
|
|
167
167
|
children: [
|
|
168
168
|
/* @__PURE__ */ p("header", { className: "ds:flex ds:items-center ds:justify-between ds:gap-[var(--spacing-sm)] ds:p-[var(--spacing-sm)]", children: [
|
|
@@ -170,14 +170,14 @@ const B = [
|
|
|
170
170
|
/* @__PURE__ */ a(F, { "aria-hidden": "true", className: "ds:size-4" }),
|
|
171
171
|
h
|
|
172
172
|
] }),
|
|
173
|
-
|
|
173
|
+
y ? /* @__PURE__ */ a(
|
|
174
174
|
C,
|
|
175
175
|
{
|
|
176
176
|
icon: /* @__PURE__ */ a(V, {}),
|
|
177
177
|
intent: "outline",
|
|
178
178
|
size: "sm",
|
|
179
179
|
"aria-label": R,
|
|
180
|
-
onClick:
|
|
180
|
+
onClick: y
|
|
181
181
|
}
|
|
182
182
|
) : null
|
|
183
183
|
] }),
|
|
@@ -192,4 +192,4 @@ export {
|
|
|
192
192
|
Q as T,
|
|
193
193
|
G as t
|
|
194
194
|
};
|
|
195
|
-
//# sourceMappingURL=task-tray-
|
|
195
|
+
//# sourceMappingURL=task-tray-B3A2fRGR.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"task-tray-B3A2fRGR.js","sources":["../../node_modules/lucide-react/dist/esm/icons/list-todo.js","../../src/components/task-tray/task-tray.agent.ts","../../src/components/task-tray/task-tray.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: \"M13 5h8\", key: \"a7qcls\" }],\n [\"path\", { d: \"M13 12h8\", key: \"h98zly\" }],\n [\"path\", { d: \"M13 19h8\", key: \"c3s6r1\" }],\n [\"path\", { d: \"m3 17 2 2 4-4\", key: \"1jhpwq\" }],\n [\"rect\", { x: \"3\", y: \"4\", width: \"6\", height: \"6\", rx: \"1\", key: \"cif1o7\" }]\n];\nconst ListTodo = createLucideIcon(\"list-todo\", __iconNode);\n\nexport { __iconNode, ListTodo as default };\n//# sourceMappingURL=list-todo.js.map\n","/* -------------------------------------------------------------------- */\n/* Agent adapter — TaskTray. */\n/* */\n/* Tray-level surface: read the current task ids + status, route a */\n/* `select_item` activation, and `toggle_done` / `dismiss` per task */\n/* through the curated handle. TaskTray is in-page (no open/close), */\n/* so it declares neither `open` nor `close`. */\n/* -------------------------------------------------------------------- */\n\nimport type { AgentAdapter } from '../../agent/types';\nimport type { TaskTrayHandle } from './task-tray';\n\nexport const taskTrayAgent: AgentAdapter<TaskTrayHandle> = {\n id: 'task-tray',\n capabilities: ['select_single', 'dismiss'],\n state: {\n items: {\n type: 'Array<{ id: string; status: string }>',\n descriptionKey: 'ui.agent.taskTray.state.items',\n description:\n 'Currently-displayed tasks. Ids + status only — never task title / patient.',\n read: (handle) => handle.getItems(),\n },\n },\n actions: {\n select_item: {\n safety: 'read',\n argsType: '{ id: string }',\n descriptionKey: 'ui.agent.taskTray.actions.selectItem',\n description: 'Activate the task with the given id.',\n invoke: (handle, args: { id: string }) => {\n handle.selectItem(args.id);\n },\n },\n toggle_done: {\n safety: 'write',\n argsType: '{ id: string }',\n descriptionKey: 'ui.agent.taskTray.actions.toggleDone',\n description: 'Request the host to toggle the done state of a task.',\n invoke: (handle, args: { id: string }) => {\n handle.toggleDone(args.id);\n },\n },\n dismiss: {\n safety: 'destructive',\n argsType: '{ id: string }',\n descriptionKey: 'ui.agent.taskTray.actions.dismiss',\n description:\n 'Request the host to dismiss / remove the task with the given id.',\n invoke: (handle, args: { id: string }) => {\n handle.dismiss(args.id);\n },\n },\n },\n domHooks: {\n root: {\n attr: 'data-component',\n value: 'task-tray',\n description: 'Marks the TaskTray wrapper.',\n },\n instanceId: {\n attr: 'data-component-id',\n sourceProp: 'id',\n description:\n 'Sourced from the id prop. Required to address a specific tray from the agent.',\n },\n item: {\n attr: 'data-task-id',\n description:\n 'Stable task id emitted on each rendered TaskCard inside the tray.',\n },\n },\n};\n","import {\n forwardRef,\n useImperativeHandle,\n useMemo,\n useRef,\n type HTMLAttributes,\n type ReactNode,\n} from 'react';\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport { useTranslation } from 'react-i18next';\nimport { ListTodo, Plus } from 'lucide-react';\nimport { IconButton } from '../button/icon-button';\nimport { Skeleton } from '../skeleton/skeleton';\nimport { EmptyState } from '../empty-state/empty-state';\nimport { TaskCard, type TaskItem } from '../task-card';\nimport { useAgentRegistration } from '../../agent/registry';\nimport { taskTrayAgent } from './task-tray.agent';\n\n/* ------------------------------------------------------------------ */\n/* CVA */\n/* ------------------------------------------------------------------ */\n\nconst taskTrayVariants = cva(\n [\n 'ds:flex ds:flex-col',\n 'ds:rounded-[var(--radius-md)] ds:shadow-[var(--shadow-card)]',\n 'ds:bg-[color:var(--card)] ds:text-[color:var(--card-foreground)]',\n 'ds:overflow-hidden',\n ].join(' '),\n {\n variants: {\n size: {\n sm: '',\n md: '',\n },\n },\n defaultVariants: {\n size: 'sm',\n },\n },\n);\n\n/* ------------------------------------------------------------------ */\n/* Types */\n/* ------------------------------------------------------------------ */\n\n/**\n * Curated imperative handle for TaskTray. Exposed as the forwardRef\n * target so a future agent / MCP UI bridge can drive the tray without\n * touching the DOM. See `task-tray.agent.ts`.\n */\nexport interface TaskTrayHandle {\n getItems: () => Array<{ id: string; status: string }>;\n selectItem: (id: string) => void;\n toggleDone: (id: string) => void;\n dismiss: (id: string) => void;\n}\n\nexport interface TaskTrayProps\n extends\n Omit<HTMLAttributes<HTMLElement>, 'onClick' | 'id'>,\n VariantProps<typeof taskTrayVariants> {\n /**\n * Stable instance id. Surfaced on the root as `data-component-id` so\n * an agent / MCP UI bridge can address this specific tray.\n */\n id?: string;\n /** Tasks rendered inside the panel. */\n items: TaskItem[];\n /** Section title — rendered in the header. Localised by the consumer. */\n title?: string;\n /** Visual density forwarded to each TaskCard. */\n size?: 'sm' | 'md';\n /** Fires when the user activates a task (click / Enter / Space). */\n onOpenTask?: (item: TaskItem) => void;\n /** Fires when the host should toggle the done state of a task. Used by agent integration. */\n onToggleDone?: (item: TaskItem) => void;\n /** Fires when the host should dismiss / remove a task. Used by agent integration. */\n onDismissTask?: (item: TaskItem) => void;\n /** Fires when the user activates the header \"Add\" affordance. */\n onAddTask?: () => void;\n /** Localised label for the \"Add\" affordance. Defaults to `ui.taskTray.add`. */\n addLabel?: string;\n /** When true the panel renders skeleton placeholders. */\n loading?: boolean;\n /** Render an empty state when `items` is empty and `loading` is false. */\n emptyTitle?: string;\n emptyDescription?: string;\n}\n\n/* ------------------------------------------------------------------ */\n/* Component */\n/* ------------------------------------------------------------------ */\n\nexport const TaskTray = forwardRef<HTMLElement, TaskTrayProps>(\n (\n {\n id,\n items,\n title,\n size = 'sm',\n onOpenTask,\n onToggleDone,\n onDismissTask,\n onAddTask,\n addLabel,\n loading = false,\n emptyTitle,\n emptyDescription,\n className,\n ...rest\n },\n ref,\n ) => {\n const { t } = useTranslation();\n const heading = title ?? t('taskTray.title', 'Tasks');\n const resolvedAddLabel = addLabel ?? t('taskTray.add', 'Add task');\n const isEmpty = !loading && items.length === 0;\n\n let body: ReactNode;\n if (loading) {\n body = (\n <div className=\"ds:flex ds:flex-col ds:gap-[var(--spacing-sm)] ds:p-[var(--spacing-sm)]\">\n {[0, 1, 2].map((i) => (\n <Skeleton key={i} variant=\"rectangular\" height=\"2.5rem\" />\n ))}\n </div>\n );\n } else if (isEmpty) {\n body = (\n <div className=\"ds:p-[var(--spacing-md)]\">\n <EmptyState\n variant=\"first-use\"\n size=\"sm\"\n title={emptyTitle ?? t('taskTray.empty.title', 'No tasks yet')}\n description={\n emptyDescription ??\n t('taskTray.empty.description', 'New tasks will appear here.')\n }\n />\n </div>\n );\n } else {\n body = (\n <ul className=\"ds:flex ds:list-none ds:flex-col\">\n {items.map((item) => (\n <TaskCard\n key={item.id}\n item={item}\n size={size}\n onActivate={onOpenTask}\n data-task-id={item.id}\n />\n ))}\n </ul>\n );\n }\n\n /* Curated imperative handle for agent integration. See\n * task-tray.agent.ts. */\n const itemsRef = useRef<TaskItem[]>(items);\n itemsRef.current = items;\n\n const handle = useMemo<TaskTrayHandle>(\n () => ({\n getItems: () =>\n itemsRef.current.map((i) => ({\n id: i.id,\n status: i.status ?? 'open',\n })),\n selectItem: (targetId: string) => {\n const found = itemsRef.current.find((i) => i.id === targetId);\n if (found) onOpenTask?.(found);\n },\n toggleDone: (targetId: string) => {\n const found = itemsRef.current.find((i) => i.id === targetId);\n if (found) onToggleDone?.(found);\n },\n dismiss: (targetId: string) => {\n const found = itemsRef.current.find((i) => i.id === targetId);\n if (found) onDismissTask?.(found);\n },\n }),\n [onOpenTask, onToggleDone, onDismissTask],\n );\n\n const rootRef = useRef<HTMLElement>(null);\n useImperativeHandle(ref, () => rootRef.current as HTMLElement, []);\n useAgentRegistration(taskTrayAgent, handle, id);\n\n return (\n <section\n ref={rootRef}\n aria-label={heading}\n data-component=\"task-tray\"\n data-component-id={id}\n className={taskTrayVariants({ size, className })}\n {...rest}\n >\n <header className=\"ds:flex ds:items-center ds:justify-between ds:gap-[var(--spacing-sm)] ds:p-[var(--spacing-sm)]\">\n <h3 className=\"ds:m-0 ds:inline-flex ds:items-center ds:gap-[var(--spacing-xs)] type-title-card\">\n <ListTodo aria-hidden=\"true\" className=\"ds:size-4\" />\n {heading}\n </h3>\n {onAddTask ? (\n <IconButton\n icon={<Plus />}\n intent=\"outline\"\n size=\"sm\"\n aria-label={resolvedAddLabel}\n onClick={onAddTask}\n />\n ) : null}\n </header>\n {body}\n </section>\n );\n },\n);\n\nTaskTray.displayName = 'TaskTray';\n"],"names":["__iconNode","ListTodo","createLucideIcon","taskTrayAgent","handle","args","taskTrayVariants","cva","TaskTray","forwardRef","id","items","title","size","onOpenTask","onToggleDone","onDismissTask","onAddTask","addLabel","loading","emptyTitle","emptyDescription","className","rest","ref","t","useTranslation","heading","resolvedAddLabel","isEmpty","body","jsx","i","Skeleton","EmptyState","item","TaskCard","itemsRef","useRef","useMemo","targetId","found","rootRef","useImperativeHandle","useAgentRegistration","jsxs","IconButton","Plus"],"mappings":"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","x_google_ignoreList":[0]}
|
|
@@ -113,7 +113,7 @@ const ge = {
|
|
|
113
113
|
onInput: D,
|
|
114
114
|
...$
|
|
115
115
|
}, c) => {
|
|
116
|
-
const { t: I } = pe(),
|
|
116
|
+
const { t: I } = pe(), o = me(), z = h ?? o.id, Y = o.disabled || _, G = o.invalid ? "error" : v, l = O(null), J = k(
|
|
117
117
|
(e) => {
|
|
118
118
|
l.current = e, typeof c == "function" ? c(e) : c && (c.current = e);
|
|
119
119
|
},
|
|
@@ -123,10 +123,10 @@ const ge = {
|
|
|
123
123
|
), T = u ? String(F) : Q, p = O(!1), A = k(() => {
|
|
124
124
|
const e = l.current;
|
|
125
125
|
if (!e || !s) return;
|
|
126
|
-
const r = window.getComputedStyle(e), d = parseFloat(r.lineHeight), f = parseFloat(r.paddingTop), m = parseFloat(r.paddingBottom), se = parseFloat(r.borderTopWidth), ae = parseFloat(r.borderBottomWidth), M = f + m + se + ae, ne = (Number.isFinite(d) ? d : 24) * g + M,
|
|
126
|
+
const r = window.getComputedStyle(e), d = parseFloat(r.lineHeight), f = parseFloat(r.paddingTop), m = parseFloat(r.paddingBottom), se = parseFloat(r.borderTopWidth), ae = parseFloat(r.borderBottomWidth), M = f + m + se + ae, ne = (Number.isFinite(d) ? d : 24) * g + M, oe = typeof b == "number" ? (Number.isFinite(d) ? d : 24) * b + M : Number.POSITIVE_INFINITY;
|
|
127
127
|
e.style.height = "auto";
|
|
128
|
-
const
|
|
129
|
-
e.style.height = `${
|
|
128
|
+
const ie = Math.max(ne, Math.min(e.scrollHeight, oe));
|
|
129
|
+
e.style.height = `${ie}px`;
|
|
130
130
|
}, [s, g, b]);
|
|
131
131
|
ce(() => {
|
|
132
132
|
s && A();
|
|
@@ -165,20 +165,20 @@ const ge = {
|
|
|
165
165
|
[w]
|
|
166
166
|
);
|
|
167
167
|
ve(ge, L, h);
|
|
168
|
-
const
|
|
168
|
+
const i = typeof a == "number" && (S ?? !0) && a > 0, V = ye(T), B = i ? Math.max(0, a - V) : 0, R = i ? V / a : 0, [C, ee] = P("");
|
|
169
169
|
ue(() => {
|
|
170
|
-
if (!
|
|
170
|
+
if (!i) return;
|
|
171
171
|
const e = window.setTimeout(() => {
|
|
172
172
|
p.current || ee(
|
|
173
|
-
I("
|
|
173
|
+
I("inputs.textarea.charactersRemaining", {
|
|
174
174
|
count: B,
|
|
175
175
|
defaultValue: "{{count}} characters remaining"
|
|
176
176
|
})
|
|
177
177
|
);
|
|
178
178
|
}, 500);
|
|
179
179
|
return () => window.clearTimeout(e);
|
|
180
|
-
}, [
|
|
181
|
-
const H =
|
|
180
|
+
}, [i, B, I]);
|
|
181
|
+
const H = i ? `${z}-counter` : void 0, te = [o.describedBy || void 0, H].filter(Boolean).join(" ") || void 0, re = s ? "auto" : "manual";
|
|
182
182
|
return /* @__PURE__ */ N(
|
|
183
183
|
"div",
|
|
184
184
|
{
|
|
@@ -195,8 +195,8 @@ const ge = {
|
|
|
195
195
|
defaultValue: u ? void 0 : E,
|
|
196
196
|
disabled: Y,
|
|
197
197
|
"aria-describedby": te,
|
|
198
|
-
"aria-invalid":
|
|
199
|
-
"aria-required":
|
|
198
|
+
"aria-invalid": o.invalid || void 0,
|
|
199
|
+
"aria-required": o.required || void 0,
|
|
200
200
|
maxLength: a,
|
|
201
201
|
rows: s ? g : q,
|
|
202
202
|
onChange: U,
|
|
@@ -212,7 +212,7 @@ const ge = {
|
|
|
212
212
|
...$
|
|
213
213
|
}
|
|
214
214
|
),
|
|
215
|
-
|
|
215
|
+
i ? /* @__PURE__ */ N(
|
|
216
216
|
"div",
|
|
217
217
|
{
|
|
218
218
|
id: H,
|
|
@@ -236,4 +236,4 @@ xe.displayName = "TextArea";
|
|
|
236
236
|
export {
|
|
237
237
|
xe as T
|
|
238
238
|
};
|
|
239
|
-
//# sourceMappingURL=text-area-
|
|
239
|
+
//# sourceMappingURL=text-area-DHtcpcLv.js.map
|