@alfadocs/ui-kit 0.1.1 → 0.1.3
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/{accordion-BJD1aM67.js → accordion-B6fyINUk.js} +10 -9
- package/dist/_chunks/accordion-B6fyINUk.js.map +1 -0
- package/dist/_chunks/{agenda-card-Bld47Eul.js → agenda-card-C_hQGErS.js} +12 -11
- package/dist/_chunks/{agenda-card-Bld47Eul.js.map → agenda-card-C_hQGErS.js.map} +1 -1
- package/dist/_chunks/{agenda-tray-D86cNIJ0.js → agenda-tray-CBaVMJLO.js} +6 -5
- package/dist/_chunks/{agenda-tray-D86cNIJ0.js.map → agenda-tray-CBaVMJLO.js.map} +1 -1
- package/dist/_chunks/{ai-prompt-input-CdYwt2VP.js → ai-prompt-input-K94oVLG2.js} +17 -16
- package/dist/_chunks/ai-prompt-input-K94oVLG2.js.map +1 -0
- package/dist/_chunks/{alert-ETrF7Q8J.js → alert-rOM4EG0P.js} +12 -11
- package/dist/_chunks/{alert-ETrF7Q8J.js.map → alert-rOM4EG0P.js.map} +1 -1
- package/dist/_chunks/{app-frame-uq2Gy0vs.js → app-frame-6d7Lu4ea.js} +2 -1
- package/dist/_chunks/{app-frame-uq2Gy0vs.js.map → app-frame-6d7Lu4ea.js.map} +1 -1
- package/dist/_chunks/{aspect-ratio-BqU4itGW.js → aspect-ratio-CxsdG8vk.js} +9 -8
- package/dist/_chunks/{aspect-ratio-BqU4itGW.js.map → aspect-ratio-CxsdG8vk.js.map} +1 -1
- package/dist/_chunks/{audio-recorder-D2UEBF9B.js → audio-recorder-Cn8z2zC9.js} +7 -6
- package/dist/_chunks/{audio-recorder-D2UEBF9B.js.map → audio-recorder-Cn8z2zC9.js.map} +1 -1
- package/dist/_chunks/{audio-visualiser-B4u4goV5.js → audio-visualiser-CeMPCZkd.js} +2 -1
- package/dist/_chunks/{audio-visualiser-B4u4goV5.js.map → audio-visualiser-CeMPCZkd.js.map} +1 -1
- package/dist/_chunks/{autocomplete.agent-Bi6CiRKa.js → autocomplete.agent-DRrp-Rsx.js} +4 -3
- package/dist/_chunks/autocomplete.agent-DRrp-Rsx.js.map +1 -0
- package/dist/_chunks/{avatar-BAhxbDEu.js → avatar-Biffh-_H.js} +17 -16
- package/dist/_chunks/avatar-Biffh-_H.js.map +1 -0
- package/dist/_chunks/{badge-zDghajh8.js → badge-mrstWxve.js} +14 -13
- package/dist/_chunks/badge-mrstWxve.js.map +1 -0
- package/dist/_chunks/{balance-cell-renderer-BGyvZWjB.js → balance-cell-renderer-CiyezQhi.js} +12 -12
- package/dist/_chunks/{balance-cell-renderer-BGyvZWjB.js.map → balance-cell-renderer-CiyezQhi.js.map} +1 -1
- package/dist/_chunks/{breadcrumb-pdUacgm1.js → breadcrumb-CcZovmIq.js} +2 -1
- package/dist/_chunks/breadcrumb-CcZovmIq.js.map +1 -0
- package/dist/_chunks/{button-DmiGFnNA.js → button-7dTew-IV.js} +4 -4
- package/dist/_chunks/button-7dTew-IV.js.map +1 -0
- package/dist/_chunks/{button-group-BtTHSyU0.js → button-group-CONver7M.js} +9 -8
- package/dist/_chunks/{button-group-BtTHSyU0.js.map → button-group-CONver7M.js.map} +1 -1
- package/dist/_chunks/{card-DeItIBcV.js → card-BEy58ZKp.js} +2 -1
- package/dist/_chunks/card-BEy58ZKp.js.map +1 -0
- package/dist/_chunks/{chat-container-Co8HpB64.js → chat-container-BZvQ3_yT.js} +2 -2
- package/dist/_chunks/{chat-container-Co8HpB64.js.map → chat-container-BZvQ3_yT.js.map} +1 -1
- package/dist/_chunks/{chat-input-3rstZhHR.js → chat-input-xiBIujMv.js} +3 -3
- package/dist/_chunks/chat-input-xiBIujMv.js.map +1 -0
- package/dist/_chunks/{chat-message-dDMVSYBs.js → chat-message-BtxUyugB.js} +10 -9
- package/dist/_chunks/chat-message-BtxUyugB.js.map +1 -0
- package/dist/_chunks/{checkbox-DMzgtnqw.js → checkbox-Ni6C_KJg.js} +11 -11
- package/dist/_chunks/{checkbox-DMzgtnqw.js.map → checkbox-Ni6C_KJg.js.map} +1 -1
- package/dist/_chunks/{checkbox-group-DBnIBRT_.js → checkbox-group-BFZ4oN5t.js} +8 -7
- package/dist/_chunks/checkbox-group-BFZ4oN5t.js.map +1 -0
- package/dist/_chunks/{collapsible-DPGQnHZh.js → collapsible-fFMqzpdL.js} +8 -7
- package/dist/_chunks/collapsible-fFMqzpdL.js.map +1 -0
- package/dist/_chunks/{color-picker-OKKF3Dww.js → color-picker-Cl3KdjJd.js} +89 -87
- package/dist/_chunks/color-picker-Cl3KdjJd.js.map +1 -0
- package/dist/_chunks/{combobox.agent-CfeB-IZ1.js → combobox.agent-DjdivI3X.js} +21 -20
- package/dist/_chunks/combobox.agent-DjdivI3X.js.map +1 -0
- package/dist/_chunks/{command-palette.agent-XLfSGHCL.js → command-palette.agent-BUjzr2ET.js} +3 -2
- package/dist/_chunks/command-palette.agent-BUjzr2ET.js.map +1 -0
- package/dist/_chunks/{date-picker-DXx8oSJb.js → date-picker-DYXNsWmM.js} +3 -3
- package/dist/_chunks/{date-picker-DXx8oSJb.js.map → date-picker-DYXNsWmM.js.map} +1 -1
- package/dist/_chunks/{date-range-picker-C3CbY__H.js → date-range-picker-BcNDJI7m.js} +3 -3
- package/dist/_chunks/date-range-picker-BcNDJI7m.js.map +1 -0
- package/dist/_chunks/{date-time-picker-Bn3FPeAc.js → date-time-picker-CmGiTU__.js} +7 -7
- package/dist/_chunks/date-time-picker-CmGiTU__.js.map +1 -0
- package/dist/_chunks/{description-list-B1CL3RTG.js → description-list-C_1NX8P3.js} +3 -2
- package/dist/_chunks/description-list-C_1NX8P3.js.map +1 -0
- package/dist/_chunks/{dialog.agent-D9WeIWi2.js → dialog.agent-C2lP9H0h.js} +2 -2
- package/dist/_chunks/{dialog.agent-D9WeIWi2.js.map → dialog.agent-C2lP9H0h.js.map} +1 -1
- package/dist/_chunks/{dropdown-menu-BnVUeVG3.js → dropdown-menu-2HgU1Emf.js} +4 -3
- package/dist/_chunks/dropdown-menu-2HgU1Emf.js.map +1 -0
- package/dist/_chunks/{empty-state-DV96gCnp.js → empty-state-BHrItOiE.js} +3 -2
- package/dist/_chunks/{empty-state-DV96gCnp.js.map → empty-state-BHrItOiE.js.map} +1 -1
- package/dist/_chunks/{file-upload.agent-DYFnqdxw.js → file-upload.agent-LlC0W468.js} +4 -4
- package/dist/_chunks/file-upload.agent-LlC0W468.js.map +1 -0
- package/dist/_chunks/{flag-C3BUEwHH.js → flag-DZ6V7-hU.js} +3 -1
- package/dist/_chunks/{flag-C3BUEwHH.js.map → flag-DZ6V7-hU.js.map} +1 -1
- package/dist/_chunks/{floating-action-button-RigP2E7o.js → floating-action-button-Cnw-f6AG.js} +8 -7
- package/dist/_chunks/floating-action-button-Cnw-f6AG.js.map +1 -0
- package/dist/_chunks/{form-field-DI5LY5aG.js → form-field-BfsPLTSc.js} +2 -1
- package/dist/_chunks/form-field-BfsPLTSc.js.map +1 -0
- package/dist/_chunks/{freemium-paywall-D0GiUFOe.js → freemium-paywall-Dr9aOtOC.js} +24 -23
- package/dist/_chunks/freemium-paywall-Dr9aOtOC.js.map +1 -0
- package/dist/_chunks/{header-CW2oRd5H.js → header-BpU9U-1X.js} +3 -2
- package/dist/_chunks/{header-CW2oRd5H.js.map → header-BpU9U-1X.js.map} +1 -1
- package/dist/_chunks/{icon-button-C482ii4y.js → icon-button-CNjWCD1X.js} +10 -9
- package/dist/_chunks/icon-button-CNjWCD1X.js.map +1 -0
- package/dist/_chunks/{icon-button-group-BnhkUWUg.js → icon-button-group-DeV3FpNY.js} +26 -25
- package/dist/_chunks/{icon-button-group-BnhkUWUg.js.map → icon-button-group-DeV3FpNY.js.map} +1 -1
- package/dist/_chunks/{kbd-DTcIjYA7.js → kbd-8baVw3KU.js} +35 -31
- package/dist/_chunks/kbd-8baVw3KU.js.map +1 -0
- package/dist/_chunks/{key-value-pair-DDhSYdDL.js → key-value-pair-C9hpjC_B.js} +13 -12
- package/dist/_chunks/{key-value-pair-DDhSYdDL.js.map → key-value-pair-C9hpjC_B.js.map} +1 -1
- package/dist/_chunks/{leo-sidebar-gXXcGPKk.js → leo-sidebar-CNjZqljo.js} +12 -12
- package/dist/_chunks/{leo-sidebar-gXXcGPKk.js.map → leo-sidebar-CNjZqljo.js.map} +1 -1
- package/dist/_chunks/{list-Cwe8mcmh.js → list-B1ozIjQe.js} +4 -1
- package/dist/_chunks/list-B1ozIjQe.js.map +1 -0
- package/dist/_chunks/live-region-C41SO3cA.js +58 -0
- package/dist/_chunks/{live-region-COggO6x6.js.map → live-region-C41SO3cA.js.map} +1 -1
- package/dist/_chunks/{logo-3wrZGpwg.js → logo-BpFoCL-s.js} +7 -7
- package/dist/_chunks/{logo-3wrZGpwg.js.map → logo-BpFoCL-s.js.map} +1 -1
- package/dist/_chunks/{matrix-rain-gsHqSvW7.js → matrix-rain-BEkvux64.js} +2 -1
- package/dist/_chunks/{matrix-rain-gsHqSvW7.js.map → matrix-rain-BEkvux64.js.map} +1 -1
- package/dist/_chunks/{message-card-DID3cXUW.js → message-card-CZzNO4ov.js} +6 -5
- package/dist/_chunks/message-card-CZzNO4ov.js.map +1 -0
- package/dist/_chunks/{message-tray-CVMLBnVp.js → message-tray-BWbjXW3F.js} +7 -6
- package/dist/_chunks/message-tray-BWbjXW3F.js.map +1 -0
- package/dist/_chunks/{multi-select.agent-BUKYZJfp.js → multi-select.agent-BSGEW10d.js} +34 -33
- package/dist/_chunks/multi-select.agent-BSGEW10d.js.map +1 -0
- package/dist/_chunks/{navigation-menu-NjwxyshT.js → navigation-menu-DxOMvrKM.js} +2 -1
- package/dist/_chunks/navigation-menu-DxOMvrKM.js.map +1 -0
- package/dist/_chunks/{notification-card-BZ33fq8H.js → notification-card-DgW-vVg-.js} +5 -4
- package/dist/_chunks/{notification-card-BZ33fq8H.js.map → notification-card-DgW-vVg-.js.map} +1 -1
- package/dist/_chunks/{notification-tray-CnEd7B2q.js → notification-tray-CKUgl2jc.js} +7 -6
- package/dist/_chunks/{notification-tray-CnEd7B2q.js.map → notification-tray-CKUgl2jc.js.map} +1 -1
- package/dist/_chunks/{number-input-D7rSa_ef.js → number-input-BPPhekLu.js} +19 -18
- package/dist/_chunks/number-input-BPPhekLu.js.map +1 -0
- package/dist/_chunks/{otp-input-C9R9sC74.js → otp-input-De5_Ih7B.js} +15 -14
- package/dist/_chunks/otp-input-De5_Ih7B.js.map +1 -0
- package/dist/_chunks/{pagination.agent-D75FB6XP.js → pagination.agent-CmA0Ocr5.js} +16 -15
- package/dist/_chunks/pagination.agent-CmA0Ocr5.js.map +1 -0
- package/dist/_chunks/{password-input-C6PvKyQV.js → password-input-DAT5HQth.js} +7 -7
- package/dist/_chunks/password-input-DAT5HQth.js.map +1 -0
- package/dist/_chunks/{patient-shell-CGsmI5LJ.js → patient-shell-BzHhg6uA.js} +9 -9
- package/dist/_chunks/{patient-shell-CGsmI5LJ.js.map → patient-shell-BzHhg6uA.js.map} +1 -1
- package/dist/_chunks/{payment-form-l3j-gA-t.js → payment-form-YlxrCpZQ.js} +22 -22
- package/dist/_chunks/payment-form-YlxrCpZQ.js.map +1 -0
- package/dist/_chunks/{pdf-viewer.agent-DuGfSoep.js → pdf-viewer.agent-sMned5Xn.js} +3 -3
- package/dist/_chunks/{pdf-viewer.agent-DuGfSoep.js.map → pdf-viewer.agent-sMned5Xn.js.map} +1 -1
- package/dist/_chunks/{phone-input-ZWa_FU4R.js → phone-input-BuRe5PyI.js} +41 -40
- package/dist/_chunks/phone-input-BuRe5PyI.js.map +1 -0
- package/dist/_chunks/{popover-CMr1pTPO.js → popover-Ds1iOdiv.js} +4 -3
- package/dist/_chunks/popover-Ds1iOdiv.js.map +1 -0
- package/dist/_chunks/{privacy-lock-DdpkKNM2.js → privacy-lock-KEruBpM1.js} +23 -23
- package/dist/_chunks/{privacy-lock-DdpkKNM2.js.map → privacy-lock-KEruBpM1.js.map} +1 -1
- package/dist/_chunks/{radio-B_gvGU29.js → radio-XSSNX3Af.js} +8 -7
- package/dist/_chunks/radio-XSSNX3Af.js.map +1 -0
- package/dist/_chunks/{radio-group-Bn8Wt0yc.js → radio-group-DBrUOPcy.js} +19 -18
- package/dist/_chunks/radio-group-DBrUOPcy.js.map +1 -0
- package/dist/_chunks/{react-day-picker-d0MHsyCj.js → react-day-picker-C04L_28V.js} +5 -5
- package/dist/_chunks/{react-day-picker-d0MHsyCj.js.map → react-day-picker-C04L_28V.js.map} +1 -1
- package/dist/_chunks/{rich-text-editor.agent-C1_E7_7t.js → rich-text-editor.agent-COSb5_2D.js} +4 -4
- package/dist/_chunks/rich-text-editor.agent-COSb5_2D.js.map +1 -0
- package/dist/_chunks/{scroll-area-Ba99pJ_R.js → scroll-area-HIq0hJyJ.js} +14 -12
- package/dist/_chunks/scroll-area-HIq0hJyJ.js.map +1 -0
- package/dist/_chunks/{search-bar-VoTqJhRp.js → search-bar-9Zbew4yM.js} +4 -3
- package/dist/_chunks/search-bar-9Zbew4yM.js.map +1 -0
- package/dist/_chunks/{search-input-D6rarD0_.js → search-input-CtkWITO2.js} +28 -28
- package/dist/_chunks/{search-input-D6rarD0_.js.map → search-input-CtkWITO2.js.map} +1 -1
- package/dist/_chunks/{select-DbxWF3O_.js → select-DdAOtomN.js} +24 -23
- package/dist/_chunks/select-DdAOtomN.js.map +1 -0
- package/dist/_chunks/{separator-BRQHi8s0.js → separator-B4wXDLNC.js} +9 -8
- package/dist/_chunks/{separator-BRQHi8s0.js.map → separator-B4wXDLNC.js.map} +1 -1
- package/dist/_chunks/{sheet-DyWqluiS.js → sheet-D7GRhnWw.js} +3 -2
- package/dist/_chunks/sheet-D7GRhnWw.js.map +1 -0
- package/dist/_chunks/{sidebar-B52iGGNV.js → sidebar-Dc2ffrbf.js} +9 -8
- package/dist/_chunks/sidebar-Dc2ffrbf.js.map +1 -0
- package/dist/_chunks/sign-in-with-alfadocs-button-BotwPDcW.js +45 -0
- package/dist/_chunks/{sign-in-with-alfadocs-button-BU7MP5Hg.js.map → sign-in-with-alfadocs-button-BotwPDcW.js.map} +1 -1
- package/dist/_chunks/{signature-capture.agent-4htVctJ2.js → signature-capture.agent-C38VPXxg.js} +19 -19
- package/dist/_chunks/signature-capture.agent-C38VPXxg.js.map +1 -0
- package/dist/_chunks/{skeleton-ClO1v5GE.js → skeleton-DAdPFx9d.js} +18 -16
- package/dist/_chunks/{skeleton-ClO1v5GE.js.map → skeleton-DAdPFx9d.js.map} +1 -1
- package/dist/_chunks/{skip-link-CASJkBOe.js → skip-link-DmZ3c6cb.js} +12 -11
- package/dist/_chunks/{skip-link-CASJkBOe.js.map → skip-link-DmZ3c6cb.js.map} +1 -1
- package/dist/_chunks/{slider-n8JWpJvT.js → slider-DjyRt3Mp.js} +3 -2
- package/dist/_chunks/slider-DjyRt3Mp.js.map +1 -0
- package/dist/_chunks/{slot-grid-BRAkqChA.js → slot-grid-WHc5A8-z.js} +57 -56
- package/dist/_chunks/slot-grid-WHc5A8-z.js.map +1 -0
- package/dist/_chunks/{sparkline.agent-BLY1IMyW.js → sparkline.agent-C_xp3NRB.js} +2 -2
- package/dist/_chunks/{sparkline.agent-BLY1IMyW.js.map → sparkline.agent-C_xp3NRB.js.map} +1 -1
- package/dist/_chunks/{spinner-CoAOGcDa.js → spinner-GCcv67vh.js} +2 -1
- package/dist/_chunks/spinner-GCcv67vh.js.map +1 -0
- package/dist/_chunks/{stat-D76MNHzK.js → stat-DUB6g90R.js} +3 -1
- package/dist/_chunks/{stat-D76MNHzK.js.map → stat-DUB6g90R.js.map} +1 -1
- package/dist/_chunks/{stepper-accordion-DHQ80A4v.js → stepper-accordion-2_7Pw0tC.js} +2 -1
- package/dist/_chunks/{stepper-accordion-DHQ80A4v.js.map → stepper-accordion-2_7Pw0tC.js.map} +1 -1
- package/dist/_chunks/{stepper-calendar-vtWwa2bY.js → stepper-calendar-CWZcFgt_.js} +9 -8
- package/dist/_chunks/stepper-calendar-CWZcFgt_.js.map +1 -0
- package/dist/_chunks/{stepper-progress-DMZ5w5VR.js → stepper-progress-rE7tn7WY.js} +12 -11
- package/dist/_chunks/{stepper-progress-DMZ5w5VR.js.map → stepper-progress-rE7tn7WY.js.map} +1 -1
- package/dist/_chunks/{streaming-text-D0cW8pwq.js → streaming-text-BgjCTVOw.js} +6 -5
- package/dist/_chunks/{streaming-text-D0cW8pwq.js.map → streaming-text-BgjCTVOw.js.map} +1 -1
- package/dist/_chunks/{suggestion-chip-BgNFpPEE.js → suggestion-chip-6AB40rxz.js} +2 -1
- package/dist/_chunks/{suggestion-chip-BgNFpPEE.js.map → suggestion-chip-6AB40rxz.js.map} +1 -1
- package/dist/_chunks/{switch-DtLPKO0p.js → switch-DhSORO9C.js} +2 -1
- package/dist/_chunks/{switch-DtLPKO0p.js.map → switch-DhSORO9C.js.map} +1 -1
- package/dist/_chunks/{tabs.agent-BDUlyPbJ.js → tabs.agent-BtaNGxRh.js} +6 -5
- package/dist/_chunks/tabs.agent-BtaNGxRh.js.map +1 -0
- package/dist/_chunks/{tag-CfSZZN2f.js → tag--uLKOb9f.js} +17 -14
- package/dist/_chunks/{tag-CfSZZN2f.js.map → tag--uLKOb9f.js.map} +1 -1
- package/dist/_chunks/{task-card-B5xfiFg5.js → task-card-BeSuntXP.js} +11 -10
- package/dist/_chunks/{task-card-B5xfiFg5.js.map → task-card-BeSuntXP.js.map} +1 -1
- package/dist/_chunks/{task-tray-BnpiodZ4.js → task-tray-pRk6u8Ik.js} +10 -9
- package/dist/_chunks/{task-tray-BnpiodZ4.js.map → task-tray-pRk6u8Ik.js.map} +1 -1
- package/dist/_chunks/{text-area-BqbruBWx.js → text-area-xf9-6iDf.js} +21 -21
- package/dist/_chunks/text-area-xf9-6iDf.js.map +1 -0
- package/dist/_chunks/{text-input-lh6kRXZS.js → text-input-exh7VD7D.js} +10 -9
- package/dist/_chunks/{text-input-lh6kRXZS.js.map → text-input-exh7VD7D.js.map} +1 -1
- package/dist/_chunks/theme-root-DDb0TJjd.js +18 -0
- package/dist/_chunks/{theme-root-vapFjsnt.js.map → theme-root-DDb0TJjd.js.map} +1 -1
- package/dist/_chunks/{theme-toggle-BHKMiORD.js → theme-toggle-CJgA6G24.js} +42 -39
- package/dist/_chunks/theme-toggle-CJgA6G24.js.map +1 -0
- package/dist/_chunks/{time-picker-DbpAmPux.js → time-picker-D-EueWUG.js} +68 -67
- package/dist/_chunks/time-picker-D-EueWUG.js.map +1 -0
- package/dist/_chunks/{timeline-vjsUeuq1.js → timeline-DIueH4TJ.js} +5 -4
- package/dist/_chunks/timeline-DIueH4TJ.js.map +1 -0
- package/dist/_chunks/{timestamp-DmSt92P1.js → timestamp-BV2lC-wV.js} +2 -1
- package/dist/_chunks/{timestamp-DmSt92P1.js.map → timestamp-BV2lC-wV.js.map} +1 -1
- package/dist/_chunks/{toast-DllSITLf.js → toast-q0SlabGr.js} +2 -2
- package/dist/_chunks/{toast-DllSITLf.js.map → toast-q0SlabGr.js.map} +1 -1
- package/dist/_chunks/{tooltip-Dp3u8jGz.js → tooltip-DHik5yRI.js} +2 -1
- package/dist/_chunks/{tooltip-Dp3u8jGz.js.map → tooltip-DHik5yRI.js.map} +1 -1
- package/dist/_chunks/{tooth-scheme.agent-BRqxWa1D.js → tooth-scheme.agent-BlDyu-Gx.js} +2 -2
- package/dist/_chunks/{tooth-scheme.agent-BRqxWa1D.js.map → tooth-scheme.agent-BlDyu-Gx.js.map} +1 -1
- package/dist/_chunks/{transcript-panel-Bg1BTMSr.js → transcript-panel-DFnhbrlQ.js} +39 -38
- package/dist/_chunks/{transcript-panel-Bg1BTMSr.js.map → transcript-panel-DFnhbrlQ.js.map} +1 -1
- package/dist/_chunks/{typing-indicator-BRg22Rqr.js → typing-indicator-CbUBf-Dx.js} +9 -8
- package/dist/_chunks/{typing-indicator-BRg22Rqr.js.map → typing-indicator-CbUBf-Dx.js.map} +1 -1
- package/dist/_chunks/visually-hidden-BlkhaZWe.js +21 -0
- package/dist/_chunks/{visually-hidden-Y3jcdCv-.js.map → visually-hidden-BlkhaZWe.js.map} +1 -1
- package/dist/_chunks/{warning-stack-B9N9yWet.js → warning-stack-DCmO0R07.js} +26 -24
- package/dist/_chunks/warning-stack-DCmO0R07.js.map +1 -0
- package/dist/_chunks/{workflow-map-gBhL_Wrs.js → workflow-map-CAM6Uy_J.js} +13 -10
- package/dist/_chunks/workflow-map-CAM6Uy_J.js.map +1 -0
- package/dist/agent-catalog.json +1 -1
- package/dist/components/accordion/accordion.d.ts.map +1 -1
- package/dist/components/accordion/index.js +1 -1
- package/dist/components/agenda-card/agenda-card.d.ts.map +1 -1
- package/dist/components/agenda-card/index.js +1 -1
- package/dist/components/agenda-tray/agenda-tray.d.ts.map +1 -1
- package/dist/components/agenda-tray/index.js +1 -1
- package/dist/components/ai-prompt-input/ai-prompt-input.d.ts.map +1 -1
- package/dist/components/ai-prompt-input/index.js +1 -1
- package/dist/components/alert/alert.d.ts.map +1 -1
- package/dist/components/alert/index.js +1 -1
- package/dist/components/app-frame/app-frame.d.ts.map +1 -1
- package/dist/components/app-frame/index.js +1 -1
- package/dist/components/aspect-ratio/aspect-ratio.d.ts.map +1 -1
- package/dist/components/aspect-ratio/index.js +1 -1
- package/dist/components/audio-recorder/audio-recorder.d.ts.map +1 -1
- package/dist/components/audio-recorder/index.js +1 -1
- package/dist/components/audio-visualiser/audio-visualiser.d.ts.map +1 -1
- package/dist/components/audio-visualiser/index.js +1 -1
- package/dist/components/autocomplete/autocomplete.d.ts.map +1 -1
- package/dist/components/autocomplete/index.js +1 -1
- package/dist/components/avatar/avatar.d.ts.map +1 -1
- package/dist/components/avatar/index.js +1 -1
- package/dist/components/badge/badge.d.ts.map +1 -1
- package/dist/components/badge/index.js +1 -1
- package/dist/components/breadcrumb/breadcrumb.d.ts.map +1 -1
- package/dist/components/breadcrumb/index.js +1 -1
- package/dist/components/button/icon-button.d.ts.map +1 -1
- package/dist/components/button/index.js +2 -2
- package/dist/components/button-group/button-group.d.ts.map +1 -1
- package/dist/components/button-group/index.js +1 -1
- package/dist/components/card/card.d.ts.map +1 -1
- package/dist/components/card/index.js +1 -1
- package/dist/components/chat-container/index.js +1 -1
- package/dist/components/chat-input/index.js +1 -1
- package/dist/components/chat-message/chat-message.d.ts.map +1 -1
- package/dist/components/chat-message/index.js +1 -1
- package/dist/components/checkbox/index.js +1 -1
- package/dist/components/checkbox-group/checkbox-group.d.ts.map +1 -1
- package/dist/components/checkbox-group/index.js +1 -1
- package/dist/components/collapsible/collapsible.d.ts.map +1 -1
- package/dist/components/collapsible/index.js +1 -1
- package/dist/components/color-picker/color-picker.d.ts.map +1 -1
- package/dist/components/color-picker/index.js +1 -1
- package/dist/components/combobox/combobox.d.ts.map +1 -1
- package/dist/components/combobox/index.js +1 -1
- package/dist/components/command-palette/command-palette.d.ts.map +1 -1
- package/dist/components/command-palette/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/description-list.d.ts.map +1 -1
- package/dist/components/description-list/index.js +1 -1
- package/dist/components/dialog/index.js +1 -1
- package/dist/components/dropdown-menu/dropdown-menu.d.ts.map +1 -1
- package/dist/components/dropdown-menu/index.js +1 -1
- package/dist/components/empty-state/empty-state.d.ts.map +1 -1
- package/dist/components/empty-state/index.js +1 -1
- package/dist/components/file-upload/index.js +1 -1
- package/dist/components/flag/flag.d.ts.map +1 -1
- package/dist/components/flag/index.js +1 -1
- package/dist/components/floating-action-button/floating-action-button.d.ts.map +1 -1
- package/dist/components/floating-action-button/index.js +1 -1
- package/dist/components/form-field/form-field.d.ts.map +1 -1
- package/dist/components/form-field/index.js +1 -1
- package/dist/components/freemium-paywall/freemium-paywall.d.ts.map +1 -1
- package/dist/components/freemium-paywall/index.js +1 -1
- package/dist/components/header/header.d.ts.map +1 -1
- package/dist/components/header/index.js +1 -1
- package/dist/components/icon-button/index.js +1 -1
- package/dist/components/icon-button-group/icon-button-group.d.ts.map +1 -1
- package/dist/components/icon-button-group/index.js +1 -1
- package/dist/components/kbd/index.js +1 -1
- package/dist/components/kbd/kbd.d.ts.map +1 -1
- package/dist/components/key-value-pair/index.js +1 -1
- package/dist/components/key-value-pair/key-value-pair.d.ts.map +1 -1
- package/dist/components/list/index.js +1 -1
- package/dist/components/list/list.d.ts.map +1 -1
- package/dist/components/live-region/index.js +1 -1
- package/dist/components/live-region/live-region.d.ts.map +1 -1
- package/dist/components/logo/index.js +1 -1
- package/dist/components/matrix-rain/index.js +1 -1
- package/dist/components/matrix-rain/matrix-rain.d.ts.map +1 -1
- package/dist/components/message-card/index.js +1 -1
- package/dist/components/message-card/message-card.d.ts.map +1 -1
- package/dist/components/message-tray/index.js +1 -1
- package/dist/components/message-tray/message-tray.d.ts.map +1 -1
- package/dist/components/multi-select/index.js +1 -1
- package/dist/components/multi-select/multi-select.d.ts.map +1 -1
- package/dist/components/navigation-menu/index.js +2 -2
- package/dist/components/navigation-menu/navigation-menu.d.ts.map +1 -1
- package/dist/components/notification-card/index.js +1 -1
- package/dist/components/notification-card/notification-card.d.ts.map +1 -1
- package/dist/components/notification-tray/index.js +1 -1
- package/dist/components/notification-tray/notification-tray.d.ts.map +1 -1
- package/dist/components/number-input/index.js +1 -1
- package/dist/components/number-input/number-input.d.ts.map +1 -1
- package/dist/components/otp-input/index.js +1 -1
- package/dist/components/otp-input/otp-input.d.ts.map +1 -1
- package/dist/components/pagination/index.js +1 -1
- package/dist/components/pagination/pagination.d.ts.map +1 -1
- package/dist/components/password-input/index.js +1 -1
- package/dist/components/payment-form/index.js +1 -1
- package/dist/components/pdf-viewer/index.js +1 -1
- package/dist/components/phone-input/index.js +1 -1
- package/dist/components/phone-input/phone-input.d.ts.map +1 -1
- package/dist/components/popover/index.js +1 -1
- package/dist/components/popover/popover.d.ts.map +1 -1
- package/dist/components/privacy-lock/index.js +1 -1
- package/dist/components/privacy-lock/privacy-lock.d.ts.map +1 -1
- package/dist/components/radio/index.js +1 -1
- package/dist/components/radio-group/index.js +2 -2
- package/dist/components/radio-group/radio-group.d.ts.map +1 -1
- package/dist/components/radio-group/radio.d.ts.map +1 -1
- package/dist/components/rich-text-editor/index.js +1 -1
- package/dist/components/scroll-area/index.js +1 -1
- package/dist/components/scroll-area/scroll-area.d.ts.map +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/select/select.d.ts.map +1 -1
- package/dist/components/separator/index.js +1 -1
- package/dist/components/separator/separator.d.ts.map +1 -1
- package/dist/components/sheet/index.js +1 -1
- package/dist/components/sheet/sheet.d.ts.map +1 -1
- package/dist/components/sidebar/index.js +1 -1
- package/dist/components/sidebar/sidebar.d.ts.map +1 -1
- package/dist/components/sign-in-with-alfadocs-button/index.js +1 -1
- package/dist/components/sign-in-with-alfadocs-button/sign-in-with-alfadocs-button.d.ts.map +1 -1
- package/dist/components/signature-capture/index.js +1 -1
- package/dist/components/skeleton/index.js +1 -1
- package/dist/components/skeleton/skeleton.d.ts.map +1 -1
- package/dist/components/skip-link/index.js +1 -1
- package/dist/components/skip-link/skip-link.d.ts.map +1 -1
- package/dist/components/slider/index.js +1 -1
- package/dist/components/slider/slider.d.ts.map +1 -1
- package/dist/components/slot-grid/index.js +1 -1
- package/dist/components/slot-grid/slot-grid.d.ts.map +1 -1
- package/dist/components/sparkline/index.js +1 -1
- package/dist/components/spinner/index.js +1 -1
- package/dist/components/spinner/spinner.d.ts.map +1 -1
- package/dist/components/stat/index.js +1 -1
- package/dist/components/stat/stat.d.ts.map +1 -1
- package/dist/components/stepper-accordion/index.js +1 -1
- package/dist/components/stepper-accordion/stepper-accordion.d.ts.map +1 -1
- package/dist/components/stepper-calendar/index.js +1 -1
- package/dist/components/stepper-calendar/stepper-calendar.d.ts.map +1 -1
- package/dist/components/stepper-progress/index.js +1 -1
- package/dist/components/stepper-progress/stepper-progress.d.ts.map +1 -1
- package/dist/components/streaming-text/index.js +1 -1
- package/dist/components/streaming-text/streaming-text.d.ts.map +1 -1
- package/dist/components/suggestion-chip/index.js +1 -1
- package/dist/components/suggestion-chip/suggestion-chip.d.ts.map +1 -1
- package/dist/components/switch/index.js +1 -1
- package/dist/components/switch/switch.d.ts.map +1 -1
- package/dist/components/tabs/index.js +1 -1
- package/dist/components/tabs/tabs.d.ts.map +1 -1
- package/dist/components/tag/index.js +1 -1
- package/dist/components/tag/tag.d.ts.map +1 -1
- package/dist/components/task-card/index.js +1 -1
- package/dist/components/task-card/task-card.d.ts.map +1 -1
- package/dist/components/task-tray/index.js +1 -1
- package/dist/components/task-tray/task-tray.d.ts.map +1 -1
- package/dist/components/text-area/index.js +1 -1
- package/dist/components/text-input/index.js +1 -1
- package/dist/components/text-input/text-input.d.ts.map +1 -1
- package/dist/components/theme-root/index.js +1 -1
- package/dist/components/theme-toggle/index.js +1 -1
- package/dist/components/theme-toggle/theme-toggle.d.ts.map +1 -1
- package/dist/components/time-picker/index.js +1 -1
- package/dist/components/time-picker/time-picker.d.ts.map +1 -1
- package/dist/components/timeline/index.js +1 -1
- package/dist/components/timeline/timeline.d.ts.map +1 -1
- package/dist/components/timestamp/index.js +1 -1
- package/dist/components/timestamp/timestamp.d.ts.map +1 -1
- package/dist/components/toast/index.js +1 -1
- package/dist/components/tooltip/index.js +1 -1
- package/dist/components/tooltip/tooltip.d.ts.map +1 -1
- package/dist/components/tooth-scheme/index.js +1 -1
- package/dist/components/transcript-panel/index.js +1 -1
- package/dist/components/transcript-panel/transcript-panel.d.ts.map +1 -1
- package/dist/components/typing-indicator/index.js +1 -1
- package/dist/components/typing-indicator/typing-indicator.d.ts.map +1 -1
- package/dist/components/visually-hidden/index.js +1 -1
- package/dist/components/warning-stack/index.js +1 -1
- package/dist/components/warning-stack/warning-stack.d.ts.map +1 -1
- package/dist/components/workflow/index.js +1 -1
- package/dist/components/workflow/workflow-card.d.ts.map +1 -1
- package/dist/components/workflow/workflow-editor.d.ts.map +1 -1
- package/dist/components/workflow/workflow-map.d.ts.map +1 -1
- package/dist/index.js +108 -108
- 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 +1 -1
- package/dist/_chunks/accordion-BJD1aM67.js.map +0 -1
- package/dist/_chunks/ai-prompt-input-CdYwt2VP.js.map +0 -1
- package/dist/_chunks/autocomplete.agent-Bi6CiRKa.js.map +0 -1
- package/dist/_chunks/avatar-BAhxbDEu.js.map +0 -1
- package/dist/_chunks/badge-zDghajh8.js.map +0 -1
- package/dist/_chunks/breadcrumb-pdUacgm1.js.map +0 -1
- package/dist/_chunks/button-DmiGFnNA.js.map +0 -1
- package/dist/_chunks/card-DeItIBcV.js.map +0 -1
- package/dist/_chunks/chat-input-3rstZhHR.js.map +0 -1
- package/dist/_chunks/chat-message-dDMVSYBs.js.map +0 -1
- package/dist/_chunks/checkbox-group-DBnIBRT_.js.map +0 -1
- package/dist/_chunks/collapsible-DPGQnHZh.js.map +0 -1
- package/dist/_chunks/color-picker-OKKF3Dww.js.map +0 -1
- package/dist/_chunks/combobox.agent-CfeB-IZ1.js.map +0 -1
- package/dist/_chunks/command-palette.agent-XLfSGHCL.js.map +0 -1
- package/dist/_chunks/date-range-picker-C3CbY__H.js.map +0 -1
- package/dist/_chunks/date-time-picker-Bn3FPeAc.js.map +0 -1
- package/dist/_chunks/description-list-B1CL3RTG.js.map +0 -1
- package/dist/_chunks/dropdown-menu-BnVUeVG3.js.map +0 -1
- package/dist/_chunks/file-upload.agent-DYFnqdxw.js.map +0 -1
- package/dist/_chunks/floating-action-button-RigP2E7o.js.map +0 -1
- package/dist/_chunks/form-field-DI5LY5aG.js.map +0 -1
- package/dist/_chunks/freemium-paywall-D0GiUFOe.js.map +0 -1
- package/dist/_chunks/icon-button-C482ii4y.js.map +0 -1
- package/dist/_chunks/kbd-DTcIjYA7.js.map +0 -1
- package/dist/_chunks/list-Cwe8mcmh.js.map +0 -1
- package/dist/_chunks/live-region-COggO6x6.js +0 -57
- package/dist/_chunks/message-card-DID3cXUW.js.map +0 -1
- package/dist/_chunks/message-tray-CVMLBnVp.js.map +0 -1
- package/dist/_chunks/multi-select.agent-BUKYZJfp.js.map +0 -1
- package/dist/_chunks/navigation-menu-NjwxyshT.js.map +0 -1
- package/dist/_chunks/number-input-D7rSa_ef.js.map +0 -1
- package/dist/_chunks/otp-input-C9R9sC74.js.map +0 -1
- package/dist/_chunks/pagination.agent-D75FB6XP.js.map +0 -1
- package/dist/_chunks/password-input-C6PvKyQV.js.map +0 -1
- package/dist/_chunks/payment-form-l3j-gA-t.js.map +0 -1
- package/dist/_chunks/phone-input-ZWa_FU4R.js.map +0 -1
- package/dist/_chunks/popover-CMr1pTPO.js.map +0 -1
- package/dist/_chunks/radio-B_gvGU29.js.map +0 -1
- package/dist/_chunks/radio-group-Bn8Wt0yc.js.map +0 -1
- package/dist/_chunks/rich-text-editor.agent-C1_E7_7t.js.map +0 -1
- package/dist/_chunks/scroll-area-Ba99pJ_R.js.map +0 -1
- package/dist/_chunks/search-bar-VoTqJhRp.js.map +0 -1
- package/dist/_chunks/select-DbxWF3O_.js.map +0 -1
- package/dist/_chunks/sheet-DyWqluiS.js.map +0 -1
- package/dist/_chunks/sidebar-B52iGGNV.js.map +0 -1
- package/dist/_chunks/sign-in-with-alfadocs-button-BU7MP5Hg.js +0 -44
- package/dist/_chunks/signature-capture.agent-4htVctJ2.js.map +0 -1
- package/dist/_chunks/slider-n8JWpJvT.js.map +0 -1
- package/dist/_chunks/slot-grid-BRAkqChA.js.map +0 -1
- package/dist/_chunks/spinner-CoAOGcDa.js.map +0 -1
- package/dist/_chunks/stepper-calendar-vtWwa2bY.js.map +0 -1
- package/dist/_chunks/tabs.agent-BDUlyPbJ.js.map +0 -1
- package/dist/_chunks/text-area-BqbruBWx.js.map +0 -1
- package/dist/_chunks/theme-root-vapFjsnt.js +0 -18
- package/dist/_chunks/theme-toggle-BHKMiORD.js.map +0 -1
- package/dist/_chunks/time-picker-DbpAmPux.js.map +0 -1
- package/dist/_chunks/timeline-vjsUeuq1.js.map +0 -1
- package/dist/_chunks/visually-hidden-Y3jcdCv-.js +0 -21
- package/dist/_chunks/warning-stack-B9N9yWet.js.map +0 -1
- package/dist/_chunks/workflow-map-gBhL_Wrs.js.map +0 -1
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"file-upload.agent-DYFnqdxw.js","sources":["../../node_modules/lucide-react/dist/esm/icons/cloud-upload.js","../../node_modules/lucide-react/dist/esm/icons/file-archive.js","../../node_modules/lucide-react/dist/esm/icons/file-image.js","../../node_modules/lucide-react/dist/esm/icons/file-spreadsheet.js","../../node_modules/lucide-react/dist/esm/icons/file.js","../../node_modules/lucide-react/dist/esm/icons/loader-circle.js","../../node_modules/lucide-react/dist/esm/icons/upload.js","../../src/components/file-upload/file-upload.tsx","../../src/components/file-upload/file-upload.agent.ts"],"sourcesContent":["/**\n * @license lucide-react v1.8.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst __iconNode = [\n [\"path\", { d: \"M12 13v8\", key: \"1l5pq0\" }],\n [\"path\", { d: \"M4 14.899A7 7 0 1 1 15.71 8h1.79a4.5 4.5 0 0 1 2.5 8.242\", key: \"1pljnt\" }],\n [\"path\", { d: \"m8 17 4-4 4 4\", key: \"1quai1\" }]\n];\nconst CloudUpload = createLucideIcon(\"cloud-upload\", __iconNode);\n\nexport { __iconNode, CloudUpload as default };\n//# sourceMappingURL=cloud-upload.js.map\n","/**\n * @license lucide-react v1.8.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst __iconNode = [\n [\n \"path\",\n {\n d: \"M13.659 22H18a2 2 0 0 0 2-2V8a2.4 2.4 0 0 0-.706-1.706l-3.588-3.588A2.4 2.4 0 0 0 14 2H6a2 2 0 0 0-2 2v11.5\",\n key: \"4pqfef\"\n }\n ],\n [\"path\", { d: \"M14 2v5a1 1 0 0 0 1 1h5\", key: \"wfsgrz\" }],\n [\"path\", { d: \"M8 12v-1\", key: \"1ej8lb\" }],\n [\"path\", { d: \"M8 18v-2\", key: \"qcmpov\" }],\n [\"path\", { d: \"M8 7V6\", key: \"1nbb54\" }],\n [\"circle\", { cx: \"8\", cy: \"20\", r: \"2\", key: \"ckkr5m\" }]\n];\nconst FileArchive = createLucideIcon(\"file-archive\", __iconNode);\n\nexport { __iconNode, FileArchive as default };\n//# sourceMappingURL=file-archive.js.map\n","/**\n * @license lucide-react v1.8.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst __iconNode = [\n [\n \"path\",\n {\n d: \"M6 22a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h8a2.4 2.4 0 0 1 1.704.706l3.588 3.588A2.4 2.4 0 0 1 20 8v12a2 2 0 0 1-2 2z\",\n key: \"1oefj6\"\n }\n ],\n [\"path\", { d: \"M14 2v5a1 1 0 0 0 1 1h5\", key: \"wfsgrz\" }],\n [\"circle\", { cx: \"10\", cy: \"12\", r: \"2\", key: \"737tya\" }],\n [\"path\", { d: \"m20 17-1.296-1.296a2.41 2.41 0 0 0-3.408 0L9 22\", key: \"wt3hpn\" }]\n];\nconst FileImage = createLucideIcon(\"file-image\", __iconNode);\n\nexport { __iconNode, FileImage as default };\n//# sourceMappingURL=file-image.js.map\n","/**\n * @license lucide-react v1.8.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst __iconNode = [\n [\n \"path\",\n {\n d: \"M6 22a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h8a2.4 2.4 0 0 1 1.704.706l3.588 3.588A2.4 2.4 0 0 1 20 8v12a2 2 0 0 1-2 2z\",\n key: \"1oefj6\"\n }\n ],\n [\"path\", { d: \"M14 2v5a1 1 0 0 0 1 1h5\", key: \"wfsgrz\" }],\n [\"path\", { d: \"M8 13h2\", key: \"yr2amv\" }],\n [\"path\", { d: \"M14 13h2\", key: \"un5t4a\" }],\n [\"path\", { d: \"M8 17h2\", key: \"2yhykz\" }],\n [\"path\", { d: \"M14 17h2\", key: \"10kma7\" }]\n];\nconst FileSpreadsheet = createLucideIcon(\"file-spreadsheet\", __iconNode);\n\nexport { __iconNode, FileSpreadsheet as default };\n//# sourceMappingURL=file-spreadsheet.js.map\n","/**\n * @license lucide-react v1.8.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst __iconNode = [\n [\n \"path\",\n {\n d: \"M6 22a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h8a2.4 2.4 0 0 1 1.704.706l3.588 3.588A2.4 2.4 0 0 1 20 8v12a2 2 0 0 1-2 2z\",\n key: \"1oefj6\"\n }\n ],\n [\"path\", { d: \"M14 2v5a1 1 0 0 0 1 1h5\", key: \"wfsgrz\" }]\n];\nconst File = createLucideIcon(\"file\", __iconNode);\n\nexport { __iconNode, File as default };\n//# sourceMappingURL=file.js.map\n","/**\n * @license lucide-react v1.8.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst __iconNode = [[\"path\", { d: \"M21 12a9 9 0 1 1-6.219-8.56\", key: \"13zald\" }]];\nconst LoaderCircle = createLucideIcon(\"loader-circle\", __iconNode);\n\nexport { __iconNode, LoaderCircle as default };\n//# sourceMappingURL=loader-circle.js.map\n","/**\n * @license lucide-react v1.8.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst __iconNode = [\n [\"path\", { d: \"M12 3v12\", key: \"1x0j5s\" }],\n [\"path\", { d: \"m17 8-5-5-5 5\", key: \"7q97r8\" }],\n [\"path\", { d: \"M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4\", key: \"ih7n3h\" }]\n];\nconst Upload = createLucideIcon(\"upload\", __iconNode);\n\nexport { __iconNode, Upload as default };\n//# sourceMappingURL=upload.js.map\n","import {\n forwardRef,\n useCallback,\n useEffect,\n useId,\n useMemo,\n useRef,\n useState,\n type ClipboardEvent,\n type ReactNode,\n} from 'react';\nimport { useDropzone, type FileRejection } from 'react-dropzone';\nimport { cva } from 'class-variance-authority';\nimport { useTranslation } from 'react-i18next';\nimport {\n AlertCircle,\n CheckCircle2,\n CloudUpload,\n File as FileIcon,\n FileArchive,\n FileImage,\n FileSpreadsheet,\n FileText,\n Loader2,\n Upload,\n X,\n} from 'lucide-react';\nimport { useFormField } from '../form-field/form-field-context';\n\n/* -------------------------------------------------------------------------- */\n/* Types */\n/* -------------------------------------------------------------------------- */\n\nexport interface FileUploadFile {\n file: File;\n id: string;\n status: 'pending' | 'uploading' | 'complete' | 'error';\n progress: number;\n preview?: string;\n error?: string;\n}\n\nexport interface FileUploadRejection {\n file: File;\n reason:\n | 'file-too-large'\n | 'file-too-small'\n | 'file-invalid-type'\n | 'too-many-files';\n}\n\nexport interface FileUploadProps {\n accept?: Record<string, string[]>;\n maxSize?: number;\n minSize?: number;\n maxFiles?: number;\n multiple?: boolean;\n disabled?: boolean;\n strictAccept?: boolean;\n onDrop?: (accepted: File[], rejected: FileUploadRejection[]) => void;\n onUpload?: (\n file: File,\n helpers: {\n signal: AbortSignal;\n onProgress: (percent: number) => void;\n },\n ) => Promise<void>;\n onRemove?: (file: FileUploadFile) => void;\n onReject?: (rejections: FileUploadRejection[]) => void;\n variant?: 'dropzone' | 'button' | 'both';\n showPreview?: boolean;\n className?: string;\n}\n\n/* -------------------------------------------------------------------------- */\n/* CVA */\n/* -------------------------------------------------------------------------- */\n\nconst dropzoneVariants = cva(\n [\n 'ds:relative ds:flex ds:flex-col ds:items-center ds:justify-center',\n 'ds:min-h-48 ds:px-[var(--spacing-lg)] ds:py-[var(--spacing-xl)]',\n 'ds:rounded-[var(--radius-lg)] ds:border-2 ds:border-dashed',\n 'ds:bg-background',\n 'ds:transition-all 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:cursor-pointer',\n 'ds:group',\n ].join(' '),\n {\n variants: {\n isDragActive: {\n true: 'ds:border-primary ds:bg-primary/10 ds:scale-[1.01]',\n false: 'ds:border-border ds:hover:border-muted-foreground/40 ds:hover:bg-muted/5',\n },\n hasError: {\n true: 'ds:border-destructive ds:bg-destructive/5 ds:hover:border-destructive',\n false: '',\n },\n isDisabled: {\n true: 'ds:cursor-not-allowed ds:opacity-50 ds:hover:border-border ds:hover:bg-background',\n false: '',\n },\n },\n defaultVariants: {\n isDragActive: false,\n hasError: false,\n isDisabled: false,\n },\n },\n);\n\nconst browseButtonVariants = cva(\n [\n 'ds:inline-flex ds:items-center ds:justify-center ds:gap-[var(--spacing-xs)]',\n 'ds:min-h-[var(--min-target-size)] ds:min-w-[var(--min-target-size)]',\n 'ds:rounded-[var(--radius-md)] ds:border ds:border-primary/30 ds:bg-primary/5',\n 'ds:ps-[var(--spacing-md)] ds:pe-[var(--spacing-md)] ds:py-[var(--spacing-sm)]',\n 'ds:text-primary ds:text-[var(--font-size-sm)] ds:font-medium',\n 'ds:transition-all ds:duration-[var(--animation-duration)] ds:motion-reduce:transition-none',\n 'ds:hover:bg-primary/10 ds:hover:border-primary/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 'ds:disabled:cursor-not-allowed ds:disabled:opacity-50',\n ].join(' '),\n);\n\nconst fileItemVariants = cva(\n [\n 'ds:flex ds:items-center ds:gap-[var(--spacing-md)]',\n 'ds:rounded-[var(--radius-md)] ds:border ds:bg-background',\n 'ds:p-[var(--spacing-md)]',\n 'ds:text-[var(--font-size-sm)] ds:text-foreground',\n 'ds:transition-all ds:duration-[var(--animation-duration)] ds:motion-reduce:transition-none',\n ].join(' '),\n {\n variants: {\n status: {\n pending: 'ds:border-border',\n uploading: 'ds:border-primary/30 ds:bg-primary/[0.02]',\n complete: 'ds:border-[var(--success)]/30 ds:bg-[var(--success)]/[0.02]',\n error: 'ds:border-destructive/30 ds:bg-destructive/[0.02]',\n },\n },\n defaultVariants: {\n status: 'pending',\n },\n },\n);\n\nconst actionButtonVariants = cva(\n [\n 'ds:inline-flex ds:items-center ds:justify-center',\n 'ds:min-h-[var(--min-target-size)] ds:min-w-[var(--min-target-size)]',\n 'ds:rounded-[var(--radius-sm)]',\n 'ds:text-muted-foreground',\n 'ds:transition-colors ds:duration-[var(--animation-duration)] ds:motion-reduce:transition-none',\n 'ds:hover:text-foreground ds:hover:bg-muted/40',\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\n/* -------------------------------------------------------------------------- */\n/* Helpers */\n/* -------------------------------------------------------------------------- */\n\nfunction generateId(): string {\n if (typeof crypto !== 'undefined' && crypto.randomUUID) {\n return crypto.randomUUID();\n }\n return `${Date.now()}-${Math.random().toString(36).slice(2, 11)}`;\n}\n\nfunction isImageFile(file: File): boolean {\n return file.type.startsWith('image/');\n}\n\nfunction getFileIcon(file: File): ReactNode {\n const ext = file.name.split('.').pop()?.toLowerCase() ?? '';\n if (['pdf', 'doc', 'docx', 'txt', 'rtf'].includes(ext)) {\n return <FileText aria-hidden=\"true\" className=\"ds:size-10 ds:shrink-0 ds:text-muted-foreground\" />;\n }\n if (['zip', 'rar', '7z', 'tar', 'gz'].includes(ext)) {\n return <FileArchive aria-hidden=\"true\" className=\"ds:size-10 ds:shrink-0 ds:text-muted-foreground\" />;\n }\n if (['xls', 'xlsx', 'csv'].includes(ext)) {\n return <FileSpreadsheet aria-hidden=\"true\" className=\"ds:size-10 ds:shrink-0 ds:text-muted-foreground\" />;\n }\n if (['png', 'jpg', 'jpeg', 'gif', 'webp', 'svg', 'bmp'].includes(ext)) {\n return <FileImage aria-hidden=\"true\" className=\"ds:size-10 ds:shrink-0 ds:text-muted-foreground\" />;\n }\n return <FileIcon aria-hidden=\"true\" className=\"ds:size-10 ds:shrink-0 ds:text-muted-foreground\" />;\n}\n\nfunction getStatusIcon(status: FileUploadFile['status']): ReactNode {\n switch (status) {\n case 'uploading':\n return <Loader2 aria-hidden=\"true\" className=\"ds:size-4 ds:shrink-0 ds:text-primary ds:animate-spin\" />;\n case 'complete':\n return <CheckCircle2 aria-hidden=\"true\" className=\"ds:size-4 ds:shrink-0 ds:text-[var(--success)]\" />;\n case 'error':\n return <AlertCircle aria-hidden=\"true\" className=\"ds:size-4 ds:shrink-0 ds:text-destructive\" />;\n default:\n return null;\n }\n}\n\nconst UNIT_KEYS = [\n 'ui.inputs.fileUpload.units.bytes',\n 'ui.inputs.fileUpload.units.kilobytes',\n 'ui.inputs.fileUpload.units.megabytes',\n 'ui.inputs.fileUpload.units.gigabytes',\n] as const;\n\nconst UNIT_FALLBACKS = ['B', 'KB', 'MB', 'GB'] as const;\n\nfunction formatFileSize(\n bytes: number,\n locale: string,\n t: (key: string, fallback: string) => string,\n): string {\n let value = bytes;\n let unitIndex = 0;\n while (value >= 1024 && unitIndex < UNIT_FALLBACKS.length - 1) {\n value /= 1024;\n unitIndex++;\n }\n const formatted = new Intl.NumberFormat(locale, {\n maximumFractionDigits: unitIndex === 0 ? 0 : 1,\n }).format(value);\n const unit = t(UNIT_KEYS[unitIndex], UNIT_FALLBACKS[unitIndex]);\n return `${formatted} ${unit}`;\n}\n\nfunction mapRejectionCode(\n code: string,\n): FileUploadRejection['reason'] {\n switch (code) {\n case 'file-too-large':\n return 'file-too-large';\n case 'file-too-small':\n return 'file-too-small';\n case 'file-invalid-type':\n return 'file-invalid-type';\n case 'too-many-files':\n return 'too-many-files';\n default:\n return 'file-invalid-type';\n }\n}\n\nfunction getExtensionFromName(name: string): string {\n const parts = name.split('.');\n return parts.length > 1 ? `.${parts.pop()!.toLowerCase()}` : '';\n}\n\nfunction formatAcceptHint(accept: Record<string, string[]>): string {\n const extensions: string[] = [];\n for (const exts of Object.values(accept)) {\n for (const ext of exts) {\n extensions.push(ext.toUpperCase().replace('.', ''));\n }\n }\n if (extensions.length > 0) return extensions.join(', ');\n const mimeLabels: string[] = [];\n for (const mime of Object.keys(accept)) {\n if (mime.endsWith('/*')) {\n mimeLabels.push(mime.replace('/*', '').split('/').pop() ?? mime);\n } else {\n mimeLabels.push(mime.split('/').pop() ?? mime);\n }\n }\n return mimeLabels.join(', ');\n}\n\n/* -------------------------------------------------------------------------- */\n/* Component */\n/* -------------------------------------------------------------------------- */\n\nexport const FileUpload = forwardRef<HTMLDivElement, FileUploadProps>(\n (\n {\n accept,\n maxSize,\n minSize,\n maxFiles = 1,\n multiple = false,\n disabled,\n strictAccept = false,\n onDrop: onDropProp,\n onUpload,\n onRemove,\n onReject,\n variant = 'both',\n showPreview = true,\n className,\n },\n ref,\n ) => {\n const { t, i18n } = useTranslation();\n const ctx = useFormField();\n const fallbackId = useId();\n\n const effectiveDisabled = ctx.disabled || disabled;\n const hasError = ctx.invalid;\n const inputId = ctx.id || fallbackId;\n\n const [files, setFiles] = useState<FileUploadFile[]>([]);\n const [rejections, setRejections] = useState<FileUploadRejection[]>([]);\n const abortControllers = useRef<Map<string, AbortController>>(new Map());\n const statusRef = useRef<HTMLSpanElement>(null);\n const filesRef = useRef<FileUploadFile[]>(files);\n filesRef.current = files;\n\n const announceStatus = useCallback((message: string) => {\n if (statusRef.current) {\n statusRef.current.textContent = message;\n }\n }, []);\n\n const validateStrictAccept = useCallback(\n (file: File): boolean => {\n if (!strictAccept || !accept) return true;\n for (const [mime, extensions] of Object.entries(accept)) {\n const mimeMatch =\n mime === '*/*' ||\n (mime.endsWith('/*') && file.type.startsWith(mime.replace('/*', '/'))) ||\n file.type === mime;\n const fileExt = getExtensionFromName(file.name);\n const extMatch =\n extensions.length === 0 ||\n extensions.some((ext) => ext.toLowerCase() === fileExt);\n if (mimeMatch && extMatch) return true;\n }\n return false;\n },\n [strictAccept, accept],\n );\n\n const uploadFile = useCallback(\n async (uploadFileState: FileUploadFile) => {\n if (!onUpload) return;\n const controller = new AbortController();\n abortControllers.current.set(uploadFileState.id, controller);\n\n setFiles((prev) =>\n prev.map((f) =>\n f.id === uploadFileState.id ? { ...f, status: 'uploading', progress: 0 } : f,\n ),\n );\n announceStatus(t('ui.inputs.fileUpload.uploading', 'Uploading\\u2026'));\n\n try {\n await onUpload(uploadFileState.file, {\n signal: controller.signal,\n onProgress: (percent: number) => {\n setFiles((prev) =>\n prev.map((f) =>\n f.id === uploadFileState.id ? { ...f, progress: percent } : f,\n ),\n );\n announceStatus(\n t('ui.inputs.fileUpload.progress', '{{percent}}% uploaded', {\n percent,\n }),\n );\n },\n });\n setFiles((prev) =>\n prev.map((f) =>\n f.id === uploadFileState.id\n ? { ...f, status: 'complete', progress: 100 }\n : f,\n ),\n );\n announceStatus(t('ui.inputs.fileUpload.complete', 'Upload complete'));\n } catch (err: unknown) {\n if (controller.signal.aborted) {\n setFiles((prev) => prev.filter((f) => f.id !== uploadFileState.id));\n return;\n }\n const errorMessage =\n err instanceof Error ? err.message : t('ui.inputs.fileUpload.errors.uploadFailed', 'Upload failed');\n setFiles((prev) =>\n prev.map((f) =>\n f.id === uploadFileState.id\n ? { ...f, status: 'error', error: errorMessage }\n : f,\n ),\n );\n } finally {\n abortControllers.current.delete(uploadFileState.id);\n }\n },\n [onUpload, announceStatus, t],\n );\n\n const handleDrop = useCallback(\n (accepted: File[], fileRejections: FileRejection[]) => {\n const mapped: FileUploadRejection[] = fileRejections.flatMap((r) =>\n r.errors.map((e) => ({\n file: r.file,\n reason: mapRejectionCode(e.code),\n })),\n );\n\n const strictRejected: FileUploadRejection[] = [];\n const strictAccepted: File[] = [];\n for (const file of accepted) {\n if (!validateStrictAccept(file)) {\n strictRejected.push({ file, reason: 'file-invalid-type' });\n } else {\n strictAccepted.push(file);\n }\n }\n\n const allRejections = [...mapped, ...strictRejected];\n setRejections(allRejections);\n\n if (allRejections.length > 0) {\n onReject?.(allRejections);\n }\n\n const newFiles: FileUploadFile[] = strictAccepted.map((file) => ({\n file,\n id: generateId(),\n status: 'pending' as const,\n progress: 0,\n preview: isImageFile(file) ? URL.createObjectURL(file) : undefined,\n }));\n\n setFiles((prev) => {\n if (!multiple && maxFiles === 1) {\n for (const f of prev) {\n if (f.preview) URL.revokeObjectURL(f.preview);\n }\n return newFiles;\n }\n return [...prev, ...newFiles];\n });\n\n onDropProp?.(strictAccepted, allRejections);\n announceStatus(\n t('ui.inputs.fileUpload.filesSelected', '{{count}} file(s) selected', {\n count: strictAccepted.length,\n }),\n );\n\n for (const nf of newFiles) {\n void uploadFile(nf);\n }\n },\n [\n multiple,\n maxFiles,\n onDropProp,\n onReject,\n validateStrictAccept,\n announceStatus,\n uploadFile,\n t,\n ],\n );\n\n const { getRootProps, getInputProps, isDragActive, open } = useDropzone({\n accept,\n maxSize,\n minSize,\n maxFiles: multiple ? maxFiles : 1,\n multiple,\n disabled: effectiveDisabled,\n onDrop: handleDrop,\n noClick: variant === 'button',\n noKeyboard: variant === 'button',\n });\n\n const handleCancel = useCallback(\n (fileId: string) => {\n const controller = abortControllers.current.get(fileId);\n controller?.abort();\n setFiles((prev) => {\n const file = prev.find((f) => f.id === fileId);\n if (file?.preview) URL.revokeObjectURL(file.preview);\n return prev.filter((f) => f.id !== fileId);\n });\n },\n [],\n );\n\n const handleRemove = useCallback(\n (fileId: string) => {\n const removed = filesRef.current.find((f) => f.id === fileId);\n if (removed?.preview) URL.revokeObjectURL(removed.preview);\n setFiles((prev) => prev.filter((f) => f.id !== fileId));\n if (removed) {\n onRemove?.(removed);\n }\n },\n [onRemove],\n );\n\n const validatePastedFiles = useCallback(\n (pastedFiles: File[]): { accepted: File[]; rejected: FileUploadRejection[] } => {\n const accepted: File[] = [];\n const rejected: FileUploadRejection[] = [];\n const effectiveMaxFiles = multiple ? maxFiles : 1;\n\n for (const file of pastedFiles) {\n if (accepted.length >= effectiveMaxFiles) {\n rejected.push({ file, reason: 'too-many-files' });\n continue;\n }\n if (maxSize !== undefined && file.size > maxSize) {\n rejected.push({ file, reason: 'file-too-large' });\n continue;\n }\n if (minSize !== undefined && file.size < minSize) {\n rejected.push({ file, reason: 'file-too-small' });\n continue;\n }\n if (accept) {\n const fileExt = getExtensionFromName(file.name);\n const typeMatch = Object.entries(accept).some(([mime, extensions]) => {\n const mimeOk =\n mime === '*/*' ||\n (mime.endsWith('/*') && file.type.startsWith(mime.replace('/*', '/'))) ||\n file.type === mime;\n const extOk =\n extensions.length > 0 &&\n extensions.some((ext) => ext.toLowerCase() === fileExt);\n return mimeOk || extOk;\n });\n if (!typeMatch) {\n rejected.push({ file, reason: 'file-invalid-type' });\n continue;\n }\n }\n accepted.push(file);\n }\n return { accepted, rejected };\n },\n [accept, maxSize, minSize, maxFiles, multiple],\n );\n\n const handlePaste = useCallback(\n (event: ClipboardEvent<HTMLDivElement>) => {\n if (effectiveDisabled) return;\n const pastedFiles = Array.from(event.clipboardData.files);\n if (pastedFiles.length > 0) {\n event.preventDefault();\n const { accepted, rejected } = validatePastedFiles(pastedFiles);\n const fileRejections: FileRejection[] = rejected.map((r) => ({\n file: r.file,\n errors: [{ code: r.reason, message: r.reason }],\n }));\n handleDrop(accepted, fileRejections);\n }\n },\n [effectiveDisabled, handleDrop, validatePastedFiles],\n );\n\n useEffect(() => {\n return () => {\n for (const f of filesRef.current) {\n if (f.preview) URL.revokeObjectURL(f.preview);\n }\n };\n }, []);\n\n const constraintHints = useMemo(() => {\n const hints: string[] = [];\n if (accept) {\n hints.push(formatAcceptHint(accept));\n }\n if (maxSize) {\n hints.push(\n t('ui.inputs.fileUpload.maxSizeHint', 'Max {{size}}', {\n size: formatFileSize(maxSize, i18n.language, t),\n }),\n );\n }\n if (multiple && maxFiles > 1) {\n hints.push(\n t('ui.inputs.fileUpload.maxFilesHint', 'Up to {{count}} files', {\n count: maxFiles,\n }),\n );\n }\n return hints;\n }, [accept, maxSize, multiple, maxFiles, t, i18n.language]);\n\n const errorMessages = useMemo(() => {\n return rejections.map((r) => {\n switch (r.reason) {\n case 'file-too-large':\n return t('ui.inputs.fileUpload.errors.fileTooLarge', 'File exceeds {{maxSize}}', {\n maxSize: maxSize ? formatFileSize(maxSize, i18n.language, t) : '',\n });\n case 'file-too-small':\n return t('ui.inputs.fileUpload.errors.fileTooSmall', 'File is smaller than {{minSize}}', {\n minSize: minSize ? formatFileSize(minSize, i18n.language, t) : '',\n });\n case 'file-invalid-type':\n return t('ui.inputs.fileUpload.errors.fileInvalidType', 'File type not accepted');\n case 'too-many-files':\n return t('ui.inputs.fileUpload.errors.tooManyFiles', 'Maximum {{maxFiles}} files allowed', {\n maxFiles,\n });\n }\n });\n }, [rejections, t, maxSize, minSize, maxFiles, i18n.language]);\n\n const renderFileList = () => {\n if (files.length === 0) return null;\n\n return (\n <ul className=\"ds:mt-[var(--spacing-md)] ds:flex ds:flex-col ds:gap-[var(--spacing-sm)] ds:list-none ds:p-0 ds:m-0\">\n {files.map((f) => (\n <li key={f.id} className={fileItemVariants({ status: f.status })}>\n {showPreview && f.preview ? (\n <img\n src={f.preview}\n alt=\"\"\n aria-hidden=\"true\"\n className=\"ds:size-12 ds:shrink-0 ds:rounded-[var(--radius-md)] ds:object-cover ds:border ds:border-border\"\n />\n ) : (\n getFileIcon(f.file)\n )}\n\n <div className=\"ds:flex-1 ds:min-w-0\">\n <div className=\"ds:flex ds:items-center ds:gap-[var(--spacing-xs)]\">\n <p className=\"ds:truncate type-label ds:m-0\">{f.file.name}</p>\n {getStatusIcon(f.status)}\n </div>\n <p className=\"type-meta ds:text-muted-foreground ds:m-0 ds:mt-0.5\">\n {formatFileSize(f.file.size, i18n.language, t)}\n {f.status === 'uploading' && (\n <span className=\"ds:ms-[var(--spacing-sm)] ds:text-primary ds:font-medium\">\n {f.progress}%\n </span>\n )}\n {f.status === 'complete' && (\n <span className=\"ds:ms-[var(--spacing-sm)] ds:text-[var(--success)] ds:font-medium\">\n {t('ui.inputs.fileUpload.complete', 'Complete')}\n </span>\n )}\n </p>\n\n {f.status === 'uploading' && (\n <div\n role=\"progressbar\"\n aria-label={f.file.name}\n aria-valuenow={f.progress}\n aria-valuemin={0}\n aria-valuemax={100}\n className=\"ds:mt-[var(--spacing-sm)] ds:h-1.5 ds:w-full ds:rounded-[var(--radius-full)] ds:bg-muted ds:overflow-hidden\"\n >\n <div\n className=\"ds:h-full ds:rounded-[var(--radius-full)] ds:bg-primary ds:transition-[inline-size] ds:duration-[var(--animation-duration)] ds:motion-reduce:transition-none\"\n style={{ inlineSize: `${f.progress}%` }}\n />\n </div>\n )}\n\n {f.status === 'error' && f.error && (\n <p role=\"alert\" className=\"type-meta ds:text-destructive ds:m-0 ds:mt-[var(--spacing-xs)]\">\n {f.error}\n </p>\n )}\n </div>\n\n {f.status === 'uploading' && (\n <button\n type=\"button\"\n onClick={() => handleCancel(f.id)}\n aria-label={t('ui.inputs.fileUpload.cancel', 'Cancel upload')}\n className={actionButtonVariants()}\n >\n <X aria-hidden=\"true\" className=\"ds:size-4\" />\n </button>\n )}\n {(f.status === 'complete' || f.status === 'pending' || f.status === 'error') && (\n <button\n type=\"button\"\n onClick={() => handleRemove(f.id)}\n aria-label={t('ui.inputs.fileUpload.remove', 'Remove file')}\n className={actionButtonVariants()}\n >\n <X aria-hidden=\"true\" className=\"ds:size-4\" />\n </button>\n )}\n </li>\n ))}\n </ul>\n );\n };\n\n const renderDropzone = () => {\n if (variant === 'button') return null;\n\n const rootProps = getRootProps({\n className: dropzoneVariants({\n isDragActive,\n hasError: hasError ?? false,\n isDisabled: effectiveDisabled ?? false,\n className,\n }),\n tabIndex: effectiveDisabled ? -1 : 0,\n });\n\n return (\n <div\n {...rootProps}\n ref={ref}\n onPaste={handlePaste}\n id={inputId}\n aria-label={t('ui.inputs.fileUpload.dropHere', 'Drop files here or click to browse')}\n aria-describedby={ctx.describedBy || undefined}\n aria-invalid={ctx.invalid || undefined}\n aria-required={ctx.required || undefined}\n data-testid=\"file-upload-dropzone\"\n >\n <input {...getInputProps()} />\n\n <div className=\"ds:flex ds:flex-col ds:items-center ds:gap-[var(--spacing-sm)]\">\n <div className=\"ds:flex ds:items-center ds:justify-center ds:size-14 ds:rounded-[var(--radius-full)] ds:bg-primary/10 ds:text-primary ds:transition-colors ds:duration-[var(--animation-duration)] ds:group-hover:bg-primary/15 ds:motion-reduce:transition-none\">\n {isDragActive ? (\n <CloudUpload aria-hidden=\"true\" className=\"ds:size-7\" />\n ) : (\n <Upload aria-hidden=\"true\" className=\"ds:size-7\" />\n )}\n </div>\n\n <div className=\"ds:flex ds:flex-col ds:items-center ds:gap-[var(--spacing-xs)]\">\n <p className=\"type-label ds:text-foreground ds:text-center ds:m-0\">\n {isDragActive\n ? t('ui.inputs.fileUpload.dropActive', 'Drop files here')\n : t('ui.inputs.fileUpload.dropHere', 'Drop files here or click to browse')}\n </p>\n\n {constraintHints.length > 0 && !isDragActive && (\n <p className=\"type-meta ds:text-muted-foreground ds:text-center ds:m-0\">\n {constraintHints.join(' \\u00b7 ')}\n </p>\n )}\n </div>\n\n {variant === 'both' && !isDragActive && (\n <button\n type=\"button\"\n onClick={(e) => {\n e.stopPropagation();\n open();\n }}\n disabled={effectiveDisabled}\n className={browseButtonVariants({ className: 'mt-[var(--spacing-xs)]' })}\n >\n <Upload aria-hidden=\"true\" className=\"ds:size-4\" />\n {t('ui.inputs.fileUpload.browse', 'Browse files')}\n </button>\n )}\n </div>\n </div>\n );\n };\n\n const renderButton = () => {\n if (variant === 'dropzone') return null;\n\n if (variant === 'button') {\n return (\n <div onPaste={handlePaste} ref={ref}>\n <input {...getInputProps()} />\n <button\n type=\"button\"\n onClick={open}\n disabled={effectiveDisabled}\n className={browseButtonVariants({ className })}\n id={variant === 'button' ? inputId : undefined}\n aria-describedby={variant === 'button' ? (ctx.describedBy || undefined) : undefined}\n aria-invalid={variant === 'button' ? (ctx.invalid || undefined) : undefined}\n aria-required={variant === 'button' ? (ctx.required || undefined) : undefined}\n >\n <Upload aria-hidden=\"true\" className=\"ds:size-4\" />\n {t('ui.inputs.fileUpload.browse', 'Browse files')}\n </button>\n </div>\n );\n }\n\n return null;\n };\n\n return (\n <div>\n {renderDropzone()}\n {renderButton()}\n {renderFileList()}\n\n {errorMessages.length > 0 && (\n <div role=\"alert\" className=\"ds:mt-[var(--spacing-sm)] ds:flex ds:flex-col ds:gap-[var(--spacing-xs)]\">\n {errorMessages.map((msg, i) => (\n <div key={i} className=\"ds:flex ds:items-center ds:gap-[var(--spacing-xs)]\">\n <AlertCircle aria-hidden=\"true\" className=\"ds:size-3.5 ds:shrink-0 ds:text-destructive\" />\n <p className=\"type-meta ds:text-destructive ds:m-0\">{msg}</p>\n </div>\n ))}\n </div>\n )}\n\n <span\n ref={statusRef}\n role=\"status\"\n aria-live=\"polite\"\n className=\"ds:sr-only\"\n />\n </div>\n );\n },\n);\n\nFileUpload.displayName = 'FileUpload';\n","import type { AgentAdapter } from '../../agent/types';\n\nexport const fileUploadAgent: AgentAdapter<unknown> = {\n id: 'file-upload',\n capabilities: ['submit', 'dismiss'],\n state: {},\n actions: {},\n domHooks: {\n root: { attr: 'data-component', value: 'file-upload' },\n },\n};\n"],"names":["__iconNode","CloudUpload","createLucideIcon","FileArchive","FileImage","FileSpreadsheet","File","LoaderCircle","Upload","dropzoneVariants","cva","browseButtonVariants","fileItemVariants","actionButtonVariants","generateId","isImageFile","file","getFileIcon","ext","_a","jsx","FileText","FileIcon","getStatusIcon","status","Loader2","CheckCircle2","AlertCircle","UNIT_KEYS","UNIT_FALLBACKS","formatFileSize","bytes","locale","t","value","unitIndex","formatted","unit","mapRejectionCode","code","getExtensionFromName","name","parts","formatAcceptHint","accept","extensions","exts","mimeLabels","mime","FileUpload","forwardRef","maxSize","minSize","maxFiles","multiple","disabled","strictAccept","onDropProp","onUpload","onRemove","onReject","variant","showPreview","className","ref","i18n","useTranslation","ctx","useFormField","fallbackId","useId","effectiveDisabled","hasError","inputId","files","setFiles","useState","rejections","setRejections","abortControllers","useRef","statusRef","filesRef","announceStatus","useCallback","message","validateStrictAccept","mimeMatch","fileExt","extMatch","uploadFile","uploadFileState","controller","prev","f","percent","err","errorMessage","handleDrop","accepted","fileRejections","mapped","r","e","strictRejected","strictAccepted","allRejections","newFiles","nf","getRootProps","getInputProps","isDragActive","open","useDropzone","handleCancel","fileId","handleRemove","removed","validatePastedFiles","pastedFiles","rejected","effectiveMaxFiles","mimeOk","extOk","handlePaste","event","useEffect","constraintHints","useMemo","hints","errorMessages","renderFileList","jsxs","X","renderDropzone","rootProps","renderButton","msg","i","fileUploadAgent"],"mappings":"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","x_google_ignoreList":[0,1,2,3,4,5,6]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"floating-action-button-RigP2E7o.js","sources":["../../src/components/floating-action-button/floating-action-button.tsx"],"sourcesContent":["import {\n forwardRef,\n type ButtonHTMLAttributes,\n type ReactNode,\n} from 'react';\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport { useTranslation } from 'react-i18next';\n\nconst fabVariants = cva(\n [\n // `relative` anchors the `::before` hit-target expansion on `sm`.\n 'ds:relative ds:inline-flex ds:items-center ds:justify-center',\n 'ds:font-medium ds:whitespace-nowrap',\n 'ds:rounded-full',\n 'ds:shadow-[var(--shadow-lg)] ds:hover:shadow-[var(--shadow-xl)] ds:active:shadow-[var(--shadow-md)]',\n 'ds:transition-[box-shadow,background-color,transform]',\n 'ds:duration-[var(--animation-duration)]',\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 // Under Windows High Contrast Mode the `shadow-*` affordance is stripped.\n // Repaint a solid edge + swap the focus ring to CanvasText so the FAB\n // remains identifiable and its focus state stays visible.\n 'ds:forced-colors:border ds:forced-colors:border-[ButtonBorder] ds:forced-colors:focus-visible:outline-[CanvasText]',\n 'ds:disabled:opacity-50 ds:disabled:cursor-not-allowed ds:disabled:shadow-[var(--shadow-md)]',\n 'ds:motion-reduce:transition-none',\n ].join(' '),\n {\n variants: {\n variant: {\n primary:\n 'ds:bg-primary ds:text-primary-foreground ds:hover:bg-primary-hover',\n secondary:\n 'ds:bg-accent ds:text-accent-foreground ds:hover:bg-accent-hover',\n },\n size: {\n // `sm` is 40x40 which sits below the 44/48 px WCAG 2.5.5 target.\n // Mirror Button's pseudo-expansion pattern: below the `sm:` (640 px)\n // breakpoint, a `::before` rectangle enlarges the hit area to\n // `--min-target-size` (44 default, 48 accessible). Above the\n // breakpoint (desktop / trackpad), the physical 40 px circle is\n // enough — the pseudo hides.\n sm: 'ds:h-10 ds:w-10 ds:text-[var(--font-size-sm)] ds:[&_svg]:size-5 ds:before:absolute ds:before:inset-x-[calc((var(--min-target-size)-100%)/-2)] ds:before:inset-y-[calc((var(--min-target-size)-100%)/-2)] ds:before:content-[\"\"] ds:sm:before:hidden',\n md: 'ds:h-14 ds:w-14 ds:text-[var(--font-size-base)] ds:[&_svg]:size-6',\n lg: 'ds:h-16 ds:w-16 ds:text-[var(--font-size-lg)] ds:[&_svg]:size-7',\n },\n extended: {\n true: 'ds:w-auto ds:gap-[var(--spacing-sm)]',\n false: '',\n },\n position: {\n 'bottom-end':\n 'ds:fixed ds:z-[var(--z-fixed)] ds:bottom-[calc(var(--spacing-lg)+env(safe-area-inset-bottom,0px))] ds:end-[var(--spacing-lg)]',\n 'bottom-start':\n 'ds:fixed ds:z-[var(--z-fixed)] ds:bottom-[calc(var(--spacing-lg)+env(safe-area-inset-bottom,0px))] ds:start-[var(--spacing-lg)]',\n 'top-end':\n 'ds:fixed ds:z-[var(--z-fixed)] ds:top-[calc(var(--spacing-lg)+env(safe-area-inset-top,0px))] ds:end-[var(--spacing-lg)]',\n 'top-start':\n 'ds:fixed ds:z-[var(--z-fixed)] ds:top-[calc(var(--spacing-lg)+env(safe-area-inset-top,0px))] ds:start-[var(--spacing-lg)]',\n static: '',\n },\n },\n compoundVariants: [\n { extended: true, size: 'sm', class: 'ds:ps-3 ds:pe-4' },\n { extended: true, size: 'md', class: 'ds:ps-4 ds:pe-5' },\n { extended: true, size: 'lg', class: 'ds:ps-5 ds:pe-6' },\n ],\n defaultVariants: {\n variant: 'primary',\n size: 'md',\n extended: false,\n position: 'bottom-end',\n },\n },\n);\n\ntype FabBaseProps = ButtonHTMLAttributes<HTMLButtonElement> &\n VariantProps<typeof fabVariants>;\n\ninterface CircularFabProps extends FabBaseProps {\n extended?: false;\n icon: ReactNode;\n 'aria-label': string;\n children?: never;\n}\n\ninterface ExtendedFabProps extends FabBaseProps {\n extended: true;\n icon?: ReactNode;\n children: ReactNode;\n}\n\nexport type FloatingActionButtonProps = CircularFabProps | ExtendedFabProps;\n\nexport const FloatingActionButton = forwardRef<\n HTMLButtonElement,\n FloatingActionButtonProps\n>((props, ref) => {\n const {\n variant,\n size,\n extended,\n position,\n className,\n icon,\n children,\n type,\n ...rest\n } = props;\n const { t } = useTranslation();\n\n const ariaLabel =\n rest['aria-label'] ??\n (!extended ? t('ui.common.add', { defaultValue: 'Add' }) : undefined);\n\n return (\n <button\n ref={ref}\n type={type ?? 'button'}\n className={fabVariants({ variant, size, extended, position, className })}\n {...rest}\n aria-label={ariaLabel}\n >\n {icon ? (\n <span aria-hidden=\"true\" className=\"ds:inline-flex ds:items-center ds:justify-center\">\n {icon}\n </span>\n ) : null}\n {extended ? <span className=\"ds:inline-flex\">{children}</span> : null}\n </button>\n );\n});\n\nFloatingActionButton.displayName = 'FloatingActionButton';\n"],"names":["fabVariants","cva","FloatingActionButton","forwardRef","props","ref","variant","size","extended","position","className","icon","children","type","rest","t","useTranslation","ariaLabel","jsxs","jsx"],"mappings":";;;;AAQA,MAAMA,IAAcC;AAAA,EAClB;AAAA;AAAA,IAEE;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA;AAAA;AAAA;AAAA,IAIA;AAAA,IACA;AAAA,IACA;AAAA,EAAA,EACA,KAAK,GAAG;AAAA,EACV;AAAA,IACE,UAAU;AAAA,MACR,SAAS;AAAA,QACP,SACE;AAAA,QACF,WACE;AAAA,MAAA;AAAA,MAEJ,MAAM;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,QAOJ,IAAI;AAAA,QACJ,IAAI;AAAA,QACJ,IAAI;AAAA,MAAA;AAAA,MAEN,UAAU;AAAA,QACR,MAAM;AAAA,QACN,OAAO;AAAA,MAAA;AAAA,MAET,UAAU;AAAA,QACR,cACE;AAAA,QACF,gBACE;AAAA,QACF,WACE;AAAA,QACF,aACE;AAAA,QACF,QAAQ;AAAA,MAAA;AAAA,IACV;AAAA,IAEF,kBAAkB;AAAA,MAChB,EAAE,UAAU,IAAM,MAAM,MAAM,OAAO,kBAAA;AAAA,MACrC,EAAE,UAAU,IAAM,MAAM,MAAM,OAAO,kBAAA;AAAA,MACrC,EAAE,UAAU,IAAM,MAAM,MAAM,OAAO,kBAAA;AAAA,IAAkB;AAAA,IAEzD,iBAAiB;AAAA,MACf,SAAS;AAAA,MACT,MAAM;AAAA,MACN,UAAU;AAAA,MACV,UAAU;AAAA,IAAA;AAAA,EACZ;AAEJ,GAoBaC,IAAuBC,EAGlC,CAACC,GAAOC,MAAQ;AAChB,QAAM;AAAA,IACJ,SAAAC;AAAA,IACA,MAAAC;AAAA,IACA,UAAAC;AAAA,IACA,UAAAC;AAAA,IACA,WAAAC;AAAA,IACA,MAAAC;AAAA,IACA,UAAAC;AAAA,IACA,MAAAC;AAAA,IACA,GAAGC;AAAA,EAAA,IACDV,GACE,EAAE,GAAAW,EAAA,IAAMC,EAAA,GAERC,IACJH,EAAK,YAAY,MACfN,IAAyD,SAA9CO,EAAE,iBAAiB,EAAE,cAAc,MAAA,CAAO;AAEzD,SACE,gBAAAG;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,KAAAb;AAAA,MACA,MAAMQ,KAAQ;AAAA,MACd,WAAWb,EAAY,EAAE,SAAAM,GAAS,MAAAC,GAAM,UAAAC,GAAU,UAAAC,GAAU,WAAAC,GAAW;AAAA,MACtE,GAAGI;AAAA,MACJ,cAAYG;AAAA,MAEX,UAAA;AAAA,QAAAN,sBACE,QAAA,EAAK,eAAY,QAAO,WAAU,oDAChC,aACH,IACE;AAAA,QACHH,IAAW,gBAAAW,EAAC,QAAA,EAAK,WAAU,kBAAkB,UAAAP,GAAS,IAAU;AAAA,MAAA;AAAA,IAAA;AAAA,EAAA;AAGvE,CAAC;AAEDV,EAAqB,cAAc;"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"form-field-DI5LY5aG.js","sources":["../../src/components/form-field/form-field.tsx"],"sourcesContent":["import { forwardRef, useId, useMemo, type HTMLAttributes } from 'react';\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport { useTranslation } from 'react-i18next';\nimport { AlertCircle } from 'lucide-react';\nimport {\n FormFieldContext,\n type FormFieldContextShape,\n} from './form-field-context';\n\nconst fieldVariants = cva('ds:text-start', {\n variants: {\n orientation: {\n vertical: 'ds:flex ds:flex-col ds:gap-[var(--spacing-xs)]',\n horizontal:\n 'ds:grid ds:grid-cols-[minmax(0,var(--form-label-inline-size))_minmax(0,1fr)] ds:items-start ds:gap-x-[var(--spacing-md)] ds:gap-y-[var(--spacing-xs)]',\n },\n disabled: {\n true: 'ds:opacity-50 ds:cursor-not-allowed',\n false: '',\n },\n },\n defaultVariants: {\n orientation: 'vertical',\n disabled: false,\n },\n});\n\nconst slotsVariants = cva('ds:flex ds:flex-col ds:gap-[var(--spacing-xs)]', {\n variants: {\n orientation: {\n vertical: '',\n horizontal: 'ds:min-w-0',\n },\n },\n defaultVariants: {\n orientation: 'vertical',\n },\n});\n\ntype RequiredIndicator =\n | { required?: boolean; optional?: never }\n | { required?: never; optional?: boolean };\n\ninterface BaseFormFieldProps\n extends Omit<HTMLAttributes<HTMLDivElement>, 'children'>,\n Omit<VariantProps<typeof fieldVariants>, 'disabled'> {\n label: string;\n description?: string;\n error?: string;\n disabled?: boolean;\n children: React.ReactNode;\n}\n\nexport type FormFieldProps = BaseFormFieldProps & RequiredIndicator;\n\nexport const FormField = forwardRef<HTMLDivElement, FormFieldProps>(\n (props, ref) => {\n const {\n label,\n description,\n error,\n required = false,\n optional = false,\n orientation = 'vertical',\n disabled = false,\n className,\n children,\n ...rest\n } = props as BaseFormFieldProps & {\n required?: boolean;\n optional?: boolean;\n };\n\n const { t } = useTranslation();\n const id = useId();\n const helpId = `${id}-help`;\n const errorId = `${id}-error`;\n const invalid = Boolean(error);\n\n const describedBy = useMemo(\n () =>\n [description ? helpId : null, error ? errorId : null]\n .filter(Boolean)\n .join(' '),\n [description, error, helpId, errorId],\n );\n\n const ctx: FormFieldContextShape = useMemo(\n () => ({\n id,\n helpId,\n errorId,\n describedBy,\n invalid,\n required,\n disabled,\n }),\n [id, helpId, errorId, describedBy, invalid, required, disabled],\n );\n\n return (\n <FormFieldContext.Provider value={ctx}>\n <div\n ref={ref}\n className={fieldVariants({ orientation, disabled, className })}\n {...rest}\n >\n <label\n htmlFor={id}\n className=\"type-label ds:text-foreground\"\n >\n {label}\n {required && (\n <span\n aria-hidden=\"true\"\n className=\"ds:text-destructive ds:ms-[var(--spacing-xs)]\"\n >\n *\n </span>\n )}\n {optional && (\n <span className=\"ds:text-muted-foreground ds:ms-[var(--spacing-xs)] ds:font-normal\">\n ({t('ui.common.optional', 'optional')})\n </span>\n )}\n </label>\n <div className={slotsVariants({ orientation })}>\n {children}\n {description && (\n <p id={helpId} className=\"type-body-sm ds:text-muted-foreground\">\n {description}\n </p>\n )}\n {error && (\n <p\n id={errorId}\n role=\"alert\"\n className=\"ds:inline-flex ds:items-center ds:gap-[var(--spacing-xs)] type-body-sm ds:text-destructive\"\n >\n <AlertCircle\n aria-hidden=\"true\"\n className=\"ds:size-4 ds:shrink-0\"\n />\n <span>{error}</span>\n </p>\n )}\n </div>\n </div>\n </FormFieldContext.Provider>\n );\n },\n);\n\nFormField.displayName = 'FormField';\n"],"names":["fieldVariants","cva","slotsVariants","FormField","forwardRef","props","ref","label","description","error","required","optional","orientation","disabled","className","children","rest","t","useTranslation","id","useId","helpId","errorId","invalid","describedBy","useMemo","ctx","jsx","FormFieldContext","jsxs","AlertCircle"],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"freemium-paywall-D0GiUFOe.js","sources":["../../src/components/freemium-paywall/freemium-paywall.tsx"],"sourcesContent":["import {\n forwardRef,\n useId,\n useState,\n type ReactNode,\n} from 'react';\nimport * as RadixAlertDialog from '@radix-ui/react-alert-dialog';\nimport * as RadixRadioGroup from '@radix-ui/react-radio-group';\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport { useTranslation } from 'react-i18next';\nimport { AlertTriangle, Check } from 'lucide-react';\nimport { Button } from '../button';\nimport { Progress } from '../progress';\nimport { formatPaymentAmount } from '../payment-form';\n\n/* ------------------------------------------------------------------ */\n/* Types */\n/* ------------------------------------------------------------------ */\n\nexport interface FreemiumPlan {\n id: string;\n /** Translation key for the plan name (e.g. `app.paywall.plans.pro`). */\n nameKey: string;\n /** Amount in minor units (cents, centesimi). */\n priceAmount: number;\n /** ISO 4217 currency code. */\n currency: string;\n /** Translation key for the cadence suffix (e.g. `app.paywall.period.month`). */\n perKey?: string;\n /** Per-line feature translation keys. */\n featuresKeys?: string[];\n}\n\nconst contentVariants = cva(\n [\n 'ds:fixed ds:z-[var(--z-modal)] ds:overflow-auto',\n 'ds:bg-[color:var(--popover)] ds:text-[color:var(--popover-foreground)]',\n 'ds:border ds:border-border ds:shadow-[var(--shadow-lg)]',\n // forced-colors: keep the dialog boundary visible under Windows High\n // Contrast, where `var(--border)` may collapse to system colours.\n 'ds:forced-colors:border-[CanvasText]',\n 'ds:focus:outline-none',\n ].join(' '),\n {\n variants: {\n layout: {\n centered:\n 'ds:start-1/2 ds:top-1/2 ds:-translate-x-1/2 ds:-translate-y-1/2 ds:rtl:translate-x-1/2 ds:rounded-[var(--radius-md)] ds:max-w-[var(--dialog-width-xl)] ds:w-[calc(100vw-2rem)] ds:max-h-[90vh]',\n sheet:\n 'ds:inset-inline-0 ds:bottom-0 ds:w-full ds:max-h-[90vh] ds:rounded-t-[var(--radius-md)]',\n },\n density: {\n compact: 'ds:ps-[var(--spacing-md)] ds:pe-[var(--spacing-md)] ds:pt-[var(--spacing-md)] ds:pb-[var(--spacing-md)]',\n full: 'ds:ps-[var(--spacing-lg)] ds:pe-[var(--spacing-lg)] ds:pt-[var(--spacing-lg)] ds:pb-[var(--spacing-lg)]',\n },\n },\n defaultVariants: { layout: 'centered', density: 'full' },\n },\n);\n\nexport interface FreemiumPaywallProps\n extends VariantProps<typeof contentVariants> {\n open: boolean;\n onOpenChange: (open: boolean) => void;\n plans: FreemiumPlan[];\n /** Currently-selected plan id (controlled) or default. */\n selectedPlanId?: string;\n defaultSelectedPlanId?: string;\n onSelectedPlanChange?: (id: string) => void;\n /** Usage indicator values — omit the object to hide the bar. */\n usage?: { used: number; limit: number };\n /** Fires on upgrade. */\n onUpgrade: (planId: string) => void;\n /** Fires when the user dismisses via Not Now. */\n onCancel?: () => void;\n /** Title override; defaults to t('ui.paywall.title'). */\n title?: ReactNode;\n /** Description override; defaults to t('ui.paywall.description'). */\n description?: ReactNode;\n className?: string;\n}\n\nexport const FreemiumPaywall = forwardRef<HTMLDivElement, FreemiumPaywallProps>(\n (\n {\n open,\n onOpenChange,\n plans,\n selectedPlanId,\n defaultSelectedPlanId,\n onSelectedPlanChange,\n usage,\n onUpgrade,\n onCancel,\n title,\n description,\n layout = 'centered',\n density = 'full',\n className,\n },\n ref,\n ) => {\n const { t, i18n } = useTranslation();\n const titleId = useId();\n const descId = useId();\n\n const isControlled = selectedPlanId !== undefined;\n const [internalSelected, setInternalSelected] = useState<string>(\n defaultSelectedPlanId ?? plans[0]?.id ?? '',\n );\n const currentSelected = isControlled\n ? selectedPlanId ?? ''\n : internalSelected;\n\n const handleSelectedChange = (next: string) => {\n if (!isControlled) setInternalSelected(next);\n onSelectedPlanChange?.(next);\n };\n\n const handleCancel = () => {\n onCancel?.();\n onOpenChange(false);\n };\n\n const handleUpgrade = () => {\n if (!currentSelected) return;\n onUpgrade(currentSelected);\n };\n\n const usagePercent = usage\n ? Math.min(100, Math.max(0, (usage.used / Math.max(1, usage.limit)) * 100))\n : 0;\n const usageFull = usage ? usage.used >= usage.limit : false;\n\n return (\n <RadixAlertDialog.Root open={open} onOpenChange={onOpenChange}>\n <RadixAlertDialog.Portal>\n <RadixAlertDialog.Overlay\n className={[\n 'ds:fixed ds:inset-0 ds:z-[var(--z-modal-backdrop)]',\n 'ds:bg-[color:var(--foreground)]/40',\n 'ds:motion-safe:data-[state=open]:animate-in ds:motion-safe:data-[state=closed]:animate-out',\n 'ds:[.theme-accessible_&]:animate-none',\n ].join(' ')}\n />\n <RadixAlertDialog.Content\n ref={ref}\n aria-labelledby={titleId}\n aria-describedby={descId}\n className={contentVariants({ layout, density, className })}\n >\n <RadixAlertDialog.Title id={titleId} asChild>\n <h2 className=\"type-title-card\">\n {title ?? t('ui.paywall.title')}\n </h2>\n </RadixAlertDialog.Title>\n <RadixAlertDialog.Description id={descId} asChild>\n <p className=\"ds:mt-[var(--spacing-xs)] ds:text-[color:var(--muted-foreground)]\">\n {description ?? t('ui.paywall.description')}\n </p>\n </RadixAlertDialog.Description>\n\n {usage ? (\n <div className=\"ds:mt-[var(--spacing-md)]\">\n <div className=\"ds:flex ds:items-center ds:gap-[var(--spacing-xs)] ds:mb-[var(--spacing-xs)]\">\n {usageFull ? (\n <AlertTriangle\n aria-hidden=\"true\"\n className=\"ds:size-4 ds:text-[color:var(--destructive)]\"\n />\n ) : null}\n <span\n className={[\n 'type-body-sm',\n usageFull\n ? 'ds:text-[color:var(--destructive)]'\n : 'ds:text-[color:var(--muted-foreground)]',\n ].join(' ')}\n >\n {usageFull\n ? t('ui.paywall.usageFull')\n : t('ui.paywall.usageLabel', {\n used: usage.used,\n limit: usage.limit,\n })}\n </span>\n </div>\n <Progress\n value={usagePercent}\n max={100}\n ariaLabel={t('ui.paywall.usageLabel', {\n used: usage.used,\n limit: usage.limit,\n })}\n className={usageFull ? 'ds:[&_[role=progressbar]>*]:bg-[color:var(--destructive)]' : ''}\n />\n </div>\n ) : null}\n\n <RadixRadioGroup.Root\n value={currentSelected}\n onValueChange={handleSelectedChange}\n aria-label={t('ui.paywall.title')}\n className=\"ds:mt-[var(--spacing-md)] ds:flex ds:flex-col ds:gap-[var(--spacing-sm)]\"\n >\n {plans.map((plan) => {\n // Reuse the payment-form helper — it knows about\n // zero-decimal currencies (JPY, KRW, VND …) and applies\n // the right divisor. Raw `/ 100` would 100× the price in\n // those currencies.\n const formattedPrice = formatPaymentAmount(\n plan.priceAmount,\n plan.currency,\n i18n.language,\n );\n const period = plan.perKey ? t(plan.perKey) : undefined;\n const priceLine = period\n ? t('ui.paywall.pricePer', { price: formattedPrice, period })\n : formattedPrice;\n const planName = t(plan.nameKey);\n return (\n <RadixRadioGroup.Item\n key={plan.id}\n value={plan.id}\n className={[\n 'ds:group ds:relative ds:flex ds:flex-col ds:items-stretch',\n 'ds:rounded-[var(--radius-md)] ds:border ds:border-border',\n 'ds:ps-[var(--spacing-md)] ds:pe-[var(--spacing-md)] ds:pt-[var(--spacing-sm)] ds:pb-[var(--spacing-sm)]',\n 'ds:text-start ds:bg-[color:var(--card)] ds:text-[color:var(--card-foreground)]',\n 'ds:data-[state=checked]:border-[color:var(--primary)]',\n 'ds:data-[state=checked]:bg-[color:var(--primary)]/5',\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 ].join(' ')}\n >\n <span className=\"ds:flex ds:items-center ds:justify-between ds:gap-[var(--spacing-sm)]\">\n <span className=\"ds:font-semibold\">{planName}</span>\n <span className=\"ds:tabular-nums\">{priceLine}</span>\n </span>\n {plan.featuresKeys && plan.featuresKeys.length > 0 ? (\n <ul\n aria-label={t('ui.paywall.features')}\n className=\"ds:mt-[var(--spacing-xs)] ds:flex ds:flex-col ds:gap-[var(--spacing-xs)]\"\n >\n {plan.featuresKeys.map((key, i) => (\n <li\n key={i}\n className=\"ds:flex ds:items-start ds:gap-[var(--spacing-xs)] type-body-sm\"\n >\n <Check\n aria-hidden=\"true\"\n className=\"ds:size-4 ds:shrink-0 ds:text-[color:var(--primary)] ds:mt-[1px]\"\n />\n <span>{t(key)}</span>\n </li>\n ))}\n </ul>\n ) : null}\n </RadixRadioGroup.Item>\n );\n })}\n </RadixRadioGroup.Root>\n\n <div className=\"ds:mt-[var(--spacing-lg)] ds:flex ds:items-center ds:gap-[var(--spacing-sm)] ds:justify-end\">\n <RadixAlertDialog.Cancel asChild>\n <Button intent=\"outline\" onClick={handleCancel}>\n {t('ui.paywall.notNow')}\n </Button>\n </RadixAlertDialog.Cancel>\n <RadixAlertDialog.Action asChild>\n <Button intent=\"primary\" onClick={handleUpgrade}>\n {t('ui.paywall.upgrade')}\n </Button>\n </RadixAlertDialog.Action>\n </div>\n </RadixAlertDialog.Content>\n </RadixAlertDialog.Portal>\n </RadixAlertDialog.Root>\n );\n },\n);\n\nFreemiumPaywall.displayName = 'FreemiumPaywall';\n"],"names":["contentVariants","cva","FreemiumPaywall","forwardRef","open","onOpenChange","plans","selectedPlanId","defaultSelectedPlanId","onSelectedPlanChange","usage","onUpgrade","onCancel","title","description","layout","density","className","ref","t","i18n","useTranslation","titleId","useId","descId","isControlled","internalSelected","setInternalSelected","useState","_a","currentSelected","handleSelectedChange","next","handleCancel","handleUpgrade","usagePercent","usageFull","jsx","RadixAlertDialog","jsxs","AlertTriangle","Progress","RadixRadioGroup","plan","formattedPrice","formatPaymentAmount","period","priceLine","planName","key","i","Check","Button"],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"icon-button-C482ii4y.js","sources":["../../src/components/button/icon-button.tsx"],"sourcesContent":["import { forwardRef } from 'react';\nimport { Button, type ButtonProps } from './button';\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport { Tooltip } from '../tooltip';\n\nconst iconButtonVariants = cva('ds:p-0', {\n variants: {\n size: {\n sm: 'ds:w-8 ds:h-8',\n md: 'ds:w-10 ds:h-10',\n lg: 'ds:w-12 ds:h-12',\n },\n },\n defaultVariants: {\n size: 'md',\n },\n});\n\nexport type IconButtonProps = Omit<\n ButtonProps,\n 'startIcon' | 'endIcon' | 'children' | 'size' | 'flipIconInRtl'\n> &\n VariantProps<typeof iconButtonVariants> & {\n icon: React.ReactNode;\n tooltip?: string;\n 'aria-label'?: string;\n /**\n * Mirror the icon horizontally in RTL. Default `false` — only enable\n * for directional glyphs (arrows, chevrons). See Button.flipIconInRtl.\n */\n flipIconInRtl?: boolean;\n };\n\nexport const IconButton = forwardRef<HTMLButtonElement, IconButtonProps>(\n (\n { icon, size, intent = 'outline', className, tooltip, flipIconInRtl = false, ...props },\n ref,\n ) => {\n const ariaLabel = props['aria-label'] || tooltip;\n\n if (import.meta.env.DEV && !ariaLabel) {\n console.warn('IconButton: aria-label or tooltip prop is required for accessibility.');\n }\n\n const iconSizeClass =\n size === 'sm' ? 'size-4' : size === 'lg' ? 'size-5' : 'size-[18px]';\n const iconFlipClass = flipIconInRtl ? 'rtl:rotate-180' : '';\n\n const button = (\n <Button\n ref={ref}\n size={size}\n intent={intent}\n className={iconButtonVariants({ size, className })}\n aria-label={ariaLabel}\n {...props}\n >\n <span\n aria-hidden=\"true\"\n className={`ds:inline-flex ds:items-center ds:justify-center ${iconSizeClass} ${iconFlipClass}`.trim()}\n >\n {icon}\n </span>\n </Button>\n );\n\n if (tooltip) {\n return <Tooltip label={tooltip}>{button}</Tooltip>;\n }\n\n return button;\n },\n);\n\nIconButton.displayName = 'IconButton';\n"],"names":["iconButtonVariants","cva","IconButton","forwardRef","icon","size","intent","className","tooltip","flipIconInRtl","props","ref","ariaLabel","iconSizeClass","iconFlipClass","button","jsx","Button","Tooltip"],"mappings":";;;;;AAKA,MAAMA,IAAqBC,EAAI,UAAU;AAAA,EACvC,UAAU;AAAA,IACR,MAAM;AAAA,MACJ,IAAI;AAAA,MACJ,IAAI;AAAA,MACJ,IAAI;AAAA,IAAA;AAAA,EACN;AAAA,EAEF,iBAAiB;AAAA,IACf,MAAM;AAAA,EAAA;AAEV,CAAC,GAiBYC,IAAaC;AAAA,EACxB,CACE,EAAE,MAAAC,GAAM,MAAAC,GAAM,QAAAC,IAAS,WAAW,WAAAC,GAAW,SAAAC,GAAS,eAAAC,IAAgB,IAAO,GAAGC,EAAA,GAChFC,MACG;AACH,UAAMC,IAAYF,EAAM,YAAY,KAAKF,GAMnCK,IACJR,MAAS,OAAO,WAAWA,MAAS,OAAO,WAAW,eAClDS,IAAgBL,IAAgB,mBAAmB,IAEnDM,IACJ,gBAAAC;AAAA,MAACC;AAAA,MAAA;AAAA,QACC,KAAAN;AAAA,QACA,MAAAN;AAAA,QACA,QAAAC;AAAA,QACA,WAAWN,EAAmB,EAAE,MAAAK,GAAM,WAAAE,GAAW;AAAA,QACjD,cAAYK;AAAA,QACX,GAAGF;AAAA,QAEJ,UAAA,gBAAAM;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,eAAY;AAAA,YACZ,WAAW,oDAAoDH,CAAa,IAAIC,CAAa,GAAG,KAAA;AAAA,YAE/F,UAAAV;AAAA,UAAA;AAAA,QAAA;AAAA,MACH;AAAA,IAAA;AAIJ,WAAII,sBACMU,GAAA,EAAQ,OAAOV,GAAU,UAAAO,GAAO,IAGnCA;AAAA,EACT;AACF;AAEAb,EAAW,cAAc;"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"kbd-DTcIjYA7.js","sources":["../../src/components/kbd/kbd.tsx"],"sourcesContent":["import {\n forwardRef,\n Fragment,\n useEffect,\n useState,\n type HTMLAttributes,\n type ReactNode,\n} from 'react';\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport { useTranslation } from 'react-i18next';\n\n/* ------------------------------------------------------------------ */\n/* Platform detection */\n/* ------------------------------------------------------------------ */\n\nfunction detectMacLike(): boolean {\n if (typeof navigator === 'undefined') return false;\n const uaData = (navigator as unknown as {\n userAgentData?: { platform?: string };\n }).userAgentData;\n const platformString = uaData?.platform ?? navigator.platform ?? '';\n return /mac/i.test(platformString);\n}\n\n/* ------------------------------------------------------------------ */\n/* Glyph + accessible-name maps */\n/* ------------------------------------------------------------------ */\n\nexport type KbdNamedKey =\n | 'Meta'\n | 'Control'\n | 'Alt'\n | 'Shift'\n | 'Enter'\n | 'Escape'\n | 'Space'\n | 'Tab'\n | 'Delete'\n | 'Backspace'\n | 'ArrowUp'\n | 'ArrowDown'\n | 'ArrowLeft'\n | 'ArrowRight';\n\n/**\n * Named keys we understand — anything else is passed through verbatim.\n * Glyph rendering is platform-aware; accessible names spell the key out\n * so screen readers say \"Command K\" instead of \"black apple K\".\n */\nconst MAC_GLYPHS: Record<KbdNamedKey, string> = {\n Meta: '\\u2318', // ⌘\n Control: '\\u2303', // ⌃\n Alt: '\\u2325', // ⌥\n Shift: '\\u21E7', // ⇧\n Enter: '\\u23CE', // ⏎\n Escape: 'Esc',\n Space: 'Space',\n Tab: '\\u21E5', // ⇥\n Delete: '\\u2326', // ⌦\n Backspace: '\\u232B', // ⌫\n ArrowUp: '\\u2191', // ↑\n ArrowDown: '\\u2193', // ↓\n ArrowLeft: '\\u2190', // ←\n ArrowRight: '\\u2192', // →\n};\n\nconst WIN_GLYPHS: Record<KbdNamedKey, string> = {\n Meta: 'Ctrl', // Windows/Linux consumers usually care about the Control equivalent\n Control: 'Ctrl',\n Alt: 'Alt',\n Shift: 'Shift',\n Enter: 'Enter',\n Escape: 'Esc',\n Space: 'Space',\n Tab: 'Tab',\n Delete: 'Del',\n Backspace: 'Backspace',\n ArrowUp: '\\u2191',\n ArrowDown: '\\u2193',\n ArrowLeft: '\\u2190',\n ArrowRight: '\\u2192',\n};\n\n/** Spelled-out names used for the aria-label — never platform-swapped. */\nconst SPOKEN_NAMES: Record<KbdNamedKey, string> = {\n Meta: 'Command',\n Control: 'Control',\n Alt: 'Option',\n Shift: 'Shift',\n Enter: 'Enter',\n Escape: 'Escape',\n Space: 'Space',\n Tab: 'Tab',\n Delete: 'Delete',\n Backspace: 'Backspace',\n ArrowUp: 'Up arrow',\n ArrowDown: 'Down arrow',\n ArrowLeft: 'Left arrow',\n ArrowRight: 'Right arrow',\n};\n\nfunction isNamedKey(key: string): key is KbdNamedKey {\n return (\n key === 'Meta' ||\n key === 'Control' ||\n key === 'Alt' ||\n key === 'Shift' ||\n key === 'Enter' ||\n key === 'Escape' ||\n key === 'Space' ||\n key === 'Tab' ||\n key === 'Delete' ||\n key === 'Backspace' ||\n key === 'ArrowUp' ||\n key === 'ArrowDown' ||\n key === 'ArrowLeft' ||\n key === 'ArrowRight'\n );\n}\n\nfunction glyphFor(key: string, isMac: boolean): string {\n if (isNamedKey(key)) {\n return (isMac ? MAC_GLYPHS : WIN_GLYPHS)[key];\n }\n return key;\n}\n\nfunction spokenFor(key: string): string {\n if (isNamedKey(key)) return SPOKEN_NAMES[key];\n return key;\n}\n\n/* ------------------------------------------------------------------ */\n/* CVA */\n/* ------------------------------------------------------------------ */\n\nconst kbdVariants = cva(\n [\n 'ds:inline-flex ds:items-center ds:justify-center',\n 'ds:font-[family-name:var(--font-mono)]',\n 'ds:tabular-nums',\n 'ds:rounded-[var(--radius-sm)]',\n 'ds:select-none',\n // Tight minimum size so single-key pills never collapse.\n 'ds:min-inline-size-[1.5em] ds:min-block-size-[1.5em]',\n ].join(' '),\n {\n variants: {\n size: {\n sm: 'ds:text-[length:var(--font-size-xs)] ds:ps-[calc(var(--spacing-xs)/1.5)] ds:pe-[calc(var(--spacing-xs)/1.5)]',\n md: 'ds:text-[length:var(--font-size-xs)] ds:ps-[var(--spacing-xs)] ds:pe-[var(--spacing-xs)]',\n lg: 'ds:text-[length:var(--font-size-sm)] ds:ps-[var(--spacing-sm)] ds:pe-[var(--spacing-sm)]',\n },\n intensity: {\n outline: [\n 'ds:bg-[var(--background)]',\n 'ds:border ds:border-[color:var(--border)]',\n 'ds:text-[color:var(--foreground)]',\n ].join(' '),\n solid: [\n 'ds:bg-[var(--muted)]',\n 'ds:text-[color:var(--foreground)]',\n ].join(' '),\n },\n },\n defaultVariants: { size: 'md', intensity: 'outline' },\n },\n);\n\nconst groupVariants = cva(\n [\n 'ds:inline-flex ds:items-center',\n 'ds:gap-[calc(var(--spacing-xs)/2)]',\n // Group shouldn't visually render as a pill itself — just holds pills.\n 'ds:font-[family-name:var(--font-mono)]',\n ].join(' '),\n);\n\n/* ------------------------------------------------------------------ */\n/* Public types */\n/* ------------------------------------------------------------------ */\n\nexport type KbdSeparator = 'none' | 'plus' | 'then';\n\n/**\n * Optional override map for keys. Consumers can rewrite the visible\n * glyph or the spoken name for product-specific shortcuts (e.g. mapping\n * a \"Brand\" modifier to a special icon).\n */\nexport interface KbdGlyphOverride {\n glyph?: string;\n spoken?: string;\n}\n\ninterface KbdBaseProps\n extends Omit<HTMLAttributes<HTMLElement>, 'children'>,\n VariantProps<typeof kbdVariants> {\n separator?: KbdSeparator;\n glyphMap?: Partial<Record<KbdNamedKey | string, KbdGlyphOverride>>;\n}\n\ninterface KbdWithKeysProps extends KbdBaseProps {\n keys: Array<KbdNamedKey | string>;\n children?: never;\n}\n\ninterface KbdWithChildrenProps extends KbdBaseProps {\n keys?: never;\n children: ReactNode;\n}\n\nexport type KbdProps = KbdWithKeysProps | KbdWithChildrenProps;\n\n/* ------------------------------------------------------------------ */\n/* Component */\n/* ------------------------------------------------------------------ */\n\nexport const Kbd = forwardRef<HTMLElement, KbdProps>((props, ref) => {\n const {\n size = 'md',\n intensity = 'outline',\n separator = 'none',\n glyphMap,\n className,\n ...rest\n } = props as KbdBaseProps & { className?: string };\n\n const { t } = useTranslation();\n\n const [isMac, setIsMac] = useState(false);\n useEffect(() => {\n setIsMac(detectMacLike());\n }, []);\n\n // Children path: pass-through rendering. Still a semantic <kbd> so\n // AT + search engines classify it correctly.\n if ('children' in props && props.children !== undefined) {\n return (\n <kbd\n ref={ref}\n className={[kbdVariants({ size, intensity }), className]\n .filter(Boolean)\n .join(' ')}\n {...rest}\n >\n {(props as KbdWithChildrenProps).children}\n </kbd>\n );\n }\n\n const keys = (props as KbdWithKeysProps).keys;\n\n // Single-key shortcut with no separator — render as one pill.\n // axe's `aria-prohibited-attr` rule forbids `aria-label` on <kbd>\n // elements (no valid implicit role), so the spoken name is delivered\n // via a visually-hidden sr-only span instead.\n if (keys.length === 1) {\n const k = keys[0];\n const override = glyphMap?.[k];\n const glyph = override?.glyph ?? glyphFor(k, isMac);\n const spoken = override?.spoken ?? spokenFor(k);\n return (\n <kbd\n ref={ref}\n className={[kbdVariants({ size, intensity }), className]\n .filter(Boolean)\n .join(' ')}\n {...rest}\n >\n <span aria-hidden=\"true\">{glyph}</span>\n <span className=\"ds:sr-only\">{spoken}</span>\n </kbd>\n );\n }\n\n // Multi-key shortcut.\n const spokenAll = keys\n .map((k) => glyphMap?.[k]?.spoken ?? spokenFor(k))\n .join(' ');\n\n // `none`: single combined pill (e.g. \"⌘K\" rendered together).\n if (separator === 'none') {\n return (\n <kbd\n ref={ref}\n className={[kbdVariants({ size, intensity }), className]\n .filter(Boolean)\n .join(' ')}\n {...rest}\n >\n {keys.map((k, i) => {\n const glyph = glyphMap?.[k]?.glyph ?? glyphFor(k, isMac);\n return (\n <span key={`${k}-${i}`} aria-hidden=\"true\">\n {glyph}\n </span>\n );\n })}\n <span className=\"ds:sr-only\">{spokenAll}</span>\n </kbd>\n );\n }\n\n // `plus` / `then`: multiple sibling <kbd> pills inside a wrapping <kbd>.\n const separatorText =\n separator === 'plus' ? t('kbd.plus', '+') : t('kbd.then', 'then');\n\n const spokenAnnouncement =\n separator === 'then'\n ? t('kbd.pressThen', 'Press {{keys}}', {\n keys: keys\n .map((k) => glyphMap?.[k]?.spoken ?? spokenFor(k))\n .join(` ${t('kbd.thenSpoken', 'then')} `),\n })\n : spokenAll;\n\n return (\n <kbd\n ref={ref}\n className={[groupVariants(), className].filter(Boolean).join(' ')}\n {...rest}\n >\n <span className=\"ds:sr-only\">{spokenAnnouncement}</span>\n {keys.map((k, i) => {\n const glyph = glyphMap?.[k]?.glyph ?? glyphFor(k, isMac);\n return (\n <Fragment key={`${k}-${i}`}>\n <kbd\n aria-hidden=\"true\"\n className={kbdVariants({ size, intensity })}\n >\n {glyph}\n </kbd>\n {i < keys.length - 1 ? (\n <span\n aria-hidden=\"true\"\n className=\"ds:text-[color:var(--muted-foreground)] ds:text-[length:var(--font-size-xs)]\"\n >\n {separatorText}\n </span>\n ) : null}\n </Fragment>\n );\n })}\n </kbd>\n );\n});\n\nKbd.displayName = 'Kbd';\n\n/* ------------------------------------------------------------------ */\n/* Named helpers */\n/* ------------------------------------------------------------------ */\n\nexport const kbdGlyphs = { mac: MAC_GLYPHS, win: WIN_GLYPHS, spoken: SPOKEN_NAMES };\n"],"names":["detectMacLike","uaData","platformString","MAC_GLYPHS","WIN_GLYPHS","SPOKEN_NAMES","isNamedKey","key","glyphFor","isMac","spokenFor","kbdVariants","cva","groupVariants","Kbd","forwardRef","props","ref","size","intensity","separator","glyphMap","className","rest","t","useTranslation","setIsMac","useState","useEffect","jsx","keys","k","override","glyph","spoken","jsxs","spokenAll","_a","i","separatorText","spokenAnnouncement","Fragment","kbdGlyphs"],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"list-Cwe8mcmh.js","sources":["../../src/components/list/list.tsx"],"sourcesContent":["import {\n Children,\n createContext,\n forwardRef,\n isValidElement,\n useCallback,\n useContext,\n useLayoutEffect,\n useMemo,\n useRef,\n useState,\n type HTMLAttributes,\n type KeyboardEvent,\n type ReactNode,\n} from 'react';\nimport { cva } from 'class-variance-authority';\nimport { useTranslation } from 'react-i18next';\n\n/* ------------------------------------------------------------------ */\n/* Context */\n/* ------------------------------------------------------------------ */\n\ninterface ListContextValue {\n selection: 'none' | 'single' | 'multiple';\n selectedValues: Set<string>;\n focusedValue: string | null;\n disabled: boolean;\n enabledItemValues: string[];\n onItemSelect: (value: string) => void;\n onItemFocus: (value: string) => void;\n onItemKeyDown: (e: KeyboardEvent<HTMLElement>, value: string) => void;\n registerItemRef: (value: string, el: HTMLElement | null) => void;\n divider: 'spaced' | 'divided' | 'bordered';\n}\n\nconst ListContext = createContext<ListContextValue>({\n selection: 'none',\n selectedValues: new Set(),\n focusedValue: null,\n disabled: false,\n enabledItemValues: [],\n onItemSelect: () => {},\n onItemFocus: () => {},\n onItemKeyDown: () => {},\n registerItemRef: () => {},\n divider: 'spaced',\n});\n\n/* ------------------------------------------------------------------ */\n/* CVA variants */\n/* ------------------------------------------------------------------ */\n\nconst listVariants = cva('ds:flex ds:flex-col ds:p-0 ds:m-0', {\n variants: {\n divider: {\n spaced: '',\n divided: '',\n bordered:\n 'ds:border ds:border-[color:var(--border)] ds:rounded-[var(--radius-md)] ds:overflow-hidden',\n },\n density: {\n compact: 'ds:gap-[var(--spacing-xs)]',\n default: 'ds:gap-[var(--spacing-sm)]',\n relaxed: 'ds:gap-[var(--spacing-md)]',\n },\n ordered: {\n true: 'ds:list-decimal ds:ps-[var(--spacing-lg)]',\n false: 'ds:list-none',\n },\n },\n defaultVariants: {\n divider: 'spaced',\n density: 'default',\n ordered: false,\n },\n});\n\nconst listItemVariants = cva(\n 'ds:ps-[var(--spacing-sm)] ds:pe-[var(--spacing-sm)] ds:py-[var(--spacing-xs)]',\n {\n variants: {\n divider: {\n spaced: '',\n divided: 'ds:[&:not(:last-child)]:[border-block-end:1px_solid_var(--border)]',\n bordered: 'ds:[&:not(:last-child)]:[border-block-end:1px_solid_var(--border)]',\n },\n interactive: {\n // flex lives on the outer <div role=\"option\"> so it doesn't suppress ::marker on <li>\n true: [\n 'ds:flex ds:items-center ds:gap-x-[var(--spacing-sm)]',\n 'ds:min-h-[var(--min-target-size)] ds:cursor-pointer ds:select-none',\n 'ds:rounded-[var(--radius-sm)]',\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 ].join(' '),\n // no flex here — <li> keeps display:list-item so ::marker renders correctly\n false: '',\n },\n selected: {\n true: '',\n false: '',\n },\n disabled: {\n true: '',\n false: '',\n },\n },\n compoundVariants: [\n {\n interactive: true,\n selected: false,\n disabled: false,\n className: 'ds:hover:bg-[color:var(--muted)]/20',\n },\n {\n interactive: true,\n selected: true,\n className: 'ds:bg-[color:var(--primary)]/10',\n },\n {\n interactive: true,\n disabled: true,\n className: 'ds:opacity-50 ds:cursor-not-allowed ds:pointer-events-none',\n },\n ],\n defaultVariants: {\n divider: 'spaced',\n interactive: false,\n selected: false,\n disabled: false,\n },\n },\n);\n\n/* ------------------------------------------------------------------ */\n/* Types */\n/* ------------------------------------------------------------------ */\n\nexport interface ListProps extends HTMLAttributes<HTMLElement> {\n as?: 'ul' | 'ol';\n start?: number;\n divider?: 'spaced' | 'divided' | 'bordered';\n density?: 'compact' | 'default' | 'relaxed';\n selection?: 'none' | 'single' | 'multiple';\n value?: string | string[];\n defaultValue?: string | string[];\n onValueChange?: (value: string | string[]) => void;\n disabled?: boolean;\n children: ReactNode;\n className?: string;\n}\n\nexport interface ListItemProps extends Omit<HTMLAttributes<HTMLElement>, 'title'> {\n value?: string;\n leading?: ReactNode;\n title: ReactNode;\n description?: ReactNode;\n trailing?: ReactNode;\n lineClamp?: number;\n disabled?: boolean;\n className?: string;\n}\n\n/* ------------------------------------------------------------------ */\n/* Helpers */\n/* ------------------------------------------------------------------ */\n\nfunction collectItemInfo(children: ReactNode): Array<{ value: string; disabled: boolean }> {\n const items: Array<{ value: string; disabled: boolean }> = [];\n Children.forEach(children, (child) => {\n if (!isValidElement(child)) return;\n const props = child.props as { value?: unknown; disabled?: unknown };\n if (typeof props.value === 'string') {\n items.push({ value: props.value, disabled: Boolean(props.disabled) });\n }\n });\n return items;\n}\n\n/* ------------------------------------------------------------------ */\n/* ListRoot */\n/* ------------------------------------------------------------------ */\n\nconst ListRoot = forwardRef<HTMLElement, ListProps>(\n (\n {\n as = 'ul',\n start,\n divider = 'spaced',\n density = 'default',\n selection = 'none',\n value: controlledValue,\n defaultValue,\n onValueChange,\n disabled = false,\n className,\n children,\n 'aria-label': ariaLabel,\n ...props\n },\n ref,\n ) => {\n const { t } = useTranslation();\n const isSelectable = selection !== 'none';\n const isMultiple = selection === 'multiple';\n const isControlled = controlledValue !== undefined;\n\n const [internalValue, setInternalValue] = useState<string[]>(() => {\n if (defaultValue === undefined) return [];\n return Array.isArray(defaultValue) ? defaultValue : [defaultValue];\n });\n\n const selectedValues = useMemo<Set<string>>(() => {\n if (isControlled) {\n const v = controlledValue!;\n return new Set(Array.isArray(v) ? v : [v]);\n }\n return new Set(internalValue);\n }, [isControlled, controlledValue, internalValue]);\n\n const allItemInfo = useMemo(() => collectItemInfo(children), [children]);\n const enabledItemValues = useMemo(\n () => allItemInfo.filter((i) => !i.disabled && !disabled).map((i) => i.value),\n [allItemInfo, disabled],\n );\n\n const [focusedValue, setFocusedValue] = useState<string | null>(null);\n\n const itemRefs = useRef<Map<string, HTMLElement>>(new Map());\n\n const registerItemRef = useCallback((value: string, el: HTMLElement | null) => {\n if (el) {\n itemRefs.current.set(value, el);\n } else {\n itemRefs.current.delete(value);\n }\n }, []);\n\n const focusItem = useCallback((value: string) => {\n setFocusedValue(value);\n requestAnimationFrame(() => {\n itemRefs.current.get(value)?.focus();\n });\n }, []);\n\n const commit = useCallback(\n (next: string[]) => {\n if (!isControlled) setInternalValue(next);\n if (isMultiple) {\n onValueChange?.(next);\n } else {\n onValueChange?.(next[0] ?? '');\n }\n },\n [isControlled, isMultiple, onValueChange],\n );\n\n const handleItemSelect = useCallback(\n (itemValue: string) => {\n if (disabled) return;\n if (!isSelectable) return;\n if (isMultiple) {\n const current = [...selectedValues];\n if (selectedValues.has(itemValue)) {\n commit(current.filter((v) => v !== itemValue));\n } else {\n commit([...current, itemValue]);\n }\n } else {\n if (selectedValues.has(itemValue)) {\n commit([]);\n } else {\n commit([itemValue]);\n }\n }\n },\n [disabled, isSelectable, isMultiple, selectedValues, commit],\n );\n\n const handleItemFocus = useCallback((value: string) => {\n setFocusedValue(value);\n }, []);\n\n const handleItemKeyDown = useCallback(\n (e: KeyboardEvent<HTMLElement>, itemValue: string) => {\n if (!isSelectable) return;\n const currentIndex = enabledItemValues.indexOf(itemValue);\n\n switch (e.key) {\n case 'ArrowDown': {\n e.preventDefault();\n const next = enabledItemValues[currentIndex + 1];\n if (next !== undefined) focusItem(next);\n break;\n }\n case 'ArrowUp': {\n e.preventDefault();\n const prev = enabledItemValues[currentIndex - 1];\n if (prev !== undefined) focusItem(prev);\n break;\n }\n case 'Home': {\n e.preventDefault();\n const first = enabledItemValues[0];\n if (first !== undefined) focusItem(first);\n break;\n }\n case 'End': {\n e.preventDefault();\n const last = enabledItemValues[enabledItemValues.length - 1];\n if (last !== undefined) focusItem(last);\n break;\n }\n case ' ':\n case 'Enter': {\n e.preventDefault();\n handleItemSelect(itemValue);\n break;\n }\n }\n },\n [isSelectable, enabledItemValues, focusItem, handleItemSelect],\n );\n\n const ctxValue: ListContextValue = {\n selection,\n selectedValues,\n focusedValue,\n disabled,\n enabledItemValues,\n onItemSelect: handleItemSelect,\n onItemFocus: handleItemFocus,\n onItemKeyDown: handleItemKeyDown,\n registerItemRef,\n divider,\n };\n\n const classes = listVariants({ divider, density, ordered: as === 'ol', className });\n\n if (isSelectable) {\n if (import.meta.env.DEV && !ariaLabel && !props['aria-labelledby']) {\n console.warn(\n 'List: a selectable list (role=\"listbox\") should have an accessible name. ' +\n 'Pass aria-label or aria-labelledby to satisfy WCAG 4.1.2.',\n );\n }\n const resolvedAriaLabel = ariaLabel ?? t('ui.list.label', 'List');\n return (\n <ListContext.Provider value={ctxValue}>\n <div\n ref={ref as React.Ref<HTMLDivElement>}\n role=\"listbox\"\n aria-label={resolvedAriaLabel}\n aria-multiselectable={isMultiple ? true : undefined}\n aria-disabled={disabled ? true : undefined}\n className={classes}\n {...props}\n >\n {children}\n </div>\n </ListContext.Provider>\n );\n }\n\n if (as === 'ol') {\n return (\n <ListContext.Provider value={ctxValue}>\n <ol\n ref={ref as React.Ref<HTMLOListElement>}\n role=\"list\"\n start={start}\n className={classes}\n {...(props as HTMLAttributes<HTMLOListElement>)}\n >\n {children}\n </ol>\n </ListContext.Provider>\n );\n }\n\n return (\n <ListContext.Provider value={ctxValue}>\n <ul\n ref={ref as React.Ref<HTMLUListElement>}\n role=\"list\"\n className={classes}\n {...(props as HTMLAttributes<HTMLUListElement>)}\n >\n {children}\n </ul>\n </ListContext.Provider>\n );\n },\n);\nListRoot.displayName = 'List';\n\n/* ------------------------------------------------------------------ */\n/* ListItem */\n/* ------------------------------------------------------------------ */\n\nconst ListItem = forwardRef<HTMLElement, ListItemProps>(\n (\n {\n value,\n leading,\n title,\n description,\n trailing,\n lineClamp,\n disabled: itemDisabled = false,\n className,\n onClick,\n onFocus,\n onKeyDown,\n ...props\n },\n ref,\n ) => {\n const {\n selection,\n selectedValues,\n focusedValue,\n disabled: groupDisabled,\n enabledItemValues,\n onItemSelect,\n onItemFocus,\n onItemKeyDown,\n registerItemRef,\n divider,\n } = useContext(ListContext);\n\n const isSelectable = selection !== 'none';\n const isDisabled = groupDisabled || itemDisabled;\n const isSelected = value !== undefined ? selectedValues.has(value) : false;\n const isFocused = value !== undefined && focusedValue === value;\n const isFirstEnabled = value !== undefined && enabledItemValues[0] === value;\n const tabIndex = isSelectable\n ? focusedValue !== null\n ? isFocused && !isDisabled\n ? 0\n : -1\n : isFirstEnabled && !isDisabled\n ? 0\n : -1\n : undefined;\n\n const descRef = useRef<HTMLSpanElement>(null);\n useLayoutEffect(() => {\n const el = descRef.current;\n if (!el) return;\n if (lineClamp != null) {\n el.style.setProperty('--list-item-clamp', String(lineClamp));\n } else {\n el.style.removeProperty('--list-item-clamp');\n }\n }, [lineClamp]);\n\n const internalRef = useCallback(\n (el: HTMLElement | null) => {\n if (value) registerItemRef(value, el);\n if (typeof ref === 'function') {\n ref(el);\n } else if (ref) {\n (ref as React.MutableRefObject<HTMLElement | null>).current = el;\n }\n },\n [value, registerItemRef, ref],\n );\n\n const handleClick = useCallback(\n (e: React.MouseEvent<HTMLElement>) => {\n if (isSelectable && value && !isDisabled) {\n onItemSelect(value);\n }\n (onClick as React.MouseEventHandler<HTMLElement> | undefined)?.(e);\n },\n [isSelectable, value, isDisabled, onItemSelect, onClick],\n );\n\n const handleFocus = useCallback(\n (e: React.FocusEvent<HTMLElement>) => {\n if (value) onItemFocus(value);\n (onFocus as React.FocusEventHandler<HTMLElement> | undefined)?.(e);\n },\n [value, onItemFocus, onFocus],\n );\n\n const handleKeyDown = useCallback(\n (e: KeyboardEvent<HTMLElement>) => {\n if (value) onItemKeyDown(e, value);\n (onKeyDown as React.KeyboardEventHandler<HTMLElement> | undefined)?.(e);\n },\n [value, onItemKeyDown, onKeyDown],\n );\n\n const itemClasses = listItemVariants({\n divider,\n interactive: isSelectable,\n selected: isSelected,\n disabled: isDisabled,\n className,\n });\n\n const content = (\n <>\n {leading && (\n <span className=\"ds:shrink-0 ds:flex ds:items-center ds:justify-center\">\n {leading}\n </span>\n )}\n <div className=\"ds:flex-1 ds:flex ds:flex-col ds:gap-[var(--spacing-xs)] ds:min-w-0\">\n <span className=\"ds:text-[color:var(--foreground)] ds:text-[length:var(--font-size-sm)] ds:font-medium ds:leading-[var(--line-height-base)] ds:[overflow-wrap:anywhere]\">\n {title}\n </span>\n {description && (\n <span\n ref={descRef}\n className={[\n 'ds:text-[color:var(--muted-foreground)] ds:text-[length:var(--font-size-xs)] ds:leading-[var(--line-height-base)]',\n lineClamp != null\n ? 'ds:[overflow:hidden] ds:[display:-webkit-box] ds:[-webkit-box-orient:vertical] ds:[-webkit-line-clamp:var(--list-item-clamp)]'\n : '',\n ]\n .filter(Boolean)\n .join(' ')}\n >\n {description}\n </span>\n )}\n </div>\n {trailing && (\n <span className=\"ds:shrink-0 ds:flex ds:items-center ds:justify-center\">\n {trailing}\n </span>\n )}\n </>\n );\n\n if (isSelectable) {\n return (\n <div\n ref={internalRef as React.Ref<HTMLDivElement>}\n role=\"option\"\n aria-selected={isSelected}\n aria-disabled={isDisabled ? true : undefined}\n tabIndex={tabIndex}\n onClick={handleClick}\n onFocus={handleFocus}\n onKeyDown={handleKeyDown}\n className={itemClasses}\n {...props}\n >\n {content}\n </div>\n );\n }\n\n return (\n <li\n ref={internalRef as React.Ref<HTMLLIElement>}\n onClick={handleClick}\n onFocus={handleFocus}\n onKeyDown={handleKeyDown}\n className={itemClasses}\n {...props}\n >\n {/* Inner flex wrapper keeps <li> as display:list-item so ::marker renders */}\n <div className=\"ds:flex ds:items-center ds:gap-x-[var(--spacing-sm)]\">\n {content}\n </div>\n </li>\n );\n },\n);\nListItem.displayName = 'List.Item';\n\n/* ------------------------------------------------------------------ */\n/* Compound export */\n/* ------------------------------------------------------------------ */\n\nexport const List = Object.assign(ListRoot, {\n Root: ListRoot,\n Item: ListItem,\n});\n\nexport type { ListContextValue };\n"],"names":["ListContext","createContext","listVariants","cva","listItemVariants","collectItemInfo","children","items","Children","child","isValidElement","props","ListRoot","forwardRef","as","start","divider","density","selection","controlledValue","defaultValue","onValueChange","disabled","className","ariaLabel","ref","t","useTranslation","isSelectable","isMultiple","isControlled","internalValue","setInternalValue","useState","selectedValues","useMemo","v","allItemInfo","enabledItemValues","i","focusedValue","setFocusedValue","itemRefs","useRef","registerItemRef","useCallback","value","el","focusItem","_a","commit","next","handleItemSelect","itemValue","current","handleItemFocus","handleItemKeyDown","currentIndex","prev","first","last","ctxValue","classes","resolvedAriaLabel","jsx","ListItem","leading","title","description","trailing","lineClamp","itemDisabled","onClick","onFocus","onKeyDown","groupDisabled","onItemSelect","onItemFocus","onItemKeyDown","useContext","isDisabled","isSelected","isFocused","isFirstEnabled","tabIndex","descRef","useLayoutEffect","internalRef","handleClick","e","handleFocus","handleKeyDown","itemClasses","content","jsxs","Fragment","List"],"mappings":"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"}
|
|
@@ -1,57 +0,0 @@
|
|
|
1
|
-
import { jsx as s } from "react/jsx-runtime";
|
|
2
|
-
import { forwardRef as p, useState as w, useEffect as L } from "react";
|
|
3
|
-
import { c as R } from "./index-D2ZczOXr.js";
|
|
4
|
-
const g = R("", {
|
|
5
|
-
variants: {
|
|
6
|
-
visuallyHidden: {
|
|
7
|
-
true: "ds:sr-only",
|
|
8
|
-
false: ""
|
|
9
|
-
}
|
|
10
|
-
},
|
|
11
|
-
defaultVariants: {
|
|
12
|
-
visuallyHidden: !0
|
|
13
|
-
}
|
|
14
|
-
}), h = p(
|
|
15
|
-
({
|
|
16
|
-
politeness: r = "polite",
|
|
17
|
-
atomic: n = !0,
|
|
18
|
-
relevant: u,
|
|
19
|
-
delay: e = 0,
|
|
20
|
-
as: d = "div",
|
|
21
|
-
visuallyHidden: v = !0,
|
|
22
|
-
className: f,
|
|
23
|
-
children: i,
|
|
24
|
-
...l
|
|
25
|
-
}, c) => {
|
|
26
|
-
const [t, a] = w(
|
|
27
|
-
e > 0 ? null : i
|
|
28
|
-
);
|
|
29
|
-
L(() => {
|
|
30
|
-
if (e <= 0) {
|
|
31
|
-
a(i);
|
|
32
|
-
return;
|
|
33
|
-
}
|
|
34
|
-
const m = window.setTimeout(() => {
|
|
35
|
-
a(i);
|
|
36
|
-
}, e);
|
|
37
|
-
return () => {
|
|
38
|
-
window.clearTimeout(m);
|
|
39
|
-
};
|
|
40
|
-
}, [i, e]);
|
|
41
|
-
const o = {
|
|
42
|
-
ref: c,
|
|
43
|
-
role: r === "assertive" ? "alert" : r === "polite" ? "status" : void 0,
|
|
44
|
-
"aria-live": r === "off" ? void 0 : r,
|
|
45
|
-
"aria-atomic": n ? !0 : void 0,
|
|
46
|
-
"aria-relevant": u,
|
|
47
|
-
className: g({ visuallyHidden: v, className: f }),
|
|
48
|
-
...l
|
|
49
|
-
};
|
|
50
|
-
return d === "span" ? /* @__PURE__ */ s("span", { ...o, children: t }) : /* @__PURE__ */ s("div", { ...o, children: t });
|
|
51
|
-
}
|
|
52
|
-
);
|
|
53
|
-
h.displayName = "LiveRegion";
|
|
54
|
-
export {
|
|
55
|
-
h as L
|
|
56
|
-
};
|
|
57
|
-
//# sourceMappingURL=live-region-COggO6x6.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"message-card-DID3cXUW.js","sources":["../../src/components/message-card/message-card.tsx"],"sourcesContent":["import {\n forwardRef,\n useCallback,\n useMemo,\n useRef,\n useState,\n type HTMLAttributes,\n type ReactNode,\n} from 'react';\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport { useTranslation } from 'react-i18next';\nimport { X } from 'lucide-react';\nimport { IconButton } from '../button/icon-button';\nimport { Button } from '../button/button';\nimport { Avatar } from '../avatar/avatar';\nimport { Timestamp } from '../timestamp';\n\n/* ------------------------------------------------------------------ */\n/* Types */\n/* ------------------------------------------------------------------ */\n\nexport interface MessageSender {\n /** Display name — drives the avatar's deterministic colour + initials. */\n name: string;\n /** Optional avatar image URL. */\n avatarUrl?: string;\n}\n\nexport interface MessageItem {\n /** Unique identifier for the message (or thread). */\n id: string;\n /** Sender identity — avatar + bold display name. */\n sender: MessageSender;\n /** Optional subject / conversation title. Rendered bold when unread. */\n subject?: string;\n /** Last-message preview — rendered as plain text, clamped to two lines. */\n preview: string;\n /** ISO-8601 timestamp of when the message was sent. */\n sentAt: string;\n /** Whether the message has been seen. Unread items get accent styling. */\n read?: boolean;\n /** Optional deep link — when present the card row is an anchor. */\n url?: string;\n /**\n * Count of unread messages inside a thread. Rendered as an end-aligned\n * badge when greater than 1.\n */\n unreadCount?: number;\n}\n\nexport interface MessageCardProps\n extends Omit<HTMLAttributes<HTMLDivElement>, 'onClick' | 'role' | 'title'>,\n VariantProps<typeof cardVariants> {\n /** The message to render. */\n item: MessageItem;\n /**\n * Layout shape.\n * - `compact` — single-line row with the whole card clickable (used by\n * MessageTray).\n * - `dashboard` — bordered block with explicit CTA and mark-as-read\n * controls (used by dashboards / sidebars).\n */\n variant?: 'compact' | 'dashboard';\n /** Visual density. */\n size?: 'sm' | 'md';\n /** Fires when the row / title is activated. */\n onActivate?: (item: MessageItem) => void;\n /** Fires when the dismiss control is activated. */\n onDismiss?: (item: MessageItem) => void;\n /**\n * Label for the dashboard-variant CTA. Only rendered when `variant` is\n * `'dashboard'` and the item has a `url`.\n */\n ctaLabel?: string;\n /**\n * Label for the dashboard-variant mark-as-read link. Only rendered when\n * `variant` is `'dashboard'` and `onDismiss` is supplied.\n */\n dismissLabel?: string;\n /**\n * External exit-animation control. When supplied the card plays its\n * fade-out when this turns `true` and the consumer owns the subsequent\n * unmount (see MessageTray). If omitted, the card self-manages the\n * exit on internal dismiss.\n */\n leaving?: boolean;\n}\n\n/* ------------------------------------------------------------------ */\n/* CVA */\n/* ------------------------------------------------------------------ */\n\nconst cardVariants = cva(\n [\n 'ds:relative ds:flex ds:gap-[var(--spacing-sm)]',\n 'ds:rounded-[var(--radius-sm)]',\n 'ds:transition-colors',\n 'ds:motion-safe:animate-in ds:motion-safe:fade-in-0 ds:motion-safe:slide-in-from-top-2 ds:motion-safe:duration-[var(--animation-duration)]',\n 'ds:data-[leaving=true]:motion-safe:animate-out ds:data-[leaving=true]:motion-safe:fade-out-0 ds:data-[leaving=true]:motion-safe:slide-out-to-top-2',\n 'ds:data-[leaving=true]:motion-safe:fill-mode-forwards',\n 'ds:data-[leaving=true]:pointer-events-none',\n 'ds:motion-reduce:transition-none',\n 'ds:text-start',\n 'ds:forced-colors:border ds:forced-colors:border-[CanvasText]',\n ].join(' '),\n {\n variants: {\n variant: {\n compact: 'ds:items-start ds:group',\n dashboard:\n 'ds:flex-col ds:sm:flex-row ds:items-stretch ds:sm:items-start ds:border ds:border-[color:var(--border)] ds:bg-[color:var(--card)]',\n },\n size: {\n sm: 'ds:p-[var(--spacing-sm)]',\n md: 'ds:p-[var(--spacing-md)]',\n },\n state: {\n unread: '',\n read: 'ds:bg-transparent',\n },\n },\n compoundVariants: [\n {\n variant: 'compact',\n state: 'unread',\n class: 'ds:bg-[color:var(--accent)]/5',\n },\n {\n variant: 'compact',\n state: 'read',\n class: 'ds:hover:bg-[color:var(--muted)]/40',\n },\n {\n variant: 'dashboard',\n state: 'unread',\n class: 'ds:bg-[color:var(--accent)]/5',\n },\n ],\n defaultVariants: {\n variant: 'compact',\n size: 'sm',\n state: 'read',\n },\n },\n);\n\nconst stretchedLinkClass = [\n 'focus-visible:outline-none',\n \"after:content-[''] after:absolute after:inset-0 after:rounded-[var(--radius-sm)]\",\n 'after:pointer-events-auto',\n 'focus-visible:after:outline-[length:var(--focus-ring-width)]',\n 'focus-visible:after:outline-solid',\n 'focus-visible:after:outline-[color:var(--ring)]',\n 'focus-visible:after:outline-offset-[length:var(--focus-ring-offset)]',\n 'forced-colors:focus-visible:after:outline-[CanvasText]',\n].join(' ');\n\n/* ------------------------------------------------------------------ */\n/* Helpers */\n/* ------------------------------------------------------------------ */\n\nexport function isSafeMessageUrl(url: string): boolean {\n // Reject protocol-relative (//host), javascript:, data:, mailto: etc.\n // Only http(s), same-origin absolute paths (/), and hash (#) anchors pass.\n return /^(https?:\\/\\/(?!\\/)|\\/(?!\\/)|#)/.test(url);\n}\n\n/* ------------------------------------------------------------------ */\n/* Component */\n/* ------------------------------------------------------------------ */\n\nexport const MessageCard = forwardRef<HTMLDivElement, MessageCardProps>(\n (\n {\n item,\n variant = 'compact',\n size = 'sm',\n onActivate,\n onDismiss,\n ctaLabel,\n dismissLabel,\n leaving,\n className,\n ...rest\n },\n ref,\n ) => {\n const { t, i18n } = useTranslation();\n\n const accessibleTime = useMemo(() => {\n const date = new Date(item.sentAt);\n if (Number.isNaN(date.getTime())) return '';\n return new Intl.DateTimeFormat(i18n.language, {\n dateStyle: 'medium',\n timeStyle: 'short',\n }).format(date);\n }, [item.sentAt, i18n.language]);\n\n const isControlledLeaving = leaving !== undefined;\n const [isLeaving, setIsLeaving] = useState(false);\n const dismissTimerRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n\n const effectiveLeaving = isControlledLeaving ? leaving : isLeaving;\n\n const prefersReducedMotion =\n typeof window !== 'undefined' &&\n typeof window.matchMedia === 'function' &&\n window.matchMedia('(prefers-reduced-motion: reduce)').matches;\n\n const handleDismiss = useCallback(() => {\n if (!onDismiss) return;\n if (isControlledLeaving || prefersReducedMotion) {\n onDismiss(item);\n return;\n }\n setIsLeaving(true);\n if (dismissTimerRef.current) clearTimeout(dismissTimerRef.current);\n const raw =\n (typeof window !== 'undefined' &&\n window\n .getComputedStyle(document.documentElement)\n .getPropertyValue('--animation-duration')) ||\n '200ms';\n const ms = raw.trim().endsWith('ms')\n ? parseFloat(raw)\n : parseFloat(raw) * 1000;\n dismissTimerRef.current = setTimeout(\n () => onDismiss(item),\n Number.isFinite(ms) ? ms : 200,\n );\n }, [onDismiss, item, isControlledLeaving, prefersReducedMotion]);\n\n const state = item.read ? 'read' : 'unread';\n\n const unreadSuffix = item.read\n ? ''\n : t('ui.messageCard.unreadSuffix', ', unread');\n const subjectFragment = item.subject\n ? t('ui.messageCard.subjectFragment', {\n subject: item.subject,\n defaultValue: ' — {{subject}}',\n })\n : '';\n const ariaLabel = t('ui.messageCard.itemLabel', {\n sender: item.sender.name,\n subjectFragment,\n time: accessibleTime,\n unreadSuffix,\n defaultValue:\n 'Message from {{sender}}{{subjectFragment}}, {{time}}{{unreadSuffix}}',\n });\n\n const hasSafeUrl = !!item.url && isSafeMessageUrl(item.url);\n\n /* ------- Sender-name rendering (stretched link in compact mode) ------ */\n\n const senderText = (\n <span\n className={[\n 'ds:flex-1 ds:min-w-0 ds:truncate',\n item.read ? 'ds:font-normal' : 'ds:font-semibold',\n ].join(' ')}\n >\n {item.sender.name}\n </span>\n );\n\n let senderNode: ReactNode;\n if (variant === 'compact' && hasSafeUrl && onActivate) {\n senderNode = (\n <a\n href={item.url}\n aria-label={ariaLabel}\n className={stretchedLinkClass + ' ds:contents'}\n onClick={(event) => {\n if (\n event.defaultPrevented ||\n event.metaKey ||\n event.ctrlKey ||\n event.shiftKey\n )\n return;\n onActivate(item);\n }}\n >\n {senderText}\n </a>\n );\n } else if (variant === 'compact' && onActivate) {\n senderNode = (\n <button\n type=\"button\"\n aria-label={ariaLabel}\n className={stretchedLinkClass + ' ds:contents ds:bg-transparent ds:border-0 ds:p-0'}\n onClick={() => onActivate(item)}\n >\n {senderText}\n </button>\n );\n } else if (variant === 'dashboard' && hasSafeUrl && onActivate) {\n senderNode = (\n <a\n href={item.url}\n className=\"ds:text-[color:var(--foreground)] ds:no-underline ds:hover:underline ds:focus-visible:outline-[length:var(--focus-ring-width)] ds:focus-visible:outline-solid ds:focus-visible:outline-[color:var(--ring)] ds:focus-visible:outline-offset-[length:var(--focus-ring-offset)]\"\n onClick={(event) => {\n if (\n event.defaultPrevented ||\n event.metaKey ||\n event.ctrlKey ||\n event.shiftKey\n )\n return;\n onActivate(item);\n }}\n >\n {senderText}\n </a>\n );\n } else {\n senderNode = senderText;\n }\n\n const showThreadCount =\n typeof item.unreadCount === 'number' && item.unreadCount > 1;\n\n return (\n <div\n ref={ref}\n role=\"listitem\"\n data-read={item.read ? 'true' : 'false'}\n data-leaving={effectiveLeaving ? 'true' : undefined}\n aria-hidden={effectiveLeaving || undefined}\n className={cardVariants({ variant, size, state, className })}\n {...rest}\n >\n {/* Avatar is decorative here — the row's assembled `aria-label`\n already names the sender, so letting Avatar contribute its own\n `role=\"img\"` + `aria-label={name}` would announce the name twice\n per row. `aria-hidden` + `role=\"presentation\"` (spread last, so\n they win over Avatar's internal values) pulls the element out of\n the a11y tree entirely. */}\n <Avatar\n name={item.sender.name}\n src={item.sender.avatarUrl}\n size={size === 'md' ? 'md' : 'sm'}\n className=\"ds:shrink-0\"\n aria-hidden=\"true\"\n role=\"presentation\"\n aria-label={undefined}\n />\n\n <div className=\"ds:flex-1 ds:min-w-0 ds:flex ds:flex-col ds:gap-[var(--spacing-sm)]\">\n <div className=\"ds:flex ds:items-center ds:gap-[var(--spacing-xs)]\">\n {!item.read ? (\n <span\n aria-hidden=\"true\"\n className=\"ds:inline-block ds:size-1.5 ds:shrink-0 ds:rounded-[var(--radius-full)] ds:bg-[color:var(--primary)] ds:forced-colors:bg-[Highlight]\"\n />\n ) : null}\n {variant === 'dashboard' ? (\n <h3 className=\"ds:m-0 ds:flex-1 ds:min-w-0 type-title-item\">\n {senderNode}\n </h3>\n ) : (\n <span className=\"ds:flex-1 ds:min-w-0 type-title-item ds:text-[color:var(--foreground)]\">\n {senderNode}\n </span>\n )}\n {showThreadCount ? (\n <span\n aria-label={t('ui.messageCard.threadCount', {\n count: item.unreadCount,\n defaultValue_one: '{{count}} new message in thread',\n defaultValue_other: '{{count}} new messages in thread',\n })}\n className=\"ds:relative ds:z-[1] ds:shrink-0 ds:inline-flex ds:items-center ds:justify-center ds:min-w-[calc(var(--spacing-md)+var(--spacing-xs))] ds:h-[calc(var(--spacing-md)+var(--spacing-xs))] ds:ps-[calc(var(--spacing-xs)/1.5)] ds:pe-[calc(var(--spacing-xs)/1.5)] ds:rounded-[var(--radius-full)] ds:bg-[color:var(--accent)] ds:text-[color:var(--accent-foreground)] ds:text-[length:var(--font-size-xs)] ds:font-semibold ds:leading-none ds:forced-colors:outline ds:forced-colors:outline-1 ds:forced-colors:outline-[CanvasText]\"\n >\n {item.unreadCount}\n </span>\n ) : null}\n </div>\n\n {item.subject ? (\n <p\n className={[\n 'ds:m-0 type-body-sm ds:text-[color:var(--foreground)] ds:truncate',\n item.read ? 'ds:font-normal' : 'ds:font-semibold',\n ].join(' ')}\n >\n {item.subject}\n </p>\n ) : null}\n\n <p className=\"ds:m-0 type-body-sm ds:text-[color:var(--muted-foreground)] ds:[overflow:hidden] ds:[display:-webkit-box] ds:[-webkit-box-orient:vertical] ds:[-webkit-line-clamp:2] ds:break-words\">\n {item.preview}\n </p>\n\n <Timestamp\n value={item.sentAt}\n shape=\"chip\"\n size=\"sm\"\n relativeWindow={12 * 60 * 60 * 1000}\n />\n\n {variant === 'dashboard' && (ctaLabel || dismissLabel) ? (\n <div className=\"ds:flex ds:flex-wrap ds:items-center ds:gap-[var(--spacing-sm)]\">\n {ctaLabel && hasSafeUrl ? (\n <Button\n intent=\"outline\"\n size=\"sm\"\n asChild\n className=\"ds:relative ds:z-[1]\"\n >\n <a\n href={item.url}\n onClick={(event) => {\n if (\n event.defaultPrevented ||\n event.metaKey ||\n event.ctrlKey ||\n event.shiftKey\n )\n return;\n onActivate?.(item);\n }}\n >\n {ctaLabel}\n </a>\n </Button>\n ) : null}\n {dismissLabel && onDismiss ? (\n <Button\n intent=\"link\"\n size=\"sm\"\n onClick={handleDismiss}\n className=\"ds:relative ds:z-[1]\"\n >\n {dismissLabel}\n </Button>\n ) : null}\n </div>\n ) : null}\n </div>\n\n {variant === 'compact' && onDismiss ? (\n <span className=\"ds:relative ds:z-[1] ds:opacity-0 ds:group-hover:opacity-100 ds:group-focus-within:opacity-100 ds:transition-opacity ds:motion-reduce:transition-none\">\n <IconButton\n icon={<X />}\n intent=\"ghost\"\n size=\"sm\"\n aria-label={t('ui.messageCard.dismiss', 'Dismiss message')}\n onClick={handleDismiss}\n />\n </span>\n ) : null}\n </div>\n );\n },\n);\n\nMessageCard.displayName = 'MessageCard';\n"],"names":["cardVariants","cva","stretchedLinkClass","isSafeMessageUrl","url","MessageCard","forwardRef","item","variant","size","onActivate","onDismiss","ctaLabel","dismissLabel","leaving","className","rest","ref","t","i18n","useTranslation","accessibleTime","useMemo","date","isControlledLeaving","isLeaving","setIsLeaving","useState","dismissTimerRef","useRef","effectiveLeaving","prefersReducedMotion","handleDismiss","useCallback","raw","ms","state","unreadSuffix","subjectFragment","ariaLabel","hasSafeUrl","senderText","jsx","senderNode","event","showThreadCount","jsxs","Avatar","Timestamp","Button","IconButton","X"],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"message-tray-CVMLBnVp.js","sources":["../../src/components/message-tray/message-tray.tsx"],"sourcesContent":["import {\n forwardRef,\n useCallback,\n useEffect,\n useLayoutEffect,\n useRef,\n useState,\n type HTMLAttributes,\n} from 'react';\nimport * as RadixPopover from '@radix-ui/react-popover';\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport { useTranslation } from 'react-i18next';\nimport { Mail } from 'lucide-react';\nimport { IconButton } from '../button/icon-button';\nimport { Button } from '../button/button';\nimport { Separator } from '../separator/separator';\nimport { Skeleton } from '../skeleton/skeleton';\nimport { MessageCard, type MessageItem } from '../message-card/message-card';\n\n/* ------------------------------------------------------------------ */\n/* Types */\n/* ------------------------------------------------------------------ */\n\nexport interface MessageTrayProps\n extends Omit<\n HTMLAttributes<HTMLDivElement>,\n 'onClick' | 'children' | 'role'\n >,\n VariantProps<typeof messageTrayVariants> {\n /** Messages rendered in the dropdown panel. */\n items: MessageItem[];\n /** Number of unread messages. Drives the badge count. */\n unreadCount?: number;\n /** Controlled open state. */\n open?: boolean;\n /** Fires when the open state changes. */\n onOpenChange?: (open: boolean) => void;\n /** Fires when the user activates an item (click or Enter/Space). */\n onItemClick?: (item: MessageItem) => void;\n /** Fires when the user dismisses / archives a message. */\n onDismiss?: (item: MessageItem) => void;\n /** Fires when the user clicks the header \"Mark all as read\" action. */\n onMarkAllRead?: () => void;\n /** When true the panel shows skeleton placeholders. */\n loading?: boolean;\n /**\n * Advisory item count before the list scrolls. Consumers override the cap\n * via the `--message-tray-max-block-size` custom property.\n */\n maxVisible?: number;\n /** When set renders a footer link that invokes `onViewAll`. */\n viewAllLabel?: string;\n /** Fires when the footer \"View all\" link is clicked. */\n onViewAll?: () => void;\n /** Panel alignment relative to the trigger. Default `'end'`. */\n align?: 'start' | 'center' | 'end';\n /** Side of the trigger to open on. Default `'bottom'`. */\n side?: 'top' | 'bottom';\n}\n\n/* ------------------------------------------------------------------ */\n/* CVA */\n/* ------------------------------------------------------------------ */\n\nconst messageTrayVariants = cva('ds:relative ds:inline-flex ds:items-center', {\n variants: {\n size: {\n sm: '',\n md: '',\n },\n },\n defaultVariants: {\n size: 'md',\n },\n});\n\nconst panelVariants = cva(\n [\n 'ds:flex ds:flex-col',\n 'ds:bg-[var(--popover)] ds:text-[var(--popover-foreground)]',\n 'ds:border ds:border-[color:var(--border)]',\n 'ds:rounded-[var(--radius-md)]',\n 'ds:shadow-[var(--shadow-lg)]',\n 'ds:z-[var(--z-popover)]',\n // Width: fluid below the design cap so narrow viewports keep a visible\n // gutter on both sides (shadow included). Cap slightly wider than\n // NotificationTray because message rows carry subject + preview.\n 'ds:w-[min(26rem,calc(100vw-2*var(--spacing-md)))]',\n // Height: below the `sm` breakpoint the panel takes a near-full-screen\n // sheet shape so the user gets room to triage an inbox without\n // scrolling a tiny popover. `6rem` reserves space for the Header\n // (≈4rem) plus the sideOffset + collisionPadding (≈2rem). Above `sm`\n // it returns to `h-auto` so the list's own cap governs the height.\n 'ds:h-[calc(100dvh-6rem)] ds:sm:h-auto',\n 'ds:data-[state=open]:animate-in ds:data-[state=closed]:animate-out',\n 'ds:data-[state=closed]:fade-out-0 ds:data-[state=open]:fade-in-0',\n 'ds:data-[state=closed]:zoom-out-95 ds:data-[state=open]:zoom-in-95',\n 'ds:motion-reduce:transition-none ds:motion-reduce:animate-none',\n 'ds:focus-visible:outline-none',\n 'ds:forced-colors:border-[CanvasText]',\n ].join(' '),\n {\n variants: {\n size: {\n sm: 'ds:p-[var(--spacing-xs)]',\n md: 'ds:p-[var(--spacing-sm)]',\n },\n },\n defaultVariants: {\n size: 'md',\n },\n },\n);\n\nconst badgeVariants = cva(\n [\n 'ds:absolute ds:-top-[var(--spacing-xs)] ds:-end-[var(--spacing-xs)]',\n 'ds:inline-flex ds:items-center ds:justify-center',\n 'ds:min-w-[calc(var(--spacing-md)+var(--spacing-xs))] ds:h-[calc(var(--spacing-md)+var(--spacing-xs))] ds:ps-[calc(var(--spacing-xs)/1.5)] ds:pe-[calc(var(--spacing-xs)/1.5)]',\n 'ds:rounded-[var(--radius-full)]',\n 'ds:bg-[color:var(--destructive)] ds:text-[color:var(--destructive-foreground)]',\n 'ds:text-[length:var(--font-size-xs)] ds:font-semibold ds:leading-none',\n 'ds:pointer-events-none ds:select-none',\n 'ds:forced-colors:outline ds:forced-colors:outline-1 ds:forced-colors:outline-[CanvasText]',\n ].join(' '),\n);\n\n/* ------------------------------------------------------------------ */\n/* Helpers */\n/* ------------------------------------------------------------------ */\n\nfunction formatBadgeCount(count: number, overflowLabel: string): string {\n return count > 99 ? overflowLabel : String(count);\n}\n\nfunction SkeletonRow() {\n return (\n <div\n aria-hidden=\"true\"\n className=\"ds:flex ds:items-start ds:gap-[var(--spacing-sm)] ds:p-[var(--spacing-sm)]\"\n >\n <Skeleton variant=\"circular\" size=\"sm\" />\n <div className=\"ds:flex-1 ds:flex ds:flex-col ds:gap-[var(--spacing-xs)]\">\n <Skeleton variant=\"text\" size=\"md\" width=\"60%\" />\n <Skeleton variant=\"text\" size=\"sm\" width=\"80%\" />\n <Skeleton variant=\"text\" size=\"sm\" width=\"95%\" />\n <Skeleton variant=\"text\" size=\"sm\" width=\"30%\" />\n </div>\n </div>\n );\n}\n\nfunction EmptyPanel() {\n const { t } = useTranslation();\n return (\n <div\n role=\"status\"\n aria-live=\"polite\"\n className=\"ds:flex ds:flex-col ds:items-center ds:justify-center ds:gap-[var(--spacing-xs)] ds:p-[var(--spacing-lg)] ds:text-center\"\n >\n <span\n aria-hidden=\"true\"\n className=\"ds:inline-flex ds:items-center ds:justify-center ds:size-10 ds:rounded-[var(--radius-full)] ds:bg-[color:var(--muted)] ds:text-[color:var(--muted-foreground)] ds:[&>svg]:size-5\"\n >\n <Mail />\n </span>\n <p className=\"type-title-item ds:text-[color:var(--foreground)]\">\n {t('ui.messageTray.noMessages', 'No messages')}\n </p>\n <p className=\"type-meta ds:text-[color:var(--muted-foreground)]\">\n {t(\n 'ui.messageTray.noMessagesDescription',\n 'Your inbox is clear.',\n )}\n </p>\n </div>\n );\n}\n\n/* ------------------------------------------------------------------ */\n/* Root */\n/* ------------------------------------------------------------------ */\n\nexport const MessageTray = forwardRef<HTMLDivElement, MessageTrayProps>(\n (\n {\n items,\n unreadCount,\n open,\n onOpenChange,\n onItemClick,\n onDismiss,\n onMarkAllRead,\n loading = false,\n maxVisible,\n viewAllLabel,\n onViewAll,\n align = 'end',\n side = 'bottom',\n size = 'md',\n className,\n ...rest\n },\n ref,\n ) => {\n const { t } = useTranslation();\n\n const isControlled = open !== undefined;\n const [internalOpen, setInternalOpen] = useState(false);\n const isOpen = isControlled ? open : internalOpen;\n\n const handleOpenChange = useCallback(\n (next: boolean) => {\n if (!isControlled) setInternalOpen(next);\n onOpenChange?.(next);\n },\n [isControlled, onOpenChange],\n );\n\n /* Exit-animation list — same AnimatePresence-style bookkeeping as\n * NotificationTray. See that component for rationale. */\n type Displayed = { item: MessageItem; leaving: boolean };\n const [displayed, setDisplayed] = useState<Displayed[]>(() =>\n items.map((item) => ({ item, leaving: false })),\n );\n\n const animationDurationMs = useCallback((): number => {\n if (typeof window === 'undefined') return 200;\n const raw = window\n .getComputedStyle(document.documentElement)\n .getPropertyValue('--animation-duration');\n if (!raw) return 200;\n const trimmed = raw.trim();\n const n = parseFloat(trimmed);\n if (!Number.isFinite(n)) return 200;\n return trimmed.endsWith('ms') ? n : n * 1000;\n }, []);\n\n useLayoutEffect(() => {\n setDisplayed((prev) => {\n const nextIds = new Set(items.map((i) => i.id));\n const prevIds = new Set(prev.map((d) => d.item.id));\n\n const merged: Displayed[] = prev.map((d) => {\n if (nextIds.has(d.item.id)) {\n const fresh = items.find((i) => i.id === d.item.id);\n return fresh\n ? { item: fresh, leaving: false }\n : { ...d, leaving: true };\n }\n return { ...d, leaving: true };\n });\n\n for (const i of items) {\n if (!prevIds.has(i.id)) merged.push({ item: i, leaving: false });\n }\n return merged;\n });\n }, [items]);\n\n useEffect(() => {\n if (!displayed.some((d) => d.leaving)) return;\n const ms = animationDurationMs();\n const timer = setTimeout(() => {\n setDisplayed((prev) => prev.filter((d) => !d.leaving));\n }, ms);\n return () => clearTimeout(timer);\n }, [displayed, animationDurationMs]);\n\n const liveRegionRef = useRef<HTMLDivElement | null>(null);\n const lastTopIdRef = useRef<string | undefined>(items[0]?.id);\n\n useEffect(() => {\n const topId = items[0]?.id;\n const prev = lastTopIdRef.current;\n if (prev && topId && prev !== topId && liveRegionRef.current) {\n const newest = items[0];\n if (newest && !newest.read) {\n liveRegionRef.current.textContent = t(\n 'ui.messageTray.newMessage',\n {\n sender: newest.sender.name,\n defaultValue: 'New message from {{sender}}',\n },\n );\n }\n }\n lastTopIdRef.current = topId;\n }, [items, t]);\n\n const displayCount = unreadCount ?? 0;\n const triggerAriaLabel =\n displayCount > 0\n ? t('ui.messageTray.triggerLabel', {\n count: displayCount,\n defaultValue: 'Messages, {{count}} unread',\n })\n : t('ui.messageTray.triggerLabelNone', 'Messages, none unread');\n\n const badgeLabel = formatBadgeCount(\n displayCount,\n t('ui.messageTray.badgeCountOverflow', '99+'),\n );\n\n const panelClass = panelVariants({ size });\n\n return (\n <div\n ref={ref}\n className={[messageTrayVariants({ size }), className]\n .filter(Boolean)\n .join(' ')}\n {...rest}\n >\n <RadixPopover.Root open={isOpen} onOpenChange={handleOpenChange}>\n <RadixPopover.Trigger asChild>\n <IconButton\n icon={<Mail />}\n intent=\"outline\"\n size={size === 'sm' ? 'sm' : 'md'}\n aria-label={triggerAriaLabel}\n aria-haspopup=\"dialog\"\n />\n </RadixPopover.Trigger>\n {displayCount > 0 ? (\n <span\n aria-hidden=\"true\"\n data-testid=\"message-tray-badge\"\n className={badgeVariants()}\n >\n {badgeLabel}\n </span>\n ) : null}\n <div\n ref={liveRegionRef}\n aria-live=\"polite\"\n aria-atomic=\"true\"\n className=\"ds:sr-only\"\n />\n <RadixPopover.Portal>\n <RadixPopover.Content\n role=\"dialog\"\n aria-label={t('ui.messageTray.panelTitle', 'Messages')}\n side={side}\n align={align}\n sideOffset={8}\n // `spacing-md` (16px) keeps Radix's collision-avoidance from\n // flush-mounting the panel against the viewport edge when the\n // trigger is near the inline-end of a narrow screen.\n collisionPadding={16}\n className={panelClass}\n >\n <div className=\"ds:flex ds:items-center ds:justify-between ds:gap-[var(--spacing-sm)] ds:ps-[var(--spacing-sm)] ds:pe-[var(--spacing-sm)] ds:pb-[var(--spacing-xs)]\">\n <h3 className=\"ds:m-0 type-title-card ds:text-[color:var(--foreground)]\">\n {t('ui.messageTray.panelTitle', 'Messages')}\n </h3>\n {onMarkAllRead && items.some((item) => !item.read) ? (\n <Button\n intent=\"link\"\n size=\"sm\"\n onClick={onMarkAllRead}\n className=\"ds:text-[length:var(--font-size-xs)]\"\n >\n {t('ui.messageTray.markAllRead', 'Mark all as read')}\n </Button>\n ) : null}\n </div>\n <Separator />\n <div\n role=\"list\"\n data-max-visible={maxVisible}\n // Below `sm` the panel is a near-full-screen sheet (see\n // `panelVariants`) and the list expands to fill the\n // remaining space with `flex-1`. Above `sm` the list\n // caps at the `--message-tray-max-block-size` custom\n // property so the popover stays compact.\n className=\"ds:flex ds:flex-col ds:gap-[var(--spacing-xs)] ds:overflow-y-auto ds:pt-[var(--spacing-xs)] ds:flex-1 ds:sm:flex-none ds:sm:[max-block-size:var(--message-tray-max-block-size,26rem)]\"\n >\n {loading ? (\n <>\n <SkeletonRow />\n <SkeletonRow />\n <SkeletonRow />\n </>\n ) : displayed.length === 0 ? (\n <EmptyPanel />\n ) : (\n displayed.map(({ item, leaving }) => (\n <MessageCard\n key={item.id}\n item={item}\n variant=\"compact\"\n leaving={leaving}\n onActivate={onItemClick}\n onDismiss={onDismiss}\n />\n ))\n )}\n </div>\n {viewAllLabel ? (\n <>\n <Separator />\n <div className=\"ds:pt-[var(--spacing-xs)]\">\n <Button\n intent=\"link\"\n size=\"sm\"\n onClick={onViewAll}\n className=\"ds:w-full ds:justify-center\"\n >\n {viewAllLabel}\n </Button>\n </div>\n </>\n ) : null}\n </RadixPopover.Content>\n </RadixPopover.Portal>\n </RadixPopover.Root>\n </div>\n );\n },\n);\n\nMessageTray.displayName = 'MessageTray';\n"],"names":["messageTrayVariants","cva","panelVariants","badgeVariants","formatBadgeCount","count","overflowLabel","SkeletonRow","jsxs","jsx","Skeleton","EmptyPanel","t","useTranslation","Mail","MessageTray","forwardRef","items","unreadCount","open","onOpenChange","onItemClick","onDismiss","onMarkAllRead","loading","maxVisible","viewAllLabel","onViewAll","align","side","size","className","rest","ref","isControlled","internalOpen","setInternalOpen","useState","isOpen","handleOpenChange","useCallback","next","displayed","setDisplayed","item","animationDurationMs","raw","trimmed","n","useLayoutEffect","prev","nextIds","i","prevIds","d","merged","fresh","useEffect","ms","timer","liveRegionRef","useRef","lastTopIdRef","_a","topId","newest","displayCount","triggerAriaLabel","badgeLabel","panelClass","RadixPopover","IconButton","Button","Separator","Fragment","leaving","MessageCard"],"mappings":"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"}
|