@alfadocs/ui-kit 0.0.20 → 0.1.1
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 +117 -0
- package/dist/_chunks/accordion-BJD1aM67.js.map +1 -0
- package/dist/_chunks/agenda-card-Bld47Eul.js +130 -0
- package/dist/_chunks/agenda-card-Bld47Eul.js.map +1 -0
- package/dist/_chunks/agenda-tray-D86cNIJ0.js +119 -0
- package/dist/_chunks/agenda-tray-D86cNIJ0.js.map +1 -0
- package/dist/_chunks/ai-prompt-input-CdYwt2VP.js +379 -0
- package/dist/_chunks/ai-prompt-input-CdYwt2VP.js.map +1 -0
- package/dist/_chunks/{alert-C5ud6CfE.js → alert-ETrF7Q8J.js} +51 -51
- package/dist/_chunks/alert-ETrF7Q8J.js.map +1 -0
- package/dist/_chunks/apexcharts-theme-BkSShpEy.js +48 -0
- package/dist/_chunks/apexcharts-theme-BkSShpEy.js.map +1 -0
- package/dist/_chunks/{app-frame-CmIUp9BD.js → app-frame-uq2Gy0vs.js} +37 -37
- package/dist/_chunks/app-frame-uq2Gy0vs.js.map +1 -0
- package/dist/_chunks/aspect-ratio-BqU4itGW.js +56 -0
- package/dist/_chunks/aspect-ratio-BqU4itGW.js.map +1 -0
- package/dist/_chunks/{audio-recorder-GkGNtW2X.js → audio-recorder-D2UEBF9B.js} +98 -98
- package/dist/_chunks/audio-recorder-D2UEBF9B.js.map +1 -0
- package/dist/_chunks/{audio-visualiser-CIO3yy23.js → audio-visualiser-B4u4goV5.js} +46 -46
- package/dist/_chunks/audio-visualiser-B4u4goV5.js.map +1 -0
- package/dist/_chunks/{autocomplete.agent-kb0nmr6F.js → autocomplete.agent-Bi6CiRKa.js} +111 -111
- package/dist/_chunks/autocomplete.agent-Bi6CiRKa.js.map +1 -0
- package/dist/_chunks/{avatar-BsV7vRA6.js → avatar-BAhxbDEu.js} +38 -38
- package/dist/_chunks/avatar-BAhxbDEu.js.map +1 -0
- package/dist/_chunks/badge-zDghajh8.js +104 -0
- package/dist/_chunks/badge-zDghajh8.js.map +1 -0
- package/dist/_chunks/{balance-cell-renderer-BQwN51rT.js → balance-cell-renderer-BGyvZWjB.js} +123 -124
- package/dist/_chunks/balance-cell-renderer-BGyvZWjB.js.map +1 -0
- package/dist/_chunks/{breadcrumb-DnO6eHSS.js → breadcrumb-pdUacgm1.js} +40 -40
- package/dist/_chunks/breadcrumb-pdUacgm1.js.map +1 -0
- package/dist/_chunks/button-DmiGFnNA.js +119 -0
- package/dist/_chunks/button-DmiGFnNA.js.map +1 -0
- package/dist/_chunks/{button-group-CI7LFxt3.js → button-group-BtTHSyU0.js} +24 -24
- package/dist/_chunks/button-group-BtTHSyU0.js.map +1 -0
- package/dist/_chunks/{calendar-BIXVzhkL.js → calendar-BkDeDTaX.js} +333 -290
- package/dist/_chunks/calendar-BkDeDTaX.js.map +1 -0
- package/dist/_chunks/card-DeItIBcV.js +158 -0
- package/dist/_chunks/card-DeItIBcV.js.map +1 -0
- package/dist/_chunks/{chart.agent-DkmVXNsI.js → chart.agent-BdS-_8MO.js} +66 -64
- package/dist/_chunks/chart.agent-BdS-_8MO.js.map +1 -0
- package/dist/_chunks/chat-container-Co8HpB64.js +174 -0
- package/dist/_chunks/chat-container-Co8HpB64.js.map +1 -0
- package/dist/_chunks/{chat-input-aphxDjZL.js → chat-input-3rstZhHR.js} +57 -57
- package/dist/_chunks/chat-input-3rstZhHR.js.map +1 -0
- package/dist/_chunks/{chat-message-CdJSD18D.js → chat-message-dDMVSYBs.js} +66 -66
- package/dist/_chunks/chat-message-dDMVSYBs.js.map +1 -0
- package/dist/_chunks/checkbox-DMzgtnqw.js +116 -0
- package/dist/_chunks/checkbox-DMzgtnqw.js.map +1 -0
- package/dist/_chunks/{checkbox-group-D1aqVI0-.js → checkbox-group-DBnIBRT_.js} +34 -34
- package/dist/_chunks/checkbox-group-DBnIBRT_.js.map +1 -0
- package/dist/_chunks/{collapsible-jBFm7Ah8.js → collapsible-DPGQnHZh.js} +16 -16
- package/dist/_chunks/collapsible-DPGQnHZh.js.map +1 -0
- package/dist/_chunks/{color-picker-CiotzQJF.js → color-picker-OKKF3Dww.js} +158 -158
- package/dist/_chunks/color-picker-OKKF3Dww.js.map +1 -0
- package/dist/_chunks/{combobox.agent-B6RwDSct.js → combobox.agent-CfeB-IZ1.js} +107 -107
- package/dist/_chunks/combobox.agent-CfeB-IZ1.js.map +1 -0
- package/dist/_chunks/{command-palette.agent-B87_OkmC.js → command-palette.agent-XLfSGHCL.js} +27 -27
- package/dist/_chunks/command-palette.agent-XLfSGHCL.js.map +1 -0
- package/dist/_chunks/{date-picker-CdPuI3dK.js → date-picker-DXx8oSJb.js} +5 -5
- package/dist/_chunks/{date-picker-CdPuI3dK.js.map → date-picker-DXx8oSJb.js.map} +1 -1
- package/dist/_chunks/{date-range-picker-DfK4cjln.js → date-range-picker-C3CbY__H.js} +29 -29
- package/dist/_chunks/{date-range-picker-DfK4cjln.js.map → date-range-picker-C3CbY__H.js.map} +1 -1
- package/dist/_chunks/{date-time-picker-CX_FMsLG.js → date-time-picker-Bn3FPeAc.js} +58 -58
- package/dist/_chunks/date-time-picker-Bn3FPeAc.js.map +1 -0
- package/dist/_chunks/description-list-B1CL3RTG.js +187 -0
- package/dist/_chunks/description-list-B1CL3RTG.js.map +1 -0
- package/dist/_chunks/{dialog.agent-B276rAQF.js → dialog.agent-D9WeIWi2.js} +39 -39
- package/dist/_chunks/dialog.agent-D9WeIWi2.js.map +1 -0
- package/dist/_chunks/dropdown-menu-BnVUeVG3.js +210 -0
- package/dist/_chunks/dropdown-menu-BnVUeVG3.js.map +1 -0
- package/dist/_chunks/{empty-state-DiG7vYBM.js → empty-state-DV96gCnp.js} +37 -37
- package/dist/_chunks/empty-state-DV96gCnp.js.map +1 -0
- package/dist/_chunks/{file-upload.agent-BMow5yDY.js → file-upload.agent-DYFnqdxw.js} +185 -185
- package/dist/_chunks/file-upload.agent-DYFnqdxw.js.map +1 -0
- package/dist/_chunks/{flag-ChP784EM.js → flag-C3BUEwHH.js} +14 -14
- package/dist/_chunks/{flag-ChP784EM.js.map → flag-C3BUEwHH.js.map} +1 -1
- package/dist/_chunks/floating-action-button-RigP2E7o.js +95 -0
- package/dist/_chunks/floating-action-button-RigP2E7o.js.map +1 -0
- package/dist/_chunks/form-field-DI5LY5aG.js +121 -0
- package/dist/_chunks/form-field-DI5LY5aG.js.map +1 -0
- package/dist/_chunks/freemium-paywall-D0GiUFOe.js +197 -0
- package/dist/_chunks/freemium-paywall-D0GiUFOe.js.map +1 -0
- package/dist/_chunks/{header-BpKaSL_v.js → header-CW2oRd5H.js} +111 -111
- package/dist/_chunks/header-CW2oRd5H.js.map +1 -0
- package/dist/_chunks/icon-button-C482ii4y.js +45 -0
- package/dist/_chunks/icon-button-C482ii4y.js.map +1 -0
- package/dist/_chunks/{icon-button-group-tERESY-n.js → icon-button-group-BnhkUWUg.js} +56 -56
- package/dist/_chunks/icon-button-group-BnhkUWUg.js.map +1 -0
- package/dist/_chunks/{kbd-0iPlQjgC.js → kbd-DTcIjYA7.js} +52 -52
- package/dist/_chunks/kbd-DTcIjYA7.js.map +1 -0
- package/dist/_chunks/{key-value-pair--Je59tAF.js → key-value-pair-DDhSYdDL.js} +26 -26
- package/dist/_chunks/key-value-pair-DDhSYdDL.js.map +1 -0
- package/dist/_chunks/leo-sidebar-gXXcGPKk.js +755 -0
- package/dist/_chunks/leo-sidebar-gXXcGPKk.js.map +1 -0
- package/dist/_chunks/{list-n8vI8Yvn.js → list-Cwe8mcmh.js} +96 -96
- package/dist/_chunks/list-Cwe8mcmh.js.map +1 -0
- package/dist/_chunks/live-region-COggO6x6.js +57 -0
- package/dist/_chunks/live-region-COggO6x6.js.map +1 -0
- package/dist/_chunks/{logo-UNWYb9p7.js → logo-3wrZGpwg.js} +29 -29
- package/dist/_chunks/logo-3wrZGpwg.js.map +1 -0
- package/dist/_chunks/{matrix-rain-Q7xTEpKu.js → matrix-rain-gsHqSvW7.js} +75 -75
- package/dist/_chunks/matrix-rain-gsHqSvW7.js.map +1 -0
- package/dist/_chunks/message-card-DID3cXUW.js +275 -0
- package/dist/_chunks/message-card-DID3cXUW.js.map +1 -0
- package/dist/_chunks/message-tray-CVMLBnVp.js +302 -0
- package/dist/_chunks/message-tray-CVMLBnVp.js.map +1 -0
- package/dist/_chunks/{multi-select.agent-Cf4pU636.js → multi-select.agent-BUKYZJfp.js} +126 -126
- package/dist/_chunks/multi-select.agent-BUKYZJfp.js.map +1 -0
- package/dist/_chunks/{navigation-menu-DBDsAmXc.js → navigation-menu-NjwxyshT.js} +68 -97
- package/dist/_chunks/navigation-menu-NjwxyshT.js.map +1 -0
- package/dist/_chunks/notification-card-BZ33fq8H.js +255 -0
- package/dist/_chunks/notification-card-BZ33fq8H.js.map +1 -0
- package/dist/_chunks/{notification-tray-CNWPuPZp.js → notification-tray-CnEd7B2q.js} +96 -96
- package/dist/_chunks/notification-tray-CnEd7B2q.js.map +1 -0
- package/dist/_chunks/{number-input-B1Th0DdC.js → number-input-D7rSa_ef.js} +73 -73
- package/dist/_chunks/number-input-D7rSa_ef.js.map +1 -0
- package/dist/_chunks/{otp-input-CmoBuZ4K.js → otp-input-C9R9sC74.js} +42 -42
- package/dist/_chunks/otp-input-C9R9sC74.js.map +1 -0
- package/dist/_chunks/{pagination.agent-B5KLDCMN.js → pagination.agent-D75FB6XP.js} +106 -106
- package/dist/_chunks/pagination.agent-D75FB6XP.js.map +1 -0
- package/dist/_chunks/{password-input-DnjNh-hQ.js → password-input-C6PvKyQV.js} +59 -59
- package/dist/_chunks/password-input-C6PvKyQV.js.map +1 -0
- package/dist/_chunks/{patient-shell-D0RaWDMR.js → patient-shell-CGsmI5LJ.js} +9 -9
- package/dist/_chunks/{patient-shell-D0RaWDMR.js.map → patient-shell-CGsmI5LJ.js.map} +1 -1
- package/dist/_chunks/{payment-form-Cf7U6r5L.js → payment-form-l3j-gA-t.js} +108 -108
- package/dist/_chunks/payment-form-l3j-gA-t.js.map +1 -0
- package/dist/_chunks/{pdf-viewer.agent-DXjgDItg.js → pdf-viewer.agent-DuGfSoep.js} +234 -233
- package/dist/_chunks/pdf-viewer.agent-DuGfSoep.js.map +1 -0
- package/dist/_chunks/{phone-input-C2dtIuxW.js → phone-input-ZWa_FU4R.js} +112 -112
- package/dist/_chunks/phone-input-ZWa_FU4R.js.map +1 -0
- package/dist/_chunks/{popover-D1woU9mP.js → popover-CMr1pTPO.js} +58 -58
- package/dist/_chunks/popover-CMr1pTPO.js.map +1 -0
- package/dist/_chunks/{privacy-lock-C1X42Sit.js → privacy-lock-DdpkKNM2.js} +37 -36
- package/dist/_chunks/privacy-lock-DdpkKNM2.js.map +1 -0
- package/dist/_chunks/{progress-DL3-izuO.js → progress-D4ELgHG3.js} +43 -43
- package/dist/_chunks/progress-D4ELgHG3.js.map +1 -0
- package/dist/_chunks/radio-B_gvGU29.js +106 -0
- package/dist/_chunks/radio-B_gvGU29.js.map +1 -0
- package/dist/_chunks/radio-group-Bn8Wt0yc.js +88 -0
- package/dist/_chunks/radio-group-Bn8Wt0yc.js.map +1 -0
- package/dist/_chunks/{react-day-picker-DQKDiJ37.js → react-day-picker-d0MHsyCj.js} +174 -174
- package/dist/_chunks/{react-day-picker-DQKDiJ37.js.map → react-day-picker-d0MHsyCj.js.map} +1 -1
- package/dist/_chunks/{resizable.agent-DVk_jJur.js → resizable.agent-DBpPGNdy.js} +122 -122
- package/dist/_chunks/resizable.agent-DBpPGNdy.js.map +1 -0
- package/dist/_chunks/{rich-text-editor.agent-BOjF4Xao.js → rich-text-editor.agent-C1_E7_7t.js} +225 -225
- package/dist/_chunks/rich-text-editor.agent-C1_E7_7t.js.map +1 -0
- package/dist/_chunks/scroll-area-Ba99pJ_R.js +144 -0
- package/dist/_chunks/scroll-area-Ba99pJ_R.js.map +1 -0
- package/dist/_chunks/{search-bar-DgSOAajC.js → search-bar-VoTqJhRp.js} +131 -131
- package/dist/_chunks/search-bar-VoTqJhRp.js.map +1 -0
- package/dist/_chunks/search-input-D6rarD0_.js +197 -0
- package/dist/_chunks/search-input-D6rarD0_.js.map +1 -0
- package/dist/_chunks/select-DbxWF3O_.js +320 -0
- package/dist/_chunks/select-DbxWF3O_.js.map +1 -0
- package/dist/_chunks/{separator-DExI4amU.js → separator-BRQHi8s0.js} +17 -17
- package/dist/_chunks/separator-BRQHi8s0.js.map +1 -0
- package/dist/_chunks/sheet-DyWqluiS.js +188 -0
- package/dist/_chunks/sheet-DyWqluiS.js.map +1 -0
- package/dist/_chunks/sidebar-B52iGGNV.js +1076 -0
- package/dist/_chunks/sidebar-B52iGGNV.js.map +1 -0
- package/dist/_chunks/{sign-in-with-alfadocs-button-BBL11-Rt.js → sign-in-with-alfadocs-button-BU7MP5Hg.js} +4 -4
- package/dist/_chunks/{sign-in-with-alfadocs-button-BBL11-Rt.js.map → sign-in-with-alfadocs-button-BU7MP5Hg.js.map} +1 -1
- package/dist/_chunks/{signature-capture.agent-L_1_-zVR.js → signature-capture.agent-4htVctJ2.js} +163 -163
- package/dist/_chunks/signature-capture.agent-4htVctJ2.js.map +1 -0
- package/dist/_chunks/skeleton-ClO1v5GE.js +95 -0
- package/dist/_chunks/skeleton-ClO1v5GE.js.map +1 -0
- package/dist/_chunks/skip-link-CASJkBOe.js +68 -0
- package/dist/_chunks/skip-link-CASJkBOe.js.map +1 -0
- package/dist/_chunks/slider-n8JWpJvT.js +273 -0
- package/dist/_chunks/slider-n8JWpJvT.js.map +1 -0
- package/dist/_chunks/slot-grid-BRAkqChA.js +491 -0
- package/dist/_chunks/slot-grid-BRAkqChA.js.map +1 -0
- package/dist/_chunks/{sparkline.agent-BDTXzTy9.js → sparkline.agent-BLY1IMyW.js} +45 -45
- package/dist/_chunks/sparkline.agent-BLY1IMyW.js.map +1 -0
- package/dist/_chunks/{spinner-77xUGpuX.js → spinner-CoAOGcDa.js} +40 -40
- package/dist/_chunks/spinner-CoAOGcDa.js.map +1 -0
- package/dist/_chunks/stat-D76MNHzK.js +208 -0
- package/dist/_chunks/stat-D76MNHzK.js.map +1 -0
- package/dist/_chunks/{stepper-accordion-BkvqQWPI.js → stepper-accordion-DHQ80A4v.js} +33 -33
- package/dist/_chunks/stepper-accordion-DHQ80A4v.js.map +1 -0
- package/dist/_chunks/{stepper-calendar-BQMjrwzo.js → stepper-calendar-vtWwa2bY.js} +159 -159
- package/dist/_chunks/stepper-calendar-vtWwa2bY.js.map +1 -0
- package/dist/_chunks/stepper-progress-DMZ5w5VR.js +128 -0
- package/dist/_chunks/stepper-progress-DMZ5w5VR.js.map +1 -0
- package/dist/_chunks/streaming-text-D0cW8pwq.js +104 -0
- package/dist/_chunks/streaming-text-D0cW8pwq.js.map +1 -0
- package/dist/_chunks/suggestion-chip-BgNFpPEE.js +157 -0
- package/dist/_chunks/suggestion-chip-BgNFpPEE.js.map +1 -0
- package/dist/_chunks/switch-DtLPKO0p.js +137 -0
- package/dist/_chunks/switch-DtLPKO0p.js.map +1 -0
- package/dist/_chunks/{tabs.agent-FsGU3sZL.js → tabs.agent-BDUlyPbJ.js} +101 -101
- package/dist/_chunks/tabs.agent-BDUlyPbJ.js.map +1 -0
- package/dist/_chunks/tag-CfSZZN2f.js +194 -0
- package/dist/_chunks/tag-CfSZZN2f.js.map +1 -0
- package/dist/_chunks/task-card-B5xfiFg5.js +112 -0
- package/dist/_chunks/task-card-B5xfiFg5.js.map +1 -0
- package/dist/_chunks/task-tray-BnpiodZ4.js +99 -0
- package/dist/_chunks/task-tray-BnpiodZ4.js.map +1 -0
- package/dist/_chunks/text-area-BqbruBWx.js +152 -0
- package/dist/_chunks/text-area-BqbruBWx.js.map +1 -0
- package/dist/_chunks/text-input-lh6kRXZS.js +187 -0
- package/dist/_chunks/text-input-lh6kRXZS.js.map +1 -0
- package/dist/_chunks/theme-toggle-BHKMiORD.js +326 -0
- package/dist/_chunks/theme-toggle-BHKMiORD.js.map +1 -0
- package/dist/_chunks/{time-picker-BapZq0OY.js → time-picker-DbpAmPux.js} +102 -102
- package/dist/_chunks/time-picker-DbpAmPux.js.map +1 -0
- package/dist/_chunks/timeline-vjsUeuq1.js +219 -0
- package/dist/_chunks/timeline-vjsUeuq1.js.map +1 -0
- package/dist/_chunks/{timestamp-BLM-jjdw.js → timestamp-DmSt92P1.js} +30 -30
- package/dist/_chunks/timestamp-DmSt92P1.js.map +1 -0
- package/dist/_chunks/{toast-DSCqnDRl.js → toast-DllSITLf.js} +151 -151
- package/dist/_chunks/{toast-DSCqnDRl.js.map → toast-DllSITLf.js.map} +1 -1
- package/dist/_chunks/{tooltip-DF6WjD1r.js → tooltip-Dp3u8jGz.js} +30 -30
- package/dist/_chunks/tooltip-Dp3u8jGz.js.map +1 -0
- package/dist/_chunks/{tooth-scheme.agent-CFKl3iQr.js → tooth-scheme.agent-BRqxWa1D.js} +75 -75
- package/dist/_chunks/tooth-scheme.agent-BRqxWa1D.js.map +1 -0
- package/dist/_chunks/transcript-panel-Bg1BTMSr.js +265 -0
- package/dist/_chunks/transcript-panel-Bg1BTMSr.js.map +1 -0
- package/dist/_chunks/typing-indicator-BRg22Rqr.js +81 -0
- package/dist/_chunks/typing-indicator-BRg22Rqr.js.map +1 -0
- package/dist/_chunks/use-locale-BuXR_Zl9.js +32 -0
- package/dist/_chunks/use-locale-BuXR_Zl9.js.map +1 -0
- package/dist/_chunks/visually-hidden-Y3jcdCv-.js +21 -0
- package/dist/_chunks/visually-hidden-Y3jcdCv-.js.map +1 -0
- package/dist/_chunks/{warning-stack-Cyf_81SL.js → warning-stack-B9N9yWet.js} +38 -38
- package/dist/_chunks/warning-stack-B9N9yWet.js.map +1 -0
- package/dist/_chunks/{workflow-map-Uf-hHAO3.js → workflow-map-gBhL_Wrs.js} +385 -385
- package/dist/_chunks/workflow-map-gBhL_Wrs.js.map +1 -0
- package/dist/agent-catalog.json +1 -1
- package/dist/components/_shared/index.d.ts +2 -0
- package/dist/components/_shared/index.d.ts.map +1 -1
- package/dist/components/_shared/use-focus-trap.d.ts +32 -0
- package/dist/components/_shared/use-focus-trap.d.ts.map +1 -0
- package/dist/components/_shared/use-neutralize-hidden-focus.d.ts +3 -0
- package/dist/components/_shared/use-neutralize-hidden-focus.d.ts.map +1 -0
- package/dist/components/accordion/index.js +1 -1
- package/dist/components/agenda-card/index.js +1 -1
- package/dist/components/agenda-tray/index.js +1 -1
- package/dist/components/ai-prompt-input/index.js +1 -1
- package/dist/components/alert/index.js +1 -1
- package/dist/components/app-frame/index.js +1 -1
- package/dist/components/aspect-ratio/index.js +1 -1
- package/dist/components/audio-recorder/index.js +1 -1
- package/dist/components/audio-visualiser/index.js +1 -1
- package/dist/components/autocomplete/index.js +1 -1
- package/dist/components/avatar/index.js +1 -1
- package/dist/components/badge/index.js +1 -1
- package/dist/components/breadcrumb/index.js +1 -1
- package/dist/components/button/index.js +2 -2
- package/dist/components/button-group/index.js +1 -1
- package/dist/components/calendar/calendar.d.ts.map +1 -1
- package/dist/components/calendar/index.js +1 -1
- package/dist/components/card/index.js +1 -1
- package/dist/components/chart/chart.d.ts.map +1 -1
- package/dist/components/chart/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/index.js +1 -1
- package/dist/components/checkbox/index.js +1 -1
- package/dist/components/checkbox-group/index.js +1 -1
- package/dist/components/collapsible/index.js +1 -1
- package/dist/components/color-picker/index.js +1 -1
- package/dist/components/combobox/index.js +1 -1
- package/dist/components/command-palette/index.js +1 -1
- package/dist/components/data-table/index.js +1 -1
- package/dist/components/data-table/toolbar.d.ts.map +1 -1
- package/dist/components/date-picker/index.js +1 -1
- package/dist/components/date-range-picker/index.js +1 -1
- package/dist/components/date-time-picker/index.js +1 -1
- package/dist/components/description-list/index.js +1 -1
- package/dist/components/dialog/index.js +1 -1
- package/dist/components/dropdown-menu/index.js +1 -1
- package/dist/components/empty-state/index.js +1 -1
- package/dist/components/file-upload/index.js +1 -1
- package/dist/components/flag/index.js +1 -1
- package/dist/components/floating-action-button/index.js +1 -1
- package/dist/components/form-field/index.js +1 -1
- package/dist/components/freemium-paywall/index.js +1 -1
- package/dist/components/header/index.js +1 -1
- package/dist/components/icon-button/index.d.ts +3 -0
- package/dist/components/icon-button/index.d.ts.map +1 -0
- package/dist/components/icon-button/index.js +5 -0
- package/dist/components/icon-button/index.js.map +1 -0
- package/dist/components/icon-button-group/index.js +1 -1
- package/dist/components/index.d.ts +8 -2
- package/dist/components/index.d.ts.map +1 -1
- package/dist/components/kbd/index.js +1 -1
- package/dist/components/key-value-pair/index.js +1 -1
- package/dist/components/list/index.js +1 -1
- package/dist/components/live-region/index.d.ts +3 -0
- package/dist/components/live-region/index.d.ts.map +1 -0
- package/dist/components/live-region/index.js +5 -0
- package/dist/components/live-region/index.js.map +1 -0
- package/dist/components/live-region/live-region.d.ts +49 -0
- package/dist/components/live-region/live-region.d.ts.map +1 -0
- package/dist/components/logo/index.js +1 -1
- package/dist/components/matrix-rain/index.js +1 -1
- package/dist/components/message-card/index.js +1 -1
- package/dist/components/message-tray/index.js +1 -1
- package/dist/components/multi-select/index.js +1 -1
- package/dist/components/navigation-menu/index.d.ts +4 -2
- package/dist/components/navigation-menu/index.d.ts.map +1 -1
- package/dist/components/navigation-menu/index.js +3 -2
- package/dist/components/navigation-menu/index.js.map +1 -1
- package/dist/components/navigation-menu/navigation-menu.d.ts +2 -6
- 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-tray/index.js +1 -1
- package/dist/components/number-input/index.js +1 -1
- package/dist/components/otp-input/index.js +1 -1
- package/dist/components/pagination/index.js +1 -1
- package/dist/components/password-input/index.js +1 -1
- package/dist/components/payment-form/index.js +1 -1
- package/dist/components/pdf-viewer/index.js +1 -1
- package/dist/components/pdf-viewer/pdf-viewer.d.ts.map +1 -1
- package/dist/components/phone-input/index.js +1 -1
- package/dist/components/popover/index.js +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/progress/index.js +1 -1
- package/dist/components/radio/index.d.ts +3 -0
- package/dist/components/radio/index.d.ts.map +1 -0
- package/dist/components/radio/index.js +5 -0
- package/dist/components/radio/index.js.map +1 -0
- package/dist/components/radio-group/index.js +4 -3
- package/dist/components/radio-group/index.js.map +1 -1
- package/dist/components/resizable/index.js +1 -1
- package/dist/components/rich-text-editor/index.js +1 -1
- package/dist/components/scroll-area/index.js +1 -1
- package/dist/components/search-bar/index.js +1 -1
- package/dist/components/search-input/index.js +1 -1
- package/dist/components/select/index.js +1 -1
- package/dist/components/separator/index.js +1 -1
- package/dist/components/sheet/index.js +1 -1
- package/dist/components/sidebar/index.js +1 -1
- package/dist/components/sign-in-with-alfadocs-button/index.js +1 -1
- package/dist/components/signature-capture/index.js +1 -1
- package/dist/components/skeleton/index.js +1 -1
- package/dist/components/skip-link/index.d.ts +2 -0
- package/dist/components/skip-link/index.d.ts.map +1 -0
- package/dist/components/skip-link/index.js +5 -0
- package/dist/components/skip-link/index.js.map +1 -0
- package/dist/components/skip-link/skip-link.d.ts +34 -0
- package/dist/components/skip-link/skip-link.d.ts.map +1 -0
- package/dist/components/slider/index.js +1 -1
- package/dist/components/slot-grid/index.js +1 -1
- package/dist/components/sparkline/index.js +1 -1
- package/dist/components/sparkline/sparkline.d.ts.map +1 -1
- package/dist/components/spinner/index.js +1 -1
- package/dist/components/stat/index.js +1 -1
- package/dist/components/stepper-accordion/index.js +1 -1
- package/dist/components/stepper-calendar/index.js +1 -1
- package/dist/components/stepper-progress/index.js +1 -1
- package/dist/components/streaming-text/index.js +1 -1
- package/dist/components/suggestion-chip/index.js +1 -1
- package/dist/components/switch/index.js +1 -1
- package/dist/components/tabs/index.js +1 -1
- package/dist/components/tag/index.js +1 -1
- package/dist/components/task-card/index.js +1 -1
- package/dist/components/task-tray/index.js +1 -1
- package/dist/components/text-area/index.js +1 -1
- package/dist/components/text-input/index.js +1 -1
- package/dist/components/theme-toggle/index.d.ts +3 -0
- package/dist/components/theme-toggle/index.d.ts.map +1 -0
- package/dist/components/theme-toggle/index.js +5 -0
- package/dist/components/theme-toggle/index.js.map +1 -0
- package/dist/components/theme-toggle/theme-toggle.d.ts +34 -0
- package/dist/components/theme-toggle/theme-toggle.d.ts.map +1 -0
- package/dist/components/time-picker/index.js +1 -1
- package/dist/components/timeline/index.js +1 -1
- package/dist/components/timestamp/index.js +1 -1
- package/dist/components/toast/index.js +1 -1
- package/dist/components/tooltip/index.js +1 -1
- package/dist/components/tooth-scheme/index.js +1 -1
- package/dist/components/transcript-panel/index.js +1 -1
- package/dist/components/typing-indicator/index.js +1 -1
- package/dist/components/visually-hidden/index.d.ts +2 -0
- package/dist/components/visually-hidden/index.d.ts.map +1 -0
- package/dist/components/visually-hidden/index.js +5 -0
- package/dist/components/visually-hidden/index.js.map +1 -0
- package/dist/components/visually-hidden/visually-hidden.d.ts +11 -0
- package/dist/components/visually-hidden/visually-hidden.d.ts.map +1 -0
- package/dist/components/warning-stack/index.js +1 -1
- package/dist/components/workflow/index.js +1 -1
- package/dist/hooks/index.d.ts +3 -0
- package/dist/hooks/index.d.ts.map +1 -1
- package/dist/hooks/index.js +10 -7
- package/dist/hooks/index.js.map +1 -1
- package/dist/hooks/use-locale.d.ts +27 -0
- package/dist/hooks/use-locale.d.ts.map +1 -0
- package/dist/hooks/use-media-query.d.ts +17 -0
- package/dist/hooks/use-media-query.d.ts.map +1 -0
- package/dist/i18n/config.js +59 -2
- package/dist/i18n/config.js.map +1 -1
- package/dist/i18n/resources.d.ts +57 -0
- package/dist/i18n/resources.d.ts.map +1 -1
- package/dist/index.js +442 -431
- package/dist/index.js.map +1 -1
- package/dist/locales/de.json +19 -0
- package/dist/locales/en.json +19 -0
- package/dist/locales/it.json +19 -0
- package/dist/patterns/leo-assistant/index.js +1 -1
- package/dist/patterns/patient-shell/index.js +1 -1
- package/dist/tokens.css +2 -2
- package/package.json +4 -2
- package/dist/_chunks/accordion-Dgcd38U_.js +0 -117
- package/dist/_chunks/accordion-Dgcd38U_.js.map +0 -1
- package/dist/_chunks/agenda-card-B2gq-gTq.js +0 -130
- package/dist/_chunks/agenda-card-B2gq-gTq.js.map +0 -1
- package/dist/_chunks/agenda-tray-twa8g_87.js +0 -119
- package/dist/_chunks/agenda-tray-twa8g_87.js.map +0 -1
- package/dist/_chunks/ai-prompt-input-C6IY_Eds.js +0 -379
- package/dist/_chunks/ai-prompt-input-C6IY_Eds.js.map +0 -1
- package/dist/_chunks/alert-C5ud6CfE.js.map +0 -1
- package/dist/_chunks/apexcharts-theme-cpBYmCcr.js +0 -17
- package/dist/_chunks/apexcharts-theme-cpBYmCcr.js.map +0 -1
- package/dist/_chunks/app-frame-CmIUp9BD.js.map +0 -1
- package/dist/_chunks/aspect-ratio-Bo3cZXmR.js +0 -56
- package/dist/_chunks/aspect-ratio-Bo3cZXmR.js.map +0 -1
- package/dist/_chunks/audio-recorder-GkGNtW2X.js.map +0 -1
- package/dist/_chunks/audio-visualiser-CIO3yy23.js.map +0 -1
- package/dist/_chunks/autocomplete.agent-kb0nmr6F.js.map +0 -1
- package/dist/_chunks/avatar-BsV7vRA6.js.map +0 -1
- package/dist/_chunks/badge--CmSr7ok.js +0 -104
- package/dist/_chunks/badge--CmSr7ok.js.map +0 -1
- package/dist/_chunks/balance-cell-renderer-BQwN51rT.js.map +0 -1
- package/dist/_chunks/breadcrumb-DnO6eHSS.js.map +0 -1
- package/dist/_chunks/button-CXL8bA8G.js +0 -119
- package/dist/_chunks/button-CXL8bA8G.js.map +0 -1
- package/dist/_chunks/button-group-CI7LFxt3.js.map +0 -1
- package/dist/_chunks/calendar-BIXVzhkL.js.map +0 -1
- package/dist/_chunks/card-n97MNPP2.js +0 -158
- package/dist/_chunks/card-n97MNPP2.js.map +0 -1
- package/dist/_chunks/chart.agent-DkmVXNsI.js.map +0 -1
- package/dist/_chunks/chat-container-SR3UWxbL.js +0 -174
- package/dist/_chunks/chat-container-SR3UWxbL.js.map +0 -1
- package/dist/_chunks/chat-input-aphxDjZL.js.map +0 -1
- package/dist/_chunks/chat-message-CdJSD18D.js.map +0 -1
- package/dist/_chunks/checkbox-CfiZ0FZc.js +0 -116
- package/dist/_chunks/checkbox-CfiZ0FZc.js.map +0 -1
- package/dist/_chunks/checkbox-group-D1aqVI0-.js.map +0 -1
- package/dist/_chunks/collapsible-jBFm7Ah8.js.map +0 -1
- package/dist/_chunks/color-picker-CiotzQJF.js.map +0 -1
- package/dist/_chunks/combobox.agent-B6RwDSct.js.map +0 -1
- package/dist/_chunks/command-palette.agent-B87_OkmC.js.map +0 -1
- package/dist/_chunks/date-time-picker-CX_FMsLG.js.map +0 -1
- package/dist/_chunks/description-list-C5UPZgX6.js +0 -187
- package/dist/_chunks/description-list-C5UPZgX6.js.map +0 -1
- package/dist/_chunks/dialog.agent-B276rAQF.js.map +0 -1
- package/dist/_chunks/dropdown-menu-CJKvK7VG.js +0 -210
- package/dist/_chunks/dropdown-menu-CJKvK7VG.js.map +0 -1
- package/dist/_chunks/empty-state-DiG7vYBM.js.map +0 -1
- package/dist/_chunks/file-upload.agent-BMow5yDY.js.map +0 -1
- package/dist/_chunks/floating-action-button-BM9ib-Wf.js +0 -95
- package/dist/_chunks/floating-action-button-BM9ib-Wf.js.map +0 -1
- package/dist/_chunks/form-field-B4bwrccN.js +0 -121
- package/dist/_chunks/form-field-B4bwrccN.js.map +0 -1
- package/dist/_chunks/freemium-paywall-DVyNsQHS.js +0 -197
- package/dist/_chunks/freemium-paywall-DVyNsQHS.js.map +0 -1
- package/dist/_chunks/header-BpKaSL_v.js.map +0 -1
- package/dist/_chunks/icon-button-C1vpylg3.js +0 -45
- package/dist/_chunks/icon-button-C1vpylg3.js.map +0 -1
- package/dist/_chunks/icon-button-group-tERESY-n.js.map +0 -1
- package/dist/_chunks/kbd-0iPlQjgC.js.map +0 -1
- package/dist/_chunks/key-value-pair--Je59tAF.js.map +0 -1
- package/dist/_chunks/leo-sidebar-9A9AWBxX.js +0 -755
- package/dist/_chunks/leo-sidebar-9A9AWBxX.js.map +0 -1
- package/dist/_chunks/list-n8vI8Yvn.js.map +0 -1
- package/dist/_chunks/logo-UNWYb9p7.js.map +0 -1
- package/dist/_chunks/matrix-rain-Q7xTEpKu.js.map +0 -1
- package/dist/_chunks/message-card-g5VS5Q80.js +0 -275
- package/dist/_chunks/message-card-g5VS5Q80.js.map +0 -1
- package/dist/_chunks/message-tray-CAk-iibU.js +0 -302
- package/dist/_chunks/message-tray-CAk-iibU.js.map +0 -1
- package/dist/_chunks/multi-select.agent-Cf4pU636.js.map +0 -1
- package/dist/_chunks/navigation-menu-DBDsAmXc.js.map +0 -1
- package/dist/_chunks/notification-card-CQxJporb.js +0 -255
- package/dist/_chunks/notification-card-CQxJporb.js.map +0 -1
- package/dist/_chunks/notification-tray-CNWPuPZp.js.map +0 -1
- package/dist/_chunks/number-input-B1Th0DdC.js.map +0 -1
- package/dist/_chunks/otp-input-CmoBuZ4K.js.map +0 -1
- package/dist/_chunks/pagination.agent-B5KLDCMN.js.map +0 -1
- package/dist/_chunks/password-input-DnjNh-hQ.js.map +0 -1
- package/dist/_chunks/payment-form-Cf7U6r5L.js.map +0 -1
- package/dist/_chunks/pdf-viewer.agent-DXjgDItg.js.map +0 -1
- package/dist/_chunks/phone-input-C2dtIuxW.js.map +0 -1
- package/dist/_chunks/popover-D1woU9mP.js.map +0 -1
- package/dist/_chunks/privacy-lock-C1X42Sit.js.map +0 -1
- package/dist/_chunks/progress-DL3-izuO.js.map +0 -1
- package/dist/_chunks/radio-group-CXN9qNPe.js +0 -185
- package/dist/_chunks/radio-group-CXN9qNPe.js.map +0 -1
- package/dist/_chunks/resizable.agent-DVk_jJur.js.map +0 -1
- package/dist/_chunks/rich-text-editor.agent-BOjF4Xao.js.map +0 -1
- package/dist/_chunks/scroll-area-DXn-YWHY.js +0 -144
- package/dist/_chunks/scroll-area-DXn-YWHY.js.map +0 -1
- package/dist/_chunks/search-bar-DgSOAajC.js.map +0 -1
- package/dist/_chunks/search-input-D4tC_Prn.js +0 -197
- package/dist/_chunks/search-input-D4tC_Prn.js.map +0 -1
- package/dist/_chunks/select-B4m4upMg.js +0 -320
- package/dist/_chunks/select-B4m4upMg.js.map +0 -1
- package/dist/_chunks/separator-DExI4amU.js.map +0 -1
- package/dist/_chunks/sheet-D6XOx0fK.js +0 -188
- package/dist/_chunks/sheet-D6XOx0fK.js.map +0 -1
- package/dist/_chunks/sidebar-r645O-k9.js +0 -1076
- package/dist/_chunks/sidebar-r645O-k9.js.map +0 -1
- package/dist/_chunks/signature-capture.agent-L_1_-zVR.js.map +0 -1
- package/dist/_chunks/skeleton-vbTWUntB.js +0 -95
- package/dist/_chunks/skeleton-vbTWUntB.js.map +0 -1
- package/dist/_chunks/slider-B3DBwmcm.js +0 -273
- package/dist/_chunks/slider-B3DBwmcm.js.map +0 -1
- package/dist/_chunks/slot-grid-DL_Tuj0p.js +0 -491
- package/dist/_chunks/slot-grid-DL_Tuj0p.js.map +0 -1
- package/dist/_chunks/sparkline.agent-BDTXzTy9.js.map +0 -1
- package/dist/_chunks/spinner-77xUGpuX.js.map +0 -1
- package/dist/_chunks/stat-CrumvZWf.js +0 -208
- package/dist/_chunks/stat-CrumvZWf.js.map +0 -1
- package/dist/_chunks/stepper-accordion-BkvqQWPI.js.map +0 -1
- package/dist/_chunks/stepper-calendar-BQMjrwzo.js.map +0 -1
- package/dist/_chunks/stepper-progress-Bwfl-0rV.js +0 -128
- package/dist/_chunks/stepper-progress-Bwfl-0rV.js.map +0 -1
- package/dist/_chunks/streaming-text-Cu9YQe_1.js +0 -104
- package/dist/_chunks/streaming-text-Cu9YQe_1.js.map +0 -1
- package/dist/_chunks/suggestion-chip-XkxDJiPW.js +0 -157
- package/dist/_chunks/suggestion-chip-XkxDJiPW.js.map +0 -1
- package/dist/_chunks/switch-DyC0ThNT.js +0 -137
- package/dist/_chunks/switch-DyC0ThNT.js.map +0 -1
- package/dist/_chunks/tabs.agent-FsGU3sZL.js.map +0 -1
- package/dist/_chunks/tag-BucAvfTX.js +0 -194
- package/dist/_chunks/tag-BucAvfTX.js.map +0 -1
- package/dist/_chunks/task-card-uxjApfcg.js +0 -112
- package/dist/_chunks/task-card-uxjApfcg.js.map +0 -1
- package/dist/_chunks/task-tray-BdfM3p8N.js +0 -99
- package/dist/_chunks/task-tray-BdfM3p8N.js.map +0 -1
- package/dist/_chunks/text-area-CKxZ7cS3.js +0 -152
- package/dist/_chunks/text-area-CKxZ7cS3.js.map +0 -1
- package/dist/_chunks/text-input-D16CcMlL.js +0 -187
- package/dist/_chunks/text-input-D16CcMlL.js.map +0 -1
- package/dist/_chunks/time-picker-BapZq0OY.js.map +0 -1
- package/dist/_chunks/timeline-D3VOf4RT.js +0 -219
- package/dist/_chunks/timeline-D3VOf4RT.js.map +0 -1
- package/dist/_chunks/timestamp-BLM-jjdw.js.map +0 -1
- package/dist/_chunks/tooltip-DF6WjD1r.js.map +0 -1
- package/dist/_chunks/tooth-scheme.agent-CFKl3iQr.js.map +0 -1
- package/dist/_chunks/transcript-panel-aI14fHYA.js +0 -265
- package/dist/_chunks/transcript-panel-aI14fHYA.js.map +0 -1
- package/dist/_chunks/typing-indicator-BTVDEpnd.js +0 -81
- package/dist/_chunks/typing-indicator-BTVDEpnd.js.map +0 -1
- package/dist/_chunks/warning-stack-Cyf_81SL.js.map +0 -1
- package/dist/_chunks/workflow-map-Uf-hHAO3.js.map +0 -1
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"card-n97MNPP2.js","sources":["../../src/components/card/card.tsx"],"sourcesContent":["import {\n createContext,\n forwardRef,\n useCallback,\n useContext,\n useId,\n useState,\n type HTMLAttributes,\n type KeyboardEvent,\n type ReactNode,\n} from 'react';\nimport { Slot } from '@radix-ui/react-slot';\nimport { cva, type VariantProps } from 'class-variance-authority';\n\n/* ------------------------------------------------------------------ */\n/* Context */\n/* ------------------------------------------------------------------ */\n\ninterface CardContextValue {\n headerId: string;\n interactive: boolean;\n registerHeader: () => void;\n}\n\nconst CardContext = createContext<CardContextValue>({\n headerId: '',\n interactive: false,\n registerHeader: () => {},\n});\n\n/* ------------------------------------------------------------------ */\n/* Variants */\n/* ------------------------------------------------------------------ */\n\nconst cardVariants = cva(\n [\n 'rounded-[var(--radius-lg)] text-[var(--card-foreground)]',\n 'overflow-hidden',\n 'flex flex-col',\n ].join(' '),\n {\n variants: {\n variant: {\n default: 'bg-[var(--card)] border border-[color:var(--card-border)]',\n outlined: 'bg-[var(--card)] border border-[color:var(--border)]',\n elevated: 'bg-[var(--card)] shadow-[var(--shadow-card)]',\n },\n interactive: {\n true: [\n 'cursor-pointer',\n 'transition-shadow duration-[var(--animation-duration)] motion-reduce:transition-none',\n 'hover:shadow-[var(--shadow-hover)]',\n 'focus-visible:outline-[length:var(--focus-ring-width)] focus-visible:outline-solid',\n 'focus-visible:outline-[color:var(--ring)] focus-visible:outline-offset-[length:var(--focus-ring-offset)]',\n 'min-h-[var(--min-target-size)]',\n ].join(' '),\n false: '',\n },\n // `stretch: true` fills the parent layout cell (grid / flex) so a\n // row of Cards ends up with matching heights. Combined with the\n // `flex-1` on `Card.Body`, the footer naturally pins to the bottom.\n stretch: {\n true: 'h-full self-stretch',\n false: '',\n },\n },\n defaultVariants: {\n variant: 'default',\n interactive: false,\n stretch: false,\n },\n },\n);\n\n/* ------------------------------------------------------------------ */\n/* Types */\n/* ------------------------------------------------------------------ */\n\nexport interface CardProps\n extends Omit<HTMLAttributes<HTMLElement>, 'role'>,\n VariantProps<typeof cardVariants> {\n variant?: 'default' | 'outlined' | 'elevated';\n interactive?: boolean;\n /**\n * Stretch the Card to fill its parent layout cell. Use on every Card in\n * a dashboard row so siblings end up with matching heights, and the\n * `Card.Body` + `Card.Footer` flex naturally pin the footer to the\n * bottom. Grid cells already `align-items: stretch` by default, but an\n * explicit `h-full` keeps the behaviour robust under flex parents too.\n */\n stretch?: boolean;\n asChild?: boolean;\n children: ReactNode;\n}\n\n/* ------------------------------------------------------------------ */\n/* Root */\n/* ------------------------------------------------------------------ */\n\nconst CardRoot = forwardRef<HTMLElement, CardProps>(\n (\n {\n variant = 'default',\n interactive = false,\n stretch = false,\n asChild = false,\n className,\n children,\n onClick,\n onKeyDown,\n ...props\n },\n ref,\n ) => {\n const headerId = useId();\n const [hasHeader, setHasHeader] = useState(false);\n const registerHeader = useCallback(() => setHasHeader(true), []);\n\n const handleKeyDown = (e: KeyboardEvent<HTMLElement>) => {\n if (interactive && (e.key === 'Enter' || e.key === ' ')) {\n e.preventDefault();\n (e.currentTarget as HTMLElement).click();\n }\n onKeyDown?.(e);\n };\n\n // When asChild=true the consumer provides its own element (<a>, <button>)\n // which already carries the correct role and tabIndex — don't override them.\n const interactiveProps = interactive\n ? {\n ...(asChild ? {} : { role: 'button' as const, tabIndex: 0 }),\n onKeyDown: handleKeyDown,\n onClick,\n }\n : { onClick };\n\n const Comp = asChild ? Slot : 'article';\n\n return (\n <CardContext.Provider value={{ headerId, interactive: interactive ?? false, registerHeader }}>\n <Comp\n ref={ref as React.Ref<HTMLElement>}\n aria-labelledby={hasHeader ? headerId : undefined}\n className={cardVariants({\n variant,\n interactive: interactive ?? false,\n stretch: stretch ?? false,\n className,\n })}\n {...interactiveProps}\n {...props}\n >\n {children}\n </Comp>\n </CardContext.Provider>\n );\n },\n);\nCardRoot.displayName = 'Card';\n\n/* ------------------------------------------------------------------ */\n/* Header */\n/* ------------------------------------------------------------------ */\n\nconst CardHeader = forwardRef<HTMLDivElement, HTMLAttributes<HTMLDivElement>>(\n ({ className, ...props }, ref) => {\n const { headerId, registerHeader } = useContext(CardContext);\n\n // Notify root that a header is present so aria-labelledby is applied.\n const callbackRef = useCallback(\n (node: HTMLDivElement | null) => {\n if (node) registerHeader();\n if (typeof ref === 'function') ref(node);\n else if (ref) (ref as React.MutableRefObject<HTMLDivElement | null>).current = node;\n },\n [ref, registerHeader],\n );\n\n return (\n <div\n ref={callbackRef}\n id={headerId}\n className={[\n 'flex flex-col gap-[var(--spacing-xs)] p-[var(--spacing-md)] pb-0',\n '[&_*]:break-normal [&_*]:[overflow-wrap:anywhere]',\n className,\n ]\n .filter(Boolean)\n .join(' ')}\n {...props}\n />\n );\n },\n);\nCardHeader.displayName = 'Card.Header';\n\n/* ------------------------------------------------------------------ */\n/* Media */\n/* ------------------------------------------------------------------ */\n\nconst CardMedia = forwardRef<HTMLDivElement, HTMLAttributes<HTMLDivElement>>(\n ({ className, ...props }, ref) => (\n <div\n ref={ref}\n className={[\n 'overflow-hidden [&_img]:w-full [&_img]:h-auto [&_img]:[object-fit:cover] [&_video]:w-full',\n className,\n ]\n .filter(Boolean)\n .join(' ')}\n {...props}\n />\n ),\n);\nCardMedia.displayName = 'Card.Media';\n\n/* ------------------------------------------------------------------ */\n/* Body */\n/* ------------------------------------------------------------------ */\n\nconst CardBody = forwardRef<HTMLDivElement, HTMLAttributes<HTMLDivElement>>(\n ({ className, ...props }, ref) => (\n <div\n ref={ref}\n className={['p-[var(--spacing-md)] flex-1 text-start', className]\n .filter(Boolean)\n .join(' ')}\n {...props}\n />\n ),\n);\nCardBody.displayName = 'Card.Body';\n\n/* ------------------------------------------------------------------ */\n/* Footer */\n/* ------------------------------------------------------------------ */\n\nconst CardFooter = forwardRef<HTMLDivElement, HTMLAttributes<HTMLDivElement>>(\n ({ className, ...props }, ref) => (\n <div\n ref={ref}\n className={[\n 'flex items-center gap-[var(--spacing-sm)] p-[var(--spacing-md)] pt-0',\n className,\n ]\n .filter(Boolean)\n .join(' ')}\n {...props}\n />\n ),\n);\nCardFooter.displayName = 'Card.Footer';\n\n/* ------------------------------------------------------------------ */\n/* Compound export */\n/* ------------------------------------------------------------------ */\n\nexport const Card = Object.assign(CardRoot, {\n Header: CardHeader,\n Media: CardMedia,\n Body: CardBody,\n Footer: CardFooter,\n});\n\nexport type { VariantProps as CardVariantProps };\n"],"names":["CardContext","createContext","cardVariants","cva","CardRoot","forwardRef","variant","interactive","stretch","asChild","className","children","onClick","onKeyDown","props","ref","headerId","useId","hasHeader","setHasHeader","useState","registerHeader","useCallback","interactiveProps","e","Comp","Slot","jsx","CardHeader","useContext","callbackRef","node","CardMedia","CardBody","CardFooter","Card"],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"chart.agent-DkmVXNsI.js","sources":["../../src/components/chart/chart.tsx","../../src/components/chart/chart.agent.ts"],"sourcesContent":["/* ------------------------------------------------------------------ */\n/* Chart — thin, typed wrapper over ApexCharts (react-apexcharts). */\n/* */\n/* - All chrome, colours, and fonts flow from */\n/* `src/tokens/apexcharts-theme.ts` — never hex literals in user */\n/* code. A MutationObserver on `<html class>` re-reads the bridge so */\n/* theme changes repaint without remount. */\n/* - A ResizeObserver on the wrapper keeps the chart responsive */\n/* without listening on `window.resize`. */\n/* - Accessibility: the wrapper carries `role=\"img\"` + `aria-label` */\n/* (required `title` prop) + `aria-describedby` pointing at a */\n/* visually-hidden `<table>` that mirrors series × categories. */\n/* - Colour-blind users: `patterns` prop flips `fill.type` to pattern */\n/* using ApexCharts' built-in pattern presets. */\n/* - Numbers format via `Intl.NumberFormat(locale)` — no hand-rolled */\n/* `toFixed()`. */\n/* ------------------------------------------------------------------ */\n\nimport {\n forwardRef,\n useEffect,\n useId,\n useImperativeHandle,\n useMemo,\n useRef,\n useState,\n} from 'react';\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport { useTranslation } from 'react-i18next';\nimport ReactApexChart from 'react-apexcharts';\nimport ApexCharts from 'apexcharts';\nimport { getApexChartsTheme } from '../../tokens/apexcharts-theme';\nimport { usePrefersReducedMotion } from '../../hooks';\n\n/* ------------------------------------------------------------------ */\n/* CVA */\n/* ------------------------------------------------------------------ */\n\nconst chartVariants = cva('relative block w-full', {\n variants: {\n density: {\n compact: 'min-h-[var(--chart-min-height-compact)]',\n comfortable: 'min-h-[var(--chart-min-height-comfortable)]',\n },\n },\n defaultVariants: { density: 'comfortable' },\n});\n\n/* ------------------------------------------------------------------ */\n/* Public types */\n/* ------------------------------------------------------------------ */\n\nexport type ChartType = 'line' | 'bar' | 'pie' | 'donut' | 'area' | 'radialBar';\n\nexport interface ChartSeries {\n name: string;\n data: number[];\n}\n\nexport interface ChartProps extends VariantProps<typeof chartVariants> {\n /** Required — drives aria-label and sr-only table caption. */\n title: string;\n /** Chart visual type. */\n type: ChartType;\n /**\n * For `line` / `bar` / `area`: an array of `ChartSeries`.\n * For `pie` / `donut` / `radialBar`: an array of numbers matched to `labels`.\n */\n series: ChartSeries[] | number[];\n /** Category axis labels (line / bar / area). */\n categories?: string[];\n /** Slice labels (pie / donut / radialBar). */\n labels?: string[];\n /** Height override. Defaults to 320px. */\n height?: number | string;\n /** Width override. Defaults to 100% of container. */\n width?: number | string;\n /** Opt-in pattern fills for colour-blind users. */\n patterns?: boolean;\n /** Show the ApexCharts toolbar. Defaults to false. */\n toolbar?: boolean;\n /** Locale override — defaults to the active i18next language. */\n locale?: string;\n /** Extra class names on the wrapper. */\n className?: string;\n}\n\nexport interface ChartHandle {\n /** Returns a PNG data URI for the chart. */\n dataURI: () => Promise<string>;\n /** Updates series without remounting. */\n updateSeries: (next: ChartProps['series']) => void;\n}\n\n/* ------------------------------------------------------------------ */\n/* Constants */\n/* ------------------------------------------------------------------ */\n\nconst PATTERN_STYLES = [\n 'verticalLines',\n 'horizontalLines',\n 'slantedLines',\n 'squares',\n 'circles',\n] as const;\n\n/** Types where `categories` belong on an x-axis. */\nconst CATEGORICAL_TYPES: ReadonlyArray<ChartType> = ['line', 'bar', 'area'];\n\n/** Types where `series` is a flat `number[]` paired with `labels`. */\nconst SLICE_TYPES: ReadonlyArray<ChartType> = ['pie', 'donut', 'radialBar'];\n\n/* ------------------------------------------------------------------ */\n/* Helpers */\n/* ------------------------------------------------------------------ */\n\nfunction isSliceType(type: ChartType): boolean {\n return SLICE_TYPES.includes(type);\n}\n\nfunction isCategoricalType(type: ChartType): boolean {\n return CATEGORICAL_TYPES.includes(type);\n}\n\n/** Coerce `series` into `ChartSeries[]` for shared logic (table, aria). */\nfunction normaliseSeries(\n series: ChartSeries[] | number[],\n type: ChartType,\n): ChartSeries[] {\n if (isSliceType(type)) {\n const nums = series as number[];\n return [\n {\n name: '',\n data: nums,\n },\n ];\n }\n return series as ChartSeries[];\n}\n\n/* ------------------------------------------------------------------ */\n/* Chart component */\n/* ------------------------------------------------------------------ */\n\nexport const Chart = forwardRef<ChartHandle, ChartProps>(\n (\n {\n title,\n type,\n series,\n categories,\n labels,\n height,\n width,\n patterns = false,\n toolbar = false,\n locale: localeProp,\n density,\n className,\n },\n ref,\n ) => {\n const { t, i18n } = useTranslation();\n const rawId = useId();\n const chartId = useMemo(\n () => `chart-${rawId.replace(/[^a-zA-Z0-9-_]/g, '')}`,\n [rawId],\n );\n const summaryId = `${chartId}-summary`;\n\n const wrapperRef = useRef<HTMLDivElement>(null);\n const [containerWidth, setContainerWidth] = useState(0);\n\n const locale = localeProp ?? i18n.language ?? 'en';\n\n /* ---- dev warning if title missing ------------------------------ */\n if (import.meta.env.DEV && !title) {\n // eslint-disable-next-line no-console\n console.warn(\n 'Chart: `title` prop is required. It drives aria-label and the screen-reader summary table.',\n );\n }\n\n /* ---- theme-reactive state -------------------------------------- */\n const [themeOptions, setThemeOptions] = useState<ApexCharts.ApexOptions>(() => {\n try {\n return getApexChartsTheme();\n } catch {\n return {};\n }\n });\n\n /* ---- MutationObserver: re-read theme on class change ------------ */\n useEffect(() => {\n if (typeof document === 'undefined') return undefined;\n let timer: ReturnType<typeof setTimeout>;\n const observer = new MutationObserver(() => {\n clearTimeout(timer);\n timer = setTimeout(() => {\n try {\n setThemeOptions(getApexChartsTheme());\n } catch {\n /* no-op in non-browser environments */\n }\n }, 50);\n });\n observer.observe(document.documentElement, {\n attributes: true,\n attributeFilter: ['class'],\n });\n return () => {\n clearTimeout(timer);\n observer.disconnect();\n };\n }, []);\n\n /* ---- ResizeObserver: track container width --------------------- */\n useEffect(() => {\n const el = wrapperRef.current;\n if (!el || typeof ResizeObserver === 'undefined') return undefined;\n const ro = new ResizeObserver((entries) => {\n const entry = entries[0];\n if (entry) setContainerWidth(Math.floor(entry.contentRect.width));\n });\n ro.observe(el);\n return () => ro.disconnect();\n }, []);\n\n /* ---- imperative handle ----------------------------------------- */\n useImperativeHandle(ref, () => ({\n async dataURI(): Promise<string> {\n const instance = ApexCharts.getChartByID(chartId);\n if (!instance) return '';\n const result = await instance.dataURI();\n return (result as { imgURI: string }).imgURI;\n },\n updateSeries(next) {\n const instance = ApexCharts.getChartByID(chartId);\n if (!instance) return;\n if (isSliceType(type)) {\n instance.updateSeries(next as number[]);\n } else {\n instance.updateSeries(next as ChartSeries[]);\n }\n },\n }));\n\n /* ---- RTL detection --------------------------------------------- */\n const isRtl =\n typeof document !== 'undefined' && document.documentElement.dir === 'rtl';\n\n /* ---- normalised series for sr-only table ----------------------- */\n const tableSeries = useMemo(\n () => normaliseSeries(series, type),\n [series, type],\n );\n\n /* ---- Intl formatter -------------------------------------------- */\n const numberFormatter = useMemo(\n () => new Intl.NumberFormat(locale),\n [locale],\n );\n\n /* ---- toolbar localisation -------------------------------------- */\n const toolbarLocale = useMemo(\n () => ({\n name: locale,\n options: {\n toolbar: {\n download: t('chart.toolbar.download'),\n selection: t('chart.toolbar.selection'),\n selectionZoom: t('chart.toolbar.selectionZoom'),\n zoomIn: t('chart.toolbar.zoomIn'),\n zoomOut: t('chart.toolbar.zoomOut'),\n pan: t('chart.toolbar.pan'),\n reset: t('chart.toolbar.reset'),\n exportToSVG: t('chart.toolbar.exportToSVG'),\n exportToPNG: t('chart.toolbar.exportToPNG'),\n exportToCSV: t('chart.toolbar.exportToCSV'),\n },\n },\n }),\n [locale, t],\n );\n\n /* ---- build ApexOptions ----------------------------------------- */\n const reducedMotion = usePrefersReducedMotion();\n\n const chartOptions: ApexCharts.ApexOptions = useMemo(() => {\n const base = themeOptions;\n\n const options: ApexCharts.ApexOptions = {\n ...base,\n chart: {\n ...base.chart,\n id: chartId,\n toolbar: { show: toolbar },\n zoom: { enabled: toolbar },\n animations: {\n enabled: !reducedMotion,\n dynamicAnimation: { enabled: !reducedMotion },\n },\n locales: [toolbarLocale],\n defaultLocale: locale,\n parentHeightOffset: 0,\n },\n labels: labels,\n legend: {\n ...base.legend,\n position: 'bottom',\n // ApexCharts legend.horizontalAlign is a physical prop mapped internally\n // to the chart's own text flow. For RTL we flip via `yaxis.opposite`\n // and ApexCharts' own `direction: 'rtl'` handling; legend stays anchored\n // to the inline-start by asking for 'left' on LTR and 'right' on RTL.\n horizontalAlign: isRtl ? 'right' : 'left',\n fontFamily: 'inherit',\n },\n tooltip: {\n ...base.tooltip,\n y: {\n formatter: (value: number) => numberFormatter.format(value),\n },\n },\n noData: {\n text: t('chart.noData'),\n },\n };\n\n if (isCategoricalType(type)) {\n options.xaxis = {\n ...base.xaxis,\n categories: categories ?? [],\n };\n options.yaxis = {\n ...base.yaxis,\n opposite: isRtl,\n labels: {\n formatter: (value: number) => numberFormatter.format(value),\n },\n };\n options.stroke = {\n curve: 'smooth',\n width: type === 'bar' ? 0 : 2,\n };\n options.dataLabels = { enabled: false };\n }\n\n if (patterns) {\n options.fill = {\n type: 'pattern',\n opacity: type === 'area' ? 0.3 : 1,\n pattern: {\n style: [...PATTERN_STYLES],\n strokeWidth: 2,\n },\n };\n } else if (type === 'area') {\n options.fill = {\n type: 'gradient',\n opacity: 0.3,\n };\n }\n\n return options;\n }, [\n themeOptions,\n chartId,\n toolbar,\n reducedMotion,\n toolbarLocale,\n locale,\n labels,\n numberFormatter,\n t,\n type,\n categories,\n isRtl,\n patterns,\n ]);\n\n /* ---- resolved dimensions --------------------------------------- */\n const resolvedWidth = width ?? (containerWidth > 0 ? containerWidth : '100%');\n const resolvedHeight = height ?? 320;\n\n /* ---- sr-only data table --------------------------------------- */\n const srTable = useMemo(() => {\n const columnLabels = isSliceType(type)\n ? (labels ?? [])\n : (categories ?? []);\n const rows = tableSeries;\n return (\n <table id={summaryId} className=\"sr-only\">\n <caption>{title}</caption>\n <thead>\n <tr>\n <th scope=\"col\">{t('chart.table.series')}</th>\n {columnLabels.map((col, i) => (\n <th key={`${col}-${i}`} scope=\"col\">\n {col}\n </th>\n ))}\n </tr>\n </thead>\n <tbody>\n {rows.map((row, rowIndex) => (\n <tr key={`${row.name}-${rowIndex}`}>\n <th scope=\"row\">{row.name || t('chart.table.value')}</th>\n {row.data.map((value, colIndex) => (\n <td key={`${rowIndex}-${colIndex}`}>\n {numberFormatter.format(value)}\n </td>\n ))}\n </tr>\n ))}\n </tbody>\n </table>\n );\n }, [type, tableSeries, labels, categories, summaryId, title, t, numberFormatter]);\n\n /* ---- ApexCharts `series` prop shape ----------------------------- */\n const apexSeries = useMemo(() => {\n if (isSliceType(type)) {\n return series as number[];\n }\n return series as ChartSeries[];\n }, [series, type]);\n\n return (\n <div\n ref={wrapperRef}\n role=\"img\"\n aria-label={title}\n aria-describedby={summaryId}\n className={chartVariants({ density, className })}\n data-component=\"chart\"\n >\n {srTable}\n <ReactApexChart\n type={type}\n series={apexSeries as ApexCharts.ApexOptions['series']}\n options={chartOptions}\n width={resolvedWidth}\n height={resolvedHeight}\n aria-hidden=\"true\"\n />\n </div>\n );\n },\n);\n\nChart.displayName = 'Chart';\n\n/* ------------------------------------------------------------------ */\n/* Re-export internal helper for downstream theming (kept narrow). */\n/* ------------------------------------------------------------------ */\n\nexport { chartVariants };\n","import type { AgentAdapter } from '../../agent/types';\nimport type { ChartHandle } from './chart';\n\nexport const chartAgent: AgentAdapter<ChartHandle> = {\n id: 'chart',\n capabilities: [],\n state: {},\n actions: {\n update_series: {\n safety: 'read',\n argsType: 'series',\n description: 'Replace the chart series without remounting.',\n invoke: (handle, args: { series: Parameters<ChartHandle['updateSeries']>[0] }) => {\n handle.updateSeries(args.series);\n },\n },\n export_png: {\n safety: 'read',\n description: 'Return a PNG data URI of the chart for export or screenshotting.',\n invoke: (handle) => handle.dataURI(),\n },\n },\n domHooks: {\n root: { attr: 'data-component', value: 'chart' },\n },\n};\n"],"names":["chartVariants","cva","PATTERN_STYLES","CATEGORICAL_TYPES","SLICE_TYPES","isSliceType","type","isCategoricalType","normaliseSeries","series","Chart","forwardRef","title","categories","labels","height","width","patterns","toolbar","localeProp","density","className","ref","t","i18n","useTranslation","rawId","useId","chartId","useMemo","summaryId","wrapperRef","useRef","containerWidth","setContainerWidth","useState","locale","themeOptions","setThemeOptions","getApexChartsTheme","useEffect","timer","observer","el","ro","entries","entry","useImperativeHandle","instance","ApexCharts","next","isRtl","tableSeries","numberFormatter","toolbarLocale","reducedMotion","usePrefersReducedMotion","chartOptions","base","options","value","resolvedWidth","resolvedHeight","srTable","columnLabels","rows","jsx","jsxs","col","i","row","rowIndex","colIndex","apexSeries","ReactApexChart","chartAgent","handle","args"],"mappings":"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"}
|
|
@@ -1,174 +0,0 @@
|
|
|
1
|
-
import { jsxs as m, jsx as a } from "react/jsx-runtime";
|
|
2
|
-
import { forwardRef as z, useRef as h, useState as R, useCallback as V, useImperativeHandle as L, useEffect as B, useLayoutEffect as C } from "react";
|
|
3
|
-
import { c as b } from "./index-D2ZczOXr.js";
|
|
4
|
-
import { useTranslation as E } from "react-i18next";
|
|
5
|
-
import { u as O } from "./index-CJE9uQmb.js";
|
|
6
|
-
import { F as j } from "./floating-action-button-BM9ib-Wf.js";
|
|
7
|
-
import { u as H } from "./use-prefers-reduced-motion-BMwIQRjB.js";
|
|
8
|
-
import { C as M } from "./chevron-down-BX_NP2Yh.js";
|
|
9
|
-
const S = b(
|
|
10
|
-
"relative flex w-full flex-col overflow-hidden bg-background",
|
|
11
|
-
{
|
|
12
|
-
variants: {
|
|
13
|
-
density: {
|
|
14
|
-
default: "gap-[var(--spacing-md)]",
|
|
15
|
-
compact: "gap-[var(--spacing-sm)]"
|
|
16
|
-
}
|
|
17
|
-
},
|
|
18
|
-
defaultVariants: { density: "default" }
|
|
19
|
-
}
|
|
20
|
-
), $ = b(
|
|
21
|
-
[
|
|
22
|
-
"flex-1 min-h-0 overflow-y-auto overflow-x-hidden",
|
|
23
|
-
"ps-[var(--spacing-md)] pe-[var(--spacing-md)]",
|
|
24
|
-
"pt-[var(--spacing-md)] pb-[var(--spacing-md)]",
|
|
25
|
-
"focus-visible:outline-[length:var(--focus-ring-width)] focus-visible:outline-solid",
|
|
26
|
-
"focus-visible:outline-[color:var(--ring)] focus-visible:outline-offset-[length:var(--focus-ring-offset)]",
|
|
27
|
-
"scroll-smooth motion-reduce:scroll-auto [.theme-accessible_&]:scroll-auto",
|
|
28
|
-
// Edge fade — content near the scroll boundaries fades into the
|
|
29
|
-
// container surface instead of clipping abruptly against the header
|
|
30
|
-
// or composer, so avatars / bubbles don't look "cut in half" as they
|
|
31
|
-
// pass the viewport edge. Fade width matches the viewport padding so
|
|
32
|
-
// a row can slide fully behind the mask before disappearing.
|
|
33
|
-
// Disabled under HCM (mask strips content), reduced motion (less
|
|
34
|
-
// decoration when motion is off), and the accessible theme.
|
|
35
|
-
"[mask-image:linear-gradient(to_bottom,transparent_0,black_var(--spacing-md),black_calc(100%-var(--spacing-md)),transparent_100%)]",
|
|
36
|
-
"motion-reduce:[mask-image:none]",
|
|
37
|
-
"[.theme-accessible_&]:[mask-image:none]",
|
|
38
|
-
"forced-colors:[mask-image:none]"
|
|
39
|
-
].join(" ")
|
|
40
|
-
), D = 100, F = 48, K = z(
|
|
41
|
-
({
|
|
42
|
-
messages: n,
|
|
43
|
-
composer: d,
|
|
44
|
-
density: x = "default",
|
|
45
|
-
className: w,
|
|
46
|
-
onAutoScrollChange: i,
|
|
47
|
-
showScrollToLatest: N = !1,
|
|
48
|
-
...k
|
|
49
|
-
}, I) => {
|
|
50
|
-
const { t: u } = E(), r = h(null), f = h(null), [l, y] = R(!0), p = H(), o = V(
|
|
51
|
-
(e) => {
|
|
52
|
-
const t = r.current;
|
|
53
|
-
if (!t) return;
|
|
54
|
-
const s = ((e == null ? void 0 : e.smooth) ?? !0) && !p;
|
|
55
|
-
t.scrollTo({ top: t.scrollHeight, behavior: s ? "smooth" : "auto" });
|
|
56
|
-
},
|
|
57
|
-
[p]
|
|
58
|
-
);
|
|
59
|
-
L(
|
|
60
|
-
I,
|
|
61
|
-
() => ({
|
|
62
|
-
scrollToBottom: o,
|
|
63
|
-
getScrollViewport: () => r.current
|
|
64
|
-
}),
|
|
65
|
-
[o]
|
|
66
|
-
), B(() => {
|
|
67
|
-
const e = r.current, t = f.current;
|
|
68
|
-
if (!e || !t) return;
|
|
69
|
-
const s = new IntersectionObserver(
|
|
70
|
-
(_) => {
|
|
71
|
-
const g = _[0];
|
|
72
|
-
y(g.isIntersecting), i == null || i(g.isIntersecting);
|
|
73
|
-
},
|
|
74
|
-
{
|
|
75
|
-
root: e,
|
|
76
|
-
// Fire when the sentinel is within BOTTOM_SLACK_PX of being visible.
|
|
77
|
-
rootMargin: `0px 0px ${F}px 0px`,
|
|
78
|
-
threshold: 0
|
|
79
|
-
}
|
|
80
|
-
);
|
|
81
|
-
return s.observe(t), () => s.disconnect();
|
|
82
|
-
}, [i]);
|
|
83
|
-
const T = n.length;
|
|
84
|
-
C(() => {
|
|
85
|
-
l && o({ smooth: !1 });
|
|
86
|
-
}, [T, l, o]);
|
|
87
|
-
const v = n.length > D, c = O({
|
|
88
|
-
count: v ? n.length : 0,
|
|
89
|
-
getScrollElement: () => r.current,
|
|
90
|
-
estimateSize: () => 80,
|
|
91
|
-
overscan: 6,
|
|
92
|
-
getItemKey: (e) => {
|
|
93
|
-
var t;
|
|
94
|
-
return ((t = n[e]) == null ? void 0 : t.id) ?? e;
|
|
95
|
-
}
|
|
96
|
-
});
|
|
97
|
-
return /* @__PURE__ */ m("div", { className: S({ density: x, className: w }), "data-component": "chat-container", ...k, children: [
|
|
98
|
-
/* @__PURE__ */ m("div", { className: "relative flex-1 min-h-0 flex flex-col", children: [
|
|
99
|
-
/* @__PURE__ */ m(
|
|
100
|
-
"div",
|
|
101
|
-
{
|
|
102
|
-
ref: r,
|
|
103
|
-
role: "log",
|
|
104
|
-
"aria-live": "polite",
|
|
105
|
-
"aria-relevant": "additions",
|
|
106
|
-
"aria-label": u("ui.chat.container"),
|
|
107
|
-
tabIndex: 0,
|
|
108
|
-
className: $(),
|
|
109
|
-
children: [
|
|
110
|
-
v ? /* @__PURE__ */ a(
|
|
111
|
-
"ol",
|
|
112
|
-
{
|
|
113
|
-
className: "relative list-none ps-0 m-0",
|
|
114
|
-
style: { blockSize: `${c.getTotalSize()}px` },
|
|
115
|
-
children: c.getVirtualItems().map((e) => {
|
|
116
|
-
const t = n[e.index];
|
|
117
|
-
return t ? /* @__PURE__ */ a(
|
|
118
|
-
"li",
|
|
119
|
-
{
|
|
120
|
-
"data-index": e.index,
|
|
121
|
-
ref: c.measureElement,
|
|
122
|
-
className: "absolute start-0 end-0 top-0 w-full",
|
|
123
|
-
style: { transform: `translateY(${e.start}px)` },
|
|
124
|
-
children: /* @__PURE__ */ a("div", { className: "pt-[var(--spacing-xs)] pb-[var(--spacing-xs)]", children: t.node })
|
|
125
|
-
},
|
|
126
|
-
t.id
|
|
127
|
-
) : null;
|
|
128
|
-
})
|
|
129
|
-
}
|
|
130
|
-
) : /* @__PURE__ */ a("ol", { className: "flex flex-col gap-[var(--spacing-sm)] list-none ps-0 m-0", children: n.map((e) => /* @__PURE__ */ a("li", { children: e.node }, e.id)) }),
|
|
131
|
-
/* @__PURE__ */ a("div", { ref: f, "aria-hidden": "true", className: "h-1 w-full" })
|
|
132
|
-
]
|
|
133
|
-
}
|
|
134
|
-
),
|
|
135
|
-
N && !l ? /* @__PURE__ */ a(
|
|
136
|
-
"div",
|
|
137
|
-
{
|
|
138
|
-
className: [
|
|
139
|
-
"pointer-events-none absolute inset-inline-end-0",
|
|
140
|
-
// `bottom` is measured from the bottom of the scroll
|
|
141
|
-
// column (i.e. the top edge of the composer slot). A
|
|
142
|
-
// small spacing-md gap keeps the FAB clear of the
|
|
143
|
-
// divider border above the composer.
|
|
144
|
-
"bottom-[var(--spacing-md)] pe-[var(--spacing-md)]",
|
|
145
|
-
// Enter animation — fade + scale in from 95%. The FAB only
|
|
146
|
-
// unmounts when the user returns to bottom, so an exit
|
|
147
|
-
// animation isn't justified (abrupt disappearance reads as
|
|
148
|
-
// "task complete" when they've scrolled back).
|
|
149
|
-
"motion-safe:animate-in motion-safe:fade-in-0 motion-safe:zoom-in-95",
|
|
150
|
-
"duration-[var(--animation-duration)] ease-[var(--ease-out)]"
|
|
151
|
-
].join(" "),
|
|
152
|
-
children: /* @__PURE__ */ a("div", { className: "pointer-events-auto", children: /* @__PURE__ */ a(
|
|
153
|
-
j,
|
|
154
|
-
{
|
|
155
|
-
icon: /* @__PURE__ */ a(M, {}),
|
|
156
|
-
"aria-label": u("ui.chat.scrollToLatest"),
|
|
157
|
-
size: "sm",
|
|
158
|
-
variant: "secondary",
|
|
159
|
-
position: "static",
|
|
160
|
-
onClick: () => o({ smooth: !0 })
|
|
161
|
-
}
|
|
162
|
-
) })
|
|
163
|
-
}
|
|
164
|
-
) : null
|
|
165
|
-
] }),
|
|
166
|
-
d ? /* @__PURE__ */ a("div", { className: "shrink-0 border-t border-border ps-[var(--spacing-md)] pe-[var(--spacing-md)] pt-[var(--spacing-sm)] pb-[var(--spacing-sm)] bg-background", children: d }) : null
|
|
167
|
-
] });
|
|
168
|
-
}
|
|
169
|
-
);
|
|
170
|
-
K.displayName = "ChatContainer";
|
|
171
|
-
export {
|
|
172
|
-
K as C
|
|
173
|
-
};
|
|
174
|
-
//# sourceMappingURL=chat-container-SR3UWxbL.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"chat-container-SR3UWxbL.js","sources":["../../src/components/chat-container/chat-container.tsx"],"sourcesContent":["import {\n forwardRef,\n useCallback,\n useEffect,\n useImperativeHandle,\n useLayoutEffect,\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 { ChevronDown } from 'lucide-react';\nimport { useVirtualizer } from '@tanstack/react-virtual';\nimport { FloatingActionButton } from '../floating-action-button/floating-action-button';\nimport { usePrefersReducedMotion } from '../../hooks';\n\nconst rootVariants = cva(\n 'relative flex w-full flex-col overflow-hidden bg-background',\n {\n variants: {\n density: {\n default: 'gap-[var(--spacing-md)]',\n compact: 'gap-[var(--spacing-sm)]',\n },\n },\n defaultVariants: { density: 'default' },\n },\n);\n\nconst scrollViewportVariants = cva(\n [\n 'flex-1 min-h-0 overflow-y-auto overflow-x-hidden',\n 'ps-[var(--spacing-md)] pe-[var(--spacing-md)]',\n 'pt-[var(--spacing-md)] pb-[var(--spacing-md)]',\n 'focus-visible:outline-[length:var(--focus-ring-width)] focus-visible:outline-solid',\n 'focus-visible:outline-[color:var(--ring)] focus-visible:outline-offset-[length:var(--focus-ring-offset)]',\n 'scroll-smooth motion-reduce:scroll-auto [.theme-accessible_&]:scroll-auto',\n // Edge fade — content near the scroll boundaries fades into the\n // container surface instead of clipping abruptly against the header\n // or composer, so avatars / bubbles don't look \"cut in half\" as they\n // pass the viewport edge. Fade width matches the viewport padding so\n // a row can slide fully behind the mask before disappearing.\n // Disabled under HCM (mask strips content), reduced motion (less\n // decoration when motion is off), and the accessible theme.\n '[mask-image:linear-gradient(to_bottom,transparent_0,black_var(--spacing-md),black_calc(100%-var(--spacing-md)),transparent_100%)]',\n 'motion-reduce:[mask-image:none]',\n '[.theme-accessible_&]:[mask-image:none]',\n 'forced-colors:[mask-image:none]',\n ].join(' '),\n);\n\nconst VIRTUALIZATION_THRESHOLD = 100;\n/** Pixel slack against the bottom edge that still counts as \"at bottom\". */\nconst BOTTOM_SLACK_PX = 48;\n\nexport interface ChatContainerHandle {\n scrollToBottom: (opts?: { smooth?: boolean }) => void;\n getScrollViewport: () => HTMLDivElement | null;\n}\n\nexport interface ChatContainerProps\n extends Omit<HTMLAttributes<HTMLDivElement>, 'children'>,\n VariantProps<typeof rootVariants> {\n /** Array of messages to render. When the array exceeds 100 items the\n * list is virtualised via @tanstack/react-virtual. */\n messages: Array<{ id: string; node: ReactNode }>;\n /** Composer slot pinned to the block-end. */\n composer?: ReactNode;\n /** Fires when the user's auto-scroll preference flips. */\n onAutoScrollChange?: (isAtBottom: boolean) => void;\n /**\n * When true, renders a \"scroll to latest\" FloatingActionButton in the\n * bottom-end of the scroll column whenever the user has scrolled\n * away from the newest message. Defaults to `false` because the\n * affordance is only useful in long-form chat surfaces (fullscreen\n * assistants, dedicated messaging views); in compact docks — e.g. the\n * Leo side-panel — conversations rarely exceed one screen and the FAB\n * just adds visual noise. Turn on for fullscreen chat surfaces.\n */\n showScrollToLatest?: boolean;\n}\n\nexport const ChatContainer = forwardRef<ChatContainerHandle, ChatContainerProps>(\n (\n {\n messages,\n composer,\n density = 'default',\n className,\n onAutoScrollChange,\n showScrollToLatest = false,\n ...rest\n },\n ref,\n ) => {\n const { t } = useTranslation();\n const viewportRef = useRef<HTMLDivElement | null>(null);\n const sentinelRef = useRef<HTMLDivElement | null>(null);\n const [isAtBottom, setIsAtBottom] = useState(true);\n\n const prefersReducedMotion = usePrefersReducedMotion();\n\n const scrollToBottom = useCallback(\n (opts?: { smooth?: boolean }) => {\n const el = viewportRef.current;\n if (!el) return;\n const smooth = (opts?.smooth ?? true) && !prefersReducedMotion;\n el.scrollTo({ top: el.scrollHeight, behavior: smooth ? 'smooth' : 'auto' });\n },\n [prefersReducedMotion],\n );\n\n useImperativeHandle(\n ref,\n () => ({\n scrollToBottom,\n getScrollViewport: () => viewportRef.current,\n }),\n [scrollToBottom],\n );\n\n /* ── Intersection observer: track \"at bottom\" via a sentinel ── */\n useEffect(() => {\n const root = viewportRef.current;\n const sentinel = sentinelRef.current;\n if (!root || !sentinel) return;\n const observer = new IntersectionObserver(\n (entries) => {\n const entry = entries[0];\n setIsAtBottom(entry.isIntersecting);\n onAutoScrollChange?.(entry.isIntersecting);\n },\n {\n root,\n // Fire when the sentinel is within BOTTOM_SLACK_PX of being visible.\n rootMargin: `0px 0px ${BOTTOM_SLACK_PX}px 0px`,\n threshold: 0,\n },\n );\n observer.observe(sentinel);\n return () => observer.disconnect();\n }, [onAutoScrollChange]);\n\n /* ── Auto-scroll on new messages when at bottom ── */\n const messagesLength = messages.length;\n useLayoutEffect(() => {\n // `smooth: false` — when we're already pinned to the bottom and a\n // new message appends, the user doesn't perceive any scroll motion\n // (the sentinel just slides a few px). But a smooth animation DOES\n // give the IntersectionObserver a window in which the sentinel is\n // temporarily outside the rootMargin zone — that's what causes the\n // scroll-to-latest FAB to flicker in and out on every new message.\n // Instant scroll settles in one frame; FAB state stays stable.\n // The user-initiated FAB click below still uses smooth because the\n // jump is large and the motion communicates the travel.\n if (isAtBottom) scrollToBottom({ smooth: false });\n // Intentionally watching only length — individual node updates (streaming)\n // are driven by their own scroll decisions.\n }, [messagesLength, isAtBottom, scrollToBottom]);\n\n const virtualized = messages.length > VIRTUALIZATION_THRESHOLD;\n\n const virtualizer = useVirtualizer({\n count: virtualized ? messages.length : 0,\n getScrollElement: () => viewportRef.current,\n estimateSize: () => 80,\n overscan: 6,\n getItemKey: (i) => messages[i]?.id ?? i,\n });\n\n return (\n <div className={rootVariants({ density, className })} data-component=\"chat-container\" {...rest}>\n {/* Scroll column wraps the viewport AND the FAB together so the\n FAB's absolute `bottom` is measured from the top of the\n composer (this wrapper's end edge), not from the root — which\n would drop the FAB inside the composer/suggestion-chip area. */}\n <div className=\"relative flex-1 min-h-0 flex flex-col\">\n <div\n ref={viewportRef}\n role=\"log\"\n aria-live=\"polite\"\n aria-relevant=\"additions\"\n aria-label={t('ui.chat.container')}\n tabIndex={0}\n className={scrollViewportVariants()}\n >\n {virtualized ? (\n <ol\n className=\"relative list-none ps-0 m-0\"\n // Inline style — permitted per 23-constraints\n // §Runtime-computed dimensions (virtualizer total size).\n style={{ blockSize: `${virtualizer.getTotalSize()}px` }}\n >\n {virtualizer.getVirtualItems().map((vi) => {\n const msg = messages[vi.index];\n if (!msg) return null;\n return (\n <li\n key={msg.id}\n data-index={vi.index}\n ref={virtualizer.measureElement}\n className=\"absolute start-0 end-0 top-0 w-full\"\n // Inline style — permitted per 23-constraints\n // §Runtime-computed dimensions (virtualizer translateY).\n style={{ transform: `translateY(${vi.start}px)` }}\n >\n <div className=\"pt-[var(--spacing-xs)] pb-[var(--spacing-xs)]\">\n {msg.node}\n </div>\n </li>\n );\n })}\n </ol>\n ) : (\n <ol className=\"flex flex-col gap-[var(--spacing-sm)] list-none ps-0 m-0\">\n {messages.map((m) => (\n <li key={m.id}>{m.node}</li>\n ))}\n </ol>\n )}\n <div ref={sentinelRef} aria-hidden=\"true\" className=\"h-1 w-full\" />\n </div>\n\n {showScrollToLatest && !isAtBottom ? (\n <div\n className={[\n 'pointer-events-none absolute inset-inline-end-0',\n // `bottom` is measured from the bottom of the scroll\n // column (i.e. the top edge of the composer slot). A\n // small spacing-md gap keeps the FAB clear of the\n // divider border above the composer.\n 'bottom-[var(--spacing-md)] pe-[var(--spacing-md)]',\n // Enter animation — fade + scale in from 95%. The FAB only\n // unmounts when the user returns to bottom, so an exit\n // animation isn't justified (abrupt disappearance reads as\n // \"task complete\" when they've scrolled back).\n 'motion-safe:animate-in motion-safe:fade-in-0 motion-safe:zoom-in-95',\n 'duration-[var(--animation-duration)] ease-[var(--ease-out)]',\n ].join(' ')}\n >\n <div className=\"pointer-events-auto\">\n <FloatingActionButton\n icon={<ChevronDown />}\n aria-label={t('ui.chat.scrollToLatest')}\n size=\"sm\"\n variant=\"secondary\"\n // `position=\"static\"` — the wrapper is already\n // absolutely-positioned. Without this, FAB's default\n // `bottom-end` variant applies `position: fixed` and\n // pins the button to the browser viewport corner,\n // escaping the container and appearing as an orphan\n // circle that stays put while the chat scrolls.\n position=\"static\"\n onClick={() => scrollToBottom({ smooth: true })}\n />\n </div>\n </div>\n ) : null}\n </div>\n\n {composer ? (\n <div className=\"shrink-0 border-t border-border ps-[var(--spacing-md)] pe-[var(--spacing-md)] pt-[var(--spacing-sm)] pb-[var(--spacing-sm)] bg-background\">\n {composer}\n </div>\n ) : null}\n </div>\n );\n },\n);\n\nChatContainer.displayName = 'ChatContainer';\n"],"names":["rootVariants","cva","scrollViewportVariants","VIRTUALIZATION_THRESHOLD","BOTTOM_SLACK_PX","ChatContainer","forwardRef","messages","composer","density","className","onAutoScrollChange","showScrollToLatest","rest","ref","t","useTranslation","viewportRef","useRef","sentinelRef","isAtBottom","setIsAtBottom","useState","prefersReducedMotion","usePrefersReducedMotion","scrollToBottom","useCallback","opts","el","smooth","useImperativeHandle","useEffect","root","sentinel","observer","entries","entry","messagesLength","useLayoutEffect","virtualized","virtualizer","useVirtualizer","i","_a","jsxs","jsx","vi","msg","m","FloatingActionButton","ChevronDown"],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"chat-input-aphxDjZL.js","sources":["../../node_modules/lucide-react/dist/esm/icons/paperclip.js","../../src/components/chat-input/chat-input.tsx"],"sourcesContent":["/**\n * @license lucide-react v1.8.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst __iconNode = [\n [\n \"path\",\n {\n d: \"m16 6-8.414 8.586a2 2 0 0 0 2.829 2.829l8.414-8.586a4 4 0 1 0-5.657-5.657l-8.379 8.551a6 6 0 1 0 8.485 8.485l8.379-8.551\",\n key: \"1miecu\"\n }\n ]\n];\nconst Paperclip = createLucideIcon(\"paperclip\", __iconNode);\n\nexport { __iconNode, Paperclip as default };\n//# sourceMappingURL=paperclip.js.map\n","import {\n forwardRef,\n useCallback,\n useId,\n useLayoutEffect,\n useRef,\n useState,\n type ChangeEvent,\n type CompositionEvent,\n type KeyboardEvent,\n type ReactNode,\n type TextareaHTMLAttributes,\n} from 'react';\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport { useTranslation } from 'react-i18next';\nimport { AlertCircle, Paperclip, Send } from 'lucide-react';\nimport { IconButton } from '../button';\n\nconst rootVariants = cva(\n [\n 'flex flex-col gap-[var(--spacing-xs)] w-full',\n 'rounded-[var(--radius-md)] border border-border',\n 'bg-background focus-within:border-[color:var(--primary)]',\n 'transition-[border-color] duration-[var(--animation-duration)]',\n 'motion-reduce:transition-none',\n ].join(' '),\n {\n variants: {\n size: {\n sm: 'text-[length:var(--font-size-sm)]',\n md: 'text-[length:var(--font-size-base)]',\n lg: 'text-[length:var(--font-size-lg)]',\n },\n },\n defaultVariants: { size: 'md' },\n },\n);\n\ntype NativeTextareaProps = Omit<\n TextareaHTMLAttributes<HTMLTextAreaElement>,\n 'size' | 'onSubmit' | 'children'\n>;\n\nexport interface ChatInputProps\n extends NativeTextareaProps,\n VariantProps<typeof rootVariants> {\n /** Invoked when the user submits (Cmd/Ctrl+Enter, or send button). */\n onSubmit?: (text: string) => void;\n /** Maximum allowed characters (grapheme clusters via Intl.Segmenter when available). */\n maxLength?: number;\n /** When true, plain Enter submits and Shift+Enter inserts a newline.\n * Default false (Enter inserts newline; Cmd/Ctrl+Enter submits). */\n submitOnEnter?: boolean;\n /** Minimum visible rows. Default 1. */\n minRows?: number;\n /** Maximum visible rows before the field scrolls. Default 8. */\n maxRows?: number;\n /** Optional attachment handler — when provided, renders the attachment button. */\n onAttach?: (files: FileList) => void;\n /** `accept` forwarded to the hidden file input. */\n accept?: string;\n /** Controls whether the textarea is disabled and submit is blocked. */\n disabled?: boolean;\n /** Optional slot placed between the textarea and the send button. */\n toolbar?: ReactNode;\n /** Visible label above the textarea. When omitted, a visually-hidden label is used. */\n label?: string;\n}\n\nfunction graphemeCount(value: string, locale: string): number {\n if (typeof Intl !== 'undefined' && typeof Intl.Segmenter === 'function') {\n try {\n const seg = new Intl.Segmenter(locale, { granularity: 'grapheme' });\n let n = 0;\n for (const _s of seg.segment(value)) n += 1;\n return n;\n } catch {\n /* fall through to Array.from */\n }\n }\n return Array.from(value).length;\n}\n\nexport const ChatInput = forwardRef<HTMLTextAreaElement, ChatInputProps>(\n (\n {\n size = 'md',\n value,\n defaultValue,\n maxLength,\n submitOnEnter = false,\n minRows = 1,\n maxRows = 8,\n onSubmit,\n onAttach,\n accept,\n disabled,\n toolbar,\n label,\n placeholder,\n className,\n onChange,\n onKeyDown,\n onCompositionStart,\n onCompositionEnd,\n id,\n ...rest\n },\n ref,\n ) => {\n const { t, i18n } = useTranslation();\n const textareaId = useId();\n const composingRef = useRef(false);\n const fileInputRef = useRef<HTMLInputElement>(null);\n const innerRef = useRef<HTMLTextAreaElement | null>(null);\n\n const setRefs = useCallback(\n (node: HTMLTextAreaElement | null) => {\n innerRef.current = node;\n if (typeof ref === 'function') ref(node);\n else if (ref) ref.current = node;\n },\n [ref],\n );\n\n const isControlled = value !== undefined;\n const [internalValue, setInternalValue] = useState<string>(\n String(defaultValue ?? ''),\n );\n const currentValue = isControlled ? String(value) : internalValue;\n\n const count = graphemeCount(currentValue, i18n.language);\n const hasMaxLength = typeof maxLength === 'number' && maxLength > 0;\n const remaining = hasMaxLength ? Math.max(0, maxLength - count) : 0;\n const showCounter = hasMaxLength && count > (maxLength as number) * 0.9;\n const atLimit = hasMaxLength && count >= maxLength;\n\n /* Auto-grow — compute height from scrollHeight, clamped to [minRows, maxRows].\n Imperative `.style` write is permitted per 23-constraints\n §Runtime-computed dimensions (textarea scrollHeight measurement). */\n const resize = useCallback(() => {\n const el = innerRef.current;\n if (!el) return;\n const styles = window.getComputedStyle(el);\n const lineHeight = parseFloat(styles.lineHeight) || 24;\n const padTop = parseFloat(styles.paddingTop) || 0;\n const padBot = parseFloat(styles.paddingBottom) || 0;\n const borderTop = parseFloat(styles.borderTopWidth) || 0;\n const borderBot = parseFloat(styles.borderBottomWidth) || 0;\n const chrome = padTop + padBot + borderTop + borderBot;\n const minH = lineHeight * minRows + chrome;\n const maxH = lineHeight * maxRows + chrome;\n el.style.height = 'auto';\n const next = Math.max(minH, Math.min(el.scrollHeight, maxH));\n el.style.height = `${next}px`;\n el.style.overflowY = el.scrollHeight > maxH ? 'auto' : 'hidden';\n }, [minRows, maxRows]);\n\n useLayoutEffect(() => {\n resize();\n }, [resize, currentValue]);\n\n const handleChange = (e: ChangeEvent<HTMLTextAreaElement>) => {\n if (!isControlled) setInternalValue(e.target.value);\n if (composingRef.current) return;\n onChange?.(e);\n };\n\n const handleCompositionStart = (e: CompositionEvent<HTMLTextAreaElement>) => {\n composingRef.current = true;\n onCompositionStart?.(e);\n };\n const handleCompositionEnd = (e: CompositionEvent<HTMLTextAreaElement>) => {\n composingRef.current = false;\n onCompositionEnd?.(e);\n };\n\n const isIMEKey = (e: KeyboardEvent<HTMLTextAreaElement>) =>\n e.nativeEvent.isComposing || e.keyCode === 229 || composingRef.current;\n\n const submit = () => {\n const text = currentValue.trim();\n if (!text || disabled || atLimit) return;\n onSubmit?.(currentValue);\n if (!isControlled) setInternalValue('');\n };\n\n const handleKeyDown = (e: KeyboardEvent<HTMLTextAreaElement>) => {\n onKeyDown?.(e);\n if (e.defaultPrevented) return;\n if (isIMEKey(e)) return;\n\n if (e.key === 'Enter') {\n const explicitSubmit = e.metaKey || e.ctrlKey;\n const plainEnterSubmits = submitOnEnter && !e.shiftKey;\n if (explicitSubmit || plainEnterSubmits) {\n e.preventDefault();\n submit();\n }\n }\n };\n\n const handleAttach = () => {\n fileInputRef.current?.click();\n };\n\n const handleFilePick = (e: ChangeEvent<HTMLInputElement>) => {\n if (e.target.files && e.target.files.length > 0) {\n onAttach?.(e.target.files);\n }\n // Reset so picking the same file twice still fires change.\n e.target.value = '';\n };\n\n const effectiveId = id ?? textareaId;\n const labelId = `${effectiveId}-label`;\n const counterId = hasMaxLength ? `${effectiveId}-counter` : undefined;\n const hintId = `${effectiveId}-hint`;\n\n const resolvedPlaceholder =\n placeholder ?? t('chat.input.placeholder');\n const resolvedLabel = label ?? t('chat.prompt');\n\n return (\n <div className={rootVariants({ size, className })}>\n <label id={labelId} htmlFor={effectiveId} className={label ? 'type-label ps-[var(--spacing-sm)] pt-[var(--spacing-sm)]' : 'sr-only'}>\n {resolvedLabel}\n </label>\n <textarea\n ref={setRefs}\n id={effectiveId}\n value={isControlled ? currentValue : undefined}\n defaultValue={!isControlled ? defaultValue : undefined}\n disabled={disabled}\n rows={minRows}\n maxLength={maxLength}\n placeholder={resolvedPlaceholder}\n aria-labelledby={labelId}\n aria-describedby={[counterId, hintId].filter(Boolean).join(' ') || undefined}\n aria-invalid={atLimit || undefined}\n onChange={handleChange}\n onKeyDown={handleKeyDown}\n onCompositionStart={handleCompositionStart}\n onCompositionEnd={handleCompositionEnd}\n className={[\n 'w-full resize-none bg-transparent',\n 'ps-[var(--spacing-md)] pe-[var(--spacing-md)] pt-[var(--spacing-sm)] pb-[var(--spacing-xs)]',\n 'placeholder:text-[color:var(--muted-foreground)]',\n 'leading-[var(--line-height-base)]',\n 'disabled:opacity-50 disabled:cursor-not-allowed',\n // Tokenised focus ring on the textarea itself — the 1px border\n // shift on the wrapper alone fails the 3px accessible-theme\n // requirement. See a11y-critical-fixes.mdx.\n 'outline-none',\n 'focus-visible:outline-[length:var(--focus-ring-width)] focus-visible:outline-solid',\n 'focus-visible:outline-[color:var(--ring)] focus-visible:outline-offset-[length:var(--focus-ring-offset)]',\n 'rounded-[var(--radius-sm)]',\n 'forced-colors:focus-visible:outline-[CanvasText]',\n ].join(' ')}\n {...rest}\n />\n <div className=\"flex items-center gap-[var(--spacing-xs)] ps-[var(--spacing-xs)] pe-[var(--spacing-xs)] pb-[var(--spacing-xs)]\">\n {onAttach ? (\n <>\n <input\n ref={fileInputRef}\n type=\"file\"\n className=\"sr-only\"\n multiple\n accept={accept}\n onChange={handleFilePick}\n />\n <IconButton\n icon={<Paperclip />}\n aria-label={t('chat.input.attach')}\n intent=\"ghost\"\n size=\"sm\"\n onClick={handleAttach}\n disabled={disabled}\n />\n </>\n ) : null}\n {toolbar}\n <div className=\"ms-auto inline-flex items-center gap-[var(--spacing-sm)]\">\n {showCounter ? (\n <span\n id={counterId}\n aria-live=\"polite\"\n className={[\n 'inline-flex items-center gap-[var(--spacing-xs)]',\n 'type-meta tabular-nums',\n atLimit\n ? 'text-[color:var(--destructive)]'\n : 'text-[color:var(--muted-foreground)]',\n ].join(' ')}\n >\n {atLimit ? (\n // Icon pairs with --destructive colour so the at-limit\n // state is not conveyed by hue alone (WCAG 1.4.1).\n <AlertCircle aria-hidden=\"true\" className=\"size-3.5\" />\n ) : null}\n {t('chat.input.remaining', { count: remaining })}\n </span>\n ) : null}\n <span id={hintId} className=\"sr-only\">\n {t('chat.input.sendHint')}\n </span>\n <IconButton\n icon={<Send />}\n aria-label={t('chat.send')}\n intent=\"primary\"\n size=\"sm\"\n disabled={disabled || !currentValue.trim() || atLimit}\n onClick={submit}\n aria-keyshortcuts=\"Meta+Enter Control+Enter\"\n />\n </div>\n </div>\n </div>\n );\n },\n);\n\nChatInput.displayName = 'ChatInput';\n"],"names":["__iconNode","Paperclip","createLucideIcon","rootVariants","cva","graphemeCount","value","locale","seg","n","_s","ChatInput","forwardRef","size","defaultValue","maxLength","submitOnEnter","minRows","maxRows","onSubmit","onAttach","accept","disabled","toolbar","label","placeholder","className","onChange","onKeyDown","onCompositionStart","onCompositionEnd","id","rest","ref","t","i18n","useTranslation","textareaId","useId","composingRef","useRef","fileInputRef","innerRef","setRefs","useCallback","node","isControlled","internalValue","setInternalValue","useState","currentValue","count","hasMaxLength","remaining","showCounter","atLimit","resize","el","styles","lineHeight","padTop","padBot","borderTop","borderBot","chrome","minH","maxH","next","useLayoutEffect","handleChange","handleCompositionStart","handleCompositionEnd","isIMEKey","submit","handleKeyDown","explicitSubmit","plainEnterSubmits","handleAttach","_a","handleFilePick","effectiveId","labelId","counterId","hintId","resolvedPlaceholder","resolvedLabel","jsxs","jsx","Fragment","IconButton","AlertCircle","Send"],"mappings":"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","x_google_ignoreList":[0]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"chat-message-CdJSD18D.js","sources":["../../node_modules/lucide-react/dist/esm/icons/rotate-ccw.js","../../src/components/chat-message/chat-message.tsx"],"sourcesContent":["/**\n * @license lucide-react v1.8.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst __iconNode = [\n [\"path\", { d: \"M3 12a9 9 0 1 0 9-9 9.75 9.75 0 0 0-6.74 2.74L3 8\", key: \"1357e3\" }],\n [\"path\", { d: \"M3 3v5h5\", key: \"1xhq8a\" }]\n];\nconst RotateCcw = createLucideIcon(\"rotate-ccw\", __iconNode);\n\nexport { __iconNode, RotateCcw as default };\n//# sourceMappingURL=rotate-ccw.js.map\n","import {\n forwardRef,\n Fragment,\n useMemo,\n type HTMLAttributes,\n type ReactNode,\n} from 'react';\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport { useTranslation } from 'react-i18next';\nimport { AlertCircle, Check, Clock, RotateCcw } from 'lucide-react';\nimport { Button } from '../button';\nimport { Avatar } from '../avatar';\nimport { Timestamp } from '../timestamp';\nimport { safeImageSrc } from '../_shared';\n\n/* ------------------------------------------------------------------ */\n/* Types */\n/* ------------------------------------------------------------------ */\n\nexport type ChatMessageRole = 'user' | 'assistant' | 'system';\nexport type ChatMessageStatus = 'sending' | 'sent' | 'error' | 'edited';\n\nexport interface ChatMessageAvatar {\n name?: string;\n src?: string;\n /**\n * Optional custom avatar node. When provided, it REPLACES the built-in\n * `<Avatar>` (initials / image) for this message. Used by the Leo\n * pattern to render a Sparkles identity tile instead of an avatar, and\n * by consumers that want to swap in a user-icon chip, brand glyph, etc.\n * The caller is responsible for accessible labelling on the custom node\n * — ChatMessage's own `aria-label` already announces the role/time, so\n * purely decorative nodes can be `aria-hidden`.\n */\n slot?: ReactNode;\n}\n\n/* ------------------------------------------------------------------ */\n/* CVA */\n/* ------------------------------------------------------------------ */\n\nconst rowVariants = cva('flex w-full items-start gap-[var(--spacing-sm)]', {\n variants: {\n role: {\n user: 'flex-row-reverse',\n assistant: 'flex-row',\n system: 'flex-col items-center text-center',\n },\n },\n defaultVariants: { role: 'assistant' },\n});\n\nconst bubbleVariants = cva(\n [\n // Cap at 42rem on wide surfaces; on narrow docks (Leo sidebar ≈22rem)\n // leave room for the avatar column (size-8 = 32px = --spacing-xl) +\n // `gap-sm` (8px = --spacing-sm) so avatars don't clip off the inline\n // edge when the row is width-constrained.\n 'relative max-w-[min(42rem,calc(100%-var(--spacing-xl)-var(--spacing-sm)))]',\n 'ps-[var(--spacing-md)] pe-[var(--spacing-md)]',\n 'pt-[var(--spacing-sm)] pb-[var(--spacing-sm)]',\n 'type-body',\n 'break-words',\n ].join(' '),\n {\n variants: {\n role: {\n user: 'bg-[color:var(--primary)] text-[color:var(--primary-foreground)] rounded-[var(--radius-md)] rounded-ee-[var(--radius-sm)]',\n assistant:\n 'bg-muted/40 text-foreground rounded-[var(--radius-md)] rounded-es-[var(--radius-sm)]',\n system:\n 'bg-transparent text-[color:var(--muted-foreground)] type-body-sm italic',\n },\n },\n defaultVariants: { role: 'assistant' },\n },\n);\n\n/* ------------------------------------------------------------------ */\n/* Safe markdown-ish (bold, inline code, line-breaks, links as text) */\n/* No dangerouslySetInnerHTML. */\n/* ------------------------------------------------------------------ */\n\ntype Token =\n | { type: 'text'; value: string }\n | { type: 'bold'; value: string }\n | { type: 'code'; value: string }\n | { type: 'br' }\n | { type: 'link'; label: string; href: string };\n\nconst SAFE_SCHEMES = /^(https?:|mailto:)/i;\n\nfunction tokenize(input: string): Token[] {\n const tokens: Token[] = [];\n let remaining = input;\n const pattern = /\\*\\*([^*]+)\\*\\*|`([^`]+)`|\\[([^\\]]+)\\]\\(([^)]+)\\)|\\n/;\n while (remaining.length > 0) {\n const match = pattern.exec(remaining);\n if (!match) {\n tokens.push({ type: 'text', value: remaining });\n break;\n }\n if (match.index > 0) {\n tokens.push({ type: 'text', value: remaining.slice(0, match.index) });\n }\n if (match[1] !== undefined) {\n tokens.push({ type: 'bold', value: match[1] });\n } else if (match[2] !== undefined) {\n tokens.push({ type: 'code', value: match[2] });\n } else if (match[3] !== undefined && match[4] !== undefined) {\n tokens.push({ type: 'link', label: match[3], href: match[4] });\n } else {\n tokens.push({ type: 'br' });\n }\n remaining = remaining.slice(match.index + match[0].length);\n }\n return tokens;\n}\n\nfunction renderBody(input: string): ReactNode {\n return tokenize(input).map((tok, i) => {\n if (tok.type === 'bold') return <strong key={i}>{tok.value}</strong>;\n if (tok.type === 'code') {\n return (\n <code\n key={i}\n dir=\"ltr\"\n className=\"rounded-[var(--radius-sm)] bg-muted/30 ps-[var(--spacing-xs)] pe-[var(--spacing-xs)] font-[family-name:var(--font-mono)]\"\n >\n {tok.value}\n </code>\n );\n }\n if (tok.type === 'br') return <br key={i} />;\n if (tok.type === 'link') {\n if (!SAFE_SCHEMES.test(tok.href)) {\n // Unsafe scheme (javascript:, data:) — render as inert text.\n return <Fragment key={i}>{tok.label}</Fragment>;\n }\n return (\n <a\n key={i}\n href={tok.href}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"underline underline-offset-2 hover:opacity-80\"\n >\n {tok.label}\n </a>\n );\n }\n return <Fragment key={i}>{tok.value}</Fragment>;\n });\n}\n\n/* ------------------------------------------------------------------ */\n/* ChatMessage */\n/* ------------------------------------------------------------------ */\n\ntype NativeProps = Omit<HTMLAttributes<HTMLElement>, 'content' | 'role'>;\n\nexport interface ChatMessageProps\n extends NativeProps,\n VariantProps<typeof bubbleVariants> {\n role: ChatMessageRole;\n content: string;\n avatar?: ChatMessageAvatar;\n timestamp?: Date | number | string;\n status?: ChatMessageStatus;\n /** Parse a small, safe subset of markdown. Never renders raw HTML. */\n renderMarkdown?: boolean;\n /** Invoked when the retry button is activated (error status only). */\n onRetry?: () => void;\n}\n\nexport const ChatMessage = forwardRef<HTMLElement, ChatMessageProps>(\n (\n {\n role,\n content,\n avatar,\n timestamp,\n status,\n renderMarkdown = false,\n onRetry,\n className,\n ...rest\n },\n ref,\n ) => {\n const { t, i18n } = useTranslation();\n\n // Local format — used for the aria-label interpolation only. Visible\n // label is rendered by `<Timestamp>` below, which computes the same\n // locale-aware HH:MM internally.\n const formattedTime = useMemo(() => {\n if (!timestamp) return null;\n const date =\n timestamp instanceof Date ? timestamp : new Date(timestamp);\n if (Number.isNaN(date.getTime())) return null;\n return new Intl.DateTimeFormat(i18n.language, {\n hour: '2-digit',\n minute: '2-digit',\n }).format(date);\n }, [timestamp, i18n.language]);\n\n const roleLabel = t(`chat.message.role.${role}`);\n const messageLabel = formattedTime\n ? t('chat.message.label', { role: roleLabel, time: formattedTime })\n : t('chat.message.labelNoTime', { role: roleLabel });\n\n const body = renderMarkdown ? renderBody(content) : content;\n\n const statusIcon = (() => {\n if (!status || status === 'edited') return null;\n if (status === 'sending')\n return <Clock aria-hidden=\"true\" className=\"size-3.5\" />;\n if (status === 'sent')\n return <Check aria-hidden=\"true\" className=\"size-3.5\" />;\n return (\n <AlertCircle\n aria-hidden=\"true\"\n className=\"size-3.5 text-[color:var(--destructive)]\"\n />\n );\n })();\n\n const statusText = status ? t(`chat.message.status.${status}`) : null;\n\n return (\n <article\n ref={ref}\n aria-label={messageLabel}\n className={[\n rowVariants({ role, className }),\n // Entrance: fade + slide up on mount. `--animation-duration` is 0ms\n // under `prefers-reduced-motion` and `.theme-accessible`, so both\n // collapse the animation to an instant state change automatically.\n 'motion-safe:animate-in motion-safe:fade-in-0 motion-safe:slide-in-from-bottom-2',\n 'duration-[var(--animation-duration)] ease-[var(--ease-out)]',\n ].join(' ')}\n {...rest}\n >\n {role !== 'system' && avatar ? (\n avatar.slot ? (\n // Consumer-supplied avatar node (e.g. Leo's Sparkles tile).\n avatar.slot\n ) : (\n // Allow-list the src: LLM-supplied values can carry\n // `javascript:` / `data:text/html` / `data:image/svg+xml` and so\n // are scrubbed here before reaching <Avatar>. Fallback to initials.\n <Avatar name={avatar.name} src={safeImageSrc(avatar.src)} size=\"sm\" />\n )\n ) : null}\n\n <div\n className={[\n // min-w-0 allows this flex item to shrink below its content's\n // natural width — without it, a single unbreakable token (URL,\n // CJK run, hash) can force the bubble wider than the parent\n // and spill outside narrow containers like the Leo sidebar.\n 'flex flex-col min-w-0',\n role === 'user' ? 'items-end' : role === 'assistant' ? 'items-start' : 'items-center',\n ].join(' ')}\n >\n <div\n dir=\"auto\"\n className={[\n bubbleVariants({ role }),\n // `break-words` (from bubbleVariants) handles soft hyphens;\n // `overflow-wrap: anywhere` is the last-resort break for\n // URLs, hashes, or CJK runs that would otherwise push the\n // bubble wider than its parent in narrow docks like Leo.\n '[overflow-wrap:anywhere]',\n ].join(' ')}\n >\n {body}\n </div>\n\n {(formattedTime || statusText) && role !== 'system' ? (\n <div\n className={[\n 'mt-[var(--spacing-xs)] inline-flex items-center gap-[var(--spacing-xs)]',\n 'type-meta text-[color:var(--muted-foreground)]',\n ].join(' ')}\n >\n {timestamp ? (\n <Timestamp\n value={timestamp}\n format=\"absolute\"\n absoluteFormat={{ hour: '2-digit', minute: '2-digit' }}\n dir=\"ltr\"\n />\n ) : null}\n {statusIcon ? (\n // `key={status}` re-mounts the span on every status change so\n // `animate-in` re-runs — gives the sending → sent → error\n // swap a subtle cross-fade instead of an abrupt pop.\n <span\n key={status}\n className={[\n 'inline-flex items-center gap-[var(--spacing-xs)]',\n 'motion-safe:animate-in motion-safe:fade-in-0',\n 'duration-[var(--animation-duration)] ease-[var(--ease-out)]',\n ].join(' ')}\n >\n {statusIcon}\n <span className=\"sr-only\">{statusText}</span>\n </span>\n ) : null}\n {status === 'error' && onRetry ? (\n <Button\n intent=\"ghost\"\n size=\"sm\"\n onClick={onRetry}\n startIcon={<RotateCcw />}\n >\n {t('chat.message.retry')}\n </Button>\n ) : null}\n </div>\n ) : null}\n </div>\n </article>\n );\n },\n);\n\nChatMessage.displayName = 'ChatMessage';\n"],"names":["__iconNode","RotateCcw","createLucideIcon","rowVariants","cva","bubbleVariants","SAFE_SCHEMES","tokenize","input","tokens","remaining","pattern","match","renderBody","tok","i","jsx","Fragment","ChatMessage","forwardRef","role","content","avatar","timestamp","status","renderMarkdown","onRetry","className","rest","ref","t","i18n","useTranslation","formattedTime","useMemo","date","roleLabel","messageLabel","body","statusIcon","Clock","Check","AlertCircle","statusText","jsxs","Avatar","safeImageSrc","Timestamp","Button"],"mappings":"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","x_google_ignoreList":[0]}
|
|
@@ -1,116 +0,0 @@
|
|
|
1
|
-
import { jsxs as j, jsx as e } from "react/jsx-runtime";
|
|
2
|
-
import { createContext as I, useContext as L, forwardRef as G, useId as _ } from "react";
|
|
3
|
-
import * as h from "@radix-ui/react-checkbox";
|
|
4
|
-
import { c as B } from "./index-D2ZczOXr.js";
|
|
5
|
-
import { T as M } from "./tooltip-DF6WjD1r.js";
|
|
6
|
-
const R = I(null);
|
|
7
|
-
function T() {
|
|
8
|
-
return L(R);
|
|
9
|
-
}
|
|
10
|
-
const u = [
|
|
11
|
-
"[stroke-dasharray:1] [stroke-dashoffset:1]",
|
|
12
|
-
"animate-[checkbox-indicator-draw_var(--animation-duration)_ease-out_forwards]"
|
|
13
|
-
].join(" ");
|
|
14
|
-
function V({ className: o }) {
|
|
15
|
-
return /* @__PURE__ */ e(
|
|
16
|
-
"svg",
|
|
17
|
-
{
|
|
18
|
-
viewBox: "0 0 24 24",
|
|
19
|
-
fill: "none",
|
|
20
|
-
stroke: "currentColor",
|
|
21
|
-
strokeWidth: "3",
|
|
22
|
-
strokeLinecap: "round",
|
|
23
|
-
strokeLinejoin: "round",
|
|
24
|
-
"aria-hidden": "true",
|
|
25
|
-
"data-slot": "checkbox-check-icon",
|
|
26
|
-
className: o,
|
|
27
|
-
children: /* @__PURE__ */ e("path", { pathLength: "1", d: "M5 12l5 5L20 7", className: u })
|
|
28
|
-
}
|
|
29
|
-
);
|
|
30
|
-
}
|
|
31
|
-
function W({ className: o }) {
|
|
32
|
-
return /* @__PURE__ */ e(
|
|
33
|
-
"svg",
|
|
34
|
-
{
|
|
35
|
-
viewBox: "0 0 24 24",
|
|
36
|
-
fill: "none",
|
|
37
|
-
stroke: "currentColor",
|
|
38
|
-
strokeWidth: "3",
|
|
39
|
-
strokeLinecap: "round",
|
|
40
|
-
"aria-hidden": "true",
|
|
41
|
-
"data-slot": "checkbox-indeterminate-icon",
|
|
42
|
-
className: o,
|
|
43
|
-
children: /* @__PURE__ */ e("path", { pathLength: "1", d: "M5 12h14", className: u })
|
|
44
|
-
}
|
|
45
|
-
);
|
|
46
|
-
}
|
|
47
|
-
const D = B(
|
|
48
|
-
[
|
|
49
|
-
"inline-flex items-center justify-center shrink-0",
|
|
50
|
-
"border border-border rounded-[var(--radius-sm)] bg-background",
|
|
51
|
-
"transition-colors duration-[var(--animation-duration)] motion-reduce:transition-none",
|
|
52
|
-
"focus-visible:outline-[length:var(--focus-ring-width)] focus-visible:outline-solid",
|
|
53
|
-
"focus-visible:outline-ring focus-visible:outline-offset-[length:var(--focus-ring-offset)]",
|
|
54
|
-
"disabled:cursor-not-allowed disabled:opacity-50",
|
|
55
|
-
"data-[state=checked]:bg-primary data-[state=checked]:border-primary data-[state=checked]:text-primary-foreground",
|
|
56
|
-
"data-[state=indeterminate]:bg-primary data-[state=indeterminate]:border-primary data-[state=indeterminate]:text-primary-foreground",
|
|
57
|
-
'relative before:absolute before:inset-[calc((var(--min-target-size)-100%)/-2)] before:content-[""]'
|
|
58
|
-
].join(" "),
|
|
59
|
-
{
|
|
60
|
-
variants: {
|
|
61
|
-
size: {
|
|
62
|
-
sm: "size-3.5",
|
|
63
|
-
md: "size-4",
|
|
64
|
-
lg: "size-5"
|
|
65
|
-
}
|
|
66
|
-
},
|
|
67
|
-
defaultVariants: {
|
|
68
|
-
size: "md"
|
|
69
|
-
}
|
|
70
|
-
}
|
|
71
|
-
), F = G(
|
|
72
|
-
({
|
|
73
|
-
label: o,
|
|
74
|
-
checked: f,
|
|
75
|
-
onCheckedChange: b,
|
|
76
|
-
size: n = "md",
|
|
77
|
-
disabled: k,
|
|
78
|
-
disabledReason: i,
|
|
79
|
-
name: p,
|
|
80
|
-
value: r,
|
|
81
|
-
id: x,
|
|
82
|
-
className: g,
|
|
83
|
-
...v
|
|
84
|
-
}, C) => {
|
|
85
|
-
const y = _(), s = x ?? y, t = T(), c = t !== null && r !== void 0, d = c ? t.value.has(r) : f, w = c ? () => t.toggle(r) : b, N = (t == null ? void 0 : t.name) ?? p, a = (t == null ? void 0 : t.disabled) || k, l = n === "sm" ? "size-3" : n === "lg" ? "size-4" : "size-3.5", z = [
|
|
86
|
-
"type-label text-foreground select-none",
|
|
87
|
-
a ? "cursor-not-allowed opacity-50" : "cursor-pointer"
|
|
88
|
-
].join(" "), m = /* @__PURE__ */ j("div", { className: "inline-flex items-center gap-[var(--spacing-sm)]", children: [
|
|
89
|
-
/* @__PURE__ */ e(
|
|
90
|
-
h.Root,
|
|
91
|
-
{
|
|
92
|
-
ref: C,
|
|
93
|
-
id: s,
|
|
94
|
-
checked: d,
|
|
95
|
-
onCheckedChange: w,
|
|
96
|
-
disabled: a,
|
|
97
|
-
"aria-disabled": a || void 0,
|
|
98
|
-
name: N,
|
|
99
|
-
value: r,
|
|
100
|
-
className: D({ size: n, className: g }),
|
|
101
|
-
...v,
|
|
102
|
-
children: /* @__PURE__ */ e(h.Indicator, { children: d === "indeterminate" ? /* @__PURE__ */ e(W, { className: l }) : /* @__PURE__ */ e(V, { className: l }) })
|
|
103
|
-
}
|
|
104
|
-
),
|
|
105
|
-
/* @__PURE__ */ e("label", { htmlFor: s, className: z, children: o })
|
|
106
|
-
] });
|
|
107
|
-
return a && i ? /* @__PURE__ */ e(M, { label: i, children: m }) : m;
|
|
108
|
-
}
|
|
109
|
-
);
|
|
110
|
-
F.displayName = "Checkbox";
|
|
111
|
-
export {
|
|
112
|
-
F as C,
|
|
113
|
-
R as a,
|
|
114
|
-
T as u
|
|
115
|
-
};
|
|
116
|
-
//# sourceMappingURL=checkbox-CfiZ0FZc.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"checkbox-CfiZ0FZc.js","sources":["../../src/components/checkbox/checkbox-group-context.ts","../../src/components/checkbox/checkbox.tsx"],"sourcesContent":["import { createContext, useContext } from 'react';\n\nexport interface CheckboxGroupContextShape {\n name?: string;\n value: Set<string>;\n toggle: (itemValue: string) => void;\n disabled: boolean;\n}\n\nexport const CheckboxGroupContext =\n createContext<CheckboxGroupContextShape | null>(null);\n\nexport function useCheckboxGroup(): CheckboxGroupContextShape | null {\n return useContext(CheckboxGroupContext);\n}\n","import { forwardRef, useId, type ComponentPropsWithoutRef } from 'react';\nimport * as RadixCheckbox from '@radix-ui/react-checkbox';\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport { useCheckboxGroup } from './checkbox-group-context';\nimport { Tooltip } from '../tooltip';\n\nconst drawClasses = [\n '[stroke-dasharray:1] [stroke-dashoffset:1]',\n 'animate-[checkbox-indicator-draw_var(--animation-duration)_ease-out_forwards]',\n].join(' ');\n\nfunction CheckIcon({ className }: { className?: string }) {\n return (\n <svg\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"3\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n aria-hidden=\"true\"\n data-slot=\"checkbox-check-icon\"\n className={className}\n >\n <path pathLength=\"1\" d=\"M5 12l5 5L20 7\" className={drawClasses} />\n </svg>\n );\n}\n\nfunction IndeterminateIcon({ className }: { className?: string }) {\n return (\n <svg\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"3\"\n strokeLinecap=\"round\"\n aria-hidden=\"true\"\n data-slot=\"checkbox-indeterminate-icon\"\n className={className}\n >\n <path pathLength=\"1\" d=\"M5 12h14\" className={drawClasses} />\n </svg>\n );\n}\n\nconst checkboxVariants = cva(\n [\n 'inline-flex items-center justify-center shrink-0',\n 'border border-border rounded-[var(--radius-sm)] bg-background',\n 'transition-colors duration-[var(--animation-duration)] motion-reduce:transition-none',\n 'focus-visible:outline-[length:var(--focus-ring-width)] focus-visible:outline-solid',\n 'focus-visible:outline-ring focus-visible:outline-offset-[length:var(--focus-ring-offset)]',\n 'disabled:cursor-not-allowed disabled:opacity-50',\n 'data-[state=checked]:bg-primary data-[state=checked]:border-primary data-[state=checked]:text-primary-foreground',\n 'data-[state=indeterminate]:bg-primary data-[state=indeterminate]:border-primary data-[state=indeterminate]:text-primary-foreground',\n 'relative before:absolute before:inset-[calc((var(--min-target-size)-100%)/-2)] before:content-[\"\"]',\n ].join(' '),\n {\n variants: {\n size: {\n sm: 'size-3.5',\n md: 'size-4',\n lg: 'size-5',\n },\n },\n defaultVariants: {\n size: 'md',\n },\n },\n);\n\ntype RadixRootProps = ComponentPropsWithoutRef<typeof RadixCheckbox.Root>;\n\nexport interface CheckboxProps\n extends Omit<RadixRootProps, 'checked' | 'onCheckedChange' | 'children'>,\n VariantProps<typeof checkboxVariants> {\n label: string;\n checked?: boolean | 'indeterminate';\n onCheckedChange?: (checked: boolean | 'indeterminate') => void;\n size?: 'sm' | 'md' | 'lg';\n disabledReason?: string;\n value?: string;\n}\n\nexport const Checkbox = forwardRef<HTMLButtonElement, CheckboxProps>(\n (\n {\n label,\n checked,\n onCheckedChange,\n size = 'md',\n disabled,\n disabledReason,\n name,\n value,\n id,\n className,\n ...props\n },\n ref,\n ) => {\n const generatedId = useId();\n const checkboxId = id ?? generatedId;\n const group = useCheckboxGroup();\n\n const inGroup = group !== null && value !== undefined;\n const effectiveChecked = inGroup ? group.value.has(value) : checked;\n const effectiveOnChange = inGroup\n ? () => group.toggle(value)\n : onCheckedChange;\n const effectiveName = group?.name ?? name;\n const effectiveDisabled = group?.disabled || disabled;\n\n const iconSizeClass =\n size === 'sm' ? 'size-3' : size === 'lg' ? 'size-4' : 'size-3.5';\n\n const labelClasses = [\n 'type-label text-foreground select-none',\n effectiveDisabled ? 'cursor-not-allowed opacity-50' : 'cursor-pointer',\n ].join(' ');\n\n const content = (\n <div className=\"inline-flex items-center gap-[var(--spacing-sm)]\">\n <RadixCheckbox.Root\n ref={ref}\n id={checkboxId}\n checked={effectiveChecked}\n onCheckedChange={effectiveOnChange}\n disabled={effectiveDisabled}\n aria-disabled={effectiveDisabled || undefined}\n name={effectiveName}\n value={value}\n className={checkboxVariants({ size, className })}\n {...props}\n >\n <RadixCheckbox.Indicator>\n {effectiveChecked === 'indeterminate' ? (\n <IndeterminateIcon className={iconSizeClass} />\n ) : (\n <CheckIcon className={iconSizeClass} />\n )}\n </RadixCheckbox.Indicator>\n </RadixCheckbox.Root>\n <label htmlFor={checkboxId} className={labelClasses}>\n {label}\n </label>\n </div>\n );\n\n if (effectiveDisabled && disabledReason) {\n return <Tooltip label={disabledReason}>{content}</Tooltip>;\n }\n\n return content;\n },\n);\n\nCheckbox.displayName = 'Checkbox';\n"],"names":["CheckboxGroupContext","createContext","useCheckboxGroup","useContext","drawClasses","CheckIcon","className","jsx","IndeterminateIcon","checkboxVariants","cva","Checkbox","forwardRef","label","checked","onCheckedChange","size","disabled","disabledReason","name","value","id","props","ref","generatedId","useId","checkboxId","group","inGroup","effectiveChecked","effectiveOnChange","effectiveName","effectiveDisabled","iconSizeClass","labelClasses","content","jsxs","RadixCheckbox","Tooltip"],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"checkbox-group-D1aqVI0-.js","sources":["../../src/components/checkbox-group/checkbox-group.tsx"],"sourcesContent":["import {\n Children,\n forwardRef,\n isValidElement,\n useId,\n useMemo,\n useState,\n type ReactNode,\n} from 'react';\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport { useTranslation } from 'react-i18next';\nimport { AlertCircle } from 'lucide-react';\nimport { Checkbox } from '../checkbox/checkbox';\nimport {\n CheckboxGroupContext,\n type CheckboxGroupContextShape,\n} from '../checkbox/checkbox-group-context';\n\nconst checkboxGroupVariants = cva('', {\n variants: {\n orientation: {\n vertical: 'flex flex-col gap-[var(--spacing-sm)]',\n horizontal:\n 'flex flex-wrap gap-x-[var(--spacing-lg)] gap-y-[var(--spacing-sm)]',\n },\n },\n defaultVariants: { orientation: 'vertical' },\n});\n\nexport interface CheckboxGroupOption {\n value: string;\n label: string;\n disabled?: boolean;\n}\n\nexport interface CheckboxGroupProps\n extends VariantProps<typeof checkboxGroupVariants> {\n label: string;\n value?: string[];\n onChange?: (value: string[]) => void;\n name?: string;\n orientation?: 'vertical' | 'horizontal';\n disabled?: boolean;\n min?: number;\n max?: number;\n onConstraintViolation?: (type: 'min' | 'max') => void;\n withSelectAll?: boolean;\n options?: CheckboxGroupOption[];\n error?: string;\n helperText?: string;\n className?: string;\n children?: ReactNode;\n}\n\nfunction collectChildValues(children: ReactNode): string[] {\n const values: string[] = [];\n Children.forEach(children, (child) => {\n if (!isValidElement(child)) return;\n const props = child.props as { value?: unknown };\n if (typeof props.value === 'string') values.push(props.value);\n });\n return values;\n}\n\nexport const CheckboxGroup = forwardRef<\n HTMLFieldSetElement,\n CheckboxGroupProps\n>(\n (\n {\n label,\n value: controlledValue,\n onChange,\n name,\n orientation = 'vertical',\n disabled = false,\n min,\n max,\n onConstraintViolation,\n withSelectAll = false,\n options,\n error,\n helperText,\n className,\n children,\n },\n ref,\n ) => {\n const { t } = useTranslation();\n const baseId = useId();\n const helperId = `${baseId}-helper`;\n const errorId = `${baseId}-error`;\n const counterId = `${baseId}-counter`;\n\n const [internalValue, setInternalValue] = useState<string[]>([]);\n const isControlled = controlledValue !== undefined;\n const currentValue = isControlled ? controlledValue : internalValue;\n\n const valueSet = useMemo(() => new Set(currentValue), [currentValue]);\n\n const [violationMsg, setViolationMsg] = useState<string>('');\n\n const allValues = useMemo<string[]>(\n () =>\n options ? options.map((o) => o.value) : collectChildValues(children),\n [options, children],\n );\n\n const commit = (next: string[]): void => {\n if (!isControlled) setInternalValue(next);\n onChange?.(next);\n };\n\n const toggle = (itemValue: string): void => {\n if (valueSet.has(itemValue)) {\n if (typeof min === 'number' && currentValue.length <= min) {\n setViolationMsg(t('ui.inputs.checkboxGroup.minReached', { min }));\n onConstraintViolation?.('min');\n return;\n }\n setViolationMsg('');\n commit(currentValue.filter((v) => v !== itemValue));\n return;\n }\n if (typeof max === 'number' && currentValue.length >= max) {\n setViolationMsg(t('ui.inputs.checkboxGroup.maxReached', { max }));\n onConstraintViolation?.('max');\n return;\n }\n setViolationMsg('');\n commit([...currentValue, itemValue]);\n };\n\n const ctxValue: CheckboxGroupContextShape = {\n name,\n value: valueSet,\n toggle,\n disabled,\n };\n\n const total = allValues.length;\n const count = currentValue.length;\n\n const parentChecked: boolean | 'indeterminate' =\n total === 0 || count === 0\n ? false\n : count >= total\n ? true\n : 'indeterminate';\n\n const handleSelectAll = (): void => {\n if (parentChecked === true) {\n if (typeof min === 'number' && min > 0) {\n setViolationMsg(t('ui.inputs.checkboxGroup.minReached', { min }));\n onConstraintViolation?.('min');\n return;\n }\n commit([]);\n setViolationMsg('');\n return;\n }\n const toCheck =\n typeof max === 'number' ? allValues.slice(0, max) : allValues;\n commit(toCheck);\n setViolationMsg('');\n };\n\n const describedBy =\n [\n helperText ? helperId : null,\n error ? errorId : null,\n total > 0 ? counterId : null,\n ]\n .filter(Boolean)\n .join(' ') || undefined;\n\n const resolvedChildren =\n children ??\n (options\n ? options.map((opt) => (\n <Checkbox\n key={opt.value}\n value={opt.value}\n label={opt.label}\n disabled={opt.disabled}\n />\n ))\n : null);\n\n const fieldsetClasses = [\n 'flex flex-col gap-[var(--spacing-sm)] min-w-0 border-0 p-0 m-0',\n className,\n ]\n .filter(Boolean)\n .join(' ');\n\n return (\n <fieldset\n ref={ref}\n className={fieldsetClasses}\n aria-describedby={describedBy}\n aria-invalid={Boolean(error) || undefined}\n >\n <legend className=\"type-label text-foreground p-0 mb-[var(--spacing-sm)]\">\n {label}\n </legend>\n {withSelectAll ? (\n <Checkbox\n label={t('ui.inputs.checkboxGroup.selectAll')}\n checked={parentChecked}\n onCheckedChange={handleSelectAll}\n disabled={disabled}\n />\n ) : null}\n <CheckboxGroupContext.Provider value={ctxValue}>\n <div className={checkboxGroupVariants({ orientation })}>\n {resolvedChildren}\n </div>\n </CheckboxGroupContext.Provider>\n {helperText ? (\n <p id={helperId} className=\"type-body-sm text-muted-foreground\">\n {helperText}\n </p>\n ) : null}\n {error ? (\n <p\n id={errorId}\n role=\"alert\"\n className=\"inline-flex items-center gap-[var(--spacing-xs)] type-body-sm text-destructive\"\n >\n <AlertCircle aria-hidden=\"true\" className=\"size-4 shrink-0\" />\n <span>{error}</span>\n </p>\n ) : null}\n <span\n id={counterId}\n role=\"status\"\n aria-live=\"polite\"\n className=\"sr-only\"\n >\n {total > 0\n ? t('ui.inputs.checkboxGroup.counter', { count, total })\n : ''}\n </span>\n <span role=\"status\" aria-live=\"polite\" className=\"sr-only\">\n {violationMsg}\n </span>\n </fieldset>\n );\n },\n);\n\nCheckboxGroup.displayName = 'CheckboxGroup';\n"],"names":["checkboxGroupVariants","cva","collectChildValues","children","values","Children","child","isValidElement","props","CheckboxGroup","forwardRef","label","controlledValue","onChange","name","orientation","disabled","min","max","onConstraintViolation","withSelectAll","options","error","helperText","className","ref","t","useTranslation","baseId","useId","helperId","errorId","counterId","internalValue","setInternalValue","useState","isControlled","currentValue","valueSet","useMemo","violationMsg","setViolationMsg","allValues","o","commit","next","ctxValue","itemValue","v","total","count","parentChecked","handleSelectAll","toCheck","describedBy","resolvedChildren","opt","jsx","Checkbox","fieldsetClasses","jsxs","CheckboxGroupContext","AlertCircle"],"mappings":";;;;;;AAkBA,MAAMA,IAAwBC,EAAI,IAAI;AAAA,EACpC,UAAU;AAAA,IACR,aAAa;AAAA,MACX,UAAU;AAAA,MACV,YACE;AAAA,IAAA;AAAA,EACJ;AAAA,EAEF,iBAAiB,EAAE,aAAa,WAAA;AAClC,CAAC;AA2BD,SAASC,GAAmBC,GAA+B;AACzD,QAAMC,IAAmB,CAAA;AACzB,SAAAC,EAAS,QAAQF,GAAU,CAACG,MAAU;AACpC,QAAI,CAACC,EAAeD,CAAK,EAAG;AAC5B,UAAME,IAAQF,EAAM;AACpB,IAAI,OAAOE,EAAM,SAAU,YAAUJ,EAAO,KAAKI,EAAM,KAAK;AAAA,EAC9D,CAAC,GACMJ;AACT;AAEO,MAAMK,KAAgBC;AAAA,EAI3B,CACE;AAAA,IACE,OAAAC;AAAA,IACA,OAAOC;AAAA,IACP,UAAAC;AAAA,IACA,MAAAC;AAAA,IACA,aAAAC,IAAc;AAAA,IACd,UAAAC,IAAW;AAAA,IACX,KAAAC;AAAA,IACA,KAAAC;AAAA,IACA,uBAAAC;AAAA,IACA,eAAAC,IAAgB;AAAA,IAChB,SAAAC;AAAA,IACA,OAAAC;AAAA,IACA,YAAAC;AAAA,IACA,WAAAC;AAAA,IACA,UAAArB;AAAA,EAAA,GAEFsB,MACG;AACH,UAAM,EAAE,GAAAC,EAAA,IAAMC,EAAA,GACRC,IAASC,EAAA,GACTC,IAAW,GAAGF,CAAM,WACpBG,IAAU,GAAGH,CAAM,UACnBI,IAAY,GAAGJ,CAAM,YAErB,CAACK,GAAeC,CAAgB,IAAIC,EAAmB,CAAA,CAAE,GACzDC,IAAexB,MAAoB,QACnCyB,IAAeD,IAAexB,IAAkBqB,GAEhDK,IAAWC,EAAQ,MAAM,IAAI,IAAIF,CAAY,GAAG,CAACA,CAAY,CAAC,GAE9D,CAACG,GAAcC,CAAe,IAAIN,EAAiB,EAAE,GAErDO,IAAYH;AAAA,MAChB,MACElB,IAAUA,EAAQ,IAAI,CAACsB,MAAMA,EAAE,KAAK,IAAIzC,GAAmBC,CAAQ;AAAA,MACrE,CAACkB,GAASlB,CAAQ;AAAA,IAAA,GAGdyC,IAAS,CAACC,MAAyB;AACvC,MAAKT,KAAcF,EAAiBW,CAAI,GACxChC,KAAA,QAAAA,EAAWgC;AAAA,IACb,GAsBMC,IAAsC;AAAA,MAC1C,MAAAhC;AAAA,MACA,OAAOwB;AAAA,MACP,QAvBa,CAACS,MAA4B;AAC1C,YAAIT,EAAS,IAAIS,CAAS,GAAG;AAC3B,cAAI,OAAO9B,KAAQ,YAAYoB,EAAa,UAAUpB,GAAK;AACzD,YAAAwB,EAAgBf,EAAE,sCAAsC,EAAE,KAAAT,EAAA,CAAK,CAAC,GAChEE,KAAA,QAAAA,EAAwB;AACxB;AAAA,UACF;AACA,UAAAsB,EAAgB,EAAE,GAClBG,EAAOP,EAAa,OAAO,CAACW,MAAMA,MAAMD,CAAS,CAAC;AAClD;AAAA,QACF;AACA,YAAI,OAAO7B,KAAQ,YAAYmB,EAAa,UAAUnB,GAAK;AACzD,UAAAuB,EAAgBf,EAAE,sCAAsC,EAAE,KAAAR,EAAA,CAAK,CAAC,GAChEC,KAAA,QAAAA,EAAwB;AACxB;AAAA,QACF;AACA,QAAAsB,EAAgB,EAAE,GAClBG,EAAO,CAAC,GAAGP,GAAcU,CAAS,CAAC;AAAA,MACrC;AAAA,MAME,UAAA/B;AAAA,IAAA,GAGIiC,IAAQP,EAAU,QAClBQ,IAAQb,EAAa,QAErBc,IACJF,MAAU,KAAKC,MAAU,IACrB,KACAA,KAASD,IACP,KACA,iBAEFG,IAAkB,MAAY;AAClC,UAAID,MAAkB,IAAM;AAC1B,YAAI,OAAOlC,KAAQ,YAAYA,IAAM,GAAG;AACtC,UAAAwB,EAAgBf,EAAE,sCAAsC,EAAE,KAAAT,EAAA,CAAK,CAAC,GAChEE,KAAA,QAAAA,EAAwB;AACxB;AAAA,QACF;AACA,QAAAyB,EAAO,CAAA,CAAE,GACTH,EAAgB,EAAE;AAClB;AAAA,MACF;AACA,YAAMY,IACJ,OAAOnC,KAAQ,WAAWwB,EAAU,MAAM,GAAGxB,CAAG,IAAIwB;AACtD,MAAAE,EAAOS,CAAO,GACdZ,EAAgB,EAAE;AAAA,IACpB,GAEMa,IACJ;AAAA,MACE/B,IAAaO,IAAW;AAAA,MACxBR,IAAQS,IAAU;AAAA,MAClBkB,IAAQ,IAAIjB,IAAY;AAAA,IAAA,EAEvB,OAAO,OAAO,EACd,KAAK,GAAG,KAAK,QAEZuB,IACJpD,MACCkB,IACGA,EAAQ,IAAI,CAACmC,MACX,gBAAAC;AAAA,MAACC;AAAA,MAAA;AAAA,QAEC,OAAOF,EAAI;AAAA,QACX,OAAOA,EAAI;AAAA,QACX,UAAUA,EAAI;AAAA,MAAA;AAAA,MAHTA,EAAI;AAAA,IAAA,CAKZ,IACD,OAEAG,IAAkB;AAAA,MACtB;AAAA,MACAnC;AAAA,IAAA,EAEC,OAAO,OAAO,EACd,KAAK,GAAG;AAEX,WACE,gBAAAoC;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,KAAAnC;AAAA,QACA,WAAWkC;AAAA,QACX,oBAAkBL;AAAA,QAClB,gBAAc,EAAQhC,KAAU;AAAA,QAEhC,UAAA;AAAA,UAAA,gBAAAmC,EAAC,UAAA,EAAO,WAAU,yDACf,UAAA9C,GACH;AAAA,UACCS,IACC,gBAAAqC;AAAA,YAACC;AAAA,YAAA;AAAA,cACC,OAAOhC,EAAE,mCAAmC;AAAA,cAC5C,SAASyB;AAAA,cACT,iBAAiBC;AAAA,cACjB,UAAApC;AAAA,YAAA;AAAA,UAAA,IAEA;AAAA,UACJ,gBAAAyC,EAACI,EAAqB,UAArB,EAA8B,OAAOf,GACpC,UAAA,gBAAAW,EAAC,OAAA,EAAI,WAAWzD,EAAsB,EAAE,aAAAe,EAAA,CAAa,GAClD,aACH,GACF;AAAA,UACCQ,sBACE,KAAA,EAAE,IAAIO,GAAU,WAAU,sCACxB,aACH,IACE;AAAA,UACHR,IACC,gBAAAsC;AAAA,YAAC;AAAA,YAAA;AAAA,cACC,IAAI7B;AAAA,cACJ,MAAK;AAAA,cACL,WAAU;AAAA,cAEV,UAAA;AAAA,gBAAA,gBAAA0B,EAACK,GAAA,EAAY,eAAY,QAAO,WAAU,mBAAkB;AAAA,gBAC5D,gBAAAL,EAAC,UAAM,UAAAnC,EAAA,CAAM;AAAA,cAAA;AAAA,YAAA;AAAA,UAAA,IAEb;AAAA,UACJ,gBAAAmC;AAAA,YAAC;AAAA,YAAA;AAAA,cACC,IAAIzB;AAAA,cACJ,MAAK;AAAA,cACL,aAAU;AAAA,cACV,WAAU;AAAA,cAET,UAAAiB,IAAQ,IACLvB,EAAE,mCAAmC,EAAE,OAAAwB,GAAO,OAAAD,EAAA,CAAO,IACrD;AAAA,YAAA;AAAA,UAAA;AAAA,UAEN,gBAAAQ,EAAC,UAAK,MAAK,UAAS,aAAU,UAAS,WAAU,WAC9C,UAAAjB,EAAA,CACH;AAAA,QAAA;AAAA,MAAA;AAAA,IAAA;AAAA,EAGN;AACF;AAEA/B,GAAc,cAAc;"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"collapsible-jBFm7Ah8.js","sources":["../../src/components/collapsible/collapsible.tsx"],"sourcesContent":["import { forwardRef, useEffect, type ComponentPropsWithoutRef } from 'react';\nimport * as CollapsiblePrimitive from '@radix-ui/react-collapsible';\nimport { cva, cx, type VariantProps } from 'class-variance-authority';\n\nconst collapsibleVariants = cva('', {\n variants: {\n variant: {\n default: '',\n card: 'bg-[var(--card)] border border-border rounded-[var(--radius-lg)] overflow-hidden',\n minimal: 'forced-colors:[border-block-end:1px_solid]',\n },\n },\n defaultVariants: {\n variant: 'default',\n },\n});\n\nconst contentCls = [\n 'overflow-hidden',\n 'transition-[block-size]',\n 'duration-[var(--animation-duration)]',\n 'ease-out',\n 'motion-reduce:transition-none',\n 'data-[state=open]:[block-size:var(--radix-collapsible-content-height)]',\n 'data-[state=closed]:[block-size:0]',\n].join(' ');\n\ntype RootProps = ComponentPropsWithoutRef<typeof CollapsiblePrimitive.Root>;\ntype TriggerProps = ComponentPropsWithoutRef<typeof CollapsiblePrimitive.Trigger>;\ntype PrimitiveContentProps = ComponentPropsWithoutRef<typeof CollapsiblePrimitive.Content>;\n\nexport interface CollapsibleProps\n extends Omit<RootProps, 'asChild'>,\n VariantProps<typeof collapsibleVariants> {}\n\nexport type CollapsibleTriggerProps = TriggerProps;\n\nexport type CollapsibleContentProps = PrimitiveContentProps;\n\nexport const Collapsible = forwardRef<HTMLDivElement, CollapsibleProps>(\n ({ variant, className, children, ...props }, ref) => (\n <CollapsiblePrimitive.Root\n ref={ref}\n className={collapsibleVariants({ variant, className })}\n {...props}\n >\n {children}\n </CollapsiblePrimitive.Root>\n ),\n);\nCollapsible.displayName = 'Collapsible';\n\nexport const CollapsibleTrigger = forwardRef<HTMLButtonElement, CollapsibleTriggerProps>(\n ({ asChild = false, children, ...props }, ref) => (\n <CollapsiblePrimitive.Trigger ref={ref} asChild={asChild} {...props}>\n {children}\n </CollapsiblePrimitive.Trigger>\n ),\n);\nCollapsibleTrigger.displayName = 'CollapsibleTrigger';\n\nexport const CollapsibleContent = forwardRef<HTMLDivElement, CollapsibleContentProps>(\n (\n {\n className,\n children,\n 'aria-labelledby': ariaLabelledBy,\n 'aria-label': ariaLabel,\n ...props\n },\n ref,\n ) => {\n useEffect(() => {\n if (import.meta.env.DEV && !ariaLabelledBy && !ariaLabel) {\n console.warn(\n 'CollapsibleContent: Provide `aria-labelledby` pointing at the trigger id, or `aria-label`, so screen readers can identify this region.',\n );\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n return (\n <CollapsiblePrimitive.Content\n ref={ref}\n aria-labelledby={ariaLabelledBy}\n aria-label={ariaLabel}\n className={cx(contentCls, className)}\n {...props}\n >\n {children}\n </CollapsiblePrimitive.Content>\n );\n },\n);\nCollapsibleContent.displayName = 'CollapsibleContent';\n"],"names":["collapsibleVariants","cva","contentCls","Collapsible","forwardRef","variant","className","children","props","ref","jsx","CollapsiblePrimitive","CollapsibleTrigger","asChild","CollapsibleContent","ariaLabelledBy","ariaLabel","useEffect","cx"],"mappings":";;;;AAIA,MAAMA,IAAsBC,EAAI,IAAI;AAAA,EAClC,UAAU;AAAA,IACR,SAAS;AAAA,MACP,SAAS;AAAA,MACT,MAAM;AAAA,MACN,SAAS;AAAA,IAAA;AAAA,EACX;AAAA,EAEF,iBAAiB;AAAA,IACf,SAAS;AAAA,EAAA;AAEb,CAAC,GAEKC,IAAa;AAAA,EACjB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,EAAE,KAAK,GAAG,GAcGC,IAAcC;AAAA,EACzB,CAAC,EAAE,SAAAC,GAAS,WAAAC,GAAW,UAAAC,GAAU,GAAGC,EAAA,GAASC,MAC3C,gBAAAC;AAAA,IAACC,EAAqB;AAAA,IAArB;AAAA,MACC,KAAAF;AAAA,MACA,WAAWT,EAAoB,EAAE,SAAAK,GAAS,WAAAC,GAAW;AAAA,MACpD,GAAGE;AAAA,MAEH,UAAAD;AAAA,IAAA;AAAA,EAAA;AAGP;AACAJ,EAAY,cAAc;AAEnB,MAAMS,IAAqBR;AAAA,EAChC,CAAC,EAAE,SAAAS,IAAU,IAAO,UAAAN,GAAU,GAAGC,KAASC,MACxC,gBAAAC,EAACC,EAAqB,SAArB,EAA6B,KAAAF,GAAU,SAAAI,GAAmB,GAAGL,GAC3D,UAAAD,GACH;AAEJ;AACAK,EAAmB,cAAc;AAE1B,MAAME,IAAqBV;AAAA,EAChC,CACE;AAAA,IACE,WAAAE;AAAA,IACA,UAAAC;AAAA,IACA,mBAAmBQ;AAAA,IACnB,cAAcC;AAAA,IACd,GAAGR;AAAA,EAAA,GAELC,OAEAQ,EAAU,MAAM;AAAA,EAOhB,GAAG,CAAA,CAAE,GAGH,gBAAAP;AAAA,IAACC,EAAqB;AAAA,IAArB;AAAA,MACC,KAAAF;AAAA,MACA,mBAAiBM;AAAA,MACjB,cAAYC;AAAA,MACZ,WAAWE,EAAGhB,GAAYI,CAAS;AAAA,MAClC,GAAGE;AAAA,MAEH,UAAAD;AAAA,IAAA;AAAA,EAAA;AAIT;AACAO,EAAmB,cAAc;"}
|