@alfadocs/ui-kit 0.1.2 → 0.1.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/_chunks/{accordion-BJD1aM67.js → accordion-B6fyINUk.js} +10 -9
- package/dist/_chunks/accordion-B6fyINUk.js.map +1 -0
- package/dist/_chunks/{agenda-card-DXOgg8IX.js → agenda-card-C_hQGErS.js} +12 -11
- package/dist/_chunks/{agenda-card-DXOgg8IX.js.map → agenda-card-C_hQGErS.js.map} +1 -1
- package/dist/_chunks/{agenda-tray-DEO8XL8V.js → agenda-tray-CBaVMJLO.js} +6 -5
- package/dist/_chunks/{agenda-tray-DEO8XL8V.js.map → agenda-tray-CBaVMJLO.js.map} +1 -1
- package/dist/_chunks/{ai-prompt-input-8IShJ-GX.js → ai-prompt-input-K94oVLG2.js} +17 -16
- package/dist/_chunks/ai-prompt-input-K94oVLG2.js.map +1 -0
- package/dist/_chunks/{alert-ETrF7Q8J.js → alert-rOM4EG0P.js} +12 -11
- package/dist/_chunks/{alert-ETrF7Q8J.js.map → alert-rOM4EG0P.js.map} +1 -1
- package/dist/_chunks/{app-frame-uq2Gy0vs.js → app-frame-6d7Lu4ea.js} +2 -1
- package/dist/_chunks/{app-frame-uq2Gy0vs.js.map → app-frame-6d7Lu4ea.js.map} +1 -1
- package/dist/_chunks/{aspect-ratio-BqU4itGW.js → aspect-ratio-CxsdG8vk.js} +9 -8
- package/dist/_chunks/{aspect-ratio-BqU4itGW.js.map → aspect-ratio-CxsdG8vk.js.map} +1 -1
- package/dist/_chunks/{audio-recorder-BvisG0Wt.js → audio-recorder-Cn8z2zC9.js} +6 -5
- package/dist/_chunks/{audio-recorder-BvisG0Wt.js.map → audio-recorder-Cn8z2zC9.js.map} +1 -1
- package/dist/_chunks/{audio-visualiser-B4u4goV5.js → audio-visualiser-CeMPCZkd.js} +2 -1
- package/dist/_chunks/{audio-visualiser-B4u4goV5.js.map → audio-visualiser-CeMPCZkd.js.map} +1 -1
- package/dist/_chunks/{autocomplete.agent-BmrpzsfW.js → autocomplete.agent-DRrp-Rsx.js} +3 -2
- package/dist/_chunks/{autocomplete.agent-BmrpzsfW.js.map → autocomplete.agent-DRrp-Rsx.js.map} +1 -1
- package/dist/_chunks/{avatar-DTQY5qIZ.js → avatar-Biffh-_H.js} +2 -1
- package/dist/_chunks/{avatar-DTQY5qIZ.js.map → avatar-Biffh-_H.js.map} +1 -1
- package/dist/_chunks/{badge-BbbBRweN.js → badge-mrstWxve.js} +14 -13
- package/dist/_chunks/{badge-BbbBRweN.js.map → badge-mrstWxve.js.map} +1 -1
- package/dist/_chunks/{balance-cell-renderer-DjR0rPS6.js → balance-cell-renderer-CiyezQhi.js} +11 -11
- package/dist/_chunks/{balance-cell-renderer-DjR0rPS6.js.map → balance-cell-renderer-CiyezQhi.js.map} +1 -1
- package/dist/_chunks/{breadcrumb-pdUacgm1.js → breadcrumb-CcZovmIq.js} +2 -1
- package/dist/_chunks/breadcrumb-CcZovmIq.js.map +1 -0
- package/dist/_chunks/{button-group-BtTHSyU0.js → button-group-CONver7M.js} +9 -8
- package/dist/_chunks/{button-group-BtTHSyU0.js.map → button-group-CONver7M.js.map} +1 -1
- package/dist/_chunks/{card-DeItIBcV.js → card-BEy58ZKp.js} +2 -1
- package/dist/_chunks/card-BEy58ZKp.js.map +1 -0
- package/dist/_chunks/{chat-container-ChdJTH0J.js → chat-container-BZvQ3_yT.js} +2 -2
- package/dist/_chunks/{chat-container-ChdJTH0J.js.map → chat-container-BZvQ3_yT.js.map} +1 -1
- package/dist/_chunks/{chat-input-C-B4snVJ.js → chat-input-xiBIujMv.js} +3 -3
- package/dist/_chunks/chat-input-xiBIujMv.js.map +1 -0
- package/dist/_chunks/{chat-message-cFNbQYRH.js → chat-message-BtxUyugB.js} +9 -8
- package/dist/_chunks/chat-message-BtxUyugB.js.map +1 -0
- package/dist/_chunks/{checkbox-DMzgtnqw.js → checkbox-Ni6C_KJg.js} +11 -11
- package/dist/_chunks/{checkbox-DMzgtnqw.js.map → checkbox-Ni6C_KJg.js.map} +1 -1
- package/dist/_chunks/{checkbox-group-DBnIBRT_.js → checkbox-group-BFZ4oN5t.js} +8 -7
- package/dist/_chunks/checkbox-group-BFZ4oN5t.js.map +1 -0
- package/dist/_chunks/{collapsible-DPGQnHZh.js → collapsible-fFMqzpdL.js} +8 -7
- package/dist/_chunks/collapsible-fFMqzpdL.js.map +1 -0
- package/dist/_chunks/{color-picker-DkMFcK2m.js → color-picker-Cl3KdjJd.js} +18 -16
- package/dist/_chunks/{color-picker-DkMFcK2m.js.map → color-picker-Cl3KdjJd.js.map} +1 -1
- package/dist/_chunks/{combobox.agent-9w6W1Jct.js → combobox.agent-DjdivI3X.js} +2 -1
- package/dist/_chunks/combobox.agent-DjdivI3X.js.map +1 -0
- package/dist/_chunks/{command-palette.agent-Dg7jhOIc.js → command-palette.agent-BUjzr2ET.js} +2 -1
- package/dist/_chunks/command-palette.agent-BUjzr2ET.js.map +1 -0
- package/dist/_chunks/{date-picker-0WQ98ZC0.js → date-picker-DYXNsWmM.js} +2 -2
- package/dist/_chunks/{date-picker-0WQ98ZC0.js.map → date-picker-DYXNsWmM.js.map} +1 -1
- package/dist/_chunks/{date-range-picker-CtwEwoyr.js → date-range-picker-BcNDJI7m.js} +2 -2
- package/dist/_chunks/date-range-picker-BcNDJI7m.js.map +1 -0
- package/dist/_chunks/{date-time-picker-Df3OJ2_C.js → date-time-picker-CmGiTU__.js} +3 -3
- package/dist/_chunks/{date-time-picker-Df3OJ2_C.js.map → date-time-picker-CmGiTU__.js.map} +1 -1
- package/dist/_chunks/{description-list-Bk3p71qY.js → description-list-C_1NX8P3.js} +3 -2
- package/dist/_chunks/description-list-C_1NX8P3.js.map +1 -0
- package/dist/_chunks/{dialog.agent-CtMkDinJ.js → dialog.agent-C2lP9H0h.js} +2 -2
- package/dist/_chunks/{dialog.agent-CtMkDinJ.js.map → dialog.agent-C2lP9H0h.js.map} +1 -1
- package/dist/_chunks/{dropdown-menu-BnVUeVG3.js → dropdown-menu-2HgU1Emf.js} +4 -3
- package/dist/_chunks/dropdown-menu-2HgU1Emf.js.map +1 -0
- package/dist/_chunks/{empty-state-DPUnQp0A.js → empty-state-BHrItOiE.js} +2 -1
- package/dist/_chunks/{empty-state-DPUnQp0A.js.map → empty-state-BHrItOiE.js.map} +1 -1
- package/dist/_chunks/{file-upload.agent-DVMxMeDA.js → file-upload.agent-LlC0W468.js} +2 -2
- package/dist/_chunks/{file-upload.agent-DVMxMeDA.js.map → file-upload.agent-LlC0W468.js.map} +1 -1
- package/dist/_chunks/{flag-C3BUEwHH.js → flag-DZ6V7-hU.js} +3 -1
- package/dist/_chunks/{flag-C3BUEwHH.js.map → flag-DZ6V7-hU.js.map} +1 -1
- package/dist/_chunks/{floating-action-button-DjRhFQdd.js → floating-action-button-Cnw-f6AG.js} +5 -4
- package/dist/_chunks/{floating-action-button-DjRhFQdd.js.map → floating-action-button-Cnw-f6AG.js.map} +1 -1
- package/dist/_chunks/{form-field-DI5LY5aG.js → form-field-BfsPLTSc.js} +2 -1
- package/dist/_chunks/form-field-BfsPLTSc.js.map +1 -0
- package/dist/_chunks/{freemium-paywall-CCsX3GhK.js → freemium-paywall-Dr9aOtOC.js} +23 -22
- package/dist/_chunks/freemium-paywall-Dr9aOtOC.js.map +1 -0
- package/dist/_chunks/{header-CVQxeLc_.js → header-BpU9U-1X.js} +3 -2
- package/dist/_chunks/{header-CVQxeLc_.js.map → header-BpU9U-1X.js.map} +1 -1
- package/dist/_chunks/{icon-button-SWpSs9S6.js → icon-button-CNjWCD1X.js} +9 -8
- package/dist/_chunks/icon-button-CNjWCD1X.js.map +1 -0
- package/dist/_chunks/{icon-button-group-BnhkUWUg.js → icon-button-group-DeV3FpNY.js} +26 -25
- package/dist/_chunks/{icon-button-group-BnhkUWUg.js.map → icon-button-group-DeV3FpNY.js.map} +1 -1
- package/dist/_chunks/{kbd-DTcIjYA7.js → kbd-8baVw3KU.js} +35 -31
- package/dist/_chunks/kbd-8baVw3KU.js.map +1 -0
- package/dist/_chunks/{key-value-pair-Cm-pSE6k.js → key-value-pair-C9hpjC_B.js} +13 -12
- package/dist/_chunks/{key-value-pair-Cm-pSE6k.js.map → key-value-pair-C9hpjC_B.js.map} +1 -1
- package/dist/_chunks/{leo-sidebar-SqGAp1vx.js → leo-sidebar-CNjZqljo.js} +11 -11
- package/dist/_chunks/{leo-sidebar-SqGAp1vx.js.map → leo-sidebar-CNjZqljo.js.map} +1 -1
- package/dist/_chunks/{list-Cwe8mcmh.js → list-B1ozIjQe.js} +4 -1
- package/dist/_chunks/list-B1ozIjQe.js.map +1 -0
- package/dist/_chunks/live-region-C41SO3cA.js +58 -0
- package/dist/_chunks/{live-region-COggO6x6.js.map → live-region-C41SO3cA.js.map} +1 -1
- package/dist/_chunks/{logo-3wrZGpwg.js → logo-BpFoCL-s.js} +7 -7
- package/dist/_chunks/{logo-3wrZGpwg.js.map → logo-BpFoCL-s.js.map} +1 -1
- package/dist/_chunks/{matrix-rain-gsHqSvW7.js → matrix-rain-BEkvux64.js} +2 -1
- package/dist/_chunks/{matrix-rain-gsHqSvW7.js.map → matrix-rain-BEkvux64.js.map} +1 -1
- package/dist/_chunks/{message-card-B0oGrI3i.js → message-card-CZzNO4ov.js} +5 -4
- package/dist/_chunks/message-card-CZzNO4ov.js.map +1 -0
- package/dist/_chunks/{message-tray-DZ6oZ0cs.js → message-tray-BWbjXW3F.js} +6 -5
- package/dist/_chunks/message-tray-BWbjXW3F.js.map +1 -0
- package/dist/_chunks/{multi-select.agent-BDEVGMmW.js → multi-select.agent-BSGEW10d.js} +19 -18
- package/dist/_chunks/multi-select.agent-BSGEW10d.js.map +1 -0
- package/dist/_chunks/{navigation-menu-NjwxyshT.js → navigation-menu-DxOMvrKM.js} +2 -1
- package/dist/_chunks/navigation-menu-DxOMvrKM.js.map +1 -0
- package/dist/_chunks/{notification-card-C73GqjHH.js → notification-card-DgW-vVg-.js} +4 -3
- package/dist/_chunks/{notification-card-C73GqjHH.js.map → notification-card-DgW-vVg-.js.map} +1 -1
- package/dist/_chunks/{notification-tray-a8a_nut-.js → notification-tray-CKUgl2jc.js} +6 -5
- package/dist/_chunks/{notification-tray-a8a_nut-.js.map → notification-tray-CKUgl2jc.js.map} +1 -1
- package/dist/_chunks/{number-input-DFQtl5K2.js → number-input-BPPhekLu.js} +16 -15
- package/dist/_chunks/{number-input-DFQtl5K2.js.map → number-input-BPPhekLu.js.map} +1 -1
- package/dist/_chunks/{otp-input-C2FdizHh.js → otp-input-De5_Ih7B.js} +2 -1
- package/dist/_chunks/{otp-input-C2FdizHh.js.map → otp-input-De5_Ih7B.js.map} +1 -1
- package/dist/_chunks/{pagination.agent-sxokDphY.js → pagination.agent-CmA0Ocr5.js} +2 -1
- package/dist/_chunks/pagination.agent-CmA0Ocr5.js.map +1 -0
- package/dist/_chunks/{password-input-C6PvKyQV.js → password-input-DAT5HQth.js} +7 -7
- package/dist/_chunks/password-input-DAT5HQth.js.map +1 -0
- package/dist/_chunks/{patient-shell-B4vKnuOf.js → patient-shell-BzHhg6uA.js} +9 -9
- package/dist/_chunks/{patient-shell-B4vKnuOf.js.map → patient-shell-BzHhg6uA.js.map} +1 -1
- package/dist/_chunks/{payment-form-175AzK-1.js → payment-form-YlxrCpZQ.js} +3 -3
- package/dist/_chunks/{payment-form-175AzK-1.js.map → payment-form-YlxrCpZQ.js.map} +1 -1
- package/dist/_chunks/{pdf-viewer.agent-DuGfSoep.js → pdf-viewer.agent-sMned5Xn.js} +3 -3
- package/dist/_chunks/{pdf-viewer.agent-DuGfSoep.js.map → pdf-viewer.agent-sMned5Xn.js.map} +1 -1
- package/dist/_chunks/{phone-input-BavVyXxZ.js → phone-input-BuRe5PyI.js} +3 -2
- package/dist/_chunks/phone-input-BuRe5PyI.js.map +1 -0
- package/dist/_chunks/{popover-BWgOopjI.js → popover-Ds1iOdiv.js} +3 -2
- package/dist/_chunks/popover-Ds1iOdiv.js.map +1 -0
- package/dist/_chunks/{privacy-lock-DWL7m_VT.js → privacy-lock-KEruBpM1.js} +16 -15
- package/dist/_chunks/privacy-lock-KEruBpM1.js.map +1 -0
- package/dist/_chunks/{radio-B_gvGU29.js → radio-XSSNX3Af.js} +8 -7
- package/dist/_chunks/radio-XSSNX3Af.js.map +1 -0
- package/dist/_chunks/{radio-group-Bn8Wt0yc.js → radio-group-DBrUOPcy.js} +19 -18
- package/dist/_chunks/radio-group-DBrUOPcy.js.map +1 -0
- package/dist/_chunks/{scroll-area-Ba99pJ_R.js → scroll-area-HIq0hJyJ.js} +14 -12
- package/dist/_chunks/scroll-area-HIq0hJyJ.js.map +1 -0
- package/dist/_chunks/{search-bar-VoTqJhRp.js → search-bar-9Zbew4yM.js} +4 -3
- package/dist/_chunks/search-bar-9Zbew4yM.js.map +1 -0
- package/dist/_chunks/{search-input-D6rarD0_.js → search-input-CtkWITO2.js} +28 -28
- package/dist/_chunks/{search-input-D6rarD0_.js.map → search-input-CtkWITO2.js.map} +1 -1
- package/dist/_chunks/{select-CQxhOXVE.js → select-DdAOtomN.js} +18 -17
- package/dist/_chunks/select-DdAOtomN.js.map +1 -0
- package/dist/_chunks/{separator-BRQHi8s0.js → separator-B4wXDLNC.js} +9 -8
- package/dist/_chunks/{separator-BRQHi8s0.js.map → separator-B4wXDLNC.js.map} +1 -1
- package/dist/_chunks/{sheet-CKsuHuHB.js → sheet-D7GRhnWw.js} +3 -2
- package/dist/_chunks/sheet-D7GRhnWw.js.map +1 -0
- package/dist/_chunks/{sidebar-CiEpSH9e.js → sidebar-Dc2ffrbf.js} +4 -3
- package/dist/_chunks/sidebar-Dc2ffrbf.js.map +1 -0
- package/dist/_chunks/sign-in-with-alfadocs-button-BotwPDcW.js +45 -0
- package/dist/_chunks/{sign-in-with-alfadocs-button-BDErAgG2.js.map → sign-in-with-alfadocs-button-BotwPDcW.js.map} +1 -1
- package/dist/_chunks/{skeleton-ClO1v5GE.js → skeleton-DAdPFx9d.js} +18 -16
- package/dist/_chunks/{skeleton-ClO1v5GE.js.map → skeleton-DAdPFx9d.js.map} +1 -1
- package/dist/_chunks/{skip-link-CASJkBOe.js → skip-link-DmZ3c6cb.js} +12 -11
- package/dist/_chunks/{skip-link-CASJkBOe.js.map → skip-link-DmZ3c6cb.js.map} +1 -1
- package/dist/_chunks/{slider-BVBlOW_l.js → slider-DjyRt3Mp.js} +2 -1
- package/dist/_chunks/slider-DjyRt3Mp.js.map +1 -0
- package/dist/_chunks/{slot-grid-B4WvLEwT.js → slot-grid-WHc5A8-z.js} +5 -4
- package/dist/_chunks/{slot-grid-B4WvLEwT.js.map → slot-grid-WHc5A8-z.js.map} +1 -1
- package/dist/_chunks/{spinner-CoAOGcDa.js → spinner-GCcv67vh.js} +2 -1
- package/dist/_chunks/spinner-GCcv67vh.js.map +1 -0
- package/dist/_chunks/{stat-D76MNHzK.js → stat-DUB6g90R.js} +3 -1
- package/dist/_chunks/{stat-D76MNHzK.js.map → stat-DUB6g90R.js.map} +1 -1
- package/dist/_chunks/{stepper-accordion-DHQ80A4v.js → stepper-accordion-2_7Pw0tC.js} +2 -1
- package/dist/_chunks/{stepper-accordion-DHQ80A4v.js.map → stepper-accordion-2_7Pw0tC.js.map} +1 -1
- package/dist/_chunks/{stepper-calendar-BZUJpj8i.js → stepper-calendar-CWZcFgt_.js} +7 -6
- package/dist/_chunks/{stepper-calendar-BZUJpj8i.js.map → stepper-calendar-CWZcFgt_.js.map} +1 -1
- package/dist/_chunks/{stepper-progress-DMZ5w5VR.js → stepper-progress-rE7tn7WY.js} +12 -11
- package/dist/_chunks/{stepper-progress-DMZ5w5VR.js.map → stepper-progress-rE7tn7WY.js.map} +1 -1
- package/dist/_chunks/{streaming-text-D0cW8pwq.js → streaming-text-BgjCTVOw.js} +6 -5
- package/dist/_chunks/{streaming-text-D0cW8pwq.js.map → streaming-text-BgjCTVOw.js.map} +1 -1
- package/dist/_chunks/{suggestion-chip-BgNFpPEE.js → suggestion-chip-6AB40rxz.js} +2 -1
- package/dist/_chunks/{suggestion-chip-BgNFpPEE.js.map → suggestion-chip-6AB40rxz.js.map} +1 -1
- package/dist/_chunks/{switch-DtLPKO0p.js → switch-DhSORO9C.js} +2 -1
- package/dist/_chunks/{switch-DtLPKO0p.js.map → switch-DhSORO9C.js.map} +1 -1
- package/dist/_chunks/{tabs.agent-sQAHxebC.js → tabs.agent-BtaNGxRh.js} +3 -2
- package/dist/_chunks/tabs.agent-BtaNGxRh.js.map +1 -0
- package/dist/_chunks/{tag-CfSZZN2f.js → tag--uLKOb9f.js} +17 -14
- package/dist/_chunks/{tag-CfSZZN2f.js.map → tag--uLKOb9f.js.map} +1 -1
- package/dist/_chunks/{task-card-B5xfiFg5.js → task-card-BeSuntXP.js} +11 -10
- package/dist/_chunks/{task-card-B5xfiFg5.js.map → task-card-BeSuntXP.js.map} +1 -1
- package/dist/_chunks/{task-tray-CWvVxWM0.js → task-tray-pRk6u8Ik.js} +10 -9
- package/dist/_chunks/{task-tray-CWvVxWM0.js.map → task-tray-pRk6u8Ik.js.map} +1 -1
- package/dist/_chunks/{text-area-iPDv7Nah.js → text-area-xf9-6iDf.js} +13 -13
- package/dist/_chunks/{text-area-iPDv7Nah.js.map → text-area-xf9-6iDf.js.map} +1 -1
- package/dist/_chunks/{text-input-lh6kRXZS.js → text-input-exh7VD7D.js} +10 -9
- package/dist/_chunks/{text-input-lh6kRXZS.js.map → text-input-exh7VD7D.js.map} +1 -1
- package/dist/_chunks/theme-root-DDb0TJjd.js +18 -0
- package/dist/_chunks/{theme-root-vapFjsnt.js.map → theme-root-DDb0TJjd.js.map} +1 -1
- package/dist/_chunks/{theme-toggle-CEaPghpm.js → theme-toggle-CJgA6G24.js} +42 -39
- package/dist/_chunks/theme-toggle-CJgA6G24.js.map +1 -0
- package/dist/_chunks/{time-picker-Crc87DU3.js → time-picker-D-EueWUG.js} +2 -1
- package/dist/_chunks/{time-picker-Crc87DU3.js.map → time-picker-D-EueWUG.js.map} +1 -1
- package/dist/_chunks/{timeline-Ym2DRmtu.js → timeline-DIueH4TJ.js} +5 -4
- package/dist/_chunks/timeline-DIueH4TJ.js.map +1 -0
- package/dist/_chunks/{timestamp-DmSt92P1.js → timestamp-BV2lC-wV.js} +2 -1
- package/dist/_chunks/{timestamp-DmSt92P1.js.map → timestamp-BV2lC-wV.js.map} +1 -1
- package/dist/_chunks/{toast-DoMNrzwm.js → toast-q0SlabGr.js} +2 -2
- package/dist/_chunks/{toast-DoMNrzwm.js.map → toast-q0SlabGr.js.map} +1 -1
- package/dist/_chunks/{tooltip-Dp3u8jGz.js → tooltip-DHik5yRI.js} +2 -1
- package/dist/_chunks/{tooltip-Dp3u8jGz.js.map → tooltip-DHik5yRI.js.map} +1 -1
- package/dist/_chunks/{transcript-panel-Bg1BTMSr.js → transcript-panel-DFnhbrlQ.js} +39 -38
- package/dist/_chunks/{transcript-panel-Bg1BTMSr.js.map → transcript-panel-DFnhbrlQ.js.map} +1 -1
- package/dist/_chunks/{typing-indicator-BRg22Rqr.js → typing-indicator-CbUBf-Dx.js} +9 -8
- package/dist/_chunks/{typing-indicator-BRg22Rqr.js.map → typing-indicator-CbUBf-Dx.js.map} +1 -1
- package/dist/_chunks/visually-hidden-BlkhaZWe.js +21 -0
- package/dist/_chunks/{visually-hidden-Y3jcdCv-.js.map → visually-hidden-BlkhaZWe.js.map} +1 -1
- package/dist/_chunks/{warning-stack-5KROOw9M.js → warning-stack-DCmO0R07.js} +25 -23
- package/dist/_chunks/warning-stack-DCmO0R07.js.map +1 -0
- package/dist/_chunks/{workflow-map-D4sjYv2d.js → workflow-map-CAM6Uy_J.js} +12 -9
- package/dist/_chunks/workflow-map-CAM6Uy_J.js.map +1 -0
- package/dist/components/accordion/accordion.d.ts.map +1 -1
- package/dist/components/accordion/index.js +1 -1
- package/dist/components/agenda-card/agenda-card.d.ts.map +1 -1
- package/dist/components/agenda-card/index.js +1 -1
- package/dist/components/agenda-tray/agenda-tray.d.ts.map +1 -1
- package/dist/components/agenda-tray/index.js +1 -1
- package/dist/components/ai-prompt-input/ai-prompt-input.d.ts.map +1 -1
- package/dist/components/ai-prompt-input/index.js +1 -1
- package/dist/components/alert/alert.d.ts.map +1 -1
- package/dist/components/alert/index.js +1 -1
- package/dist/components/app-frame/app-frame.d.ts.map +1 -1
- package/dist/components/app-frame/index.js +1 -1
- package/dist/components/aspect-ratio/aspect-ratio.d.ts.map +1 -1
- package/dist/components/aspect-ratio/index.js +1 -1
- package/dist/components/audio-recorder/audio-recorder.d.ts.map +1 -1
- package/dist/components/audio-recorder/index.js +1 -1
- package/dist/components/audio-visualiser/audio-visualiser.d.ts.map +1 -1
- package/dist/components/audio-visualiser/index.js +1 -1
- package/dist/components/autocomplete/autocomplete.d.ts.map +1 -1
- package/dist/components/autocomplete/index.js +1 -1
- package/dist/components/avatar/avatar.d.ts.map +1 -1
- package/dist/components/avatar/index.js +1 -1
- package/dist/components/badge/badge.d.ts.map +1 -1
- package/dist/components/badge/index.js +1 -1
- package/dist/components/breadcrumb/breadcrumb.d.ts.map +1 -1
- package/dist/components/breadcrumb/index.js +1 -1
- package/dist/components/button/icon-button.d.ts.map +1 -1
- package/dist/components/button/index.js +1 -1
- package/dist/components/button-group/button-group.d.ts.map +1 -1
- package/dist/components/button-group/index.js +1 -1
- package/dist/components/card/card.d.ts.map +1 -1
- package/dist/components/card/index.js +1 -1
- package/dist/components/chat-container/index.js +1 -1
- package/dist/components/chat-input/index.js +1 -1
- package/dist/components/chat-message/chat-message.d.ts.map +1 -1
- package/dist/components/chat-message/index.js +1 -1
- package/dist/components/checkbox/index.js +1 -1
- package/dist/components/checkbox-group/checkbox-group.d.ts.map +1 -1
- package/dist/components/checkbox-group/index.js +1 -1
- package/dist/components/collapsible/collapsible.d.ts.map +1 -1
- package/dist/components/collapsible/index.js +1 -1
- package/dist/components/color-picker/color-picker.d.ts.map +1 -1
- package/dist/components/color-picker/index.js +1 -1
- package/dist/components/combobox/combobox.d.ts.map +1 -1
- package/dist/components/combobox/index.js +1 -1
- package/dist/components/command-palette/command-palette.d.ts.map +1 -1
- package/dist/components/command-palette/index.js +1 -1
- package/dist/components/data-table/index.js +1 -1
- package/dist/components/date-picker/index.js +1 -1
- package/dist/components/date-range-picker/index.js +1 -1
- package/dist/components/date-time-picker/index.js +1 -1
- package/dist/components/description-list/description-list.d.ts.map +1 -1
- package/dist/components/description-list/index.js +1 -1
- package/dist/components/dialog/index.js +1 -1
- package/dist/components/dropdown-menu/dropdown-menu.d.ts.map +1 -1
- package/dist/components/dropdown-menu/index.js +1 -1
- package/dist/components/empty-state/empty-state.d.ts.map +1 -1
- package/dist/components/empty-state/index.js +1 -1
- package/dist/components/file-upload/index.js +1 -1
- package/dist/components/flag/flag.d.ts.map +1 -1
- package/dist/components/flag/index.js +1 -1
- package/dist/components/floating-action-button/floating-action-button.d.ts.map +1 -1
- package/dist/components/floating-action-button/index.js +1 -1
- package/dist/components/form-field/form-field.d.ts.map +1 -1
- package/dist/components/form-field/index.js +1 -1
- package/dist/components/freemium-paywall/freemium-paywall.d.ts.map +1 -1
- package/dist/components/freemium-paywall/index.js +1 -1
- package/dist/components/header/header.d.ts.map +1 -1
- package/dist/components/header/index.js +1 -1
- package/dist/components/icon-button/index.js +1 -1
- package/dist/components/icon-button-group/icon-button-group.d.ts.map +1 -1
- package/dist/components/icon-button-group/index.js +1 -1
- package/dist/components/kbd/index.js +1 -1
- package/dist/components/kbd/kbd.d.ts.map +1 -1
- package/dist/components/key-value-pair/index.js +1 -1
- package/dist/components/key-value-pair/key-value-pair.d.ts.map +1 -1
- package/dist/components/list/index.js +1 -1
- package/dist/components/list/list.d.ts.map +1 -1
- package/dist/components/live-region/index.js +1 -1
- package/dist/components/live-region/live-region.d.ts.map +1 -1
- package/dist/components/logo/index.js +1 -1
- package/dist/components/matrix-rain/index.js +1 -1
- package/dist/components/matrix-rain/matrix-rain.d.ts.map +1 -1
- package/dist/components/message-card/index.js +1 -1
- package/dist/components/message-card/message-card.d.ts.map +1 -1
- package/dist/components/message-tray/index.js +1 -1
- package/dist/components/message-tray/message-tray.d.ts.map +1 -1
- package/dist/components/multi-select/index.js +1 -1
- package/dist/components/multi-select/multi-select.d.ts.map +1 -1
- package/dist/components/navigation-menu/index.js +2 -2
- package/dist/components/navigation-menu/navigation-menu.d.ts.map +1 -1
- package/dist/components/notification-card/index.js +1 -1
- package/dist/components/notification-card/notification-card.d.ts.map +1 -1
- package/dist/components/notification-tray/index.js +1 -1
- package/dist/components/notification-tray/notification-tray.d.ts.map +1 -1
- package/dist/components/number-input/index.js +1 -1
- package/dist/components/number-input/number-input.d.ts.map +1 -1
- package/dist/components/otp-input/index.js +1 -1
- package/dist/components/otp-input/otp-input.d.ts.map +1 -1
- package/dist/components/pagination/index.js +1 -1
- package/dist/components/pagination/pagination.d.ts.map +1 -1
- package/dist/components/password-input/index.js +1 -1
- package/dist/components/payment-form/index.js +1 -1
- package/dist/components/pdf-viewer/index.js +1 -1
- package/dist/components/phone-input/index.js +1 -1
- package/dist/components/phone-input/phone-input.d.ts.map +1 -1
- package/dist/components/popover/index.js +1 -1
- package/dist/components/popover/popover.d.ts.map +1 -1
- package/dist/components/privacy-lock/index.js +1 -1
- package/dist/components/privacy-lock/privacy-lock.d.ts.map +1 -1
- package/dist/components/radio/index.js +1 -1
- package/dist/components/radio-group/index.js +2 -2
- package/dist/components/radio-group/radio-group.d.ts.map +1 -1
- package/dist/components/radio-group/radio.d.ts.map +1 -1
- package/dist/components/scroll-area/index.js +1 -1
- package/dist/components/scroll-area/scroll-area.d.ts.map +1 -1
- package/dist/components/search-bar/index.js +1 -1
- package/dist/components/search-input/index.js +1 -1
- package/dist/components/select/index.js +1 -1
- package/dist/components/select/select.d.ts.map +1 -1
- package/dist/components/separator/index.js +1 -1
- package/dist/components/separator/separator.d.ts.map +1 -1
- package/dist/components/sheet/index.js +1 -1
- package/dist/components/sheet/sheet.d.ts.map +1 -1
- package/dist/components/sidebar/index.js +1 -1
- package/dist/components/sidebar/sidebar.d.ts.map +1 -1
- package/dist/components/sign-in-with-alfadocs-button/index.js +1 -1
- package/dist/components/sign-in-with-alfadocs-button/sign-in-with-alfadocs-button.d.ts.map +1 -1
- package/dist/components/skeleton/index.js +1 -1
- package/dist/components/skeleton/skeleton.d.ts.map +1 -1
- package/dist/components/skip-link/index.js +1 -1
- package/dist/components/skip-link/skip-link.d.ts.map +1 -1
- package/dist/components/slider/index.js +1 -1
- package/dist/components/slider/slider.d.ts.map +1 -1
- package/dist/components/slot-grid/index.js +1 -1
- package/dist/components/slot-grid/slot-grid.d.ts.map +1 -1
- package/dist/components/spinner/index.js +1 -1
- package/dist/components/spinner/spinner.d.ts.map +1 -1
- package/dist/components/stat/index.js +1 -1
- package/dist/components/stat/stat.d.ts.map +1 -1
- package/dist/components/stepper-accordion/index.js +1 -1
- package/dist/components/stepper-accordion/stepper-accordion.d.ts.map +1 -1
- package/dist/components/stepper-calendar/index.js +1 -1
- package/dist/components/stepper-calendar/stepper-calendar.d.ts.map +1 -1
- package/dist/components/stepper-progress/index.js +1 -1
- package/dist/components/stepper-progress/stepper-progress.d.ts.map +1 -1
- package/dist/components/streaming-text/index.js +1 -1
- package/dist/components/streaming-text/streaming-text.d.ts.map +1 -1
- package/dist/components/suggestion-chip/index.js +1 -1
- package/dist/components/suggestion-chip/suggestion-chip.d.ts.map +1 -1
- package/dist/components/switch/index.js +1 -1
- package/dist/components/switch/switch.d.ts.map +1 -1
- package/dist/components/tabs/index.js +1 -1
- package/dist/components/tabs/tabs.d.ts.map +1 -1
- package/dist/components/tag/index.js +1 -1
- package/dist/components/tag/tag.d.ts.map +1 -1
- package/dist/components/task-card/index.js +1 -1
- package/dist/components/task-card/task-card.d.ts.map +1 -1
- package/dist/components/task-tray/index.js +1 -1
- package/dist/components/task-tray/task-tray.d.ts.map +1 -1
- package/dist/components/text-area/index.js +1 -1
- package/dist/components/text-input/index.js +1 -1
- package/dist/components/text-input/text-input.d.ts.map +1 -1
- package/dist/components/theme-root/index.js +1 -1
- package/dist/components/theme-toggle/index.js +1 -1
- package/dist/components/theme-toggle/theme-toggle.d.ts.map +1 -1
- package/dist/components/time-picker/index.js +1 -1
- package/dist/components/time-picker/time-picker.d.ts.map +1 -1
- package/dist/components/timeline/index.js +1 -1
- package/dist/components/timeline/timeline.d.ts.map +1 -1
- package/dist/components/timestamp/index.js +1 -1
- package/dist/components/timestamp/timestamp.d.ts.map +1 -1
- package/dist/components/toast/index.js +1 -1
- package/dist/components/tooltip/index.js +1 -1
- package/dist/components/tooltip/tooltip.d.ts.map +1 -1
- package/dist/components/transcript-panel/index.js +1 -1
- package/dist/components/transcript-panel/transcript-panel.d.ts.map +1 -1
- package/dist/components/typing-indicator/index.js +1 -1
- package/dist/components/typing-indicator/typing-indicator.d.ts.map +1 -1
- package/dist/components/visually-hidden/index.js +1 -1
- package/dist/components/warning-stack/index.js +1 -1
- package/dist/components/warning-stack/warning-stack.d.ts.map +1 -1
- package/dist/components/workflow/index.js +1 -1
- package/dist/components/workflow/workflow-card.d.ts.map +1 -1
- package/dist/components/workflow/workflow-editor.d.ts.map +1 -1
- package/dist/components/workflow/workflow-map.d.ts.map +1 -1
- package/dist/index.js +103 -103
- package/dist/patterns/leo-assistant/index.js +1 -1
- package/dist/patterns/patient-shell/index.js +1 -1
- package/package.json +1 -1
- package/dist/_chunks/accordion-BJD1aM67.js.map +0 -1
- package/dist/_chunks/ai-prompt-input-8IShJ-GX.js.map +0 -1
- package/dist/_chunks/breadcrumb-pdUacgm1.js.map +0 -1
- package/dist/_chunks/card-DeItIBcV.js.map +0 -1
- package/dist/_chunks/chat-input-C-B4snVJ.js.map +0 -1
- package/dist/_chunks/chat-message-cFNbQYRH.js.map +0 -1
- package/dist/_chunks/checkbox-group-DBnIBRT_.js.map +0 -1
- package/dist/_chunks/collapsible-DPGQnHZh.js.map +0 -1
- package/dist/_chunks/combobox.agent-9w6W1Jct.js.map +0 -1
- package/dist/_chunks/command-palette.agent-Dg7jhOIc.js.map +0 -1
- package/dist/_chunks/date-range-picker-CtwEwoyr.js.map +0 -1
- package/dist/_chunks/description-list-Bk3p71qY.js.map +0 -1
- package/dist/_chunks/dropdown-menu-BnVUeVG3.js.map +0 -1
- package/dist/_chunks/form-field-DI5LY5aG.js.map +0 -1
- package/dist/_chunks/freemium-paywall-CCsX3GhK.js.map +0 -1
- package/dist/_chunks/icon-button-SWpSs9S6.js.map +0 -1
- package/dist/_chunks/kbd-DTcIjYA7.js.map +0 -1
- package/dist/_chunks/list-Cwe8mcmh.js.map +0 -1
- package/dist/_chunks/live-region-COggO6x6.js +0 -57
- package/dist/_chunks/message-card-B0oGrI3i.js.map +0 -1
- package/dist/_chunks/message-tray-DZ6oZ0cs.js.map +0 -1
- package/dist/_chunks/multi-select.agent-BDEVGMmW.js.map +0 -1
- package/dist/_chunks/navigation-menu-NjwxyshT.js.map +0 -1
- package/dist/_chunks/pagination.agent-sxokDphY.js.map +0 -1
- package/dist/_chunks/password-input-C6PvKyQV.js.map +0 -1
- package/dist/_chunks/phone-input-BavVyXxZ.js.map +0 -1
- package/dist/_chunks/popover-BWgOopjI.js.map +0 -1
- package/dist/_chunks/privacy-lock-DWL7m_VT.js.map +0 -1
- package/dist/_chunks/radio-B_gvGU29.js.map +0 -1
- package/dist/_chunks/radio-group-Bn8Wt0yc.js.map +0 -1
- package/dist/_chunks/scroll-area-Ba99pJ_R.js.map +0 -1
- package/dist/_chunks/search-bar-VoTqJhRp.js.map +0 -1
- package/dist/_chunks/select-CQxhOXVE.js.map +0 -1
- package/dist/_chunks/sheet-CKsuHuHB.js.map +0 -1
- package/dist/_chunks/sidebar-CiEpSH9e.js.map +0 -1
- package/dist/_chunks/sign-in-with-alfadocs-button-BDErAgG2.js +0 -44
- package/dist/_chunks/slider-BVBlOW_l.js.map +0 -1
- package/dist/_chunks/spinner-CoAOGcDa.js.map +0 -1
- package/dist/_chunks/tabs.agent-sQAHxebC.js.map +0 -1
- package/dist/_chunks/theme-root-vapFjsnt.js +0 -18
- package/dist/_chunks/theme-toggle-CEaPghpm.js.map +0 -1
- package/dist/_chunks/timeline-Ym2DRmtu.js.map +0 -1
- package/dist/_chunks/visually-hidden-Y3jcdCv-.js +0 -21
- package/dist/_chunks/warning-stack-5KROOw9M.js.map +0 -1
- package/dist/_chunks/workflow-map-D4sjYv2d.js.map +0 -1
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"chat-input-C-B4snVJ.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 'ds:flex ds:flex-col ds:gap-[var(--spacing-xs)] ds:w-full',\n 'ds:rounded-[var(--radius-md)] ds:border ds:border-border',\n 'ds:bg-background ds:focus-within:border-[color:var(--primary)]',\n 'ds:transition-[border-color] ds:duration-[var(--animation-duration)]',\n 'ds:motion-reduce:transition-none',\n ].join(' '),\n {\n variants: {\n size: {\n sm: 'ds:text-[length:var(--font-size-sm)]',\n md: 'ds:text-[length:var(--font-size-base)]',\n lg: 'ds: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 ds:ps-[var(--spacing-sm)] ds:pt-[var(--spacing-sm)]' : 'ds: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 'ds:w-full ds:resize-none ds:bg-transparent',\n 'ds:ps-[var(--spacing-md)] ds:pe-[var(--spacing-md)] ds:pt-[var(--spacing-sm)] ds:pb-[var(--spacing-xs)]',\n 'ds:placeholder:text-[color:var(--muted-foreground)]',\n 'ds:leading-[var(--line-height-base)]',\n 'ds:disabled:opacity-50 ds: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 'ds:outline-none',\n 'ds:focus-visible:outline-[length:var(--focus-ring-width)] ds:focus-visible:outline-solid',\n 'ds:focus-visible:outline-[color:var(--ring)] ds:focus-visible:outline-offset-[length:var(--focus-ring-offset)]',\n 'ds:rounded-[var(--radius-sm)]',\n 'ds:forced-colors:focus-visible:outline-[CanvasText]',\n ].join(' ')}\n {...rest}\n />\n <div className=\"ds:flex ds:items-center ds:gap-[var(--spacing-xs)] ds:ps-[var(--spacing-xs)] ds:pe-[var(--spacing-xs)] ds:pb-[var(--spacing-xs)]\">\n {onAttach ? (\n <>\n <input\n ref={fileInputRef}\n type=\"file\"\n className=\"ds: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=\"ds:ms-auto ds:inline-flex ds:items-center ds:gap-[var(--spacing-sm)]\">\n {showCounter ? (\n <span\n id={counterId}\n aria-live=\"polite\"\n className={[\n 'ds:inline-flex ds:items-center ds:gap-[var(--spacing-xs)]',\n 'type-meta ds:tabular-nums',\n atLimit\n ? 'ds:text-[color:var(--destructive)]'\n : 'ds: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=\"ds:size-3.5\" />\n ) : null}\n {t('chat.input.remaining', { count: remaining })}\n </span>\n ) : null}\n <span id={hintId} className=\"ds: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-cFNbQYRH.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('ds:flex ds:w-full ds:items-start ds:gap-[var(--spacing-sm)]', {\n variants: {\n role: {\n user: 'ds:flex-row-reverse',\n assistant: 'ds:flex-row',\n system: 'ds:flex-col ds:items-center ds: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 'ds:relative ds:max-w-[min(42rem,calc(100%-var(--spacing-xl)-var(--spacing-sm)))]',\n 'ds:ps-[var(--spacing-md)] ds:pe-[var(--spacing-md)]',\n 'ds:pt-[var(--spacing-sm)] ds:pb-[var(--spacing-sm)]',\n 'type-body',\n 'ds:break-words',\n ].join(' '),\n {\n variants: {\n role: {\n user: 'ds:bg-[color:var(--primary)] ds:text-[color:var(--primary-foreground)] ds:rounded-[var(--radius-md)] ds:rounded-ee-[var(--radius-sm)]',\n assistant:\n 'ds:bg-muted/40 ds:text-foreground ds:rounded-[var(--radius-md)] ds:rounded-es-[var(--radius-sm)]',\n system:\n 'ds:bg-transparent ds:text-[color:var(--muted-foreground)] type-body-sm ds: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=\"ds:rounded-[var(--radius-sm)] ds:bg-muted/30 ds:ps-[var(--spacing-xs)] ds:pe-[var(--spacing-xs)] ds: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=\"ds:underline ds:underline-offset-2 ds: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=\"ds:size-3.5\" />;\n if (status === 'sent')\n return <Check aria-hidden=\"true\" className=\"ds:size-3.5\" />;\n return (\n <AlertCircle\n aria-hidden=\"true\"\n className=\"ds:size-3.5 ds: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 'ds:motion-safe:animate-in ds:motion-safe:fade-in-0 ds:motion-safe:slide-in-from-bottom-2',\n 'ds:duration-[var(--animation-duration)] ds: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 'ds:flex ds:flex-col ds:min-w-0',\n role === 'user' ? 'ds:items-end' : role === 'assistant' ? 'ds:items-start' : 'ds: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 'ds:[overflow-wrap:anywhere]',\n ].join(' ')}\n >\n {body}\n </div>\n\n {(formattedTime || statusText) && role !== 'system' ? (\n <div\n className={[\n 'ds:mt-[var(--spacing-xs)] ds:inline-flex ds:items-center ds:gap-[var(--spacing-xs)]',\n 'type-meta ds: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 'ds:inline-flex ds:items-center ds:gap-[var(--spacing-xs)]',\n 'ds:motion-safe:animate-in ds:motion-safe:fade-in-0',\n 'ds:duration-[var(--animation-duration)] ds:ease-[var(--ease-out)]',\n ].join(' ')}\n >\n {statusIcon}\n <span className=\"ds: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 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"checkbox-group-DBnIBRT_.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: 'ds:flex ds:flex-col ds:gap-[var(--spacing-sm)]',\n horizontal:\n 'ds:flex ds:flex-wrap ds:gap-x-[var(--spacing-lg)] ds: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 ds:text-foreground ds:p-0 ds: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 ds:text-muted-foreground\">\n {helperText}\n </p>\n ) : null}\n {error ? (\n <p\n id={errorId}\n role=\"alert\"\n className=\"ds:inline-flex ds:items-center ds:gap-[var(--spacing-xs)] type-body-sm ds:text-destructive\"\n >\n <AlertCircle aria-hidden=\"true\" className=\"ds:size-4 ds:shrink-0\" />\n <span>{error}</span>\n </p>\n ) : null}\n <span\n id={counterId}\n role=\"status\"\n aria-live=\"polite\"\n className=\"ds: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=\"ds: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":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"collapsible-DPGQnHZh.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: 'ds:bg-[var(--card)] ds:border ds:border-border ds:rounded-[var(--radius-lg)] ds:overflow-hidden',\n minimal: 'ds: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;"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"combobox.agent-9w6W1Jct.js","sources":["../../src/components/combobox/combobox.tsx","../../src/components/combobox/combobox.agent.ts"],"sourcesContent":["import {\n forwardRef,\n useContext,\n useEffect,\n useLayoutEffect,\n useMemo,\n useRef,\n useState,\n type KeyboardEvent,\n type MouseEvent,\n type ReactElement,\n type ReactNode,\n type Ref,\n} from 'react';\nimport * as Popover from '@radix-ui/react-popover';\nimport { Command, defaultFilter, useCommandState } from 'cmdk';\nimport { cva } from 'class-variance-authority';\nimport { useTranslation } from 'react-i18next';\nimport { Check, X } from 'lucide-react';\nimport {\n FormFieldContext,\n useFormField,\n} from '../form-field/form-field-context';\nimport type { OptionShape } from '../_shared/option';\nimport { composeRefs } from '../_shared/compose-refs';\nimport { normalizeDiacritics } from '../_shared/normalize-diacritics';\nimport { groupOptions } from '../_shared/group-options';\nimport {\n INPUT_SURFACE_CHROME,\n INPUT_SURFACE_HEIGHT,\n INPUT_SURFACE_PADDING_X,\n INPUT_SURFACE_TONE,\n} from '../_shared/input-surface';\n\nexport type ComboboxOption<T extends string = string> = OptionShape<T>;\n\nexport interface ComboboxProps<T extends string = string> {\n options: ComboboxOption<T>[];\n value?: T | '';\n defaultValue?: T;\n onValueChange?: (value: T | '') => void;\n placeholder?: string;\n clearable?: boolean;\n disabled?: boolean;\n readOnly?: boolean;\n required?: boolean;\n name?: string;\n id?: string;\n size?: 'sm' | 'md' | 'lg';\n tone?: 'default' | 'error';\n filter?: (value: string, search: string) => number;\n allowCreate?: boolean;\n onCreate?: (value: string) => void;\n open?: boolean;\n onOpenChange?: (open: boolean) => void;\n emptyMessage?: ReactNode;\n 'aria-label'?: string;\n className?: string;\n}\n\nconst comboboxInputVariants = cva(\n [\n 'ds:peer ds:w-full ds:bg-transparent ds:text-foreground ds:placeholder:text-muted-foreground',\n 'ds:outline-none ds:border-0',\n 'ds:disabled:cursor-not-allowed',\n ].join(' '),\n {\n variants: {\n size: {\n sm: 'ds:text-[length:var(--font-size-sm)]',\n md: 'ds:text-[length:var(--font-size-base)]',\n lg: 'ds:text-[length:var(--font-size-lg)]',\n },\n },\n defaultVariants: {\n size: 'md',\n },\n },\n);\n\nconst comboboxWrapperVariants = cva(\n [\n 'ds:group ds:relative ds:inline-flex ds:items-center ds:gap-[var(--spacing-sm)] ds:w-full',\n INPUT_SURFACE_CHROME,\n ].join(' '),\n {\n variants: {\n size: {\n sm: `${INPUT_SURFACE_HEIGHT.sm} ${INPUT_SURFACE_PADDING_X.sm}`,\n md: `${INPUT_SURFACE_HEIGHT.md} ${INPUT_SURFACE_PADDING_X.md}`,\n lg: `${INPUT_SURFACE_HEIGHT.lg} ${INPUT_SURFACE_PADDING_X.lg}`,\n },\n tone: INPUT_SURFACE_TONE,\n },\n defaultVariants: {\n size: 'md',\n tone: 'default',\n },\n },\n);\n\nconst comboboxContentVariants = cva(\n [\n 'ds:z-[var(--z-popover)] ds:overflow-hidden ds:w-[var(--radix-popover-trigger-width)]',\n 'ds:rounded-[var(--radius-md)] ds:border ds:border-border ds:bg-background ds:text-foreground',\n 'ds:shadow-[var(--shadow-lg)]',\n 'ds:animate-in ds:fade-in ds:zoom-in-95',\n 'ds:data-[state=closed]:animate-out ds:data-[state=closed]:fade-out',\n 'ds:data-[state=closed]:zoom-out-95',\n 'ds:data-[side=bottom]:slide-in-from-top-2',\n 'ds:data-[side=top]:slide-in-from-bottom-2',\n 'ds:motion-reduce:animate-none',\n ].join(' '),\n);\n\nconst comboboxItemVariants = cva(\n [\n 'ds:relative ds:flex ds:cursor-pointer ds:items-center ds:gap-[var(--spacing-sm)]',\n 'ds:rounded-[var(--radius-sm)]',\n 'ds:text-foreground ds:outline-none ds:select-none',\n 'ds:data-[highlighted]:bg-muted ds:data-[highlighted]:text-foreground',\n 'ds:data-[highlighted]:border-s-2 ds:data-[highlighted]:border-s-primary',\n 'ds:aria-selected:bg-muted',\n 'ds:aria-disabled:pointer-events-none ds:aria-disabled:opacity-50',\n ].join(' '),\n {\n variants: {\n size: {\n sm: 'ds:min-h-8 ds:ps-3 ds:pe-3 ds:text-[length:var(--font-size-sm)]',\n md: 'ds:min-h-[var(--min-target-size)] ds:ps-3 ds:pe-3 ds:text-[length:var(--font-size-base)]',\n lg: 'ds:min-h-12 ds:ps-4 ds:pe-4 ds:text-[length:var(--font-size-lg)]',\n },\n },\n defaultVariants: {\n size: 'md',\n },\n },\n);\n\nconst comboboxGroupHeadingClasses = [\n 'ps-3 pe-3 py-1.5',\n 'type-eyebrow text-muted-foreground',\n].join(' ');\n\nconst comboboxListClasses =\n 'max-h-[18rem] overflow-y-auto p-[var(--spacing-xs)]';\n\nconst comboboxEmptyClasses =\n 'ps-3 pe-3 py-2 type-body-sm text-muted-foreground';\n\nconst iconSizeBySize = {\n sm: 'size-3.5',\n md: 'size-4',\n lg: 'size-5',\n} as const;\n\ninterface CreateRowProps {\n search: string;\n label: string;\n iconClass: string;\n size: 'sm' | 'md' | 'lg';\n onSelect: (value: string) => void;\n}\n\nfunction ComboboxCreateRow({\n search,\n label,\n iconClass,\n size,\n onSelect,\n}: CreateRowProps): ReactElement | null {\n // Only surface the create row when no existing item matches the query.\n const filteredCount = useCommandState((state) => state.filtered.count);\n if (filteredCount > 0) return null;\n return (\n <Command.Item\n value={`__combobox-create__${search}`}\n keywords={[]}\n forceMount\n onSelect={() => onSelect(search)}\n className={comboboxItemVariants({ size })}\n >\n <span\n aria-hidden=\"true\"\n className={`ds:inline-flex ds:items-center ds:justify-center ${iconClass}`}\n />\n <span className=\"ds:flex-1 ds:truncate\">{label}</span>\n </Command.Item>\n );\n}\n\nconst ComboboxImpl = forwardRef<HTMLInputElement, ComboboxProps>(function Combobox(\n {\n options,\n value,\n defaultValue,\n onValueChange,\n placeholder,\n clearable = false,\n disabled,\n readOnly,\n required,\n name,\n id,\n size = 'md',\n tone = 'default',\n filter: externalFilter,\n allowCreate = false,\n onCreate,\n open: openProp,\n onOpenChange,\n emptyMessage,\n className,\n 'aria-label': ariaLabel,\n },\n ref,\n) {\n const { t } = useTranslation();\n const ctx = useFormField();\n const inFormField = useContext(FormFieldContext) !== null;\n\n const [internalValue, setInternalValue] = useState<string>(\n value ?? defaultValue ?? '',\n );\n const isControlled = value !== undefined;\n const currentValue = isControlled ? value : internalValue;\n\n const selectedOption = useMemo(\n () => options.find((o) => o.value === currentValue),\n [options, currentValue],\n );\n const selectedLabel = selectedOption?.label ?? '';\n\n const [search, setSearch] = useState<string>(selectedLabel);\n const [internalOpen, setInternalOpen] = useState(false);\n const isOpenControlled = openProp !== undefined;\n const open = isOpenControlled ? openProp : internalOpen;\n const composingRef = useRef(false);\n\n const inputRef = useRef<HTMLInputElement>(null);\n const anchorRef = useRef<HTMLDivElement>(null);\n\n useLayoutEffect(() => {\n inputRef.current?.setAttribute('aria-expanded', String(open));\n });\n\n useEffect(() => {\n if (!open) {\n setSearch(selectedLabel);\n }\n }, [selectedLabel, open]);\n\n const inputId = id ?? (inFormField ? ctx.id : undefined);\n const effectiveDisabled = (inFormField ? ctx.disabled : false) || Boolean(disabled);\n const effectiveReadOnly = Boolean(readOnly);\n const effectiveRequired = (inFormField ? ctx.required : false) || Boolean(required);\n const effectiveInvalid = inFormField ? ctx.invalid : false;\n const effectiveTone = effectiveInvalid ? 'error' : tone;\n const describedBy = inFormField && ctx.describedBy ? ctx.describedBy : undefined;\n\n const resolvedPlaceholder =\n placeholder ?? t('ui.inputs.combobox.placeholder', 'Search…');\n\n const filterFn = useMemo(\n () => (candidate: string, searchStr: string, keywords?: string[]) => {\n if (composingRef.current) return 1;\n const normalizedCandidate = normalizeDiacritics(candidate);\n const normalizedSearch = normalizeDiacritics(searchStr);\n const normalizedKeywords = keywords?.map(normalizeDiacritics);\n if (externalFilter) {\n return externalFilter(normalizedCandidate, normalizedSearch);\n }\n return defaultFilter(\n normalizedCandidate,\n normalizedSearch,\n normalizedKeywords,\n );\n },\n [externalFilter],\n );\n\n const emitValue = onValueChange as ((next: string) => void) | undefined;\n\n const commit = (next: string) => {\n if (!isControlled) setInternalValue(next);\n emitValue?.(next);\n };\n\n const setOpen = (next: boolean) => {\n if (!isOpenControlled) setInternalOpen(next);\n onOpenChange?.(next);\n };\n\n const handleSelect = (optValue: string) => {\n const option = options.find((o) => o.value === optValue);\n commit(optValue);\n setSearch(option?.label ?? '');\n setOpen(false);\n };\n\n const handleCreate = (nextValue: string) => {\n onCreate?.(nextValue);\n setOpen(false);\n };\n\n const handleSearchChange = (next: string) => {\n if (effectiveReadOnly) return;\n setSearch(next);\n if (!open && next.length > 0 && !composingRef.current) {\n setOpen(true);\n }\n };\n\n const handleFocus = () => {\n if (!effectiveDisabled && !effectiveReadOnly) setOpen(true);\n };\n\n const handleCompositionStart = () => {\n composingRef.current = true;\n };\n\n const handleCompositionEnd = () => {\n composingRef.current = false;\n if (effectiveReadOnly) return;\n const next = inputRef.current?.value ?? '';\n setSearch(next);\n if (next.length > 0) setOpen(true);\n };\n\n const handleKeyDown = (event: KeyboardEvent<HTMLInputElement>) => {\n if (event.nativeEvent.isComposing) return;\n if (event.key === 'Escape' && open) {\n event.preventDefault();\n setOpen(false);\n setSearch(selectedLabel);\n }\n };\n\n const handleClear = (event: MouseEvent<HTMLButtonElement>) => {\n event.preventDefault();\n event.stopPropagation();\n commit('');\n setSearch('');\n setOpen(true);\n inputRef.current?.focus();\n };\n\n const handleOpenChange = (next: boolean) => {\n if (effectiveReadOnly && next) return;\n setOpen(next);\n if (!next) setSearch(selectedLabel);\n };\n\n const showClear =\n clearable && Boolean(currentValue) && !effectiveDisabled && !effectiveReadOnly;\n\n const groups = groupOptions(options);\n const iconClass = iconSizeBySize[size];\n\n return (\n <Popover.Root open={open} onOpenChange={handleOpenChange}>\n <Command\n filter={filterFn}\n shouldFilter\n loop\n label={ariaLabel}\n className=\"ds:w-full\"\n >\n <Popover.Anchor asChild>\n <div\n ref={anchorRef}\n className={comboboxWrapperVariants({\n size,\n tone: effectiveTone,\n className,\n })}\n >\n <Command.Input\n ref={composeRefs(ref, inputRef)}\n value={search}\n onValueChange={handleSearchChange}\n id={inputId}\n name={name}\n placeholder={resolvedPlaceholder}\n disabled={effectiveDisabled}\n readOnly={effectiveReadOnly}\n required={effectiveRequired}\n aria-label={ariaLabel}\n aria-describedby={describedBy}\n aria-invalid={effectiveInvalid || undefined}\n onFocus={handleFocus}\n onKeyDown={handleKeyDown}\n onCompositionStart={handleCompositionStart}\n onCompositionEnd={handleCompositionEnd}\n className={comboboxInputVariants({ size })}\n />\n {showClear ? (\n <button\n type=\"button\"\n aria-label={t('ui.inputs.combobox.clear', 'Clear selection')}\n onClick={handleClear}\n onPointerDown={(event) => event.stopPropagation()}\n className={[\n 'ds:inline-flex ds:items-center ds:justify-center ds:rounded-[var(--radius-sm)]',\n 'ds:text-muted-foreground ds:hover:text-foreground',\n 'ds:transition-colors ds:duration-[var(--animation-duration)] ds:motion-reduce:transition-none',\n 'ds:focus-visible:outline-[length:var(--focus-ring-width)] ds:focus-visible:outline-solid',\n 'ds:focus-visible:outline-ring ds:focus-visible:outline-offset-[length:var(--focus-ring-offset)]',\n 'ds:size-4',\n ].join(' ')}\n >\n <X aria-hidden=\"true\" className=\"ds:size-3.5\" />\n </button>\n ) : null}\n </div>\n </Popover.Anchor>\n <Popover.Portal>\n <Popover.Content\n onOpenAutoFocus={(event) => event.preventDefault()}\n onCloseAutoFocus={(event) => event.preventDefault()}\n onInteractOutside={(event) => {\n const target = event.target as Node | null;\n if (target && anchorRef.current?.contains(target)) {\n event.preventDefault();\n }\n }}\n sideOffset={4}\n align=\"start\"\n className={comboboxContentVariants()}\n >\n <Command.List className={comboboxListClasses}>\n <Command.Empty className={comboboxEmptyClasses}>\n {emptyMessage ?? t('ui.inputs.combobox.empty', 'No results found')}\n </Command.Empty>\n {groups.map(({ group, items }, groupIndex) => {\n const body = items.map((option) => {\n const isSelected = option.value === currentValue;\n return (\n <Command.Item\n key={option.value}\n value={option.value}\n keywords={[option.label]}\n disabled={option.disabled}\n onSelect={handleSelect}\n className={comboboxItemVariants({ size })}\n >\n <span\n aria-hidden=\"true\"\n className={`ds:inline-flex ds:items-center ds:justify-center ${iconClass}`}\n >\n {isSelected ? <Check className={iconClass} /> : null}\n </span>\n <span className=\"ds:flex-1 ds:truncate\">{option.label}</span>\n {option.description ? (\n <span className=\"type-meta ds:text-muted-foreground\">\n {option.description}\n </span>\n ) : null}\n </Command.Item>\n );\n });\n if (!group) {\n return (\n <Command.Group key={`group-${groupIndex}`}>\n {body}\n </Command.Group>\n );\n }\n return (\n <Command.Group\n key={`group-${group}`}\n heading={\n <span className={comboboxGroupHeadingClasses}>{group}</span>\n }\n >\n {body}\n </Command.Group>\n );\n })}\n {allowCreate && search.length > 0 ? (\n <ComboboxCreateRow\n search={search}\n label={t('ui.inputs.combobox.create', 'Create \"{{value}}\"', {\n value: search,\n })}\n iconClass={iconClass}\n size={size}\n onSelect={handleCreate}\n />\n ) : null}\n </Command.List>\n </Popover.Content>\n </Popover.Portal>\n </Command>\n </Popover.Root>\n );\n});\nComboboxImpl.displayName = 'Combobox';\n\ninterface ComboboxComponent {\n <T extends string = string>(\n props: ComboboxProps<T> & { ref?: Ref<HTMLInputElement> },\n ): ReactElement | null;\n displayName?: string;\n}\n\n// forwardRef erases component-level generics, so we re-widen via a callable\n// interface to preserve the `<T extends string>` signature at the call site.\nexport const Combobox = ComboboxImpl as unknown as ComboboxComponent;\n\nexport {\n comboboxInputVariants,\n comboboxWrapperVariants,\n comboboxContentVariants,\n comboboxItemVariants,\n};\n","import type { AgentAdapter } from '../../agent/types';\n\nexport const comboboxAgent: AgentAdapter<unknown> = {\n id: 'combobox',\n capabilities: ['select_single', 'pick', 'filter', 'open', 'close'],\n state: {},\n actions: {},\n domHooks: {\n root: { attr: 'data-component', value: 'combobox' },\n item: {\n attr: 'data-option-id',\n description: 'Each option emits its value as data-option-id.',\n },\n },\n};\n"],"names":["comboboxInputVariants","cva","comboboxWrapperVariants","INPUT_SURFACE_CHROME","INPUT_SURFACE_HEIGHT","INPUT_SURFACE_PADDING_X","INPUT_SURFACE_TONE","comboboxContentVariants","comboboxItemVariants","comboboxGroupHeadingClasses","comboboxListClasses","comboboxEmptyClasses","iconSizeBySize","ComboboxCreateRow","search","label","iconClass","size","onSelect","useCommandState","state","jsxs","Command","jsx","ComboboxImpl","forwardRef","options","value","defaultValue","onValueChange","placeholder","clearable","disabled","readOnly","required","name","id","tone","externalFilter","allowCreate","onCreate","openProp","onOpenChange","emptyMessage","className","ariaLabel","ref","t","useTranslation","ctx","useFormField","inFormField","useContext","FormFieldContext","internalValue","setInternalValue","useState","isControlled","currentValue","selectedOption","useMemo","o","selectedLabel","setSearch","internalOpen","setInternalOpen","isOpenControlled","open","composingRef","useRef","inputRef","anchorRef","useLayoutEffect","_a","useEffect","inputId","effectiveDisabled","effectiveReadOnly","effectiveRequired","effectiveInvalid","effectiveTone","describedBy","resolvedPlaceholder","filterFn","candidate","searchStr","keywords","normalizedCandidate","normalizeDiacritics","normalizedSearch","normalizedKeywords","defaultFilter","emitValue","commit","next","setOpen","handleSelect","optValue","option","handleCreate","nextValue","handleSearchChange","handleFocus","handleCompositionStart","handleCompositionEnd","handleKeyDown","event","handleClear","handleOpenChange","showClear","groups","groupOptions","Popover","composeRefs","X","target","group","items","groupIndex","body","isSelected","Check","Combobox","comboboxAgent"],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"command-palette.agent-Dg7jhOIc.js","sources":["../../src/components/command-palette/command-palette.tsx","../../src/components/command-palette/command-palette.agent.ts"],"sourcesContent":["import {\n forwardRef,\n useCallback,\n useEffect,\n useMemo,\n useState,\n type ComponentPropsWithoutRef,\n type ElementRef,\n type ReactNode,\n} from 'react';\nimport { Command as CommandPrimitive, defaultFilter } from 'cmdk';\nimport * as RadixDialog from '@radix-ui/react-dialog';\nimport { useTranslation } from 'react-i18next';\nimport { Search } from 'lucide-react';\n\n/* -------------------------------------------------------------------- */\n/* Types */\n/* -------------------------------------------------------------------- */\n\nexport interface Command {\n id: string;\n label: string;\n group: string;\n keywords?: string[];\n shortcut?: string;\n onSelect: () => void;\n /** Optional leading icon. */\n icon?: ReactNode;\n}\n\n/* -------------------------------------------------------------------- */\n/* Diacritic-insensitive normaliser */\n/* -------------------------------------------------------------------- */\n\nfunction normalise(value: string): string {\n return value.normalize('NFD').replace(/\\p{Diacritic}/gu, '').toLowerCase();\n}\n\nexport const diacriticInsensitiveFilter = (\n value: string,\n search: string,\n keywords?: string[],\n) => defaultFilter(normalise(value), normalise(search), keywords?.map(normalise));\n\n/* -------------------------------------------------------------------- */\n/* Recents (localStorage, SSR-safe) */\n/* -------------------------------------------------------------------- */\n\nconst RECENTS_KEY = 'ui.cmdk.recents';\nconst MAX_RECENTS = 5;\n\nfunction readRecents(): string[] {\n if (typeof window === 'undefined') return [];\n try {\n const raw = window.localStorage.getItem(RECENTS_KEY);\n if (!raw) return [];\n const parsed = JSON.parse(raw);\n return Array.isArray(parsed) ? parsed.slice(0, MAX_RECENTS).filter((v) => typeof v === 'string') : [];\n } catch {\n return [];\n }\n}\n\nfunction writeRecents(ids: string[]) {\n if (typeof window === 'undefined') return;\n try {\n window.localStorage.setItem(RECENTS_KEY, JSON.stringify(ids.slice(0, MAX_RECENTS)));\n } catch {\n /* noop */\n }\n}\n\n/* -------------------------------------------------------------------- */\n/* useCommandPalette — Cmd/Ctrl+K hook */\n/* -------------------------------------------------------------------- */\n\nexport function useCommandPalette() {\n const [open, setOpen] = useState(false);\n\n useEffect(() => {\n function handler(event: KeyboardEvent) {\n const target = event.target as HTMLElement | null;\n const tag = target?.tagName.toLowerCase();\n const isEditable =\n tag === 'input' || tag === 'textarea' || target?.isContentEditable;\n if (isEditable && !(open && event.key === 'Escape')) return;\n\n const isK = event.key === 'k' || event.key === 'K';\n const isMeta = event.metaKey || event.ctrlKey;\n if (isK && isMeta) {\n event.preventDefault();\n setOpen((v) => !v);\n }\n }\n document.addEventListener('keydown', handler);\n return () => document.removeEventListener('keydown', handler);\n }, [open]);\n\n return { open, setOpen };\n}\n\n/* -------------------------------------------------------------------- */\n/* Primitives (forwardRef wrappers around cmdk + dialog chrome) */\n/* -------------------------------------------------------------------- */\n\nconst rootClasses = [\n 'flex h-full w-full flex-col overflow-hidden',\n 'rounded-[var(--radius-md)]',\n 'bg-[var(--background)] text-[var(--foreground)]',\n].join(' ');\n\nexport interface CommandPaletteRootProps\n extends ComponentPropsWithoutRef<typeof CommandPrimitive> {}\n\nconst CommandPalette = forwardRef<\n ElementRef<typeof CommandPrimitive>,\n CommandPaletteRootProps\n>(({ className, filter = diacriticInsensitiveFilter, ...rest }, ref) => (\n <CommandPrimitive\n ref={ref}\n filter={filter}\n className={[rootClasses, className].filter(Boolean).join(' ')}\n {...rest}\n />\n));\nCommandPalette.displayName = 'CommandPalette';\n\n/* -------------------------------------------------------------------- */\n/* Input */\n/* -------------------------------------------------------------------- */\n\nconst inputWrapClasses = [\n 'flex items-center',\n 'border-block-end border-[var(--border)]',\n 'ps-[var(--spacing-md)] pe-[var(--spacing-sm)]',\n].join(' ');\n\nconst inputClasses = [\n 'flex w-full bg-transparent',\n 'min-h-[var(--min-target-size)]',\n 'text-[var(--font-size-base)] text-[var(--foreground)]',\n 'placeholder:text-[var(--muted-foreground)]',\n 'outline-none',\n 'disabled:cursor-not-allowed disabled:opacity-50',\n 'border-0',\n].join(' ');\n\nexport interface CommandInputProps\n extends ComponentPropsWithoutRef<typeof CommandPrimitive.Input> {}\n\nconst CommandInput = forwardRef<\n ElementRef<typeof CommandPrimitive.Input>,\n CommandInputProps\n>(({ className, placeholder, ...rest }, ref) => {\n const { t } = useTranslation();\n return (\n <div className={inputWrapClasses}>\n <Search aria-hidden=\"true\" className=\"ds:size-4 ds:me-2 ds:text-[var(--muted-foreground)]\" />\n <CommandPrimitive.Input\n ref={ref}\n placeholder={\n placeholder ??\n t('navigation.cmdk.placeholder', 'Type a command or search\\u2026')\n }\n className={[inputClasses, className].filter(Boolean).join(' ')}\n {...rest}\n />\n </div>\n );\n});\nCommandInput.displayName = 'CommandInput';\n\n/* -------------------------------------------------------------------- */\n/* List / Empty / Group / Item / Separator */\n/* -------------------------------------------------------------------- */\n\nconst CommandList = forwardRef<\n ElementRef<typeof CommandPrimitive.List>,\n ComponentPropsWithoutRef<typeof CommandPrimitive.List>\n>(({ className, ...rest }, ref) => (\n <CommandPrimitive.List\n ref={ref}\n className={[\n 'ds:max-h-[20rem] ds:overflow-y-auto',\n 'ds:ps-[var(--spacing-xs)] ds:pe-[var(--spacing-xs)]',\n 'ds:py-[var(--spacing-xs)]',\n className ?? '',\n ]\n .filter(Boolean)\n .join(' ')}\n {...rest}\n />\n));\nCommandList.displayName = 'CommandList';\n\nconst CommandEmpty = forwardRef<\n ElementRef<typeof CommandPrimitive.Empty>,\n ComponentPropsWithoutRef<typeof CommandPrimitive.Empty>\n>(({ className, children, ...rest }, ref) => {\n const { t } = useTranslation();\n return (\n <CommandPrimitive.Empty\n ref={ref}\n className={[\n 'ds:py-[var(--spacing-lg)] ds:text-center',\n 'type-body-sm ds:text-[var(--muted-foreground)]',\n className ?? '',\n ]\n .filter(Boolean)\n .join(' ')}\n {...rest}\n >\n {children ?? t('navigation.cmdk.empty', 'No results found')}\n </CommandPrimitive.Empty>\n );\n});\nCommandEmpty.displayName = 'CommandEmpty';\n\nconst CommandGroup = forwardRef<\n ElementRef<typeof CommandPrimitive.Group>,\n ComponentPropsWithoutRef<typeof CommandPrimitive.Group>\n>(({ className, heading, ...rest }, ref) => (\n <CommandPrimitive.Group\n ref={ref}\n heading={heading}\n className={[\n 'ds:overflow-hidden',\n 'ds:text-[var(--foreground)]',\n 'ds:[&_[cmdk-group-heading]]:ps-[var(--spacing-sm)]',\n 'ds:[&_[cmdk-group-heading]]:pe-[var(--spacing-sm)]',\n 'ds:[&_[cmdk-group-heading]]:py-[var(--spacing-xs)]',\n 'ds:[&_[cmdk-group-heading]]:type-eyebrow',\n 'ds:[&_[cmdk-group-heading]]:text-[var(--muted-foreground)]',\n className ?? '',\n ]\n .filter(Boolean)\n .join(' ')}\n {...rest}\n />\n));\nCommandGroup.displayName = 'CommandGroup';\n\nconst itemClasses = [\n 'relative flex items-center',\n 'gap-[var(--spacing-sm)]',\n 'min-h-[var(--min-target-size)]',\n 'rounded-[var(--radius-sm)]',\n 'ps-[var(--spacing-sm)] pe-[var(--spacing-sm)]',\n 'text-[var(--font-size-sm)] text-[var(--foreground)]',\n 'cursor-pointer select-none outline-none',\n 'data-[selected=true]:bg-[var(--primary)] data-[selected=true]:text-[var(--primary-foreground)]',\n 'data-[selected=true]:font-[var(--font-weight-semibold)]',\n 'data-[disabled=true]:pointer-events-none data-[disabled=true]:opacity-50',\n 'transition-colors duration-[var(--animation-duration)] motion-reduce:transition-none',\n].join(' ');\n\nexport interface CommandItemProps\n extends ComponentPropsWithoutRef<typeof CommandPrimitive.Item> {}\n\nconst CommandItem = forwardRef<\n ElementRef<typeof CommandPrimitive.Item>,\n CommandItemProps\n>(({ className, ...rest }, ref) => (\n <CommandPrimitive.Item\n ref={ref}\n className={[itemClasses, className].filter(Boolean).join(' ')}\n {...rest}\n />\n));\nCommandItem.displayName = 'CommandItem';\n\nconst CommandSeparator = forwardRef<\n ElementRef<typeof CommandPrimitive.Separator>,\n ComponentPropsWithoutRef<typeof CommandPrimitive.Separator>\n>(({ className, ...rest }, ref) => (\n <CommandPrimitive.Separator\n ref={ref}\n className={[\n 'ds:-ms-[var(--spacing-xs)] ds:-me-[var(--spacing-xs)]',\n 'ds:my-[var(--spacing-xs)]',\n 'ds:h-px ds:bg-[var(--border)]',\n className ?? '',\n ]\n .filter(Boolean)\n .join(' ')}\n {...rest}\n />\n));\nCommandSeparator.displayName = 'CommandSeparator';\n\nexport interface CommandShortcutProps extends ComponentPropsWithoutRef<'kbd'> {}\n\nconst CommandShortcut = forwardRef<HTMLElement, CommandShortcutProps>(\n ({ className, children, ...rest }, ref) => (\n <kbd\n ref={ref}\n className={[\n 'ds:ms-auto',\n 'ds:inline-flex ds:items-center',\n 'ds:ps-[var(--spacing-xs)] ds:pe-[var(--spacing-xs)]',\n 'ds:h-5 ds:rounded-[var(--radius-sm)]',\n 'ds:bg-[var(--muted)]/20 ds:text-[var(--muted-foreground)]',\n 'ds:text-[length:var(--font-size-xs)] ds:font-[var(--font-weight-medium)]',\n 'ds:data-[selected=true]:bg-[var(--primary-foreground)]/20',\n 'ds:data-[selected=true]:text-[var(--primary-foreground)]',\n className ?? '',\n ]\n .filter(Boolean)\n .join(' ')}\n {...rest}\n >\n {children}\n </kbd>\n ),\n);\nCommandShortcut.displayName = 'CommandShortcut';\n\n/* -------------------------------------------------------------------- */\n/* Highlight helper */\n/* -------------------------------------------------------------------- */\n\n/**\n * Returns React nodes that wrap the matching segments of `label` in `<mark>`.\n * Diacritic-insensitive. No `dangerouslySetInnerHTML`.\n */\nexport function highlightMatch(label: string, query: string): ReactNode {\n if (!query) return label;\n const norm = normalise(label);\n const normQ = normalise(query);\n const idx = norm.indexOf(normQ);\n if (idx === -1) return label;\n // Walk the original label using character-by-character correspondence with the\n // normalised string. Since normalise may drop diacritics, we use index mapping.\n const before = label.slice(0, idx);\n const match = label.slice(idx, idx + normQ.length);\n const after = label.slice(idx + normQ.length);\n return (\n <>\n {before}\n <mark className=\"ds:bg-[var(--accent)]/20 ds:text-inherit ds:rounded-[var(--radius-sm)] ds:px-[0.125em]\">\n {match}\n </mark>\n {after}\n </>\n );\n}\n\n/* -------------------------------------------------------------------- */\n/* CommandPaletteDialog — Dialog shell + commands-as-data API */\n/* -------------------------------------------------------------------- */\n\nexport interface CommandPaletteDialogProps {\n /** Controlled open state. */\n open: boolean;\n /** Fires when the dialog opens/closes. */\n onOpenChange: (open: boolean) => void;\n /** Commands to display. */\n commands: Command[];\n /** Extra content rendered above the input (optional). */\n header?: ReactNode;\n}\n\nconst overlayClasses = [\n 'fixed inset-0 z-[var(--z-modal-backdrop)]',\n 'bg-[var(--foreground)]/40 backdrop-blur-sm',\n 'data-[state=open]:animate-in data-[state=closed]:animate-out',\n 'data-[state=open]:fade-in data-[state=closed]:fade-out',\n 'motion-reduce:animate-none',\n].join(' ');\n\nconst dialogContentClasses = [\n 'fixed z-[var(--z-modal)]',\n // Logical-inset arbitrary-value positioning: `inset-inline-start-1/2`\n // isn't a real Tailwind class (the generator maps fractions only to\n // `start-*`), so use `start-1/2` for horizontal and `top-*` for the\n // top offset — matching the working Dialog component.\n 'top-[12vh] start-1/2 -translate-x-1/2 rtl:translate-x-1/2',\n 'w-[92vw] max-w-[var(--dialog-width-lg)]',\n 'rounded-[var(--radius-lg)]',\n 'bg-[var(--background)] text-[var(--foreground)]',\n 'shadow-[var(--shadow-xl)]',\n 'border border-[var(--border)]',\n 'data-[state=open]:animate-in data-[state=closed]:animate-out',\n 'data-[state=open]:zoom-in-95 data-[state=closed]:zoom-out-95',\n 'motion-reduce:animate-none',\n 'focus:outline-none',\n].join(' ');\n\nconst VisuallyHidden = ({ children }: { children: ReactNode }) => (\n <span className=\"ds:sr-only\">{children}</span>\n);\n\nfunction CommandPaletteDialog({\n open,\n onOpenChange,\n commands,\n header,\n}: CommandPaletteDialogProps) {\n const { t } = useTranslation();\n const [search, setSearch] = useState('');\n const [recents, setRecents] = useState<string[]>(readRecents);\n\n useEffect(() => {\n if (!open) setSearch('');\n }, [open]);\n\n const grouped = useMemo(() => {\n const byGroup = new Map<string, Command[]>();\n commands.forEach((c) => {\n const list = byGroup.get(c.group) ?? [];\n list.push(c);\n byGroup.set(c.group, list);\n });\n return byGroup;\n }, [commands]);\n\n const recentCommands = useMemo(() => {\n if (search) return [];\n const byId = new Map(commands.map((c) => [c.id, c]));\n return recents.map((id) => byId.get(id)).filter(Boolean) as Command[];\n }, [commands, recents, search]);\n\n const runCommand = useCallback(\n (cmd: Command) => {\n onOpenChange(false);\n const next = [cmd.id, ...recents.filter((id) => id !== cmd.id)].slice(0, MAX_RECENTS);\n setRecents(next);\n writeRecents(next);\n // Defer so Dialog unmount doesn't swallow the callback\n setTimeout(() => cmd.onSelect(), 0);\n },\n [recents, onOpenChange],\n );\n\n const clearRecents = useCallback(() => {\n setRecents([]);\n writeRecents([]);\n }, []);\n\n return (\n <RadixDialog.Root open={open} onOpenChange={onOpenChange}>\n <RadixDialog.Portal>\n <RadixDialog.Overlay className={overlayClasses} />\n <RadixDialog.Content\n className={dialogContentClasses}\n aria-label={t('navigation.cmdk.title', 'Command palette')}\n >\n <RadixDialog.Title asChild>\n <VisuallyHidden>\n {t('navigation.cmdk.title', 'Command palette')}\n </VisuallyHidden>\n </RadixDialog.Title>\n <RadixDialog.Description asChild>\n <VisuallyHidden>\n {t(\n 'navigation.cmdk.description',\n 'Search for commands, pages, and actions',\n )}\n </VisuallyHidden>\n </RadixDialog.Description>\n <CommandPalette label={t('navigation.cmdk.title', 'Command palette')}>\n {header}\n <CommandInput value={search} onValueChange={setSearch} />\n <CommandList>\n <CommandEmpty />\n {recentCommands.length > 0 ? (\n <>\n <CommandGroup heading={t('navigation.cmdk.recents', 'Recent')}>\n {recentCommands.map((cmd) => (\n <CommandItem\n key={`recent-${cmd.id}`}\n value={`recent-${cmd.label}`}\n onSelect={() => runCommand(cmd)}\n >\n {cmd.icon ? <span aria-hidden=\"true\">{cmd.icon}</span> : null}\n <span>{cmd.label}</span>\n {cmd.shortcut ? (\n <CommandShortcut>{cmd.shortcut}</CommandShortcut>\n ) : null}\n </CommandItem>\n ))}\n <CommandItem\n value=\"__clear-recents\"\n onSelect={clearRecents}\n >\n <span>\n {t(\n 'navigation.cmdk.clearRecents',\n 'Clear recent commands',\n )}\n </span>\n </CommandItem>\n </CommandGroup>\n <CommandSeparator />\n </>\n ) : null}\n {Array.from(grouped.entries()).map(([group, list]) => (\n <CommandGroup key={group} heading={group}>\n {list.map((cmd) => (\n <CommandItem\n key={cmd.id}\n value={cmd.label}\n keywords={cmd.keywords}\n onSelect={() => runCommand(cmd)}\n >\n {cmd.icon ? <span aria-hidden=\"true\">{cmd.icon}</span> : null}\n <span>{highlightMatch(cmd.label, search)}</span>\n {cmd.shortcut ? (\n <CommandShortcut>{cmd.shortcut}</CommandShortcut>\n ) : null}\n </CommandItem>\n ))}\n </CommandGroup>\n ))}\n </CommandList>\n </CommandPalette>\n </RadixDialog.Content>\n </RadixDialog.Portal>\n </RadixDialog.Root>\n );\n}\n\nexport {\n CommandPalette,\n CommandPaletteDialog,\n CommandInput,\n CommandList,\n CommandGroup,\n CommandItem,\n CommandEmpty,\n CommandSeparator,\n CommandShortcut,\n};\n","import type { AgentAdapter } from '../../agent/types';\n\nexport const commandPaletteAgent: AgentAdapter<unknown> = {\n id: 'command-palette',\n capabilities: ['open', 'close', 'filter', 'pick', 'submit'],\n state: {},\n actions: {},\n domHooks: {\n root: { attr: 'data-component', value: 'command-palette' },\n item: {\n attr: 'data-command-id',\n description: 'Each command item emits its key as data-command-id.',\n },\n },\n};\n"],"names":["normalise","value","diacriticInsensitiveFilter","search","keywords","defaultFilter","RECENTS_KEY","MAX_RECENTS","readRecents","raw","parsed","v","writeRecents","ids","useCommandPalette","open","setOpen","useState","useEffect","handler","event","target","tag","isK","isMeta","rootClasses","CommandPalette","forwardRef","className","filter","rest","ref","jsx","CommandPrimitive","inputWrapClasses","inputClasses","CommandInput","placeholder","t","useTranslation","jsxs","Search","CommandList","CommandEmpty","children","CommandGroup","heading","itemClasses","CommandItem","CommandSeparator","CommandShortcut","highlightMatch","label","query","norm","normQ","idx","before","match","after","Fragment","overlayClasses","dialogContentClasses","VisuallyHidden","CommandPaletteDialog","onOpenChange","commands","header","setSearch","recents","setRecents","grouped","useMemo","byGroup","c","list","recentCommands","byId","id","runCommand","useCallback","cmd","next","clearRecents","RadixDialog","group","commandPaletteAgent"],"mappings":";;;;;;AAkCA,SAASA,EAAUC,GAAuB;AACxC,SAAOA,EAAM,UAAU,KAAK,EAAE,QAAQ,iCAAA,GAAmB,EAAE,EAAE,YAAA;AAC/D;AAEO,MAAMC,IAA6B,CACxCD,GACAE,GACAC,MACGC,EAAcL,EAAUC,CAAK,GAAGD,EAAUG,CAAM,GAAGC,KAAA,gBAAAA,EAAU,IAAIJ,EAAU,GAM1EM,IAAc,mBACdC,IAAc;AAEpB,SAASC,IAAwB;AAC/B,MAAI,OAAO,SAAW,IAAa,QAAO,CAAA;AAC1C,MAAI;AACF,UAAMC,IAAM,OAAO,aAAa,QAAQH,CAAW;AACnD,QAAI,CAACG,EAAK,QAAO,CAAA;AACjB,UAAMC,IAAS,KAAK,MAAMD,CAAG;AAC7B,WAAO,MAAM,QAAQC,CAAM,IAAIA,EAAO,MAAM,GAAGH,CAAW,EAAE,OAAO,CAACI,MAAM,OAAOA,KAAM,QAAQ,IAAI,CAAA;AAAA,EACrG,QAAQ;AACN,WAAO,CAAA;AAAA,EACT;AACF;AAEA,SAASC,EAAaC,GAAe;AACnC,MAAI,SAAO,SAAW;AACtB,QAAI;AACF,aAAO,aAAa,QAAQP,GAAa,KAAK,UAAUO,EAAI,MAAM,GAAGN,CAAW,CAAC,CAAC;AAAA,IACpF,QAAQ;AAAA,IAER;AACF;AAMO,SAASO,KAAoB;AAClC,QAAM,CAACC,GAAMC,CAAO,IAAIC,EAAS,EAAK;AAEtC,SAAAC,EAAU,MAAM;AACd,aAASC,EAAQC,GAAsB;AACrC,YAAMC,IAASD,EAAM,QACfE,IAAMD,KAAA,gBAAAA,EAAQ,QAAQ;AAG5B,WADEC,MAAQ,WAAWA,MAAQ,eAAcD,KAAA,gBAAAA,EAAQ,uBACjC,EAAEN,KAAQK,EAAM,QAAQ,UAAW;AAErD,YAAMG,IAAMH,EAAM,QAAQ,OAAOA,EAAM,QAAQ,KACzCI,IAASJ,EAAM,WAAWA,EAAM;AACtC,MAAIG,KAAOC,MACTJ,EAAM,eAAA,GACNJ,EAAQ,CAACL,MAAM,CAACA,CAAC;AAAA,IAErB;AACA,oBAAS,iBAAiB,WAAWQ,CAAO,GACrC,MAAM,SAAS,oBAAoB,WAAWA,CAAO;AAAA,EAC9D,GAAG,CAACJ,CAAI,CAAC,GAEF,EAAE,MAAAA,GAAM,SAAAC,EAAA;AACjB;AAMA,MAAMS,IAAc;AAAA,EAClB;AAAA,EACA;AAAA,EACA;AACF,EAAE,KAAK,GAAG,GAKJC,IAAiBC,EAGrB,CAAC,EAAE,WAAAC,GAAW,QAAAC,IAAS3B,GAA4B,GAAG4B,KAAQC,MAC9D,gBAAAC;AAAA,EAACC;AAAAA,EAAA;AAAA,IACC,KAAAF;AAAA,IACA,QAAAF;AAAA,IACA,WAAW,CAACJ,GAAaG,CAAS,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG;AAAA,IAC3D,GAAGE;AAAA,EAAA;AACN,CACD;AACDJ,EAAe,cAAc;AAM7B,MAAMQ,IAAmB;AAAA,EACvB;AAAA,EACA;AAAA,EACA;AACF,EAAE,KAAK,GAAG,GAEJC,IAAe;AAAA,EACnB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,EAAE,KAAK,GAAG,GAKJC,IAAeT,EAGnB,CAAC,EAAE,WAAAC,GAAW,aAAAS,GAAa,GAAGP,EAAA,GAAQC,MAAQ;AAC9C,QAAM,EAAE,GAAAO,EAAA,IAAMC,EAAA;AACd,SACE,gBAAAC,EAAC,OAAA,EAAI,WAAWN,GACd,UAAA;AAAA,IAAA,gBAAAF,EAACS,GAAA,EAAO,eAAY,QAAO,WAAU,uDAAsD;AAAA,IAC3F,gBAAAT;AAAA,MAACC,EAAiB;AAAA,MAAjB;AAAA,QACC,KAAAF;AAAA,QACA,aACEM,KACAC,EAAE,+BAA+B,2BAAgC;AAAA,QAEnE,WAAW,CAACH,GAAcP,CAAS,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG;AAAA,QAC5D,GAAGE;AAAA,MAAA;AAAA,IAAA;AAAA,EACN,GACF;AAEJ,CAAC;AACDM,EAAa,cAAc;AAM3B,MAAMM,IAAcf,EAGlB,CAAC,EAAE,WAAAC,GAAW,GAAGE,EAAA,GAAQC,MACzB,gBAAAC;AAAA,EAACC,EAAiB;AAAA,EAAjB;AAAA,IACC,KAAAF;AAAA,IACA,WAAW;AAAA,MACT;AAAA,MACA;AAAA,MACA;AAAA,MACAH,KAAa;AAAA,IAAA,EAEZ,OAAO,OAAO,EACd,KAAK,GAAG;AAAA,IACV,GAAGE;AAAA,EAAA;AACN,CACD;AACDY,EAAY,cAAc;AAE1B,MAAMC,IAAehB,EAGnB,CAAC,EAAE,WAAAC,GAAW,UAAAgB,GAAU,GAAGd,EAAA,GAAQC,MAAQ;AAC3C,QAAM,EAAE,GAAAO,EAAA,IAAMC,EAAA;AACd,SACE,gBAAAP;AAAA,IAACC,EAAiB;AAAA,IAAjB;AAAA,MACC,KAAAF;AAAA,MACA,WAAW;AAAA,QACT;AAAA,QACA;AAAA,QACAH,KAAa;AAAA,MAAA,EAEZ,OAAO,OAAO,EACd,KAAK,GAAG;AAAA,MACV,GAAGE;AAAA,MAEH,UAAAc,KAAYN,EAAE,yBAAyB,kBAAkB;AAAA,IAAA;AAAA,EAAA;AAGhE,CAAC;AACDK,EAAa,cAAc;AAE3B,MAAME,IAAelB,EAGnB,CAAC,EAAE,WAAAC,GAAW,SAAAkB,GAAS,GAAGhB,EAAA,GAAQC,MAClC,gBAAAC;AAAA,EAACC,EAAiB;AAAA,EAAjB;AAAA,IACC,KAAAF;AAAA,IACA,SAAAe;AAAA,IACA,WAAW;AAAA,MACT;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACAlB,KAAa;AAAA,IAAA,EAEZ,OAAO,OAAO,EACd,KAAK,GAAG;AAAA,IACV,GAAGE;AAAA,EAAA;AACN,CACD;AACDe,EAAa,cAAc;AAE3B,MAAME,IAAc;AAAA,EAClB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,EAAE,KAAK,GAAG,GAKJC,IAAcrB,EAGlB,CAAC,EAAE,WAAAC,GAAW,GAAGE,EAAA,GAAQC,MACzB,gBAAAC;AAAA,EAACC,EAAiB;AAAA,EAAjB;AAAA,IACC,KAAAF;AAAA,IACA,WAAW,CAACgB,GAAanB,CAAS,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG;AAAA,IAC3D,GAAGE;AAAA,EAAA;AACN,CACD;AACDkB,EAAY,cAAc;AAE1B,MAAMC,IAAmBtB,EAGvB,CAAC,EAAE,WAAAC,GAAW,GAAGE,EAAA,GAAQC,MACzB,gBAAAC;AAAA,EAACC,EAAiB;AAAA,EAAjB;AAAA,IACC,KAAAF;AAAA,IACA,WAAW;AAAA,MACT;AAAA,MACA;AAAA,MACA;AAAA,MACAH,KAAa;AAAA,IAAA,EAEZ,OAAO,OAAO,EACd,KAAK,GAAG;AAAA,IACV,GAAGE;AAAA,EAAA;AACN,CACD;AACDmB,EAAiB,cAAc;AAI/B,MAAMC,IAAkBvB;AAAA,EACtB,CAAC,EAAE,WAAAC,GAAW,UAAAgB,GAAU,GAAGd,EAAA,GAAQC,MACjC,gBAAAC;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,KAAAD;AAAA,MACA,WAAW;AAAA,QACT;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACAH,KAAa;AAAA,MAAA,EAEZ,OAAO,OAAO,EACd,KAAK,GAAG;AAAA,MACV,GAAGE;AAAA,MAEH,UAAAc;AAAA,IAAA;AAAA,EAAA;AAGP;AACAM,EAAgB,cAAc;AAUvB,SAASC,EAAeC,GAAeC,GAA0B;AACtE,MAAI,CAACA,EAAO,QAAOD;AACnB,QAAME,IAAOtD,EAAUoD,CAAK,GACtBG,IAAQvD,EAAUqD,CAAK,GACvBG,IAAMF,EAAK,QAAQC,CAAK;AAC9B,MAAIC,MAAQ,GAAI,QAAOJ;AAGvB,QAAMK,IAASL,EAAM,MAAM,GAAGI,CAAG,GAC3BE,IAAQN,EAAM,MAAMI,GAAKA,IAAMD,EAAM,MAAM,GAC3CI,IAAQP,EAAM,MAAMI,IAAMD,EAAM,MAAM;AAC5C,SACE,gBAAAf,EAAAoB,GAAA,EACG,UAAA;AAAA,IAAAH;AAAA,IACD,gBAAAzB,EAAC,QAAA,EAAK,WAAU,0FACb,UAAA0B,GACH;AAAA,IACCC;AAAA,EAAA,GACH;AAEJ;AAiBA,MAAME,IAAiB;AAAA,EACrB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,EAAE,KAAK,GAAG,GAEJC,IAAuB;AAAA,EAC3B;AAAA;AAAA;AAAA;AAAA;AAAA,EAKA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,EAAE,KAAK,GAAG,GAEJC,IAAiB,CAAC,EAAE,UAAAnB,EAAA,MACxB,gBAAAZ,EAAC,QAAA,EAAK,WAAU,cAAc,UAAAY,GAAS;AAGzC,SAASoB,GAAqB;AAAA,EAC5B,MAAAjD;AAAA,EACA,cAAAkD;AAAA,EACA,UAAAC;AAAA,EACA,QAAAC;AACF,GAA8B;AAC5B,QAAM,EAAE,GAAA7B,EAAA,IAAMC,EAAA,GACR,CAACpC,GAAQiE,CAAS,IAAInD,EAAS,EAAE,GACjC,CAACoD,GAASC,CAAU,IAAIrD,EAAmBT,CAAW;AAE5D,EAAAU,EAAU,MAAM;AACd,IAAKH,KAAMqD,EAAU,EAAE;AAAA,EACzB,GAAG,CAACrD,CAAI,CAAC;AAET,QAAMwD,IAAUC,EAAQ,MAAM;AAC5B,UAAMC,wBAAc,IAAA;AACpB,WAAAP,EAAS,QAAQ,CAACQ,MAAM;AACtB,YAAMC,IAAOF,EAAQ,IAAIC,EAAE,KAAK,KAAK,CAAA;AACrC,MAAAC,EAAK,KAAKD,CAAC,GACXD,EAAQ,IAAIC,EAAE,OAAOC,CAAI;AAAA,IAC3B,CAAC,GACMF;AAAA,EACT,GAAG,CAACP,CAAQ,CAAC,GAEPU,IAAiBJ,EAAQ,MAAM;AACnC,QAAIrE,UAAe,CAAA;AACnB,UAAM0E,IAAO,IAAI,IAAIX,EAAS,IAAI,CAACQ,MAAM,CAACA,EAAE,IAAIA,CAAC,CAAC,CAAC;AACnD,WAAOL,EAAQ,IAAI,CAACS,MAAOD,EAAK,IAAIC,CAAE,CAAC,EAAE,OAAO,OAAO;AAAA,EACzD,GAAG,CAACZ,GAAUG,GAASlE,CAAM,CAAC,GAExB4E,IAAaC;AAAA,IACjB,CAACC,MAAiB;AAChB,MAAAhB,EAAa,EAAK;AAClB,YAAMiB,IAAO,CAACD,EAAI,IAAI,GAAGZ,EAAQ,OAAO,CAACS,MAAOA,MAAOG,EAAI,EAAE,CAAC,EAAE,MAAM,GAAG1E,CAAW;AACpF,MAAA+D,EAAWY,CAAI,GACftE,EAAasE,CAAI,GAEjB,WAAW,MAAMD,EAAI,SAAA,GAAY,CAAC;AAAA,IACpC;AAAA,IACA,CAACZ,GAASJ,CAAY;AAAA,EAAA,GAGlBkB,IAAeH,EAAY,MAAM;AACrC,IAAAV,EAAW,CAAA,CAAE,GACb1D,EAAa,CAAA,CAAE;AAAA,EACjB,GAAG,CAAA,CAAE;AAEL,SACE,gBAAAoB,EAACoD,EAAY,MAAZ,EAAiB,MAAArE,GAAY,cAAAkD,GAC5B,UAAA,gBAAAzB,EAAC4C,EAAY,QAAZ,EACC,UAAA;AAAA,IAAA,gBAAApD,EAACoD,EAAY,SAAZ,EAAoB,WAAWvB,EAAA,CAAgB;AAAA,IAChD,gBAAArB;AAAA,MAAC4C,EAAY;AAAA,MAAZ;AAAA,QACC,WAAWtB;AAAA,QACX,cAAYxB,EAAE,yBAAyB,iBAAiB;AAAA,QAExD,UAAA;AAAA,UAAA,gBAAAN,EAACoD,EAAY,OAAZ,EAAkB,SAAO,IACxB,UAAA,gBAAApD,EAAC+B,GAAA,EACE,UAAAzB,EAAE,yBAAyB,iBAAiB,EAAA,CAC/C,GACF;AAAA,4BACC8C,EAAY,aAAZ,EAAwB,SAAO,IAC9B,4BAACrB,GAAA,EACE,UAAAzB;AAAA,YACC;AAAA,YACA;AAAA,UAAA,GAEJ,EAAA,CACF;AAAA,4BACCZ,GAAA,EAAe,OAAOY,EAAE,yBAAyB,iBAAiB,GAChE,UAAA;AAAA,YAAA6B;AAAA,YACD,gBAAAnC,EAACI,GAAA,EAAa,OAAOjC,GAAQ,eAAeiE,GAAW;AAAA,8BACtD1B,GAAA,EACC,UAAA;AAAA,cAAA,gBAAAV,EAACW,GAAA,EAAa;AAAA,cACbiC,EAAe,SAAS,IACvB,gBAAApC,EAAAoB,GAAA,EACE,UAAA;AAAA,gBAAA,gBAAApB,EAACK,GAAA,EAAa,SAASP,EAAE,2BAA2B,QAAQ,GACzD,UAAA;AAAA,kBAAAsC,EAAe,IAAI,CAACK,MACnB,gBAAAzC;AAAA,oBAACQ;AAAA,oBAAA;AAAA,sBAEC,OAAO,UAAUiC,EAAI,KAAK;AAAA,sBAC1B,UAAU,MAAMF,EAAWE,CAAG;AAAA,sBAE7B,UAAA;AAAA,wBAAAA,EAAI,OAAO,gBAAAjD,EAAC,QAAA,EAAK,eAAY,QAAQ,UAAAiD,EAAI,MAAK,IAAU;AAAA,wBACzD,gBAAAjD,EAAC,QAAA,EAAM,UAAAiD,EAAI,MAAA,CAAM;AAAA,wBAChBA,EAAI,WACH,gBAAAjD,EAACkB,GAAA,EAAiB,UAAA+B,EAAI,UAAS,IAC7B;AAAA,sBAAA;AAAA,oBAAA;AAAA,oBARC,UAAUA,EAAI,EAAE;AAAA,kBAAA,CAUxB;AAAA,kBACD,gBAAAjD;AAAA,oBAACgB;AAAA,oBAAA;AAAA,sBACC,OAAM;AAAA,sBACN,UAAUmC;AAAA,sBAEV,4BAAC,QAAA,EACE,UAAA7C;AAAA,wBACC;AAAA,wBACA;AAAA,sBAAA,EACF,CACF;AAAA,oBAAA;AAAA,kBAAA;AAAA,gBACF,GACF;AAAA,kCACCW,GAAA,CAAA,CAAiB;AAAA,cAAA,EAAA,CACpB,IACE;AAAA,cACH,MAAM,KAAKsB,EAAQ,SAAS,EAAE,IAAI,CAAC,CAACc,GAAOV,CAAI,wBAC7C9B,GAAA,EAAyB,SAASwC,GAChC,UAAAV,EAAK,IAAI,CAACM,MACT,gBAAAzC;AAAA,gBAACQ;AAAA,gBAAA;AAAA,kBAEC,OAAOiC,EAAI;AAAA,kBACX,UAAUA,EAAI;AAAA,kBACd,UAAU,MAAMF,EAAWE,CAAG;AAAA,kBAE7B,UAAA;AAAA,oBAAAA,EAAI,OAAO,gBAAAjD,EAAC,QAAA,EAAK,eAAY,QAAQ,UAAAiD,EAAI,MAAK,IAAU;AAAA,sCACxD,QAAA,EAAM,UAAA9B,EAAe8B,EAAI,OAAO9E,CAAM,GAAE;AAAA,oBACxC8E,EAAI,WACH,gBAAAjD,EAACkB,GAAA,EAAiB,UAAA+B,EAAI,UAAS,IAC7B;AAAA,kBAAA;AAAA,gBAAA;AAAA,gBATCA,EAAI;AAAA,cAAA,CAWZ,EAAA,GAdgBI,CAenB,CACD;AAAA,YAAA,EAAA,CACH;AAAA,UAAA,EAAA,CACF;AAAA,QAAA;AAAA,MAAA;AAAA,IAAA;AAAA,EACF,EAAA,CACF,EAAA,CACF;AAEJ;ACtgBO,MAAMC,KAA6C;AAAA,EACxD,IAAI;AAAA,EACJ,cAAc,CAAC,QAAQ,SAAS,UAAU,QAAQ,QAAQ;AAAA,EAC1D,OAAO,CAAA;AAAA,EACP,SAAS,CAAA;AAAA,EACT,UAAU;AAAA,IACR,MAAM,EAAE,MAAM,kBAAkB,OAAO,kBAAA;AAAA,IACvC,MAAM;AAAA,MACJ,MAAM;AAAA,MACN,aAAa;AAAA,IAAA;AAAA,EACf;AAEJ;"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"date-range-picker-CtwEwoyr.js","sources":["../../node_modules/date-fns/subDays.js","../../node_modules/date-fns/subWeeks.js","../../src/components/date-range-picker/date-range-picker.tsx"],"sourcesContent":["import { addDays } from \"./addDays.js\";\n\n/**\n * The {@link subDays} function options.\n */\n\n/**\n * @name subDays\n * @category Day Helpers\n * @summary Subtract the specified number of days from the given date.\n *\n * @typeParam DateType - The `Date` type, the function operates on. Gets inferred from passed arguments. Allows to use extensions like [`UTCDate`](https://github.com/date-fns/utc).\n * @typeParam ResultDate - The result `Date` type, it is the type returned from the context function if it is passed, or inferred from the arguments.\n *\n * @param date - The date to be changed\n * @param amount - The amount of days to be subtracted.\n * @param options - An object with options\n *\n * @returns The new date with the days subtracted\n *\n * @example\n * // Subtract 10 days from 1 September 2014:\n * const result = subDays(new Date(2014, 8, 1), 10)\n * //=> Fri Aug 22 2014 00:00:00\n */\nexport function subDays(date, amount, options) {\n return addDays(date, -amount, options);\n}\n\n// Fallback for modularized imports:\nexport default subDays;\n","import { addWeeks } from \"./addWeeks.js\";\n\n/**\n * The {@link subWeeks} function options.\n */\n\n/**\n * @name subWeeks\n * @category Week Helpers\n * @summary Subtract the specified number of weeks from the given date.\n *\n * @description\n * Subtract the specified number of weeks from the given date.\n *\n * @typeParam DateType - The `Date` type, the function operates on. Gets inferred from passed arguments. Allows to use extensions like [`UTCDate`](https://github.com/date-fns/utc).\n * @typeParam ResultDate - The result `Date` type, it is the type returned from the context function if it is passed, or inferred from the arguments.\n *\n * @param date - The date to be changed\n * @param amount - The amount of weeks to be subtracted.\n * @param options - An object with options\n *\n * @returns The new date with the weeks subtracted\n *\n * @example\n * // Subtract 4 weeks from 1 September 2014:\n * const result = subWeeks(new Date(2014, 8, 1), 4)\n * //=> Mon Aug 04 2014 00:00:00\n */\nexport function subWeeks(date, amount, options) {\n return addWeeks(date, -amount, options);\n}\n\n// Fallback for modularized imports:\nexport default subWeeks;\n","import {\n forwardRef,\n useCallback,\n useRef,\n useState,\n} from 'react';\nimport { type VariantProps } from 'class-variance-authority';\nimport { useTranslation } from 'react-i18next';\nimport * as Popover from '@radix-ui/react-popover';\nimport {\n DayPicker,\n type DateRange,\n} from 'react-day-picker';\nimport {\n format as fnsFormat,\n differenceInCalendarDays,\n startOfWeek,\n endOfWeek,\n startOfMonth,\n endOfMonth,\n subDays,\n subWeeks,\n} from 'date-fns';\nimport { Calendar } from 'lucide-react';\nimport { useFormField } from '../form-field/form-field-context';\nimport {\n getDateFnsLocale,\n buildDisabledMatcher,\n CalendarChevron,\n triggerVariants,\n calendarIconVariants,\n popoverContentVariants,\n presetButtonVariants,\n} from '../_shared';\nimport '../../tokens/themes/bridges/react-day-picker.css';\n\n/* -------------------------------------------------------------------------- */\n/* Props */\n/* -------------------------------------------------------------------------- */\n\nexport interface DateRangePreset {\n label: string;\n range: () => { from: Date; to: Date };\n}\n\nexport interface DateRangeValue {\n from?: Date;\n to?: Date;\n}\n\nexport interface DateRangePickerProps\n extends Pick<VariantProps<typeof triggerVariants>, 'size'> {\n /** Current range — controlled. */\n value?: DateRangeValue;\n /** Default range — uncontrolled. */\n defaultValue?: DateRangeValue;\n /** Called when the range changes. */\n onChange?: (range: DateRangeValue) => void;\n /** Minimum selectable date. */\n minDate?: Date;\n /** Maximum selectable date. */\n maxDate?: Date;\n /** Custom presets. Replaces defaults unless mergePresets is true. */\n presets?: DateRangePreset[];\n /** Merge custom presets with defaults instead of replacing. */\n mergePresets?: boolean;\n /** Component size. */\n size?: 'sm' | 'md' | 'lg';\n /** Disabled state. */\n disabled?: boolean;\n /** Placeholder text. */\n placeholder?: string;\n /** Additional class names. */\n className?: string;\n /** id override. */\n id?: string;\n}\n\n/* -------------------------------------------------------------------------- */\n/* Component */\n/* -------------------------------------------------------------------------- */\n\nexport const DateRangePicker = forwardRef<HTMLDivElement, DateRangePickerProps>(\n (\n {\n value,\n defaultValue,\n onChange,\n minDate,\n maxDate,\n presets: presetsProp,\n mergePresets = false,\n size = 'md',\n disabled,\n placeholder,\n className,\n id,\n },\n ref,\n ) => {\n const { t, i18n } = useTranslation();\n const ctx = useFormField();\n const effectiveId = id ?? ctx.id;\n const effectiveDisabled = ctx.disabled || disabled;\n const effectiveTone = ctx.invalid ? 'error' : 'default';\n\n const locale = getDateFnsLocale(i18n.language);\n const placeholderText =\n placeholder ?? t('ui.inputs.dateRangePicker.placeholder', 'Select date range');\n\n const isControlled = value !== undefined;\n const [internalValue, setInternalValue] = useState<DateRangeValue>(\n value ?? defaultValue ?? {},\n );\n const currentValue: DateRangeValue = isControlled ? value : internalValue;\n\n const [open, setOpen] = useState(false);\n const [month, setMonth] = useState<Date>(\n currentValue.from ?? new Date(),\n );\n\n const triggerRef = useRef<HTMLButtonElement>(null);\n\n const emit = useCallback(\n (range: DateRangeValue) => {\n if (!isControlled) setInternalValue(range);\n onChange?.(range);\n },\n [isControlled, onChange],\n );\n\n const disabledMatcher = buildDisabledMatcher(minDate, maxDate);\n\n // Default presets\n const defaultPresets: DateRangePreset[] = [\n {\n label: t('ui.inputs.dateRangePicker.presets.today', 'Today'),\n range: () => {\n const today = new Date();\n return { from: today, to: today };\n },\n },\n {\n label: t('ui.inputs.dateRangePicker.presets.yesterday', 'Yesterday'),\n range: () => {\n const yesterday = subDays(new Date(), 1);\n return { from: yesterday, to: yesterday };\n },\n },\n {\n label: t('ui.inputs.dateRangePicker.presets.last7', 'Last 7 days'),\n range: () => ({\n from: subDays(new Date(), 6),\n to: new Date(),\n }),\n },\n {\n label: t('ui.inputs.dateRangePicker.presets.thisWeek', 'This week'),\n range: () => ({\n from: startOfWeek(new Date(), { locale }),\n to: endOfWeek(new Date(), { locale }),\n }),\n },\n {\n label: t('ui.inputs.dateRangePicker.presets.lastWeek', 'Last week'),\n range: () => {\n const lastWeekDay = subWeeks(new Date(), 1);\n return {\n from: startOfWeek(lastWeekDay, { locale }),\n to: endOfWeek(lastWeekDay, { locale }),\n };\n },\n },\n {\n label: t('ui.inputs.dateRangePicker.presets.thisMonth', 'This month'),\n range: () => ({\n from: startOfMonth(new Date()),\n to: endOfMonth(new Date()),\n }),\n },\n {\n label: t('ui.inputs.dateRangePicker.presets.last30', 'Last 30 days'),\n range: () => ({\n from: subDays(new Date(), 29),\n to: new Date(),\n }),\n },\n ];\n\n const effectivePresets = presetsProp\n ? mergePresets\n ? [...defaultPresets, ...presetsProp]\n : presetsProp\n : defaultPresets;\n\n const handleRangeSelect = (range: DateRange | undefined) => {\n if (range) {\n emit({ from: range.from, to: range.to });\n } else {\n emit({});\n }\n };\n\n const handlePresetClick = (preset: DateRangePreset) => {\n const range = preset.range();\n emit(range);\n setMonth(range.from);\n setOpen(false);\n };\n\n // Format display text\n const displayText = (() => {\n if (currentValue.from && currentValue.to) {\n const fromStr = fnsFormat(currentValue.from, 'MMM d, yyyy', { locale });\n const toStr = fnsFormat(currentValue.to, 'MMM d, yyyy', { locale });\n return `${fromStr} – ${toStr}`;\n }\n if (currentValue.from) {\n return fnsFormat(currentValue.from, 'MMM d, yyyy', { locale });\n }\n return '';\n })();\n\n // Range summary for screen readers\n const rangeSummary = (() => {\n if (currentValue.from && currentValue.to) {\n const days = differenceInCalendarDays(currentValue.to, currentValue.from) + 1;\n return t('ui.inputs.dateRangePicker.days', '{{count}} days', { count: days });\n }\n return '';\n })();\n\n return (\n <Popover.Root open={open} onOpenChange={setOpen}>\n <div ref={ref} className={className}>\n <Popover.Trigger asChild disabled={effectiveDisabled}>\n <button\n ref={triggerRef}\n id={effectiveId}\n type=\"button\"\n disabled={effectiveDisabled}\n aria-describedby={ctx.describedBy || undefined}\n aria-invalid={ctx.invalid || undefined}\n // `aria-required` is not valid on `<button>` per ARIA 1.2 — the\n // FormField label's visible asterisk + `aria-describedby` link\n // communicate the required state instead.\n aria-haspopup=\"dialog\"\n aria-expanded={open}\n className={triggerVariants({ size, tone: effectiveTone })}\n >\n <span className={displayText ? 'ds:text-foreground' : 'ds:text-muted-foreground'}>\n {displayText || placeholderText}\n </span>\n <span aria-hidden=\"true\" className={calendarIconVariants({ size })}>\n <Calendar />\n </span>\n </button>\n </Popover.Trigger>\n\n <Popover.Portal>\n <Popover.Content\n sideOffset={4}\n align=\"start\"\n className={popoverContentVariants()}\n >\n <div className=\"ds:flex ds:gap-[var(--spacing-md)]\">\n {/* Presets column */}\n {effectivePresets.length > 0 ? (\n <div className=\"ds:flex ds:flex-col ds:gap-[var(--spacing-xs)] ds:min-w-[8rem] ds:border-e ds:border-border ds:pe-[var(--spacing-md)]\">\n {effectivePresets.map((preset) => (\n <button\n key={preset.label}\n type=\"button\"\n onClick={() => handlePresetClick(preset)}\n className={presetButtonVariants()}\n >\n {preset.label}\n </button>\n ))}\n </div>\n ) : null}\n\n {/* Dual calendar */}\n <div>\n <DayPicker\n mode=\"range\"\n selected={\n currentValue.from\n ? { from: currentValue.from, to: currentValue.to }\n : undefined\n }\n onSelect={handleRangeSelect}\n month={month}\n onMonthChange={setMonth}\n numberOfMonths={2}\n disabled={disabledMatcher}\n locale={locale}\n showOutsideDays\n fixedWeeks\n pagedNavigation\n components={{ Chevron: CalendarChevron }}\n />\n\n {/* Range summary live region */}\n {rangeSummary ? (\n <div\n role=\"status\"\n aria-live=\"polite\"\n className=\"type-body-sm ds:text-muted-foreground ds:mt-[var(--spacing-sm)] ds:text-center\"\n >\n {rangeSummary}\n </div>\n ) : null}\n </div>\n </div>\n </Popover.Content>\n </Popover.Portal>\n </div>\n </Popover.Root>\n );\n },\n);\n\nDateRangePicker.displayName = 'DateRangePicker';\n"],"names":["subDays","date","amount","options","addDays","subWeeks","addWeeks","DateRangePicker","forwardRef","value","defaultValue","onChange","minDate","maxDate","presetsProp","mergePresets","size","disabled","placeholder","className","id","ref","t","i18n","useTranslation","ctx","useFormField","effectiveId","effectiveDisabled","effectiveTone","locale","getDateFnsLocale","placeholderText","isControlled","internalValue","setInternalValue","useState","currentValue","open","setOpen","month","setMonth","triggerRef","useRef","emit","useCallback","range","disabledMatcher","buildDisabledMatcher","defaultPresets","today","yesterday","startOfWeek","endOfWeek","lastWeekDay","startOfMonth","endOfMonth","effectivePresets","handleRangeSelect","handlePresetClick","preset","displayText","fromStr","fnsFormat","toStr","rangeSummary","days","differenceInCalendarDays","jsx","Popover","jsxs","triggerVariants","calendarIconVariants","Calendar","popoverContentVariants","presetButtonVariants","DayPicker","CalendarChevron"],"mappings":"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","x_google_ignoreList":[0,1]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"description-list-Bk3p71qY.js","sources":["../../src/components/description-list/description-list.tsx"],"sourcesContent":["import { createContext, forwardRef, useCallback, useContext, useState } from 'react';\nimport { cva } from 'class-variance-authority';\nimport { useTranslation } from 'react-i18next';\nimport { Copy, Check } from 'lucide-react';\nimport { IconButton } from '../button/icon-button';\n\n/* ------------------------------------------------------------------ */\n/* Context */\n/* ------------------------------------------------------------------ */\n\ninterface DescriptionListContextShape {\n layout: 'inline' | 'stacked' | 'responsive';\n density: 'default' | 'compact';\n divider: 'none' | 'between' | 'bordered';\n}\n\nconst DescriptionListContext = createContext<DescriptionListContextShape>({\n layout: 'inline',\n density: 'default',\n divider: 'none',\n});\n\n/* ------------------------------------------------------------------ */\n/* CVA — root <dl> */\n/* ------------------------------------------------------------------ */\n\nconst descriptionListVariants = cva('ds:flex ds:flex-col', {\n variants: {\n layout: {\n inline: '',\n stacked: '',\n responsive: '',\n },\n density: {\n default: 'ds:gap-[var(--spacing-md)]',\n compact: 'ds:gap-[var(--spacing-sm)]',\n },\n divider: {\n none: '',\n between: '',\n bordered: '',\n },\n },\n defaultVariants: {\n layout: 'inline',\n density: 'default',\n divider: 'none',\n },\n});\n\n/* ------------------------------------------------------------------ */\n/* CVA — row <div> */\n/* ------------------------------------------------------------------ */\n\nconst descriptionListRowVariants = cva('', {\n variants: {\n layout: {\n inline: 'ds:grid ds:gap-[var(--spacing-md)]',\n stacked: 'ds:flex ds:flex-col ds:gap-[var(--spacing-xs)]',\n responsive:\n 'ds:grid ds:gap-[var(--spacing-md)] ds:max-sm:flex ds:max-sm:flex-col ds:max-sm:gap-[var(--spacing-xs)]',\n },\n divider: {\n none: '',\n between:\n 'ds:[&:not(:last-child)]:border-b ds:[&:not(:last-child)]:border-[color:var(--border)] ds:[&:not(:last-child)]:pb-[var(--spacing-md)]',\n bordered:\n 'ds:border ds:border-[color:var(--border)] ds:rounded-[var(--radius-sm)] ds:p-[var(--spacing-sm)]',\n },\n copyable: {\n true: '',\n false: '',\n },\n },\n compoundVariants: [\n {\n layout: 'inline',\n copyable: false,\n className: 'ds:grid-cols-[minmax(0,1fr)_minmax(0,2fr)]',\n },\n {\n layout: 'inline',\n copyable: true,\n className: 'ds:grid-cols-[minmax(0,1fr)_minmax(0,2fr)_auto]',\n },\n {\n layout: 'responsive',\n copyable: false,\n className: 'ds:grid-cols-[minmax(0,1fr)_minmax(0,2fr)]',\n },\n {\n layout: 'responsive',\n copyable: true,\n className: 'ds:grid-cols-[minmax(0,1fr)_minmax(0,2fr)_auto]',\n },\n ],\n defaultVariants: {\n layout: 'inline',\n divider: 'none',\n copyable: false,\n },\n});\n\n/* ------------------------------------------------------------------ */\n/* Props */\n/* ------------------------------------------------------------------ */\n\nexport interface DescriptionListProps extends React.HTMLAttributes<HTMLDListElement> {\n layout?: 'inline' | 'stacked' | 'responsive';\n density?: 'default' | 'compact';\n divider?: 'none' | 'between' | 'bordered';\n}\n\nexport interface DescriptionListRowProps extends React.HTMLAttributes<HTMLDivElement> {\n /** When true, shows a copy-to-clipboard button using KeyValuePair's established mechanism */\n copyable?: boolean;\n /** Text written to the clipboard when copyable=true */\n copyText?: string;\n /** Label used in the copy button's aria-label: \"Copy {copyLabel}\". Falls back to copyText. */\n copyLabel?: string;\n}\n\nexport interface DescriptionListTermProps extends React.HTMLAttributes<HTMLElement> {}\n\nexport interface DescriptionListDetailProps extends React.HTMLAttributes<HTMLElement> {\n /** Right-aligns numeric values via text-end */\n numeric?: boolean;\n}\n\n/* ------------------------------------------------------------------ */\n/* Root — <dl> */\n/* ------------------------------------------------------------------ */\n\nconst DescriptionListRoot = forwardRef<HTMLDListElement, DescriptionListProps>(\n (\n {\n layout = 'inline',\n density = 'default',\n divider = 'none',\n className,\n children,\n ...props\n },\n ref,\n ) => (\n <DescriptionListContext.Provider value={{ layout, density, divider }}>\n <dl\n ref={ref}\n className={descriptionListVariants({ layout, density, divider, className })}\n {...props}\n >\n {children}\n </dl>\n </DescriptionListContext.Provider>\n ),\n);\nDescriptionListRoot.displayName = 'DescriptionList';\n\n/* ------------------------------------------------------------------ */\n/* Row — <div> that groups a <dt> with its <dd>(s) */\n/* ------------------------------------------------------------------ */\n\nconst DescriptionListRow = forwardRef<HTMLDivElement, DescriptionListRowProps>(\n (\n {\n copyable = false,\n copyText,\n copyLabel,\n className,\n children,\n ...props\n },\n ref,\n ) => {\n const { layout, divider } = useContext(DescriptionListContext);\n const { t } = useTranslation();\n const [copied, setCopied] = useState(false);\n const [announcement, setAnnouncement] = useState('');\n\n const handleCopy = useCallback(async () => {\n if (!copyText) {\n if (import.meta.env.DEV) {\n console.warn(\n 'DescriptionList.Row: copyable=true but no copyText provided. Copy is a no-op.',\n );\n }\n return;\n }\n try {\n await navigator.clipboard.writeText(copyText);\n setCopied(true);\n setAnnouncement(t('ui.keyValuePair.copied'));\n setTimeout(() => {\n setCopied(false);\n setAnnouncement('');\n }, 2000);\n } catch {\n setAnnouncement(t('ui.keyValuePair.notAvailable'));\n setTimeout(() => setAnnouncement(''), 3000);\n }\n }, [copyText, t]);\n\n const ariaLabel = t('ui.keyValuePair.copy', { label: copyLabel ?? copyText ?? '' });\n\n return (\n <div\n ref={ref}\n className={descriptionListRowVariants({ layout, divider, copyable, className })}\n {...props}\n >\n {children}\n {copyable && (\n <IconButton\n icon={copied ? <Check /> : <Copy />}\n size=\"sm\"\n aria-label={ariaLabel}\n onClick={handleCopy}\n intent=\"ghost\"\n className=\"ds:self-start\"\n />\n )}\n {copyable && (\n <span role=\"status\" className=\"ds:sr-only\">\n {announcement}\n </span>\n )}\n </div>\n );\n },\n);\nDescriptionListRow.displayName = 'DescriptionList.Row';\n\n/* ------------------------------------------------------------------ */\n/* CVA — term <dt> */\n/* ------------------------------------------------------------------ */\n\nconst descriptionListTermVariants = cva(\n 'type-label ds:text-[color:var(--muted-foreground)] ds:text-start ds:[overflow-wrap:anywhere] ds:[word-break:normal]',\n);\n\n/* ------------------------------------------------------------------ */\n/* CVA — detail <dd> */\n/* ------------------------------------------------------------------ */\n\nconst descriptionListDetailVariants = cva(\n 'type-body ds:text-[color:var(--foreground)] ds:m-0 ds:[overflow-wrap:anywhere] ds:[word-break:normal]',\n {\n variants: {\n numeric: {\n true: 'ds:text-end',\n false: 'ds:text-start',\n },\n },\n defaultVariants: {\n numeric: false,\n },\n },\n);\n\n/* ------------------------------------------------------------------ */\n/* Term — <dt> */\n/* ------------------------------------------------------------------ */\n\nconst DescriptionListTerm = forwardRef<HTMLElement, DescriptionListTermProps>(\n ({ className, ...props }, ref) => (\n <dt\n ref={ref as React.Ref<HTMLElement>}\n className={descriptionListTermVariants({ className })}\n {...props}\n />\n ),\n);\nDescriptionListTerm.displayName = 'DescriptionList.Term';\n\n/* ------------------------------------------------------------------ */\n/* Detail — <dd> */\n/* ------------------------------------------------------------------ */\n\nconst DescriptionListDetail = forwardRef<HTMLElement, DescriptionListDetailProps>(\n ({ numeric = false, className, ...props }, ref) => (\n <dd\n ref={ref as React.Ref<HTMLElement>}\n className={descriptionListDetailVariants({ numeric, className })}\n {...props}\n />\n ),\n);\nDescriptionListDetail.displayName = 'DescriptionList.Detail';\n\n/* ------------------------------------------------------------------ */\n/* Compound export */\n/* ------------------------------------------------------------------ */\n\nexport const DescriptionList = Object.assign(DescriptionListRoot, {\n Row: DescriptionListRow,\n Term: DescriptionListTerm,\n Detail: DescriptionListDetail,\n});\n"],"names":["DescriptionListContext","createContext","descriptionListVariants","cva","descriptionListRowVariants","DescriptionListRoot","forwardRef","layout","density","divider","className","children","props","ref","jsx","DescriptionListRow","copyable","copyText","copyLabel","useContext","t","useTranslation","copied","setCopied","useState","announcement","setAnnouncement","handleCopy","useCallback","ariaLabel","jsxs","IconButton","Check","Copy","descriptionListTermVariants","descriptionListDetailVariants","DescriptionListTerm","DescriptionListDetail","numeric","DescriptionList"],"mappings":";;;;;;;AAgBA,MAAMA,IAAyBC,EAA2C;AAAA,EACxE,QAAQ;AAAA,EACR,SAAS;AAAA,EACT,SAAS;AACX,CAAC,GAMKC,IAA0BC,EAAI,uBAAuB;AAAA,EACzD,UAAU;AAAA,IACR,QAAQ;AAAA,MACN,QAAQ;AAAA,MACR,SAAS;AAAA,MACT,YAAY;AAAA,IAAA;AAAA,IAEd,SAAS;AAAA,MACP,SAAS;AAAA,MACT,SAAS;AAAA,IAAA;AAAA,IAEX,SAAS;AAAA,MACP,MAAM;AAAA,MACN,SAAS;AAAA,MACT,UAAU;AAAA,IAAA;AAAA,EACZ;AAAA,EAEF,iBAAiB;AAAA,IACf,QAAQ;AAAA,IACR,SAAS;AAAA,IACT,SAAS;AAAA,EAAA;AAEb,CAAC,GAMKC,IAA6BD,EAAI,IAAI;AAAA,EACzC,UAAU;AAAA,IACR,QAAQ;AAAA,MACN,QAAQ;AAAA,MACR,SAAS;AAAA,MACT,YACE;AAAA,IAAA;AAAA,IAEJ,SAAS;AAAA,MACP,MAAM;AAAA,MACN,SACE;AAAA,MACF,UACE;AAAA,IAAA;AAAA,IAEJ,UAAU;AAAA,MACR,MAAM;AAAA,MACN,OAAO;AAAA,IAAA;AAAA,EACT;AAAA,EAEF,kBAAkB;AAAA,IAChB;AAAA,MACE,QAAQ;AAAA,MACR,UAAU;AAAA,MACV,WAAW;AAAA,IAAA;AAAA,IAEb;AAAA,MACE,QAAQ;AAAA,MACR,UAAU;AAAA,MACV,WAAW;AAAA,IAAA;AAAA,IAEb;AAAA,MACE,QAAQ;AAAA,MACR,UAAU;AAAA,MACV,WAAW;AAAA,IAAA;AAAA,IAEb;AAAA,MACE,QAAQ;AAAA,MACR,UAAU;AAAA,MACV,WAAW;AAAA,IAAA;AAAA,EACb;AAAA,EAEF,iBAAiB;AAAA,IACf,QAAQ;AAAA,IACR,SAAS;AAAA,IACT,UAAU;AAAA,EAAA;AAEd,CAAC,GAgCKE,IAAsBC;AAAA,EAC1B,CACE;AAAA,IACE,QAAAC,IAAS;AAAA,IACT,SAAAC,IAAU;AAAA,IACV,SAAAC,IAAU;AAAA,IACV,WAAAC;AAAA,IACA,UAAAC;AAAA,IACA,GAAGC;AAAA,EAAA,GAELC,MAEA,gBAAAC,EAACd,EAAuB,UAAvB,EAAgC,OAAO,EAAE,QAAAO,GAAQ,SAAAC,GAAS,SAAAC,EAAA,GACzD,UAAA,gBAAAK;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,KAAAD;AAAA,MACA,WAAWX,EAAwB,EAAE,QAAAK,GAAQ,SAAAC,GAAS,SAAAC,GAAS,WAAAC,GAAW;AAAA,MACzE,GAAGE;AAAA,MAEH,UAAAD;AAAA,IAAA;AAAA,EAAA,GAEL;AAEJ;AACAN,EAAoB,cAAc;AAMlC,MAAMU,IAAqBT;AAAA,EACzB,CACE;AAAA,IACE,UAAAU,IAAW;AAAA,IACX,UAAAC;AAAA,IACA,WAAAC;AAAA,IACA,WAAAR;AAAA,IACA,UAAAC;AAAA,IACA,GAAGC;AAAA,EAAA,GAELC,MACG;AACH,UAAM,EAAE,QAAAN,GAAQ,SAAAE,MAAYU,EAAWnB,CAAsB,GACvD,EAAE,GAAAoB,EAAA,IAAMC,EAAA,GACR,CAACC,GAAQC,CAAS,IAAIC,EAAS,EAAK,GACpC,CAACC,GAAcC,CAAe,IAAIF,EAAS,EAAE,GAE7CG,IAAaC,EAAY,YAAY;AACzC,UAAKX;AAQL,YAAI;AACF,gBAAM,UAAU,UAAU,UAAUA,CAAQ,GAC5CM,EAAU,EAAI,GACdG,EAAgBN,EAAE,wBAAwB,CAAC,GAC3C,WAAW,MAAM;AACf,YAAAG,EAAU,EAAK,GACfG,EAAgB,EAAE;AAAA,UACpB,GAAG,GAAI;AAAA,QACT,QAAQ;AACN,UAAAA,EAAgBN,EAAE,8BAA8B,CAAC,GACjD,WAAW,MAAMM,EAAgB,EAAE,GAAG,GAAI;AAAA,QAC5C;AAAA,IACF,GAAG,CAACT,GAAUG,CAAC,CAAC,GAEVS,IAAYT,EAAE,wBAAwB,EAAE,OAAOF,KAAaD,KAAY,IAAI;AAElF,WACE,gBAAAa;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,KAAAjB;AAAA,QACA,WAAWT,EAA2B,EAAE,QAAAG,GAAQ,SAAAE,GAAS,UAAAO,GAAU,WAAAN,GAAW;AAAA,QAC7E,GAAGE;AAAA,QAEH,UAAA;AAAA,UAAAD;AAAA,UACAK,KACC,gBAAAF;AAAA,YAACiB;AAAA,YAAA;AAAA,cACC,MAAMT,IAAS,gBAAAR,EAACkB,GAAA,CAAA,CAAM,sBAAMC,GAAA,EAAK;AAAA,cACjC,MAAK;AAAA,cACL,cAAYJ;AAAA,cACZ,SAASF;AAAA,cACT,QAAO;AAAA,cACP,WAAU;AAAA,YAAA;AAAA,UAAA;AAAA,UAGbX,KACC,gBAAAF,EAAC,QAAA,EAAK,MAAK,UAAS,WAAU,cAC3B,UAAAW,EAAA,CACH;AAAA,QAAA;AAAA,MAAA;AAAA,IAAA;AAAA,EAIR;AACF;AACAV,EAAmB,cAAc;AAMjC,MAAMmB,IAA8B/B;AAAA,EAClC;AACF,GAMMgC,IAAgChC;AAAA,EACpC;AAAA,EACA;AAAA,IACE,UAAU;AAAA,MACR,SAAS;AAAA,QACP,MAAM;AAAA,QACN,OAAO;AAAA,MAAA;AAAA,IACT;AAAA,IAEF,iBAAiB;AAAA,MACf,SAAS;AAAA,IAAA;AAAA,EACX;AAEJ,GAMMiC,IAAsB9B;AAAA,EAC1B,CAAC,EAAE,WAAAI,GAAW,GAAGE,EAAA,GAASC,MACxB,gBAAAC;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,KAAAD;AAAA,MACA,WAAWqB,EAA4B,EAAE,WAAAxB,GAAW;AAAA,MACnD,GAAGE;AAAA,IAAA;AAAA,EAAA;AAGV;AACAwB,EAAoB,cAAc;AAMlC,MAAMC,IAAwB/B;AAAA,EAC5B,CAAC,EAAE,SAAAgC,IAAU,IAAO,WAAA5B,GAAW,GAAGE,EAAA,GAASC,MACzC,gBAAAC;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,KAAAD;AAAA,MACA,WAAWsB,EAA8B,EAAE,SAAAG,GAAS,WAAA5B,GAAW;AAAA,MAC9D,GAAGE;AAAA,IAAA;AAAA,EAAA;AAGV;AACAyB,EAAsB,cAAc;AAM7B,MAAME,IAAkB,OAAO,OAAOlC,GAAqB;AAAA,EAChE,KAAKU;AAAA,EACL,MAAMqB;AAAA,EACN,QAAQC;AACV,CAAC;"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"dropdown-menu-BnVUeVG3.js","sources":["../../src/components/dropdown-menu/dropdown-menu.tsx"],"sourcesContent":["import {\n forwardRef,\n type ComponentPropsWithoutRef,\n type ElementRef,\n type ReactNode,\n} from 'react';\nimport * as RadixDropdownMenu from '@radix-ui/react-dropdown-menu';\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport { Check, ChevronRight } from 'lucide-react';\nimport { Separator as DsSeparator } from '../separator/separator';\nimport { Kbd, type KbdNamedKey } from '../kbd/kbd';\nimport { useDocumentDirection } from '../_shared/use-direction';\n\n/* ------------------------------------------------------------------ */\n/* CVA */\n/* ------------------------------------------------------------------ */\n\nconst contentVariants = cva(\n [\n 'ds:z-[var(--z-dropdown)]',\n 'ds:min-w-[8rem]',\n 'ds:rounded-[var(--radius-md)]',\n 'ds:border ds:border-[color:var(--border)]',\n 'ds:bg-[var(--popover)] ds:text-[color:var(--popover-foreground)]',\n 'ds:shadow-[var(--shadow-lg)]',\n 'ds:p-[var(--spacing-xs)]',\n // Motion — gated on --animation-duration via Tailwind's animate-in\n // preset. motion-reduce disables via the no-preference query.\n 'ds:data-[state=open]:animate-in ds:data-[state=closed]:animate-out',\n 'ds:data-[state=open]:fade-in ds:data-[state=closed]:fade-out',\n 'ds:data-[state=open]:zoom-in-95 ds:data-[state=closed]:zoom-out-95',\n 'ds:motion-reduce:animate-none',\n 'ds:forced-colors:border-[CanvasText]',\n ].join(' '),\n);\n\nconst itemClasses = cva(\n [\n 'ds:relative ds:flex ds:items-center ds:gap-[var(--spacing-sm)]',\n 'ds:ps-[var(--spacing-sm)] ds:pe-[var(--spacing-sm)]',\n 'ds:pt-[var(--spacing-xs)] ds:pb-[var(--spacing-xs)]',\n 'ds:rounded-[var(--radius-sm)]',\n 'ds:min-h-[var(--min-target-size)]',\n 'ds:text-[length:var(--font-size-sm)] ds:text-[color:var(--foreground)]',\n 'ds:cursor-pointer ds:select-none ds:outline-none',\n // Highlighted + hover state\n 'ds:data-[highlighted]:bg-[color:var(--muted)]/40',\n 'ds:focus-visible:outline-[length:var(--focus-ring-width)]',\n 'ds:focus-visible:outline-solid ds:focus-visible:outline-[color:var(--ring)]',\n 'ds:focus-visible:outline-offset-[length:var(--focus-ring-offset)]',\n 'ds:forced-colors:focus-visible:outline-[CanvasText]',\n // Disabled\n 'ds:data-[disabled]:opacity-50 ds:data-[disabled]:cursor-not-allowed',\n 'ds:data-[disabled]:pointer-events-none',\n ].join(' '),\n);\n\nconst labelClasses = cva(\n [\n 'ds:ps-[var(--spacing-sm)] ds:pe-[var(--spacing-sm)]',\n 'ds:pt-[var(--spacing-xs)] ds:pb-[var(--spacing-xs)]',\n 'type-eyebrow ds:text-[color:var(--muted-foreground)]',\n 'ds:select-none',\n ].join(' '),\n);\n\nconst indicatorSlotClasses =\n 'inline-flex items-center justify-center size-4 shrink-0';\n\n/* ------------------------------------------------------------------ */\n/* Root / Trigger / Portal */\n/* ------------------------------------------------------------------ */\n\ntype DropdownMenuRootProps = ComponentPropsWithoutRef<typeof RadixDropdownMenu.Root>;\n\nconst Root = ({ dir, ...props }: DropdownMenuRootProps) => {\n const autoDir = useDocumentDirection();\n return <RadixDropdownMenu.Root dir={dir ?? autoDir} {...props} />;\n};\nRoot.displayName = 'DropdownMenu.Root';\n\nconst Trigger = RadixDropdownMenu.Trigger;\nconst Portal = RadixDropdownMenu.Portal;\nconst RadixGroup = RadixDropdownMenu.Group;\nconst RadixRadioGroup = RadixDropdownMenu.RadioGroup;\n\n/* ------------------------------------------------------------------ */\n/* Content */\n/* ------------------------------------------------------------------ */\n\nexport interface DropdownMenuContentProps\n extends ComponentPropsWithoutRef<typeof RadixDropdownMenu.Content>,\n VariantProps<typeof contentVariants> {}\n\nconst Content = forwardRef<\n ElementRef<typeof RadixDropdownMenu.Content>,\n DropdownMenuContentProps\n>(({ className, sideOffset = 8, ...props }, ref) => (\n <RadixDropdownMenu.Portal>\n <RadixDropdownMenu.Content\n ref={ref}\n sideOffset={sideOffset}\n className={contentVariants({ className })}\n {...props}\n />\n </RadixDropdownMenu.Portal>\n));\nContent.displayName = 'DropdownMenu.Content';\n\n/* ------------------------------------------------------------------ */\n/* Item */\n/* ------------------------------------------------------------------ */\n\nexport interface DropdownMenuItemProps\n extends ComponentPropsWithoutRef<typeof RadixDropdownMenu.Item> {\n startIcon?: ReactNode;\n endIcon?: ReactNode;\n description?: ReactNode;\n /** Convenience — renders a DS <Kbd keys={…}> on the inline-end. */\n shortcut?: Array<KbdNamedKey | string>;\n}\n\nconst Item = forwardRef<\n ElementRef<typeof RadixDropdownMenu.Item>,\n DropdownMenuItemProps\n>(\n (\n { className, startIcon, endIcon, description, shortcut, children, ...props },\n ref,\n ) => (\n <RadixDropdownMenu.Item\n ref={ref}\n className={itemClasses({ className })}\n {...props}\n >\n {startIcon ? (\n <span\n aria-hidden=\"true\"\n className=\"ds:inline-flex ds:size-4 ds:shrink-0 ds:items-center ds:justify-center\"\n >\n {startIcon}\n </span>\n ) : null}\n <span className=\"ds:flex-1 ds:flex ds:flex-col ds:min-w-0\">\n <span className=\"ds:truncate\">{children}</span>\n {description ? (\n <span className=\"type-meta ds:text-[color:var(--muted-foreground)] ds:truncate\">\n {description}\n </span>\n ) : null}\n </span>\n {shortcut ? (\n <span className=\"ds:ms-auto\">\n <Kbd keys={shortcut} size=\"sm\" />\n </span>\n ) : endIcon ? (\n <span\n aria-hidden=\"true\"\n className=\"ds:ms-auto ds:inline-flex ds:size-4 ds:shrink-0 ds:items-center ds:justify-center\"\n >\n {endIcon}\n </span>\n ) : null}\n </RadixDropdownMenu.Item>\n ),\n);\nItem.displayName = 'DropdownMenu.Item';\n\n/* ------------------------------------------------------------------ */\n/* CheckboxItem */\n/* ------------------------------------------------------------------ */\n\nexport interface DropdownMenuCheckboxItemProps\n extends ComponentPropsWithoutRef<typeof RadixDropdownMenu.CheckboxItem> {}\n\nconst CheckboxItem = forwardRef<\n ElementRef<typeof RadixDropdownMenu.CheckboxItem>,\n DropdownMenuCheckboxItemProps\n>(({ className, children, ...props }, ref) => (\n <RadixDropdownMenu.CheckboxItem\n ref={ref}\n className={itemClasses({ className })}\n {...props}\n >\n <span className={indicatorSlotClasses}>\n <RadixDropdownMenu.ItemIndicator>\n <Check aria-hidden className=\"ds:size-4\" />\n </RadixDropdownMenu.ItemIndicator>\n </span>\n <span className=\"ds:flex-1 ds:truncate\">{children}</span>\n </RadixDropdownMenu.CheckboxItem>\n));\nCheckboxItem.displayName = 'DropdownMenu.CheckboxItem';\n\n/* ------------------------------------------------------------------ */\n/* RadioGroup / RadioItem */\n/* ------------------------------------------------------------------ */\n\nconst RadioGroup = RadixRadioGroup;\n\nexport interface DropdownMenuRadioItemProps\n extends ComponentPropsWithoutRef<typeof RadixDropdownMenu.RadioItem> {}\n\nconst RadioItem = forwardRef<\n ElementRef<typeof RadixDropdownMenu.RadioItem>,\n DropdownMenuRadioItemProps\n>(({ className, children, ...props }, ref) => (\n <RadixDropdownMenu.RadioItem\n ref={ref}\n className={itemClasses({ className })}\n {...props}\n >\n <span className={indicatorSlotClasses}>\n <RadixDropdownMenu.ItemIndicator>\n <Check\n aria-hidden\n className=\"ds:size-4 ds:text-[color:var(--accent)]\"\n />\n </RadixDropdownMenu.ItemIndicator>\n </span>\n <span className=\"ds:flex-1 ds:truncate\">{children}</span>\n </RadixDropdownMenu.RadioItem>\n));\nRadioItem.displayName = 'DropdownMenu.RadioItem';\n\n/* ------------------------------------------------------------------ */\n/* Label */\n/* ------------------------------------------------------------------ */\n\nexport interface DropdownMenuLabelProps\n extends ComponentPropsWithoutRef<typeof RadixDropdownMenu.Label> {}\n\nconst Label = forwardRef<\n ElementRef<typeof RadixDropdownMenu.Label>,\n DropdownMenuLabelProps\n>(({ className, ...props }, ref) => (\n <RadixDropdownMenu.Label\n ref={ref}\n className={labelClasses({ className })}\n {...props}\n />\n));\nLabel.displayName = 'DropdownMenu.Label';\n\n/* ------------------------------------------------------------------ */\n/* Separator */\n/* ------------------------------------------------------------------ */\n\nexport interface DropdownMenuSeparatorProps\n extends ComponentPropsWithoutRef<typeof RadixDropdownMenu.Separator> {}\n\nconst MenuSeparator = forwardRef<\n ElementRef<typeof RadixDropdownMenu.Separator>,\n DropdownMenuSeparatorProps\n>(({ className, ...props }, ref) => (\n <RadixDropdownMenu.Separator ref={ref} asChild {...props}>\n <DsSeparator\n className={['ds:my-[calc(var(--spacing-xs)/2)]', className ?? '']\n .filter(Boolean)\n .join(' ')}\n />\n </RadixDropdownMenu.Separator>\n));\nMenuSeparator.displayName = 'DropdownMenu.Separator';\n\n/* ------------------------------------------------------------------ */\n/* Shortcut — thin wrapper over DS Kbd for the right side of an Item */\n/* ------------------------------------------------------------------ */\n\nexport interface DropdownMenuShortcutProps {\n keys: Array<KbdNamedKey | string>;\n separator?: 'none' | 'plus' | 'then';\n}\n\nconst Shortcut = forwardRef<HTMLSpanElement, DropdownMenuShortcutProps>(\n ({ keys, separator = 'none' }, ref) => (\n <span ref={ref} className=\"ds:ms-auto ds:ps-[var(--spacing-sm)]\">\n <Kbd keys={keys} separator={separator} size=\"sm\" />\n </span>\n ),\n);\nShortcut.displayName = 'DropdownMenu.Shortcut';\n\n/* ------------------------------------------------------------------ */\n/* Sub-menu */\n/* ------------------------------------------------------------------ */\n\nconst Sub = RadixDropdownMenu.Sub;\n\nexport interface DropdownMenuSubTriggerProps\n extends ComponentPropsWithoutRef<typeof RadixDropdownMenu.SubTrigger> {\n startIcon?: ReactNode;\n}\n\nconst SubTrigger = forwardRef<\n ElementRef<typeof RadixDropdownMenu.SubTrigger>,\n DropdownMenuSubTriggerProps\n>(({ className, startIcon, children, ...props }, ref) => (\n <RadixDropdownMenu.SubTrigger\n ref={ref}\n className={itemClasses({ className })}\n {...props}\n >\n {startIcon ? (\n <span\n aria-hidden=\"true\"\n className=\"ds:inline-flex ds:size-4 ds:shrink-0 ds:items-center ds:justify-center\"\n >\n {startIcon}\n </span>\n ) : null}\n <span className=\"ds:flex-1 ds:truncate\">{children}</span>\n <ChevronRight\n aria-hidden\n className=\"ds:ms-auto ds:size-4 ds:shrink-0 ds:rtl:-scale-x-100\"\n />\n </RadixDropdownMenu.SubTrigger>\n));\nSubTrigger.displayName = 'DropdownMenu.SubTrigger';\n\nexport interface DropdownMenuSubContentProps\n extends ComponentPropsWithoutRef<typeof RadixDropdownMenu.SubContent> {}\n\nconst SubContent = forwardRef<\n ElementRef<typeof RadixDropdownMenu.SubContent>,\n DropdownMenuSubContentProps\n>(({ className, ...props }, ref) => (\n <RadixDropdownMenu.Portal>\n <RadixDropdownMenu.SubContent\n ref={ref}\n sideOffset={8}\n className={contentVariants({ className })}\n {...props}\n />\n </RadixDropdownMenu.Portal>\n));\nSubContent.displayName = 'DropdownMenu.SubContent';\n\n/* ------------------------------------------------------------------ */\n/* Assembled namespace export */\n/* ------------------------------------------------------------------ */\n\nexport const DropdownMenu = {\n Root,\n Trigger,\n Portal,\n Content,\n Group: RadixGroup,\n Item,\n CheckboxItem,\n RadioGroup,\n RadioItem,\n Label,\n Separator: MenuSeparator,\n Shortcut,\n Sub,\n SubTrigger,\n SubContent,\n};\n"],"names":["contentVariants","cva","itemClasses","labelClasses","indicatorSlotClasses","Root","dir","props","autoDir","useDocumentDirection","jsx","RadixDropdownMenu","Trigger","Portal","RadixGroup","RadixRadioGroup","Content","forwardRef","className","sideOffset","ref","Item","startIcon","endIcon","description","shortcut","children","jsxs","Kbd","CheckboxItem","Check","RadioGroup","RadioItem","Label","MenuSeparator","DsSeparator","Shortcut","keys","separator","Sub","SubTrigger","ChevronRight","SubContent","DropdownMenu"],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"form-field-DI5LY5aG.js","sources":["../../src/components/form-field/form-field.tsx"],"sourcesContent":["import { forwardRef, useId, useMemo, type HTMLAttributes } from 'react';\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport { useTranslation } from 'react-i18next';\nimport { AlertCircle } from 'lucide-react';\nimport {\n FormFieldContext,\n type FormFieldContextShape,\n} from './form-field-context';\n\nconst fieldVariants = cva('ds:text-start', {\n variants: {\n orientation: {\n vertical: 'ds:flex ds:flex-col ds:gap-[var(--spacing-xs)]',\n horizontal:\n 'ds:grid ds:grid-cols-[minmax(0,var(--form-label-inline-size))_minmax(0,1fr)] ds:items-start ds:gap-x-[var(--spacing-md)] ds:gap-y-[var(--spacing-xs)]',\n },\n disabled: {\n true: 'ds:opacity-50 ds:cursor-not-allowed',\n false: '',\n },\n },\n defaultVariants: {\n orientation: 'vertical',\n disabled: false,\n },\n});\n\nconst slotsVariants = cva('ds:flex ds:flex-col ds:gap-[var(--spacing-xs)]', {\n variants: {\n orientation: {\n vertical: '',\n horizontal: 'ds:min-w-0',\n },\n },\n defaultVariants: {\n orientation: 'vertical',\n },\n});\n\ntype RequiredIndicator =\n | { required?: boolean; optional?: never }\n | { required?: never; optional?: boolean };\n\ninterface BaseFormFieldProps\n extends Omit<HTMLAttributes<HTMLDivElement>, 'children'>,\n Omit<VariantProps<typeof fieldVariants>, 'disabled'> {\n label: string;\n description?: string;\n error?: string;\n disabled?: boolean;\n children: React.ReactNode;\n}\n\nexport type FormFieldProps = BaseFormFieldProps & RequiredIndicator;\n\nexport const FormField = forwardRef<HTMLDivElement, FormFieldProps>(\n (props, ref) => {\n const {\n label,\n description,\n error,\n required = false,\n optional = false,\n orientation = 'vertical',\n disabled = false,\n className,\n children,\n ...rest\n } = props as BaseFormFieldProps & {\n required?: boolean;\n optional?: boolean;\n };\n\n const { t } = useTranslation();\n const id = useId();\n const helpId = `${id}-help`;\n const errorId = `${id}-error`;\n const invalid = Boolean(error);\n\n const describedBy = useMemo(\n () =>\n [description ? helpId : null, error ? errorId : null]\n .filter(Boolean)\n .join(' '),\n [description, error, helpId, errorId],\n );\n\n const ctx: FormFieldContextShape = useMemo(\n () => ({\n id,\n helpId,\n errorId,\n describedBy,\n invalid,\n required,\n disabled,\n }),\n [id, helpId, errorId, describedBy, invalid, required, disabled],\n );\n\n return (\n <FormFieldContext.Provider value={ctx}>\n <div\n ref={ref}\n className={fieldVariants({ orientation, disabled, className })}\n {...rest}\n >\n <label\n htmlFor={id}\n className=\"type-label ds:text-foreground\"\n >\n {label}\n {required && (\n <span\n aria-hidden=\"true\"\n className=\"ds:text-destructive ds:ms-[var(--spacing-xs)]\"\n >\n *\n </span>\n )}\n {optional && (\n <span className=\"ds:text-muted-foreground ds:ms-[var(--spacing-xs)] ds:font-normal\">\n ({t('ui.common.optional', 'optional')})\n </span>\n )}\n </label>\n <div className={slotsVariants({ orientation })}>\n {children}\n {description && (\n <p id={helpId} className=\"type-body-sm ds:text-muted-foreground\">\n {description}\n </p>\n )}\n {error && (\n <p\n id={errorId}\n role=\"alert\"\n className=\"ds:inline-flex ds:items-center ds:gap-[var(--spacing-xs)] type-body-sm ds:text-destructive\"\n >\n <AlertCircle\n aria-hidden=\"true\"\n className=\"ds:size-4 ds:shrink-0\"\n />\n <span>{error}</span>\n </p>\n )}\n </div>\n </div>\n </FormFieldContext.Provider>\n );\n },\n);\n\nFormField.displayName = 'FormField';\n"],"names":["fieldVariants","cva","slotsVariants","FormField","forwardRef","props","ref","label","description","error","required","optional","orientation","disabled","className","children","rest","t","useTranslation","id","useId","helpId","errorId","invalid","describedBy","useMemo","ctx","jsx","FormFieldContext","jsxs","AlertCircle"],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"freemium-paywall-CCsX3GhK.js","sources":["../../src/components/freemium-paywall/freemium-paywall.tsx"],"sourcesContent":["import {\n forwardRef,\n useId,\n useState,\n type ReactNode,\n} from 'react';\nimport * as RadixAlertDialog from '@radix-ui/react-alert-dialog';\nimport * as RadixRadioGroup from '@radix-ui/react-radio-group';\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport { useTranslation } from 'react-i18next';\nimport { AlertTriangle, Check } from 'lucide-react';\nimport { Button } from '../button';\nimport { Progress } from '../progress';\nimport { formatPaymentAmount } from '../payment-form';\n\n/* ------------------------------------------------------------------ */\n/* Types */\n/* ------------------------------------------------------------------ */\n\nexport interface FreemiumPlan {\n id: string;\n /** Translation key for the plan name (e.g. `app.paywall.plans.pro`). */\n nameKey: string;\n /** Amount in minor units (cents, centesimi). */\n priceAmount: number;\n /** ISO 4217 currency code. */\n currency: string;\n /** Translation key for the cadence suffix (e.g. `app.paywall.period.month`). */\n perKey?: string;\n /** Per-line feature translation keys. */\n featuresKeys?: string[];\n}\n\nconst contentVariants = cva(\n [\n 'ds:fixed ds:z-[var(--z-modal)] ds:overflow-auto',\n 'ds:bg-[color:var(--popover)] ds:text-[color:var(--popover-foreground)]',\n 'ds:border ds:border-border ds:shadow-[var(--shadow-lg)]',\n // forced-colors: keep the dialog boundary visible under Windows High\n // Contrast, where `var(--border)` may collapse to system colours.\n 'ds:forced-colors:border-[CanvasText]',\n 'ds:focus:outline-none',\n ].join(' '),\n {\n variants: {\n layout: {\n centered:\n 'ds:start-1/2 ds:top-1/2 ds:-translate-x-1/2 ds:-translate-y-1/2 ds:rtl:translate-x-1/2 ds:rounded-[var(--radius-md)] ds:max-w-[var(--dialog-width-xl)] ds:w-[calc(100vw-2rem)] ds:max-h-[90vh]',\n sheet:\n 'ds:inset-inline-0 ds:bottom-0 ds:w-full ds:max-h-[90vh] ds:rounded-t-[var(--radius-md)]',\n },\n density: {\n compact: 'ds:ps-[var(--spacing-md)] ds:pe-[var(--spacing-md)] ds:pt-[var(--spacing-md)] ds:pb-[var(--spacing-md)]',\n full: 'ds:ps-[var(--spacing-lg)] ds:pe-[var(--spacing-lg)] ds:pt-[var(--spacing-lg)] ds:pb-[var(--spacing-lg)]',\n },\n },\n defaultVariants: { layout: 'centered', density: 'full' },\n },\n);\n\nexport interface FreemiumPaywallProps\n extends VariantProps<typeof contentVariants> {\n open: boolean;\n onOpenChange: (open: boolean) => void;\n plans: FreemiumPlan[];\n /** Currently-selected plan id (controlled) or default. */\n selectedPlanId?: string;\n defaultSelectedPlanId?: string;\n onSelectedPlanChange?: (id: string) => void;\n /** Usage indicator values — omit the object to hide the bar. */\n usage?: { used: number; limit: number };\n /** Fires on upgrade. */\n onUpgrade: (planId: string) => void;\n /** Fires when the user dismisses via Not Now. */\n onCancel?: () => void;\n /** Title override; defaults to t('ui.paywall.title'). */\n title?: ReactNode;\n /** Description override; defaults to t('ui.paywall.description'). */\n description?: ReactNode;\n className?: string;\n}\n\nexport const FreemiumPaywall = forwardRef<HTMLDivElement, FreemiumPaywallProps>(\n (\n {\n open,\n onOpenChange,\n plans,\n selectedPlanId,\n defaultSelectedPlanId,\n onSelectedPlanChange,\n usage,\n onUpgrade,\n onCancel,\n title,\n description,\n layout = 'centered',\n density = 'full',\n className,\n },\n ref,\n ) => {\n const { t, i18n } = useTranslation();\n const titleId = useId();\n const descId = useId();\n\n const isControlled = selectedPlanId !== undefined;\n const [internalSelected, setInternalSelected] = useState<string>(\n defaultSelectedPlanId ?? plans[0]?.id ?? '',\n );\n const currentSelected = isControlled\n ? selectedPlanId ?? ''\n : internalSelected;\n\n const handleSelectedChange = (next: string) => {\n if (!isControlled) setInternalSelected(next);\n onSelectedPlanChange?.(next);\n };\n\n const handleCancel = () => {\n onCancel?.();\n onOpenChange(false);\n };\n\n const handleUpgrade = () => {\n if (!currentSelected) return;\n onUpgrade(currentSelected);\n };\n\n const usagePercent = usage\n ? Math.min(100, Math.max(0, (usage.used / Math.max(1, usage.limit)) * 100))\n : 0;\n const usageFull = usage ? usage.used >= usage.limit : false;\n\n return (\n <RadixAlertDialog.Root open={open} onOpenChange={onOpenChange}>\n <RadixAlertDialog.Portal>\n <RadixAlertDialog.Overlay\n className={[\n 'ds:fixed ds:inset-0 ds:z-[var(--z-modal-backdrop)]',\n 'ds:bg-[color:var(--foreground)]/40',\n 'ds:motion-safe:data-[state=open]:animate-in ds:motion-safe:data-[state=closed]:animate-out',\n 'ds:[.theme-accessible_&]:animate-none',\n ].join(' ')}\n />\n <RadixAlertDialog.Content\n ref={ref}\n aria-labelledby={titleId}\n aria-describedby={descId}\n className={contentVariants({ layout, density, className })}\n >\n <RadixAlertDialog.Title id={titleId} asChild>\n <h2 className=\"type-title-card\">\n {title ?? t('ui.paywall.title')}\n </h2>\n </RadixAlertDialog.Title>\n <RadixAlertDialog.Description id={descId} asChild>\n <p className=\"ds:mt-[var(--spacing-xs)] ds:text-[color:var(--muted-foreground)]\">\n {description ?? t('ui.paywall.description')}\n </p>\n </RadixAlertDialog.Description>\n\n {usage ? (\n <div className=\"ds:mt-[var(--spacing-md)]\">\n <div className=\"ds:flex ds:items-center ds:gap-[var(--spacing-xs)] ds:mb-[var(--spacing-xs)]\">\n {usageFull ? (\n <AlertTriangle\n aria-hidden=\"true\"\n className=\"ds:size-4 ds:text-[color:var(--destructive)]\"\n />\n ) : null}\n <span\n className={[\n 'type-body-sm',\n usageFull\n ? 'ds:text-[color:var(--destructive)]'\n : 'ds:text-[color:var(--muted-foreground)]',\n ].join(' ')}\n >\n {usageFull\n ? t('ui.paywall.usageFull')\n : t('ui.paywall.usageLabel', {\n used: usage.used,\n limit: usage.limit,\n })}\n </span>\n </div>\n <Progress\n value={usagePercent}\n max={100}\n ariaLabel={t('ui.paywall.usageLabel', {\n used: usage.used,\n limit: usage.limit,\n })}\n className={usageFull ? 'ds:[&_[role=progressbar]>*]:bg-[color:var(--destructive)]' : ''}\n />\n </div>\n ) : null}\n\n <RadixRadioGroup.Root\n value={currentSelected}\n onValueChange={handleSelectedChange}\n aria-label={t('ui.paywall.title')}\n className=\"ds:mt-[var(--spacing-md)] ds:flex ds:flex-col ds:gap-[var(--spacing-sm)]\"\n >\n {plans.map((plan) => {\n // Reuse the payment-form helper — it knows about\n // zero-decimal currencies (JPY, KRW, VND …) and applies\n // the right divisor. Raw `/ 100` would 100× the price in\n // those currencies.\n const formattedPrice = formatPaymentAmount(\n plan.priceAmount,\n plan.currency,\n i18n.language,\n );\n const period = plan.perKey ? t(plan.perKey) : undefined;\n const priceLine = period\n ? t('ui.paywall.pricePer', { price: formattedPrice, period })\n : formattedPrice;\n const planName = t(plan.nameKey);\n return (\n <RadixRadioGroup.Item\n key={plan.id}\n value={plan.id}\n className={[\n 'ds:group ds:relative ds:flex ds:flex-col ds:items-stretch',\n 'ds:rounded-[var(--radius-md)] ds:border ds:border-border',\n 'ds:ps-[var(--spacing-md)] ds:pe-[var(--spacing-md)] ds:pt-[var(--spacing-sm)] ds:pb-[var(--spacing-sm)]',\n 'ds:text-start ds:bg-[color:var(--card)] ds:text-[color:var(--card-foreground)]',\n 'ds:data-[state=checked]:border-[color:var(--primary)]',\n 'ds:data-[state=checked]:bg-[color:var(--primary)]/5',\n 'ds:focus-visible:outline-[length:var(--focus-ring-width)] ds:focus-visible:outline-solid',\n 'ds:focus-visible:outline-[color:var(--ring)] ds:focus-visible:outline-offset-[length:var(--focus-ring-offset)]',\n ].join(' ')}\n >\n <span className=\"ds:flex ds:items-center ds:justify-between ds:gap-[var(--spacing-sm)]\">\n <span className=\"ds:font-semibold\">{planName}</span>\n <span className=\"ds:tabular-nums\">{priceLine}</span>\n </span>\n {plan.featuresKeys && plan.featuresKeys.length > 0 ? (\n <ul\n aria-label={t('ui.paywall.features')}\n className=\"ds:mt-[var(--spacing-xs)] ds:flex ds:flex-col ds:gap-[var(--spacing-xs)]\"\n >\n {plan.featuresKeys.map((key, i) => (\n <li\n key={i}\n className=\"ds:flex ds:items-start ds:gap-[var(--spacing-xs)] type-body-sm\"\n >\n <Check\n aria-hidden=\"true\"\n className=\"ds:size-4 ds:shrink-0 ds:text-[color:var(--primary)] ds:mt-[1px]\"\n />\n <span>{t(key)}</span>\n </li>\n ))}\n </ul>\n ) : null}\n </RadixRadioGroup.Item>\n );\n })}\n </RadixRadioGroup.Root>\n\n <div className=\"ds:mt-[var(--spacing-lg)] ds:flex ds:items-center ds:gap-[var(--spacing-sm)] ds:justify-end\">\n <RadixAlertDialog.Cancel asChild>\n <Button intent=\"outline\" onClick={handleCancel}>\n {t('ui.paywall.notNow')}\n </Button>\n </RadixAlertDialog.Cancel>\n <RadixAlertDialog.Action asChild>\n <Button intent=\"primary\" onClick={handleUpgrade}>\n {t('ui.paywall.upgrade')}\n </Button>\n </RadixAlertDialog.Action>\n </div>\n </RadixAlertDialog.Content>\n </RadixAlertDialog.Portal>\n </RadixAlertDialog.Root>\n );\n },\n);\n\nFreemiumPaywall.displayName = 'FreemiumPaywall';\n"],"names":["contentVariants","cva","FreemiumPaywall","forwardRef","open","onOpenChange","plans","selectedPlanId","defaultSelectedPlanId","onSelectedPlanChange","usage","onUpgrade","onCancel","title","description","layout","density","className","ref","t","i18n","useTranslation","titleId","useId","descId","isControlled","internalSelected","setInternalSelected","useState","_a","currentSelected","handleSelectedChange","next","handleCancel","handleUpgrade","usagePercent","usageFull","jsx","RadixAlertDialog","jsxs","AlertTriangle","Progress","RadixRadioGroup","plan","formattedPrice","formatPaymentAmount","period","priceLine","planName","key","i","Check","Button"],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"icon-button-SWpSs9S6.js","sources":["../../src/components/button/icon-button.tsx"],"sourcesContent":["import { forwardRef } from 'react';\nimport { Button, type ButtonProps } from './button';\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport { Tooltip } from '../tooltip';\n\nconst iconButtonVariants = cva('ds:p-0', {\n variants: {\n size: {\n sm: 'ds:w-8 ds:h-8',\n md: 'ds:w-10 ds:h-10',\n lg: 'ds:w-12 ds:h-12',\n },\n },\n defaultVariants: {\n size: 'md',\n },\n});\n\nexport type IconButtonProps = Omit<\n ButtonProps,\n 'startIcon' | 'endIcon' | 'children' | 'size' | 'flipIconInRtl'\n> &\n VariantProps<typeof iconButtonVariants> & {\n icon: React.ReactNode;\n tooltip?: string;\n 'aria-label'?: string;\n /**\n * Mirror the icon horizontally in RTL. Default `false` — only enable\n * for directional glyphs (arrows, chevrons). See Button.flipIconInRtl.\n */\n flipIconInRtl?: boolean;\n };\n\nexport const IconButton = forwardRef<HTMLButtonElement, IconButtonProps>(\n (\n { icon, size, intent = 'outline', className, tooltip, flipIconInRtl = false, ...props },\n ref,\n ) => {\n const ariaLabel = props['aria-label'] || tooltip;\n\n if (import.meta.env.DEV && !ariaLabel) {\n console.warn('IconButton: aria-label or tooltip prop is required for accessibility.');\n }\n\n const iconSizeClass =\n size === 'sm' ? 'size-4' : size === 'lg' ? 'size-5' : 'size-[18px]';\n const iconFlipClass = flipIconInRtl ? 'rtl:rotate-180' : '';\n\n const button = (\n <Button\n ref={ref}\n size={size}\n intent={intent}\n className={iconButtonVariants({ size, className })}\n aria-label={ariaLabel}\n {...props}\n >\n <span\n aria-hidden=\"true\"\n className={`ds:inline-flex ds:items-center ds:justify-center ${iconSizeClass} ${iconFlipClass}`.trim()}\n >\n {icon}\n </span>\n </Button>\n );\n\n if (tooltip) {\n return <Tooltip label={tooltip}>{button}</Tooltip>;\n }\n\n return button;\n },\n);\n\nIconButton.displayName = 'IconButton';\n"],"names":["iconButtonVariants","cva","IconButton","forwardRef","icon","size","intent","className","tooltip","flipIconInRtl","props","ref","ariaLabel","iconSizeClass","iconFlipClass","button","jsx","Button","Tooltip"],"mappings":";;;;;AAKA,MAAMA,IAAqBC,EAAI,UAAU;AAAA,EACvC,UAAU;AAAA,IACR,MAAM;AAAA,MACJ,IAAI;AAAA,MACJ,IAAI;AAAA,MACJ,IAAI;AAAA,IAAA;AAAA,EACN;AAAA,EAEF,iBAAiB;AAAA,IACf,MAAM;AAAA,EAAA;AAEV,CAAC,GAiBYC,IAAaC;AAAA,EACxB,CACE,EAAE,MAAAC,GAAM,MAAAC,GAAM,QAAAC,IAAS,WAAW,WAAAC,GAAW,SAAAC,GAAS,eAAAC,IAAgB,IAAO,GAAGC,EAAA,GAChFC,MACG;AACH,UAAMC,IAAYF,EAAM,YAAY,KAAKF,GAMnCK,IACJR,MAAS,OAAO,WAAWA,MAAS,OAAO,WAAW,eAClDS,IAAgBL,IAAgB,mBAAmB,IAEnDM,IACJ,gBAAAC;AAAA,MAACC;AAAA,MAAA;AAAA,QACC,KAAAN;AAAA,QACA,MAAAN;AAAA,QACA,QAAAC;AAAA,QACA,WAAWN,EAAmB,EAAE,MAAAK,GAAM,WAAAE,GAAW;AAAA,QACjD,cAAYK;AAAA,QACX,GAAGF;AAAA,QAEJ,UAAA,gBAAAM;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,eAAY;AAAA,YACZ,WAAW,oDAAoDH,CAAa,IAAIC,CAAa,GAAG,KAAA;AAAA,YAE/F,UAAAV;AAAA,UAAA;AAAA,QAAA;AAAA,MACH;AAAA,IAAA;AAIJ,WAAII,sBACMU,GAAA,EAAQ,OAAOV,GAAU,UAAAO,GAAO,IAGnCA;AAAA,EACT;AACF;AAEAb,EAAW,cAAc;"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"kbd-DTcIjYA7.js","sources":["../../src/components/kbd/kbd.tsx"],"sourcesContent":["import {\n forwardRef,\n Fragment,\n useEffect,\n useState,\n type HTMLAttributes,\n type ReactNode,\n} from 'react';\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport { useTranslation } from 'react-i18next';\n\n/* ------------------------------------------------------------------ */\n/* Platform detection */\n/* ------------------------------------------------------------------ */\n\nfunction detectMacLike(): boolean {\n if (typeof navigator === 'undefined') return false;\n const uaData = (navigator as unknown as {\n userAgentData?: { platform?: string };\n }).userAgentData;\n const platformString = uaData?.platform ?? navigator.platform ?? '';\n return /mac/i.test(platformString);\n}\n\n/* ------------------------------------------------------------------ */\n/* Glyph + accessible-name maps */\n/* ------------------------------------------------------------------ */\n\nexport type KbdNamedKey =\n | 'Meta'\n | 'Control'\n | 'Alt'\n | 'Shift'\n | 'Enter'\n | 'Escape'\n | 'Space'\n | 'Tab'\n | 'Delete'\n | 'Backspace'\n | 'ArrowUp'\n | 'ArrowDown'\n | 'ArrowLeft'\n | 'ArrowRight';\n\n/**\n * Named keys we understand — anything else is passed through verbatim.\n * Glyph rendering is platform-aware; accessible names spell the key out\n * so screen readers say \"Command K\" instead of \"black apple K\".\n */\nconst MAC_GLYPHS: Record<KbdNamedKey, string> = {\n Meta: '\\u2318', // ⌘\n Control: '\\u2303', // ⌃\n Alt: '\\u2325', // ⌥\n Shift: '\\u21E7', // ⇧\n Enter: '\\u23CE', // ⏎\n Escape: 'Esc',\n Space: 'Space',\n Tab: '\\u21E5', // ⇥\n Delete: '\\u2326', // ⌦\n Backspace: '\\u232B', // ⌫\n ArrowUp: '\\u2191', // ↑\n ArrowDown: '\\u2193', // ↓\n ArrowLeft: '\\u2190', // ←\n ArrowRight: '\\u2192', // →\n};\n\nconst WIN_GLYPHS: Record<KbdNamedKey, string> = {\n Meta: 'Ctrl', // Windows/Linux consumers usually care about the Control equivalent\n Control: 'Ctrl',\n Alt: 'Alt',\n Shift: 'Shift',\n Enter: 'Enter',\n Escape: 'Esc',\n Space: 'Space',\n Tab: 'Tab',\n Delete: 'Del',\n Backspace: 'Backspace',\n ArrowUp: '\\u2191',\n ArrowDown: '\\u2193',\n ArrowLeft: '\\u2190',\n ArrowRight: '\\u2192',\n};\n\n/** Spelled-out names used for the aria-label — never platform-swapped. */\nconst SPOKEN_NAMES: Record<KbdNamedKey, string> = {\n Meta: 'Command',\n Control: 'Control',\n Alt: 'Option',\n Shift: 'Shift',\n Enter: 'Enter',\n Escape: 'Escape',\n Space: 'Space',\n Tab: 'Tab',\n Delete: 'Delete',\n Backspace: 'Backspace',\n ArrowUp: 'Up arrow',\n ArrowDown: 'Down arrow',\n ArrowLeft: 'Left arrow',\n ArrowRight: 'Right arrow',\n};\n\nfunction isNamedKey(key: string): key is KbdNamedKey {\n return (\n key === 'Meta' ||\n key === 'Control' ||\n key === 'Alt' ||\n key === 'Shift' ||\n key === 'Enter' ||\n key === 'Escape' ||\n key === 'Space' ||\n key === 'Tab' ||\n key === 'Delete' ||\n key === 'Backspace' ||\n key === 'ArrowUp' ||\n key === 'ArrowDown' ||\n key === 'ArrowLeft' ||\n key === 'ArrowRight'\n );\n}\n\nfunction glyphFor(key: string, isMac: boolean): string {\n if (isNamedKey(key)) {\n return (isMac ? MAC_GLYPHS : WIN_GLYPHS)[key];\n }\n return key;\n}\n\nfunction spokenFor(key: string): string {\n if (isNamedKey(key)) return SPOKEN_NAMES[key];\n return key;\n}\n\n/* ------------------------------------------------------------------ */\n/* CVA */\n/* ------------------------------------------------------------------ */\n\nconst kbdVariants = cva(\n [\n 'ds:inline-flex ds:items-center ds:justify-center',\n 'ds:font-[family-name:var(--font-mono)]',\n 'ds:tabular-nums',\n 'ds:rounded-[var(--radius-sm)]',\n 'ds:select-none',\n // Tight minimum size so single-key pills never collapse.\n 'ds:min-inline-size-[1.5em] ds:min-block-size-[1.5em]',\n ].join(' '),\n {\n variants: {\n size: {\n sm: 'ds:text-[length:var(--font-size-xs)] ds:ps-[calc(var(--spacing-xs)/1.5)] ds:pe-[calc(var(--spacing-xs)/1.5)]',\n md: 'ds:text-[length:var(--font-size-xs)] ds:ps-[var(--spacing-xs)] ds:pe-[var(--spacing-xs)]',\n lg: 'ds:text-[length:var(--font-size-sm)] ds:ps-[var(--spacing-sm)] ds:pe-[var(--spacing-sm)]',\n },\n intensity: {\n outline: [\n 'ds:bg-[var(--background)]',\n 'ds:border ds:border-[color:var(--border)]',\n 'ds:text-[color:var(--foreground)]',\n ].join(' '),\n solid: [\n 'ds:bg-[var(--muted)]',\n 'ds:text-[color:var(--foreground)]',\n ].join(' '),\n },\n },\n defaultVariants: { size: 'md', intensity: 'outline' },\n },\n);\n\nconst groupVariants = cva(\n [\n 'ds:inline-flex ds:items-center',\n 'ds:gap-[calc(var(--spacing-xs)/2)]',\n // Group shouldn't visually render as a pill itself — just holds pills.\n 'ds:font-[family-name:var(--font-mono)]',\n ].join(' '),\n);\n\n/* ------------------------------------------------------------------ */\n/* Public types */\n/* ------------------------------------------------------------------ */\n\nexport type KbdSeparator = 'none' | 'plus' | 'then';\n\n/**\n * Optional override map for keys. Consumers can rewrite the visible\n * glyph or the spoken name for product-specific shortcuts (e.g. mapping\n * a \"Brand\" modifier to a special icon).\n */\nexport interface KbdGlyphOverride {\n glyph?: string;\n spoken?: string;\n}\n\ninterface KbdBaseProps\n extends Omit<HTMLAttributes<HTMLElement>, 'children'>,\n VariantProps<typeof kbdVariants> {\n separator?: KbdSeparator;\n glyphMap?: Partial<Record<KbdNamedKey | string, KbdGlyphOverride>>;\n}\n\ninterface KbdWithKeysProps extends KbdBaseProps {\n keys: Array<KbdNamedKey | string>;\n children?: never;\n}\n\ninterface KbdWithChildrenProps extends KbdBaseProps {\n keys?: never;\n children: ReactNode;\n}\n\nexport type KbdProps = KbdWithKeysProps | KbdWithChildrenProps;\n\n/* ------------------------------------------------------------------ */\n/* Component */\n/* ------------------------------------------------------------------ */\n\nexport const Kbd = forwardRef<HTMLElement, KbdProps>((props, ref) => {\n const {\n size = 'md',\n intensity = 'outline',\n separator = 'none',\n glyphMap,\n className,\n ...rest\n } = props as KbdBaseProps & { className?: string };\n\n const { t } = useTranslation();\n\n const [isMac, setIsMac] = useState(false);\n useEffect(() => {\n setIsMac(detectMacLike());\n }, []);\n\n // Children path: pass-through rendering. Still a semantic <kbd> so\n // AT + search engines classify it correctly.\n if ('children' in props && props.children !== undefined) {\n return (\n <kbd\n ref={ref}\n className={[kbdVariants({ size, intensity }), className]\n .filter(Boolean)\n .join(' ')}\n {...rest}\n >\n {(props as KbdWithChildrenProps).children}\n </kbd>\n );\n }\n\n const keys = (props as KbdWithKeysProps).keys;\n\n // Single-key shortcut with no separator — render as one pill.\n // axe's `aria-prohibited-attr` rule forbids `aria-label` on <kbd>\n // elements (no valid implicit role), so the spoken name is delivered\n // via a visually-hidden sr-only span instead.\n if (keys.length === 1) {\n const k = keys[0];\n const override = glyphMap?.[k];\n const glyph = override?.glyph ?? glyphFor(k, isMac);\n const spoken = override?.spoken ?? spokenFor(k);\n return (\n <kbd\n ref={ref}\n className={[kbdVariants({ size, intensity }), className]\n .filter(Boolean)\n .join(' ')}\n {...rest}\n >\n <span aria-hidden=\"true\">{glyph}</span>\n <span className=\"ds:sr-only\">{spoken}</span>\n </kbd>\n );\n }\n\n // Multi-key shortcut.\n const spokenAll = keys\n .map((k) => glyphMap?.[k]?.spoken ?? spokenFor(k))\n .join(' ');\n\n // `none`: single combined pill (e.g. \"⌘K\" rendered together).\n if (separator === 'none') {\n return (\n <kbd\n ref={ref}\n className={[kbdVariants({ size, intensity }), className]\n .filter(Boolean)\n .join(' ')}\n {...rest}\n >\n {keys.map((k, i) => {\n const glyph = glyphMap?.[k]?.glyph ?? glyphFor(k, isMac);\n return (\n <span key={`${k}-${i}`} aria-hidden=\"true\">\n {glyph}\n </span>\n );\n })}\n <span className=\"ds:sr-only\">{spokenAll}</span>\n </kbd>\n );\n }\n\n // `plus` / `then`: multiple sibling <kbd> pills inside a wrapping <kbd>.\n const separatorText =\n separator === 'plus' ? t('kbd.plus', '+') : t('kbd.then', 'then');\n\n const spokenAnnouncement =\n separator === 'then'\n ? t('kbd.pressThen', 'Press {{keys}}', {\n keys: keys\n .map((k) => glyphMap?.[k]?.spoken ?? spokenFor(k))\n .join(` ${t('kbd.thenSpoken', 'then')} `),\n })\n : spokenAll;\n\n return (\n <kbd\n ref={ref}\n className={[groupVariants(), className].filter(Boolean).join(' ')}\n {...rest}\n >\n <span className=\"ds:sr-only\">{spokenAnnouncement}</span>\n {keys.map((k, i) => {\n const glyph = glyphMap?.[k]?.glyph ?? glyphFor(k, isMac);\n return (\n <Fragment key={`${k}-${i}`}>\n <kbd\n aria-hidden=\"true\"\n className={kbdVariants({ size, intensity })}\n >\n {glyph}\n </kbd>\n {i < keys.length - 1 ? (\n <span\n aria-hidden=\"true\"\n className=\"ds:text-[color:var(--muted-foreground)] ds:text-[length:var(--font-size-xs)]\"\n >\n {separatorText}\n </span>\n ) : null}\n </Fragment>\n );\n })}\n </kbd>\n );\n});\n\nKbd.displayName = 'Kbd';\n\n/* ------------------------------------------------------------------ */\n/* Named helpers */\n/* ------------------------------------------------------------------ */\n\nexport const kbdGlyphs = { mac: MAC_GLYPHS, win: WIN_GLYPHS, spoken: SPOKEN_NAMES };\n"],"names":["detectMacLike","uaData","platformString","MAC_GLYPHS","WIN_GLYPHS","SPOKEN_NAMES","isNamedKey","key","glyphFor","isMac","spokenFor","kbdVariants","cva","groupVariants","Kbd","forwardRef","props","ref","size","intensity","separator","glyphMap","className","rest","t","useTranslation","setIsMac","useState","useEffect","jsx","keys","k","override","glyph","spoken","jsxs","spokenAll","_a","i","separatorText","spokenAnnouncement","Fragment","kbdGlyphs"],"mappings":"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"}
|