@alfadocs/ui-kit 0.1.4 → 0.1.6
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/README.md +26 -0
- package/dist/_chunks/{agenda-card-C_hQGErS.js → agenda-card-DIWDvWum.js} +10 -10
- package/dist/_chunks/agenda-card-DIWDvWum.js.map +1 -0
- package/dist/_chunks/{agenda-tray-CBaVMJLO.js → agenda-tray-BqQZwiHc.js} +5 -5
- package/dist/_chunks/{agenda-tray-CBaVMJLO.js.map → agenda-tray-BqQZwiHc.js.map} +1 -1
- package/dist/_chunks/{ai-prompt-input-K94oVLG2.js → ai-prompt-input-CI27KmZ1.js} +4 -4
- package/dist/_chunks/ai-prompt-input-CI27KmZ1.js.map +1 -0
- package/dist/_chunks/{alert-rOM4EG0P.js → alert-BlOUMkXj.js} +39 -39
- package/dist/_chunks/alert-BlOUMkXj.js.map +1 -0
- package/dist/_chunks/{audio-recorder-Cn8z2zC9.js → audio-recorder-B-8SKgKn.js} +5 -5
- package/dist/_chunks/{audio-recorder-Cn8z2zC9.js.map → audio-recorder-B-8SKgKn.js.map} +1 -1
- package/dist/_chunks/{autocomplete.agent-DRrp-Rsx.js → autocomplete.agent-DqOy0_1P.js} +31 -31
- package/dist/_chunks/autocomplete.agent-DqOy0_1P.js.map +1 -0
- package/dist/_chunks/{avatar-Biffh-_H.js → avatar-Dcr6XuDQ.js} +19 -19
- package/dist/_chunks/avatar-Dcr6XuDQ.js.map +1 -0
- package/dist/_chunks/{balance-cell-renderer-CiyezQhi.js → balance-cell-renderer-BRWt3neo.js} +166 -166
- package/dist/_chunks/balance-cell-renderer-BRWt3neo.js.map +1 -0
- package/dist/_chunks/breadcrumb-D6xpsP7n.js +293 -0
- package/dist/_chunks/breadcrumb-D6xpsP7n.js.map +1 -0
- package/dist/_chunks/{button-7dTew-IV.js → button-7mLWcMp_.js} +9 -9
- package/dist/_chunks/{button-7dTew-IV.js.map → button-7mLWcMp_.js.map} +1 -1
- package/dist/_chunks/{calendar-BkDeDTaX.js → calendar-nGEgelJs.js} +100 -100
- package/dist/_chunks/calendar-nGEgelJs.js.map +1 -0
- package/dist/_chunks/{chat-input-xiBIujMv.js → chat-input-DsIrWM4f.js} +2 -2
- package/dist/_chunks/{chat-input-xiBIujMv.js.map → chat-input-DsIrWM4f.js.map} +1 -1
- package/dist/_chunks/{chat-message-BtxUyugB.js → chat-message-ByouZpPP.js} +3 -3
- package/dist/_chunks/{chat-message-BtxUyugB.js.map → chat-message-ByouZpPP.js.map} +1 -1
- package/dist/_chunks/{checkbox-Ni6C_KJg.js → checkbox-DNK4qS2_.js} +13 -13
- package/dist/_chunks/checkbox-DNK4qS2_.js.map +1 -0
- package/dist/_chunks/{checkbox-group-BFZ4oN5t.js → checkbox-group-CWpGZEF6.js} +13 -13
- package/dist/_chunks/checkbox-group-CWpGZEF6.js.map +1 -0
- package/dist/_chunks/{collapsible-fFMqzpdL.js → collapsible-D4LOdLxp.js} +18 -18
- package/dist/_chunks/collapsible-D4LOdLxp.js.map +1 -0
- package/dist/_chunks/{color-picker-Cl3KdjJd.js → color-picker-e9PmpaGH.js} +161 -161
- package/dist/_chunks/color-picker-e9PmpaGH.js.map +1 -0
- package/dist/_chunks/{combobox.agent-DjdivI3X.js → combobox.agent-ByobCLJ_.js} +28 -28
- package/dist/_chunks/combobox.agent-ByobCLJ_.js.map +1 -0
- package/dist/_chunks/{command-palette.agent-BUjzr2ET.js → command-palette.agent-js2rxgeR.js} +117 -117
- package/dist/_chunks/command-palette.agent-js2rxgeR.js.map +1 -0
- package/dist/_chunks/{description-list-C_1NX8P3.js → description-list-DvJbp6Yg.js} +2 -2
- package/dist/_chunks/{description-list-C_1NX8P3.js.map → description-list-DvJbp6Yg.js.map} +1 -1
- package/dist/_chunks/{dialog.agent-C2lP9H0h.js → dialog.agent-DEG_fVzG.js} +42 -42
- package/dist/_chunks/dialog.agent-DEG_fVzG.js.map +1 -0
- package/dist/_chunks/{dropdown-menu-2HgU1Emf.js → dropdown-menu-JNo66A-j.js} +2 -2
- package/dist/_chunks/dropdown-menu-JNo66A-j.js.map +1 -0
- package/dist/_chunks/{empty-state-BHrItOiE.js → empty-state-DQPtRp2b.js} +2 -2
- package/dist/_chunks/{empty-state-BHrItOiE.js.map → empty-state-DQPtRp2b.js.map} +1 -1
- package/dist/_chunks/{file-upload.agent-LlC0W468.js → file-upload.agent-B9AN82LA.js} +2 -2
- package/dist/_chunks/{file-upload.agent-LlC0W468.js.map → file-upload.agent-B9AN82LA.js.map} +1 -1
- package/dist/_chunks/{freemium-paywall-Dr9aOtOC.js → freemium-paywall-CkefGLM_.js} +4 -4
- package/dist/_chunks/{freemium-paywall-Dr9aOtOC.js.map → freemium-paywall-CkefGLM_.js.map} +1 -1
- package/dist/_chunks/{header-BpU9U-1X.js → header-BGn1mRp8.js} +2 -2
- package/dist/_chunks/{header-BpU9U-1X.js.map → header-BGn1mRp8.js.map} +1 -1
- package/dist/_chunks/{icon-button-CNjWCD1X.js → icon-button-Wnnde5lc.js} +6 -6
- package/dist/_chunks/icon-button-Wnnde5lc.js.map +1 -0
- package/dist/_chunks/input-surface-u4QB0lxe.js +32 -0
- package/dist/_chunks/input-surface-u4QB0lxe.js.map +1 -0
- package/dist/_chunks/{key-value-pair-C9hpjC_B.js → key-value-pair-JRFS9Xrh.js} +10 -10
- package/dist/_chunks/key-value-pair-JRFS9Xrh.js.map +1 -0
- package/dist/_chunks/{leo-sidebar-CNjZqljo.js → leo-sidebar-Bh3dPDTQ.js} +64 -64
- package/dist/_chunks/leo-sidebar-Bh3dPDTQ.js.map +1 -0
- package/dist/_chunks/{message-card-CZzNO4ov.js → message-card-qAp2-WQK.js} +12 -12
- package/dist/_chunks/message-card-qAp2-WQK.js.map +1 -0
- package/dist/_chunks/{message-tray-BWbjXW3F.js → message-tray-VaLpQU5t.js} +5 -5
- package/dist/_chunks/{message-tray-BWbjXW3F.js.map → message-tray-VaLpQU5t.js.map} +1 -1
- package/dist/_chunks/{multi-select.agent-BSGEW10d.js → multi-select.agent-CNsyW3n9.js} +66 -66
- package/dist/_chunks/multi-select.agent-CNsyW3n9.js.map +1 -0
- package/dist/_chunks/navigation-menu-EVFau1O2.js +180 -0
- package/dist/_chunks/navigation-menu-EVFau1O2.js.map +1 -0
- package/dist/_chunks/{notification-card-DgW-vVg-.js → notification-card-BF2_veHy.js} +11 -11
- package/dist/_chunks/notification-card-BF2_veHy.js.map +1 -0
- package/dist/_chunks/{notification-tray-CKUgl2jc.js → notification-tray-Bq-08ReD.js} +5 -5
- package/dist/_chunks/{notification-tray-CKUgl2jc.js.map → notification-tray-Bq-08ReD.js.map} +1 -1
- package/dist/_chunks/{number-input-BPPhekLu.js → number-input-DjpT_RXJ.js} +46 -46
- package/dist/_chunks/number-input-DjpT_RXJ.js.map +1 -0
- package/dist/_chunks/pagination.agent-oEaqmtx5.js +380 -0
- package/dist/_chunks/pagination.agent-oEaqmtx5.js.map +1 -0
- package/dist/_chunks/{password-input-DAT5HQth.js → password-input-DJDVznWH.js} +5 -5
- package/dist/_chunks/password-input-DJDVznWH.js.map +1 -0
- package/dist/_chunks/{patient-shell-BzHhg6uA.js → patient-shell-DP54y6rc.js} +5 -5
- package/dist/_chunks/{patient-shell-BzHhg6uA.js.map → patient-shell-DP54y6rc.js.map} +1 -1
- package/dist/_chunks/{payment-form-YlxrCpZQ.js → payment-form-hcl-gGrp.js} +2 -2
- package/dist/_chunks/{payment-form-YlxrCpZQ.js.map → payment-form-hcl-gGrp.js.map} +1 -1
- package/dist/_chunks/{pdf-viewer.agent-sMned5Xn.js → pdf-viewer.agent-CfIHhcHx.js} +3 -3
- package/dist/_chunks/{pdf-viewer.agent-sMned5Xn.js.map → pdf-viewer.agent-CfIHhcHx.js.map} +1 -1
- package/dist/_chunks/{phone-input-BuRe5PyI.js → phone-input-DE_39q65.js} +103 -103
- package/dist/_chunks/phone-input-DE_39q65.js.map +1 -0
- package/dist/_chunks/{popover-Ds1iOdiv.js → popover-DvAtFOi-.js} +2 -2
- package/dist/_chunks/{popover-Ds1iOdiv.js.map → popover-DvAtFOi-.js.map} +1 -1
- package/dist/_chunks/{privacy-lock-up2ervfF.js → privacy-lock-DS6QRo2N.js} +3 -3
- package/dist/_chunks/{privacy-lock-up2ervfF.js.map → privacy-lock-DS6QRo2N.js.map} +1 -1
- package/dist/_chunks/{progress-D4ELgHG3.js → progress-B4Of_pzz.js} +57 -57
- package/dist/_chunks/progress-B4Of_pzz.js.map +1 -0
- package/dist/_chunks/{radio-XSSNX3Af.js → radio-cs8N1wJi.js} +29 -29
- package/dist/_chunks/radio-cs8N1wJi.js.map +1 -0
- package/dist/_chunks/{radio-group-DBrUOPcy.js → radio-group-BIUbpWml.js} +3 -3
- package/dist/_chunks/radio-group-BIUbpWml.js.map +1 -0
- package/dist/_chunks/{scroll-area-HIq0hJyJ.js → scroll-area-DLr5w9Dd.js} +9 -9
- package/dist/_chunks/scroll-area-DLr5w9Dd.js.map +1 -0
- package/dist/_chunks/{search-bar-9Zbew4yM.js → search-bar-fcGqDFW3.js} +30 -30
- package/dist/_chunks/{search-bar-9Zbew4yM.js.map → search-bar-fcGqDFW3.js.map} +1 -1
- package/dist/_chunks/{search-input-CtkWITO2.js → search-input-BVMCONyN.js} +2 -2
- package/dist/_chunks/{search-input-CtkWITO2.js.map → search-input-BVMCONyN.js.map} +1 -1
- package/dist/_chunks/{select-DdAOtomN.js → select-IY_JQa-F.js} +50 -50
- package/dist/_chunks/select-IY_JQa-F.js.map +1 -0
- package/dist/_chunks/{sheet-D7GRhnWw.js → sheet-BhNpLHc9.js} +8 -8
- package/dist/_chunks/sheet-BhNpLHc9.js.map +1 -0
- package/dist/_chunks/{sidebar-Dc2ffrbf.js → sidebar-OVzwN3jE.js} +294 -294
- package/dist/_chunks/sidebar-OVzwN3jE.js.map +1 -0
- package/dist/_chunks/{sign-in-with-alfadocs-button-BotwPDcW.js → sign-in-with-alfadocs-button-BN_FPGHT.js} +2 -2
- package/dist/_chunks/{sign-in-with-alfadocs-button-BotwPDcW.js.map → sign-in-with-alfadocs-button-BN_FPGHT.js.map} +1 -1
- package/dist/_chunks/{skeleton-DAdPFx9d.js → skeleton-dtqyF09N.js} +8 -8
- package/dist/_chunks/skeleton-dtqyF09N.js.map +1 -0
- package/dist/_chunks/{slot-grid-WHc5A8-z.js → slot-grid-D_l5VsHG.js} +5 -5
- package/dist/_chunks/{slot-grid-WHc5A8-z.js.map → slot-grid-D_l5VsHG.js.map} +1 -1
- package/dist/_chunks/{stepper-accordion-2_7Pw0tC.js → stepper-accordion-CGog0JSF.js} +64 -64
- package/dist/_chunks/stepper-accordion-CGog0JSF.js.map +1 -0
- package/dist/_chunks/{stepper-calendar-CWZcFgt_.js → stepper-calendar-_fLOAjus.js} +7 -7
- package/dist/_chunks/{stepper-calendar-CWZcFgt_.js.map → stepper-calendar-_fLOAjus.js.map} +1 -1
- package/dist/_chunks/{switch-DhSORO9C.js → switch-aN2EYxHh.js} +4 -4
- package/dist/_chunks/switch-aN2EYxHh.js.map +1 -0
- package/dist/_chunks/{tabs.agent-BtaNGxRh.js → tabs.agent-BpbVA-Zh.js} +55 -55
- package/dist/_chunks/tabs.agent-BpbVA-Zh.js.map +1 -0
- package/dist/_chunks/{tag--uLKOb9f.js → tag-BqidXKo3.js} +2 -2
- package/dist/_chunks/tag-BqidXKo3.js.map +1 -0
- package/dist/_chunks/{task-card-BeSuntXP.js → task-card-yW7tKlG4.js} +17 -17
- package/dist/_chunks/task-card-yW7tKlG4.js.map +1 -0
- package/dist/_chunks/{task-tray-pRk6u8Ik.js → task-tray-BzahI5FQ.js} +5 -5
- package/dist/_chunks/{task-tray-pRk6u8Ik.js.map → task-tray-BzahI5FQ.js.map} +1 -1
- package/dist/_chunks/{text-area-xf9-6iDf.js → text-area-DmKSd2DG.js} +2 -2
- package/dist/_chunks/text-area-DmKSd2DG.js.map +1 -0
- package/dist/_chunks/{text-input-exh7VD7D.js → text-input-CRHvl5zk.js} +19 -19
- package/dist/_chunks/text-input-CRHvl5zk.js.map +1 -0
- package/dist/_chunks/{theme-toggle-CJgA6G24.js → theme-toggle-COHFwO2H.js} +4 -4
- package/dist/_chunks/{theme-toggle-CJgA6G24.js.map → theme-toggle-COHFwO2H.js.map} +1 -1
- package/dist/_chunks/{timeline-DIueH4TJ.js → timeline-RgAIzpMd.js} +2 -2
- package/dist/_chunks/{timeline-DIueH4TJ.js.map → timeline-RgAIzpMd.js.map} +1 -1
- package/dist/_chunks/{toast-q0SlabGr.js → toast-lOhJDKOH.js} +12 -12
- package/dist/_chunks/{toast-q0SlabGr.js.map → toast-lOhJDKOH.js.map} +1 -1
- package/dist/_chunks/{transcript-panel-DFnhbrlQ.js → transcript-panel-CNbVGG9L.js} +59 -59
- package/dist/_chunks/transcript-panel-CNbVGG9L.js.map +1 -0
- package/dist/_chunks/{visually-hidden-BlkhaZWe.js → visually-hidden-Bw7vBHLm.js} +6 -6
- package/dist/_chunks/{visually-hidden-BlkhaZWe.js.map → visually-hidden-Bw7vBHLm.js.map} +1 -1
- package/dist/_chunks/{warning-stack-DCmO0R07.js → warning-stack-8Pa3pekh.js} +24 -24
- package/dist/_chunks/warning-stack-8Pa3pekh.js.map +1 -0
- package/dist/_chunks/{workflow-map-CAM6Uy_J.js → workflow-map-DGJwVcO-.js} +106 -106
- package/dist/_chunks/workflow-map-DGJwVcO-.js.map +1 -0
- package/dist/agent-catalog.json +1 -1
- package/dist/components/_shared/input-surface.d.ts +11 -11
- package/dist/components/agenda-card/index.js +1 -1
- package/dist/components/agenda-tray/index.js +1 -1
- package/dist/components/ai-prompt-input/index.js +1 -1
- package/dist/components/alert/index.js +1 -1
- package/dist/components/audio-recorder/index.js +1 -1
- package/dist/components/autocomplete/index.js +1 -1
- package/dist/components/avatar/index.js +1 -1
- package/dist/components/breadcrumb/index.js +1 -1
- package/dist/components/button/index.js +2 -2
- package/dist/components/calendar/index.js +1 -1
- package/dist/components/chat-input/index.js +1 -1
- package/dist/components/chat-message/index.js +1 -1
- package/dist/components/checkbox/index.js +1 -1
- package/dist/components/checkbox-group/index.js +1 -1
- package/dist/components/collapsible/index.js +1 -1
- package/dist/components/color-picker/index.js +1 -1
- package/dist/components/combobox/index.js +1 -1
- package/dist/components/command-palette/index.js +1 -1
- package/dist/components/data-table/index.js +1 -1
- package/dist/components/description-list/index.js +1 -1
- package/dist/components/dialog/index.js +1 -1
- package/dist/components/dropdown-menu/index.js +1 -1
- package/dist/components/empty-state/index.js +1 -1
- package/dist/components/file-upload/index.js +1 -1
- package/dist/components/freemium-paywall/index.js +1 -1
- package/dist/components/header/index.js +1 -1
- package/dist/components/icon-button/index.js +1 -1
- package/dist/components/key-value-pair/index.js +1 -1
- package/dist/components/message-card/index.js +1 -1
- package/dist/components/message-tray/index.js +1 -1
- package/dist/components/multi-select/index.js +1 -1
- package/dist/components/navigation-menu/index.js +1 -1
- package/dist/components/notification-card/index.js +1 -1
- package/dist/components/notification-tray/index.js +1 -1
- package/dist/components/number-input/index.js +1 -1
- package/dist/components/pagination/index.js +1 -1
- package/dist/components/password-input/index.js +1 -1
- package/dist/components/payment-form/index.js +1 -1
- package/dist/components/pdf-viewer/index.js +1 -1
- package/dist/components/phone-input/index.js +1 -1
- package/dist/components/popover/index.js +1 -1
- package/dist/components/privacy-lock/index.js +1 -1
- package/dist/components/progress/index.js +1 -1
- package/dist/components/radio/index.js +1 -1
- package/dist/components/radio-group/index.js +2 -2
- package/dist/components/scroll-area/index.js +1 -1
- package/dist/components/search-bar/index.js +1 -1
- package/dist/components/search-input/index.js +1 -1
- package/dist/components/select/index.js +1 -1
- package/dist/components/sheet/index.js +1 -1
- package/dist/components/sidebar/index.js +1 -1
- package/dist/components/sign-in-with-alfadocs-button/index.js +1 -1
- package/dist/components/skeleton/index.js +1 -1
- package/dist/components/slot-grid/index.js +1 -1
- package/dist/components/stepper-accordion/index.js +1 -1
- package/dist/components/stepper-calendar/index.js +1 -1
- package/dist/components/switch/index.js +1 -1
- package/dist/components/tabs/index.js +1 -1
- package/dist/components/tag/index.js +1 -1
- package/dist/components/task-card/index.js +1 -1
- package/dist/components/task-tray/index.js +1 -1
- package/dist/components/text-area/index.js +1 -1
- package/dist/components/text-input/index.js +1 -1
- package/dist/components/theme-toggle/index.js +1 -1
- package/dist/components/timeline/index.js +1 -1
- package/dist/components/toast/index.js +1 -1
- package/dist/components/transcript-panel/index.js +1 -1
- package/dist/components/visually-hidden/index.js +1 -1
- package/dist/components/warning-stack/index.js +1 -1
- package/dist/components/workflow/index.js +1 -1
- package/dist/index.js +72 -72
- package/dist/patterns/leo-assistant/index.js +1 -1
- package/dist/patterns/leo-assistant/leo-sidebar.d.ts.map +1 -1
- package/dist/patterns/patient-shell/index.js +1 -1
- package/dist/tokens.css +1 -1
- package/package.json +1 -1
- package/dist/_chunks/agenda-card-C_hQGErS.js.map +0 -1
- package/dist/_chunks/ai-prompt-input-K94oVLG2.js.map +0 -1
- package/dist/_chunks/alert-rOM4EG0P.js.map +0 -1
- package/dist/_chunks/autocomplete.agent-DRrp-Rsx.js.map +0 -1
- package/dist/_chunks/avatar-Biffh-_H.js.map +0 -1
- package/dist/_chunks/balance-cell-renderer-CiyezQhi.js.map +0 -1
- package/dist/_chunks/breadcrumb-CcZovmIq.js +0 -293
- package/dist/_chunks/breadcrumb-CcZovmIq.js.map +0 -1
- package/dist/_chunks/calendar-BkDeDTaX.js.map +0 -1
- package/dist/_chunks/checkbox-Ni6C_KJg.js.map +0 -1
- package/dist/_chunks/checkbox-group-BFZ4oN5t.js.map +0 -1
- package/dist/_chunks/collapsible-fFMqzpdL.js.map +0 -1
- package/dist/_chunks/color-picker-Cl3KdjJd.js.map +0 -1
- package/dist/_chunks/combobox.agent-DjdivI3X.js.map +0 -1
- package/dist/_chunks/command-palette.agent-BUjzr2ET.js.map +0 -1
- package/dist/_chunks/dialog.agent-C2lP9H0h.js.map +0 -1
- package/dist/_chunks/dropdown-menu-2HgU1Emf.js.map +0 -1
- package/dist/_chunks/icon-button-CNjWCD1X.js.map +0 -1
- package/dist/_chunks/input-surface-D5OMCB1W.js +0 -32
- package/dist/_chunks/input-surface-D5OMCB1W.js.map +0 -1
- package/dist/_chunks/key-value-pair-C9hpjC_B.js.map +0 -1
- package/dist/_chunks/leo-sidebar-CNjZqljo.js.map +0 -1
- package/dist/_chunks/message-card-CZzNO4ov.js.map +0 -1
- package/dist/_chunks/multi-select.agent-BSGEW10d.js.map +0 -1
- package/dist/_chunks/navigation-menu-DxOMvrKM.js +0 -180
- package/dist/_chunks/navigation-menu-DxOMvrKM.js.map +0 -1
- package/dist/_chunks/notification-card-DgW-vVg-.js.map +0 -1
- package/dist/_chunks/number-input-BPPhekLu.js.map +0 -1
- package/dist/_chunks/pagination.agent-CmA0Ocr5.js +0 -380
- package/dist/_chunks/pagination.agent-CmA0Ocr5.js.map +0 -1
- package/dist/_chunks/password-input-DAT5HQth.js.map +0 -1
- package/dist/_chunks/phone-input-BuRe5PyI.js.map +0 -1
- package/dist/_chunks/progress-D4ELgHG3.js.map +0 -1
- package/dist/_chunks/radio-XSSNX3Af.js.map +0 -1
- package/dist/_chunks/radio-group-DBrUOPcy.js.map +0 -1
- package/dist/_chunks/scroll-area-HIq0hJyJ.js.map +0 -1
- package/dist/_chunks/select-DdAOtomN.js.map +0 -1
- package/dist/_chunks/sheet-D7GRhnWw.js.map +0 -1
- package/dist/_chunks/sidebar-Dc2ffrbf.js.map +0 -1
- package/dist/_chunks/skeleton-DAdPFx9d.js.map +0 -1
- package/dist/_chunks/stepper-accordion-2_7Pw0tC.js.map +0 -1
- package/dist/_chunks/switch-DhSORO9C.js.map +0 -1
- package/dist/_chunks/tabs.agent-BtaNGxRh.js.map +0 -1
- package/dist/_chunks/tag--uLKOb9f.js.map +0 -1
- package/dist/_chunks/task-card-BeSuntXP.js.map +0 -1
- package/dist/_chunks/text-area-xf9-6iDf.js.map +0 -1
- package/dist/_chunks/text-input-exh7VD7D.js.map +0 -1
- package/dist/_chunks/transcript-panel-DFnhbrlQ.js.map +0 -1
- package/dist/_chunks/warning-stack-DCmO0R07.js.map +0 -1
- package/dist/_chunks/workflow-map-CAM6Uy_J.js.map +0 -1
|
@@ -2,9 +2,9 @@ import { jsx as a, jsxs as l } from "react/jsx-runtime";
|
|
|
2
2
|
import { forwardRef as R, useMemo as B, useState as L, useRef as U, useCallback as W } from "react";
|
|
3
3
|
import { c as _ } from "./index-D2ZczOXr.js";
|
|
4
4
|
import { useTranslation as E } from "react-i18next";
|
|
5
|
-
import { I as H } from "./icon-button-
|
|
6
|
-
import { B as N } from "./button-
|
|
7
|
-
import { A as X } from "./avatar-
|
|
5
|
+
import { I as H } from "./icon-button-Wnnde5lc.js";
|
|
6
|
+
import { B as N } from "./button-7mLWcMp_.js";
|
|
7
|
+
import { A as X } from "./avatar-Dcr6XuDQ.js";
|
|
8
8
|
import { T as q } from "./timestamp-BV2lC-wV.js";
|
|
9
9
|
import { X as G } from "./x-CCcI3eJp.js";
|
|
10
10
|
const J = _(
|
|
@@ -59,14 +59,14 @@ const J = _(
|
|
|
59
59
|
}
|
|
60
60
|
}
|
|
61
61
|
), k = [
|
|
62
|
-
"focus-visible:outline-none",
|
|
63
|
-
"after:content-[''] after:absolute after:inset-0 after:rounded-[var(--radius-sm)]",
|
|
64
|
-
"after:pointer-events-auto",
|
|
65
|
-
"focus-visible:after:outline-[length:var(--focus-ring-width)]",
|
|
66
|
-
"focus-visible:after:outline-solid",
|
|
67
|
-
"focus-visible:after:outline-[color:var(--ring)]",
|
|
68
|
-
"focus-visible:after:outline-offset-[length:var(--focus-ring-offset)]",
|
|
69
|
-
"forced-colors:focus-visible:after:outline-[CanvasText]"
|
|
62
|
+
"ds:focus-visible:outline-none",
|
|
63
|
+
"ds:after:content-[''] ds:after:absolute ds:after:inset-0 ds:after:rounded-[var(--radius-sm)]",
|
|
64
|
+
"ds:after:pointer-events-auto",
|
|
65
|
+
"ds:focus-visible:after:outline-[length:var(--focus-ring-width)]",
|
|
66
|
+
"ds:focus-visible:after:outline-solid",
|
|
67
|
+
"ds:focus-visible:after:outline-[color:var(--ring)]",
|
|
68
|
+
"ds:focus-visible:after:outline-offset-[length:var(--focus-ring-offset)]",
|
|
69
|
+
"ds:forced-colors:focus-visible:after:outline-[CanvasText]"
|
|
70
70
|
].join(" ");
|
|
71
71
|
function O(e) {
|
|
72
72
|
return /^(https?:\/\/(?!\/)|\/(?!\/)|#)/.test(e);
|
|
@@ -273,4 +273,4 @@ export {
|
|
|
273
273
|
Q as M,
|
|
274
274
|
O as i
|
|
275
275
|
};
|
|
276
|
-
//# sourceMappingURL=message-card-
|
|
276
|
+
//# sourceMappingURL=message-card-qAp2-WQK.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"message-card-qAp2-WQK.js","sources":["../../src/components/message-card/message-card.tsx"],"sourcesContent":["import {\n forwardRef,\n useCallback,\n useMemo,\n useRef,\n useState,\n type HTMLAttributes,\n type ReactNode,\n} from 'react';\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport { useTranslation } from 'react-i18next';\nimport { X } from 'lucide-react';\nimport { IconButton } from '../button/icon-button';\nimport { Button } from '../button/button';\nimport { Avatar } from '../avatar/avatar';\nimport { Timestamp } from '../timestamp';\n\n/* ------------------------------------------------------------------ */\n/* Types */\n/* ------------------------------------------------------------------ */\n\nexport interface MessageSender {\n /** Display name — drives the avatar's deterministic colour + initials. */\n name: string;\n /** Optional avatar image URL. */\n avatarUrl?: string;\n}\n\nexport interface MessageItem {\n /** Unique identifier for the message (or thread). */\n id: string;\n /** Sender identity — avatar + bold display name. */\n sender: MessageSender;\n /** Optional subject / conversation title. Rendered bold when unread. */\n subject?: string;\n /** Last-message preview — rendered as plain text, clamped to two lines. */\n preview: string;\n /** ISO-8601 timestamp of when the message was sent. */\n sentAt: string;\n /** Whether the message has been seen. Unread items get accent styling. */\n read?: boolean;\n /** Optional deep link — when present the card row is an anchor. */\n url?: string;\n /**\n * Count of unread messages inside a thread. Rendered as an end-aligned\n * badge when greater than 1.\n */\n unreadCount?: number;\n}\n\nexport interface MessageCardProps\n extends Omit<HTMLAttributes<HTMLDivElement>, 'onClick' | 'role' | 'title'>,\n VariantProps<typeof cardVariants> {\n /** The message to render. */\n item: MessageItem;\n /**\n * Layout shape.\n * - `compact` — single-line row with the whole card clickable (used by\n * MessageTray).\n * - `dashboard` — bordered block with explicit CTA and mark-as-read\n * controls (used by dashboards / sidebars).\n */\n variant?: 'compact' | 'dashboard';\n /** Visual density. */\n size?: 'sm' | 'md';\n /** Fires when the row / title is activated. */\n onActivate?: (item: MessageItem) => void;\n /** Fires when the dismiss control is activated. */\n onDismiss?: (item: MessageItem) => void;\n /**\n * Label for the dashboard-variant CTA. Only rendered when `variant` is\n * `'dashboard'` and the item has a `url`.\n */\n ctaLabel?: string;\n /**\n * Label for the dashboard-variant mark-as-read link. Only rendered when\n * `variant` is `'dashboard'` and `onDismiss` is supplied.\n */\n dismissLabel?: string;\n /**\n * External exit-animation control. When supplied the card plays its\n * fade-out when this turns `true` and the consumer owns the subsequent\n * unmount (see MessageTray). If omitted, the card self-manages the\n * exit on internal dismiss.\n */\n leaving?: boolean;\n}\n\n/* ------------------------------------------------------------------ */\n/* CVA */\n/* ------------------------------------------------------------------ */\n\nconst cardVariants = cva(\n [\n 'ds:relative ds:flex ds:gap-[var(--spacing-sm)]',\n 'ds:rounded-[var(--radius-sm)]',\n 'ds:transition-colors',\n 'ds:motion-safe:animate-in ds:motion-safe:fade-in-0 ds:motion-safe:slide-in-from-top-2 ds:motion-safe:duration-[var(--animation-duration)]',\n 'ds:data-[leaving=true]:motion-safe:animate-out ds:data-[leaving=true]:motion-safe:fade-out-0 ds:data-[leaving=true]:motion-safe:slide-out-to-top-2',\n 'ds:data-[leaving=true]:motion-safe:fill-mode-forwards',\n 'ds:data-[leaving=true]:pointer-events-none',\n 'ds:motion-reduce:transition-none',\n 'ds:text-start',\n 'ds:forced-colors:border ds:forced-colors:border-[CanvasText]',\n ].join(' '),\n {\n variants: {\n variant: {\n compact: 'ds:items-start ds:group',\n dashboard:\n 'ds:flex-col ds:sm:flex-row ds:items-stretch ds:sm:items-start ds:border ds:border-[color:var(--border)] ds:bg-[color:var(--card)]',\n },\n size: {\n sm: 'ds:p-[var(--spacing-sm)]',\n md: 'ds:p-[var(--spacing-md)]',\n },\n state: {\n unread: '',\n read: 'ds:bg-transparent',\n },\n },\n compoundVariants: [\n {\n variant: 'compact',\n state: 'unread',\n class: 'ds:bg-[color:var(--accent)]/5',\n },\n {\n variant: 'compact',\n state: 'read',\n class: 'ds:hover:bg-[color:var(--muted)]/40',\n },\n {\n variant: 'dashboard',\n state: 'unread',\n class: 'ds:bg-[color:var(--accent)]/5',\n },\n ],\n defaultVariants: {\n variant: 'compact',\n size: 'sm',\n state: 'read',\n },\n },\n);\n\nconst stretchedLinkClass = [\n 'ds:focus-visible:outline-none',\n \"ds:after:content-[''] ds:after:absolute ds:after:inset-0 ds:after:rounded-[var(--radius-sm)]\",\n 'ds:after:pointer-events-auto',\n 'ds:focus-visible:after:outline-[length:var(--focus-ring-width)]',\n 'ds:focus-visible:after:outline-solid',\n 'ds:focus-visible:after:outline-[color:var(--ring)]',\n 'ds:focus-visible:after:outline-offset-[length:var(--focus-ring-offset)]',\n 'ds:forced-colors:focus-visible:after:outline-[CanvasText]',\n].join(' ');\n\n/* ------------------------------------------------------------------ */\n/* Helpers */\n/* ------------------------------------------------------------------ */\n\nexport function isSafeMessageUrl(url: string): boolean {\n // Reject protocol-relative (//host), javascript:, data:, mailto: etc.\n // Only http(s), same-origin absolute paths (/), and hash (#) anchors pass.\n return /^(https?:\\/\\/(?!\\/)|\\/(?!\\/)|#)/.test(url);\n}\n\n/* ------------------------------------------------------------------ */\n/* Component */\n/* ------------------------------------------------------------------ */\n\nexport const MessageCard = forwardRef<HTMLDivElement, MessageCardProps>(\n (\n {\n item,\n variant = 'compact',\n size = 'sm',\n onActivate,\n onDismiss,\n ctaLabel,\n dismissLabel,\n leaving,\n className,\n ...rest\n },\n ref,\n ) => {\n const { t, i18n } = useTranslation();\n\n const accessibleTime = useMemo(() => {\n const date = new Date(item.sentAt);\n if (Number.isNaN(date.getTime())) return '';\n return new Intl.DateTimeFormat(i18n.language, {\n dateStyle: 'medium',\n timeStyle: 'short',\n }).format(date);\n }, [item.sentAt, i18n.language]);\n\n const isControlledLeaving = leaving !== undefined;\n const [isLeaving, setIsLeaving] = useState(false);\n const dismissTimerRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n\n const effectiveLeaving = isControlledLeaving ? leaving : isLeaving;\n\n const prefersReducedMotion =\n typeof window !== 'undefined' &&\n typeof window.matchMedia === 'function' &&\n window.matchMedia('(prefers-reduced-motion: reduce)').matches;\n\n const handleDismiss = useCallback(() => {\n if (!onDismiss) return;\n if (isControlledLeaving || prefersReducedMotion) {\n onDismiss(item);\n return;\n }\n setIsLeaving(true);\n if (dismissTimerRef.current) clearTimeout(dismissTimerRef.current);\n const raw =\n (typeof window !== 'undefined' &&\n window\n .getComputedStyle(document.documentElement)\n .getPropertyValue('--animation-duration')) ||\n '200ms';\n const ms = raw.trim().endsWith('ms')\n ? parseFloat(raw)\n : parseFloat(raw) * 1000;\n dismissTimerRef.current = setTimeout(\n () => onDismiss(item),\n Number.isFinite(ms) ? ms : 200,\n );\n }, [onDismiss, item, isControlledLeaving, prefersReducedMotion]);\n\n const state = item.read ? 'read' : 'unread';\n\n const unreadSuffix = item.read\n ? ''\n : t('ui.messageCard.unreadSuffix', ', unread');\n const subjectFragment = item.subject\n ? t('ui.messageCard.subjectFragment', {\n subject: item.subject,\n defaultValue: ' — {{subject}}',\n })\n : '';\n const ariaLabel = t('ui.messageCard.itemLabel', {\n sender: item.sender.name,\n subjectFragment,\n time: accessibleTime,\n unreadSuffix,\n defaultValue:\n 'Message from {{sender}}{{subjectFragment}}, {{time}}{{unreadSuffix}}',\n });\n\n const hasSafeUrl = !!item.url && isSafeMessageUrl(item.url);\n\n /* ------- Sender-name rendering (stretched link in compact mode) ------ */\n\n const senderText = (\n <span\n className={[\n 'ds:flex-1 ds:min-w-0 ds:truncate',\n item.read ? 'ds:font-normal' : 'ds:font-semibold',\n ].join(' ')}\n >\n {item.sender.name}\n </span>\n );\n\n let senderNode: ReactNode;\n if (variant === 'compact' && hasSafeUrl && onActivate) {\n senderNode = (\n <a\n href={item.url}\n aria-label={ariaLabel}\n className={stretchedLinkClass + ' ds:contents'}\n onClick={(event) => {\n if (\n event.defaultPrevented ||\n event.metaKey ||\n event.ctrlKey ||\n event.shiftKey\n )\n return;\n onActivate(item);\n }}\n >\n {senderText}\n </a>\n );\n } else if (variant === 'compact' && onActivate) {\n senderNode = (\n <button\n type=\"button\"\n aria-label={ariaLabel}\n className={stretchedLinkClass + ' ds:contents ds:bg-transparent ds:border-0 ds:p-0'}\n onClick={() => onActivate(item)}\n >\n {senderText}\n </button>\n );\n } else if (variant === 'dashboard' && hasSafeUrl && onActivate) {\n senderNode = (\n <a\n href={item.url}\n className=\"ds:text-[color:var(--foreground)] ds:no-underline ds:hover:underline ds:focus-visible:outline-[length:var(--focus-ring-width)] ds:focus-visible:outline-solid ds:focus-visible:outline-[color:var(--ring)] ds:focus-visible:outline-offset-[length:var(--focus-ring-offset)]\"\n onClick={(event) => {\n if (\n event.defaultPrevented ||\n event.metaKey ||\n event.ctrlKey ||\n event.shiftKey\n )\n return;\n onActivate(item);\n }}\n >\n {senderText}\n </a>\n );\n } else {\n senderNode = senderText;\n }\n\n const showThreadCount =\n typeof item.unreadCount === 'number' && item.unreadCount > 1;\n\n return (\n <div\n ref={ref}\n role=\"listitem\"\n data-component=\"message-card\"\n data-read={item.read ? 'true' : 'false'}\n data-leaving={effectiveLeaving ? 'true' : undefined}\n aria-hidden={effectiveLeaving || undefined}\n className={cardVariants({ variant, size, state, className })}\n {...rest}\n >\n {/* Avatar is decorative here — the row's assembled `aria-label`\n already names the sender, so letting Avatar contribute its own\n `role=\"img\"` + `aria-label={name}` would announce the name twice\n per row. `aria-hidden` + `role=\"presentation\"` (spread last, so\n they win over Avatar's internal values) pulls the element out of\n the a11y tree entirely. */}\n <Avatar\n name={item.sender.name}\n src={item.sender.avatarUrl}\n size={size === 'md' ? 'md' : 'sm'}\n className=\"ds:shrink-0\"\n aria-hidden=\"true\"\n role=\"presentation\"\n aria-label={undefined}\n />\n\n <div className=\"ds:flex-1 ds:min-w-0 ds:flex ds:flex-col ds:gap-[var(--spacing-sm)]\">\n <div className=\"ds:flex ds:items-center ds:gap-[var(--spacing-xs)]\">\n {!item.read ? (\n <span\n aria-hidden=\"true\"\n className=\"ds:inline-block ds:size-1.5 ds:shrink-0 ds:rounded-[var(--radius-full)] ds:bg-[color:var(--primary)] ds:forced-colors:bg-[Highlight]\"\n />\n ) : null}\n {variant === 'dashboard' ? (\n <h3 className=\"ds:m-0 ds:flex-1 ds:min-w-0 type-title-item\">\n {senderNode}\n </h3>\n ) : (\n <span className=\"ds:flex-1 ds:min-w-0 type-title-item ds:text-[color:var(--foreground)]\">\n {senderNode}\n </span>\n )}\n {showThreadCount ? (\n <span\n aria-label={t('ui.messageCard.threadCount', {\n count: item.unreadCount,\n defaultValue_one: '{{count}} new message in thread',\n defaultValue_other: '{{count}} new messages in thread',\n })}\n className=\"ds:relative ds:z-[1] ds:shrink-0 ds:inline-flex ds:items-center ds:justify-center ds:min-w-[calc(var(--spacing-md)+var(--spacing-xs))] ds:h-[calc(var(--spacing-md)+var(--spacing-xs))] ds:ps-[calc(var(--spacing-xs)/1.5)] ds:pe-[calc(var(--spacing-xs)/1.5)] ds:rounded-[var(--radius-full)] ds:bg-[color:var(--accent)] ds:text-[color:var(--accent-foreground)] ds:text-[length:var(--font-size-xs)] ds:font-semibold ds:leading-none ds:forced-colors:outline ds:forced-colors:outline-1 ds:forced-colors:outline-[CanvasText]\"\n >\n {item.unreadCount}\n </span>\n ) : null}\n </div>\n\n {item.subject ? (\n <p\n className={[\n 'ds:m-0 type-body-sm ds:text-[color:var(--foreground)] ds:truncate',\n item.read ? 'ds:font-normal' : 'ds:font-semibold',\n ].join(' ')}\n >\n {item.subject}\n </p>\n ) : null}\n\n <p className=\"ds:m-0 type-body-sm ds:text-[color:var(--muted-foreground)] ds:[overflow:hidden] ds:[display:-webkit-box] ds:[-webkit-box-orient:vertical] ds:[-webkit-line-clamp:2] ds:break-words\">\n {item.preview}\n </p>\n\n <Timestamp\n value={item.sentAt}\n shape=\"chip\"\n size=\"sm\"\n relativeWindow={12 * 60 * 60 * 1000}\n />\n\n {variant === 'dashboard' && (ctaLabel || dismissLabel) ? (\n <div className=\"ds:flex ds:flex-wrap ds:items-center ds:gap-[var(--spacing-sm)]\">\n {ctaLabel && hasSafeUrl ? (\n <Button\n intent=\"outline\"\n size=\"sm\"\n asChild\n className=\"ds:relative ds:z-[1]\"\n >\n <a\n href={item.url}\n onClick={(event) => {\n if (\n event.defaultPrevented ||\n event.metaKey ||\n event.ctrlKey ||\n event.shiftKey\n )\n return;\n onActivate?.(item);\n }}\n >\n {ctaLabel}\n </a>\n </Button>\n ) : null}\n {dismissLabel && onDismiss ? (\n <Button\n intent=\"link\"\n size=\"sm\"\n onClick={handleDismiss}\n className=\"ds:relative ds:z-[1]\"\n >\n {dismissLabel}\n </Button>\n ) : null}\n </div>\n ) : null}\n </div>\n\n {variant === 'compact' && onDismiss ? (\n <span className=\"ds:relative ds:z-[1] ds:opacity-0 ds:group-hover:opacity-100 ds:group-focus-within:opacity-100 ds:transition-opacity ds:motion-reduce:transition-none\">\n <IconButton\n icon={<X />}\n intent=\"ghost\"\n size=\"sm\"\n aria-label={t('ui.messageCard.dismiss', 'Dismiss message')}\n onClick={handleDismiss}\n />\n </span>\n ) : null}\n </div>\n );\n },\n);\n\nMessageCard.displayName = 'MessageCard';\n"],"names":["cardVariants","cva","stretchedLinkClass","isSafeMessageUrl","url","MessageCard","forwardRef","item","variant","size","onActivate","onDismiss","ctaLabel","dismissLabel","leaving","className","rest","ref","t","i18n","useTranslation","accessibleTime","useMemo","date","isControlledLeaving","isLeaving","setIsLeaving","useState","dismissTimerRef","useRef","effectiveLeaving","prefersReducedMotion","handleDismiss","useCallback","raw","ms","state","unreadSuffix","subjectFragment","ariaLabel","hasSafeUrl","senderText","jsx","senderNode","event","showThreadCount","jsxs","Avatar","Timestamp","Button","IconButton","X"],"mappings":"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"}
|
|
@@ -3,11 +3,11 @@ import { forwardRef as se, useState as S, useCallback as V, useLayoutEffect as a
|
|
|
3
3
|
import * as p from "@radix-ui/react-popover";
|
|
4
4
|
import { c as y } from "./index-D2ZczOXr.js";
|
|
5
5
|
import { useTranslation as E } from "react-i18next";
|
|
6
|
-
import { I as te } from "./icon-button-
|
|
7
|
-
import { B } from "./button-
|
|
6
|
+
import { I as te } from "./icon-button-Wnnde5lc.js";
|
|
7
|
+
import { B } from "./button-7mLWcMp_.js";
|
|
8
8
|
import { S as P } from "./separator-B4wXDLNC.js";
|
|
9
|
-
import { S as l } from "./skeleton-
|
|
10
|
-
import { M as re } from "./message-card-
|
|
9
|
+
import { S as l } from "./skeleton-dtqyF09N.js";
|
|
10
|
+
import { M as re } from "./message-card-qAp2-WQK.js";
|
|
11
11
|
import { M as L } from "./mail-C8irm52s.js";
|
|
12
12
|
const ne = y("ds:relative ds:inline-flex ds:items-center", {
|
|
13
13
|
variants: {
|
|
@@ -300,4 +300,4 @@ ce.displayName = "MessageTray";
|
|
|
300
300
|
export {
|
|
301
301
|
ce as M
|
|
302
302
|
};
|
|
303
|
-
//# sourceMappingURL=message-tray-
|
|
303
|
+
//# sourceMappingURL=message-tray-VaLpQU5t.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"message-tray-BWbjXW3F.js","sources":["../../src/components/message-tray/message-tray.tsx"],"sourcesContent":["import {\n forwardRef,\n useCallback,\n useEffect,\n useLayoutEffect,\n useRef,\n useState,\n type HTMLAttributes,\n} from 'react';\nimport * as RadixPopover from '@radix-ui/react-popover';\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport { useTranslation } from 'react-i18next';\nimport { Mail } from 'lucide-react';\nimport { IconButton } from '../button/icon-button';\nimport { Button } from '../button/button';\nimport { Separator } from '../separator/separator';\nimport { Skeleton } from '../skeleton/skeleton';\nimport { MessageCard, type MessageItem } from '../message-card/message-card';\n\n/* ------------------------------------------------------------------ */\n/* Types */\n/* ------------------------------------------------------------------ */\n\nexport interface MessageTrayProps\n extends Omit<\n HTMLAttributes<HTMLDivElement>,\n 'onClick' | 'children' | 'role'\n >,\n VariantProps<typeof messageTrayVariants> {\n /** Messages rendered in the dropdown panel. */\n items: MessageItem[];\n /** Number of unread messages. Drives the badge count. */\n unreadCount?: number;\n /** Controlled open state. */\n open?: boolean;\n /** Fires when the open state changes. */\n onOpenChange?: (open: boolean) => void;\n /** Fires when the user activates an item (click or Enter/Space). */\n onItemClick?: (item: MessageItem) => void;\n /** Fires when the user dismisses / archives a message. */\n onDismiss?: (item: MessageItem) => void;\n /** Fires when the user clicks the header \"Mark all as read\" action. */\n onMarkAllRead?: () => void;\n /** When true the panel shows skeleton placeholders. */\n loading?: boolean;\n /**\n * Advisory item count before the list scrolls. Consumers override the cap\n * via the `--message-tray-max-block-size` custom property.\n */\n maxVisible?: number;\n /** When set renders a footer link that invokes `onViewAll`. */\n viewAllLabel?: string;\n /** Fires when the footer \"View all\" link is clicked. */\n onViewAll?: () => void;\n /** Panel alignment relative to the trigger. Default `'end'`. */\n align?: 'start' | 'center' | 'end';\n /** Side of the trigger to open on. Default `'bottom'`. */\n side?: 'top' | 'bottom';\n}\n\n/* ------------------------------------------------------------------ */\n/* CVA */\n/* ------------------------------------------------------------------ */\n\nconst messageTrayVariants = cva('ds:relative ds:inline-flex ds:items-center', {\n variants: {\n size: {\n sm: '',\n md: '',\n },\n },\n defaultVariants: {\n size: 'md',\n },\n});\n\nconst panelVariants = cva(\n [\n 'ds:flex ds:flex-col',\n 'ds:bg-[var(--popover)] ds:text-[var(--popover-foreground)]',\n 'ds:border ds:border-[color:var(--border)]',\n 'ds:rounded-[var(--radius-md)]',\n 'ds:shadow-[var(--shadow-lg)]',\n 'ds:z-[var(--z-popover)]',\n // Width: fluid below the design cap so narrow viewports keep a visible\n // gutter on both sides (shadow included). Cap slightly wider than\n // NotificationTray because message rows carry subject + preview.\n 'ds:w-[min(26rem,calc(100vw-2*var(--spacing-md)))]',\n // Height: below the `sm` breakpoint the panel takes a near-full-screen\n // sheet shape so the user gets room to triage an inbox without\n // scrolling a tiny popover. `6rem` reserves space for the Header\n // (≈4rem) plus the sideOffset + collisionPadding (≈2rem). Above `sm`\n // it returns to `h-auto` so the list's own cap governs the height.\n 'ds:h-[calc(100dvh-6rem)] ds:sm:h-auto',\n 'ds:data-[state=open]:animate-in ds:data-[state=closed]:animate-out',\n 'ds:data-[state=closed]:fade-out-0 ds:data-[state=open]:fade-in-0',\n 'ds:data-[state=closed]:zoom-out-95 ds:data-[state=open]:zoom-in-95',\n 'ds:motion-reduce:transition-none ds:motion-reduce:animate-none',\n 'ds:focus-visible:outline-none',\n 'ds:forced-colors:border-[CanvasText]',\n ].join(' '),\n {\n variants: {\n size: {\n sm: 'ds:p-[var(--spacing-xs)]',\n md: 'ds:p-[var(--spacing-sm)]',\n },\n },\n defaultVariants: {\n size: 'md',\n },\n },\n);\n\nconst badgeVariants = cva(\n [\n 'ds:absolute ds:-top-[var(--spacing-xs)] ds:-end-[var(--spacing-xs)]',\n 'ds:inline-flex ds:items-center ds:justify-center',\n 'ds:min-w-[calc(var(--spacing-md)+var(--spacing-xs))] ds:h-[calc(var(--spacing-md)+var(--spacing-xs))] ds:ps-[calc(var(--spacing-xs)/1.5)] ds:pe-[calc(var(--spacing-xs)/1.5)]',\n 'ds:rounded-[var(--radius-full)]',\n 'ds:bg-[color:var(--destructive)] ds:text-[color:var(--destructive-foreground)]',\n 'ds:text-[length:var(--font-size-xs)] ds:font-semibold ds:leading-none',\n 'ds:pointer-events-none ds:select-none',\n 'ds:forced-colors:outline ds:forced-colors:outline-1 ds:forced-colors:outline-[CanvasText]',\n ].join(' '),\n);\n\n/* ------------------------------------------------------------------ */\n/* Helpers */\n/* ------------------------------------------------------------------ */\n\nfunction formatBadgeCount(count: number, overflowLabel: string): string {\n return count > 99 ? overflowLabel : String(count);\n}\n\nfunction SkeletonRow() {\n return (\n <div\n aria-hidden=\"true\"\n className=\"ds:flex ds:items-start ds:gap-[var(--spacing-sm)] ds:p-[var(--spacing-sm)]\"\n >\n <Skeleton variant=\"circular\" size=\"sm\" />\n <div className=\"ds:flex-1 ds:flex ds:flex-col ds:gap-[var(--spacing-xs)]\">\n <Skeleton variant=\"text\" size=\"md\" width=\"60%\" />\n <Skeleton variant=\"text\" size=\"sm\" width=\"80%\" />\n <Skeleton variant=\"text\" size=\"sm\" width=\"95%\" />\n <Skeleton variant=\"text\" size=\"sm\" width=\"30%\" />\n </div>\n </div>\n );\n}\n\nfunction EmptyPanel() {\n const { t } = useTranslation();\n return (\n <div\n role=\"status\"\n aria-live=\"polite\"\n className=\"ds:flex ds:flex-col ds:items-center ds:justify-center ds:gap-[var(--spacing-xs)] ds:p-[var(--spacing-lg)] ds:text-center\"\n >\n <span\n aria-hidden=\"true\"\n className=\"ds:inline-flex ds:items-center ds:justify-center ds:size-10 ds:rounded-[var(--radius-full)] ds:bg-[color:var(--muted)] ds:text-[color:var(--muted-foreground)] ds:[&>svg]:size-5\"\n >\n <Mail />\n </span>\n <p className=\"type-title-item ds:text-[color:var(--foreground)]\">\n {t('ui.messageTray.noMessages', 'No messages')}\n </p>\n <p className=\"type-meta ds:text-[color:var(--muted-foreground)]\">\n {t(\n 'ui.messageTray.noMessagesDescription',\n 'Your inbox is clear.',\n )}\n </p>\n </div>\n );\n}\n\n/* ------------------------------------------------------------------ */\n/* Root */\n/* ------------------------------------------------------------------ */\n\nexport const MessageTray = forwardRef<HTMLDivElement, MessageTrayProps>(\n (\n {\n items,\n unreadCount,\n open,\n onOpenChange,\n onItemClick,\n onDismiss,\n onMarkAllRead,\n loading = false,\n maxVisible,\n viewAllLabel,\n onViewAll,\n align = 'end',\n side = 'bottom',\n size = 'md',\n className,\n ...rest\n },\n ref,\n ) => {\n const { t } = useTranslation();\n\n const isControlled = open !== undefined;\n const [internalOpen, setInternalOpen] = useState(false);\n const isOpen = isControlled ? open : internalOpen;\n\n const handleOpenChange = useCallback(\n (next: boolean) => {\n if (!isControlled) setInternalOpen(next);\n onOpenChange?.(next);\n },\n [isControlled, onOpenChange],\n );\n\n /* Exit-animation list — same AnimatePresence-style bookkeeping as\n * NotificationTray. See that component for rationale. */\n type Displayed = { item: MessageItem; leaving: boolean };\n const [displayed, setDisplayed] = useState<Displayed[]>(() =>\n items.map((item) => ({ item, leaving: false })),\n );\n\n const animationDurationMs = useCallback((): number => {\n if (typeof window === 'undefined') return 200;\n const raw = window\n .getComputedStyle(document.documentElement)\n .getPropertyValue('--animation-duration');\n if (!raw) return 200;\n const trimmed = raw.trim();\n const n = parseFloat(trimmed);\n if (!Number.isFinite(n)) return 200;\n return trimmed.endsWith('ms') ? n : n * 1000;\n }, []);\n\n useLayoutEffect(() => {\n setDisplayed((prev) => {\n const nextIds = new Set(items.map((i) => i.id));\n const prevIds = new Set(prev.map((d) => d.item.id));\n\n const merged: Displayed[] = prev.map((d) => {\n if (nextIds.has(d.item.id)) {\n const fresh = items.find((i) => i.id === d.item.id);\n return fresh\n ? { item: fresh, leaving: false }\n : { ...d, leaving: true };\n }\n return { ...d, leaving: true };\n });\n\n for (const i of items) {\n if (!prevIds.has(i.id)) merged.push({ item: i, leaving: false });\n }\n return merged;\n });\n }, [items]);\n\n useEffect(() => {\n if (!displayed.some((d) => d.leaving)) return;\n const ms = animationDurationMs();\n const timer = setTimeout(() => {\n setDisplayed((prev) => prev.filter((d) => !d.leaving));\n }, ms);\n return () => clearTimeout(timer);\n }, [displayed, animationDurationMs]);\n\n const liveRegionRef = useRef<HTMLDivElement | null>(null);\n const lastTopIdRef = useRef<string | undefined>(items[0]?.id);\n\n useEffect(() => {\n const topId = items[0]?.id;\n const prev = lastTopIdRef.current;\n if (prev && topId && prev !== topId && liveRegionRef.current) {\n const newest = items[0];\n if (newest && !newest.read) {\n liveRegionRef.current.textContent = t(\n 'ui.messageTray.newMessage',\n {\n sender: newest.sender.name,\n defaultValue: 'New message from {{sender}}',\n },\n );\n }\n }\n lastTopIdRef.current = topId;\n }, [items, t]);\n\n const displayCount = unreadCount ?? 0;\n const triggerAriaLabel =\n displayCount > 0\n ? t('ui.messageTray.triggerLabel', {\n count: displayCount,\n defaultValue: 'Messages, {{count}} unread',\n })\n : t('ui.messageTray.triggerLabelNone', 'Messages, none unread');\n\n const badgeLabel = formatBadgeCount(\n displayCount,\n t('ui.messageTray.badgeCountOverflow', '99+'),\n );\n\n const panelClass = panelVariants({ size });\n\n return (\n <div\n ref={ref}\n data-component=\"message-tray\"\n className={[messageTrayVariants({ size }), className]\n .filter(Boolean)\n .join(' ')}\n {...rest}\n >\n <RadixPopover.Root open={isOpen} onOpenChange={handleOpenChange}>\n <RadixPopover.Trigger asChild>\n <IconButton\n icon={<Mail />}\n intent=\"outline\"\n size={size === 'sm' ? 'sm' : 'md'}\n aria-label={triggerAriaLabel}\n aria-haspopup=\"dialog\"\n />\n </RadixPopover.Trigger>\n {displayCount > 0 ? (\n <span\n aria-hidden=\"true\"\n data-testid=\"message-tray-badge\"\n className={badgeVariants()}\n >\n {badgeLabel}\n </span>\n ) : null}\n <div\n ref={liveRegionRef}\n aria-live=\"polite\"\n aria-atomic=\"true\"\n className=\"ds:sr-only\"\n />\n <RadixPopover.Portal>\n <RadixPopover.Content\n role=\"dialog\"\n aria-label={t('ui.messageTray.panelTitle', 'Messages')}\n side={side}\n align={align}\n sideOffset={8}\n // `spacing-md` (16px) keeps Radix's collision-avoidance from\n // flush-mounting the panel against the viewport edge when the\n // trigger is near the inline-end of a narrow screen.\n collisionPadding={16}\n className={panelClass}\n >\n <div className=\"ds:flex ds:items-center ds:justify-between ds:gap-[var(--spacing-sm)] ds:ps-[var(--spacing-sm)] ds:pe-[var(--spacing-sm)] ds:pb-[var(--spacing-xs)]\">\n <h3 className=\"ds:m-0 type-title-card ds:text-[color:var(--foreground)]\">\n {t('ui.messageTray.panelTitle', 'Messages')}\n </h3>\n {onMarkAllRead && items.some((item) => !item.read) ? (\n <Button\n intent=\"link\"\n size=\"sm\"\n onClick={onMarkAllRead}\n className=\"ds:text-[length:var(--font-size-xs)]\"\n >\n {t('ui.messageTray.markAllRead', 'Mark all as read')}\n </Button>\n ) : null}\n </div>\n <Separator />\n <div\n role=\"list\"\n data-max-visible={maxVisible}\n // Below `sm` the panel is a near-full-screen sheet (see\n // `panelVariants`) and the list expands to fill the\n // remaining space with `flex-1`. Above `sm` the list\n // caps at the `--message-tray-max-block-size` custom\n // property so the popover stays compact.\n className=\"ds:flex ds:flex-col ds:gap-[var(--spacing-xs)] ds:overflow-y-auto ds:pt-[var(--spacing-xs)] ds:flex-1 ds:sm:flex-none ds:sm:[max-block-size:var(--message-tray-max-block-size,26rem)]\"\n >\n {loading ? (\n <>\n <SkeletonRow />\n <SkeletonRow />\n <SkeletonRow />\n </>\n ) : displayed.length === 0 ? (\n <EmptyPanel />\n ) : (\n displayed.map(({ item, leaving }) => (\n <MessageCard\n key={item.id}\n item={item}\n variant=\"compact\"\n leaving={leaving}\n onActivate={onItemClick}\n onDismiss={onDismiss}\n />\n ))\n )}\n </div>\n {viewAllLabel ? (\n <>\n <Separator />\n <div className=\"ds:pt-[var(--spacing-xs)]\">\n <Button\n intent=\"link\"\n size=\"sm\"\n onClick={onViewAll}\n className=\"ds:w-full ds:justify-center\"\n >\n {viewAllLabel}\n </Button>\n </div>\n </>\n ) : null}\n </RadixPopover.Content>\n </RadixPopover.Portal>\n </RadixPopover.Root>\n </div>\n );\n },\n);\n\nMessageTray.displayName = 'MessageTray';\n"],"names":["messageTrayVariants","cva","panelVariants","badgeVariants","formatBadgeCount","count","overflowLabel","SkeletonRow","jsxs","jsx","Skeleton","EmptyPanel","t","useTranslation","Mail","MessageTray","forwardRef","items","unreadCount","open","onOpenChange","onItemClick","onDismiss","onMarkAllRead","loading","maxVisible","viewAllLabel","onViewAll","align","side","size","className","rest","ref","isControlled","internalOpen","setInternalOpen","useState","isOpen","handleOpenChange","useCallback","next","displayed","setDisplayed","item","animationDurationMs","raw","trimmed","n","useLayoutEffect","prev","nextIds","i","prevIds","d","merged","fresh","useEffect","ms","timer","liveRegionRef","useRef","lastTopIdRef","_a","topId","newest","displayCount","triggerAriaLabel","badgeLabel","panelClass","RadixPopover","IconButton","Button","Separator","Fragment","leaving","MessageCard"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"message-tray-VaLpQU5t.js","sources":["../../src/components/message-tray/message-tray.tsx"],"sourcesContent":["import {\n forwardRef,\n useCallback,\n useEffect,\n useLayoutEffect,\n useRef,\n useState,\n type HTMLAttributes,\n} from 'react';\nimport * as RadixPopover from '@radix-ui/react-popover';\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport { useTranslation } from 'react-i18next';\nimport { Mail } from 'lucide-react';\nimport { IconButton } from '../button/icon-button';\nimport { Button } from '../button/button';\nimport { Separator } from '../separator/separator';\nimport { Skeleton } from '../skeleton/skeleton';\nimport { MessageCard, type MessageItem } from '../message-card/message-card';\n\n/* ------------------------------------------------------------------ */\n/* Types */\n/* ------------------------------------------------------------------ */\n\nexport interface MessageTrayProps\n extends Omit<\n HTMLAttributes<HTMLDivElement>,\n 'onClick' | 'children' | 'role'\n >,\n VariantProps<typeof messageTrayVariants> {\n /** Messages rendered in the dropdown panel. */\n items: MessageItem[];\n /** Number of unread messages. Drives the badge count. */\n unreadCount?: number;\n /** Controlled open state. */\n open?: boolean;\n /** Fires when the open state changes. */\n onOpenChange?: (open: boolean) => void;\n /** Fires when the user activates an item (click or Enter/Space). */\n onItemClick?: (item: MessageItem) => void;\n /** Fires when the user dismisses / archives a message. */\n onDismiss?: (item: MessageItem) => void;\n /** Fires when the user clicks the header \"Mark all as read\" action. */\n onMarkAllRead?: () => void;\n /** When true the panel shows skeleton placeholders. */\n loading?: boolean;\n /**\n * Advisory item count before the list scrolls. Consumers override the cap\n * via the `--message-tray-max-block-size` custom property.\n */\n maxVisible?: number;\n /** When set renders a footer link that invokes `onViewAll`. */\n viewAllLabel?: string;\n /** Fires when the footer \"View all\" link is clicked. */\n onViewAll?: () => void;\n /** Panel alignment relative to the trigger. Default `'end'`. */\n align?: 'start' | 'center' | 'end';\n /** Side of the trigger to open on. Default `'bottom'`. */\n side?: 'top' | 'bottom';\n}\n\n/* ------------------------------------------------------------------ */\n/* CVA */\n/* ------------------------------------------------------------------ */\n\nconst messageTrayVariants = cva('ds:relative ds:inline-flex ds:items-center', {\n variants: {\n size: {\n sm: '',\n md: '',\n },\n },\n defaultVariants: {\n size: 'md',\n },\n});\n\nconst panelVariants = cva(\n [\n 'ds:flex ds:flex-col',\n 'ds:bg-[var(--popover)] ds:text-[var(--popover-foreground)]',\n 'ds:border ds:border-[color:var(--border)]',\n 'ds:rounded-[var(--radius-md)]',\n 'ds:shadow-[var(--shadow-lg)]',\n 'ds:z-[var(--z-popover)]',\n // Width: fluid below the design cap so narrow viewports keep a visible\n // gutter on both sides (shadow included). Cap slightly wider than\n // NotificationTray because message rows carry subject + preview.\n 'ds:w-[min(26rem,calc(100vw-2*var(--spacing-md)))]',\n // Height: below the `sm` breakpoint the panel takes a near-full-screen\n // sheet shape so the user gets room to triage an inbox without\n // scrolling a tiny popover. `6rem` reserves space for the Header\n // (≈4rem) plus the sideOffset + collisionPadding (≈2rem). Above `sm`\n // it returns to `h-auto` so the list's own cap governs the height.\n 'ds:h-[calc(100dvh-6rem)] ds:sm:h-auto',\n 'ds:data-[state=open]:animate-in ds:data-[state=closed]:animate-out',\n 'ds:data-[state=closed]:fade-out-0 ds:data-[state=open]:fade-in-0',\n 'ds:data-[state=closed]:zoom-out-95 ds:data-[state=open]:zoom-in-95',\n 'ds:motion-reduce:transition-none ds:motion-reduce:animate-none',\n 'ds:focus-visible:outline-none',\n 'ds:forced-colors:border-[CanvasText]',\n ].join(' '),\n {\n variants: {\n size: {\n sm: 'ds:p-[var(--spacing-xs)]',\n md: 'ds:p-[var(--spacing-sm)]',\n },\n },\n defaultVariants: {\n size: 'md',\n },\n },\n);\n\nconst badgeVariants = cva(\n [\n 'ds:absolute ds:-top-[var(--spacing-xs)] ds:-end-[var(--spacing-xs)]',\n 'ds:inline-flex ds:items-center ds:justify-center',\n 'ds:min-w-[calc(var(--spacing-md)+var(--spacing-xs))] ds:h-[calc(var(--spacing-md)+var(--spacing-xs))] ds:ps-[calc(var(--spacing-xs)/1.5)] ds:pe-[calc(var(--spacing-xs)/1.5)]',\n 'ds:rounded-[var(--radius-full)]',\n 'ds:bg-[color:var(--destructive)] ds:text-[color:var(--destructive-foreground)]',\n 'ds:text-[length:var(--font-size-xs)] ds:font-semibold ds:leading-none',\n 'ds:pointer-events-none ds:select-none',\n 'ds:forced-colors:outline ds:forced-colors:outline-1 ds:forced-colors:outline-[CanvasText]',\n ].join(' '),\n);\n\n/* ------------------------------------------------------------------ */\n/* Helpers */\n/* ------------------------------------------------------------------ */\n\nfunction formatBadgeCount(count: number, overflowLabel: string): string {\n return count > 99 ? overflowLabel : String(count);\n}\n\nfunction SkeletonRow() {\n return (\n <div\n aria-hidden=\"true\"\n className=\"ds:flex ds:items-start ds:gap-[var(--spacing-sm)] ds:p-[var(--spacing-sm)]\"\n >\n <Skeleton variant=\"circular\" size=\"sm\" />\n <div className=\"ds:flex-1 ds:flex ds:flex-col ds:gap-[var(--spacing-xs)]\">\n <Skeleton variant=\"text\" size=\"md\" width=\"60%\" />\n <Skeleton variant=\"text\" size=\"sm\" width=\"80%\" />\n <Skeleton variant=\"text\" size=\"sm\" width=\"95%\" />\n <Skeleton variant=\"text\" size=\"sm\" width=\"30%\" />\n </div>\n </div>\n );\n}\n\nfunction EmptyPanel() {\n const { t } = useTranslation();\n return (\n <div\n role=\"status\"\n aria-live=\"polite\"\n className=\"ds:flex ds:flex-col ds:items-center ds:justify-center ds:gap-[var(--spacing-xs)] ds:p-[var(--spacing-lg)] ds:text-center\"\n >\n <span\n aria-hidden=\"true\"\n className=\"ds:inline-flex ds:items-center ds:justify-center ds:size-10 ds:rounded-[var(--radius-full)] ds:bg-[color:var(--muted)] ds:text-[color:var(--muted-foreground)] ds:[&>svg]:size-5\"\n >\n <Mail />\n </span>\n <p className=\"type-title-item ds:text-[color:var(--foreground)]\">\n {t('ui.messageTray.noMessages', 'No messages')}\n </p>\n <p className=\"type-meta ds:text-[color:var(--muted-foreground)]\">\n {t(\n 'ui.messageTray.noMessagesDescription',\n 'Your inbox is clear.',\n )}\n </p>\n </div>\n );\n}\n\n/* ------------------------------------------------------------------ */\n/* Root */\n/* ------------------------------------------------------------------ */\n\nexport const MessageTray = forwardRef<HTMLDivElement, MessageTrayProps>(\n (\n {\n items,\n unreadCount,\n open,\n onOpenChange,\n onItemClick,\n onDismiss,\n onMarkAllRead,\n loading = false,\n maxVisible,\n viewAllLabel,\n onViewAll,\n align = 'end',\n side = 'bottom',\n size = 'md',\n className,\n ...rest\n },\n ref,\n ) => {\n const { t } = useTranslation();\n\n const isControlled = open !== undefined;\n const [internalOpen, setInternalOpen] = useState(false);\n const isOpen = isControlled ? open : internalOpen;\n\n const handleOpenChange = useCallback(\n (next: boolean) => {\n if (!isControlled) setInternalOpen(next);\n onOpenChange?.(next);\n },\n [isControlled, onOpenChange],\n );\n\n /* Exit-animation list — same AnimatePresence-style bookkeeping as\n * NotificationTray. See that component for rationale. */\n type Displayed = { item: MessageItem; leaving: boolean };\n const [displayed, setDisplayed] = useState<Displayed[]>(() =>\n items.map((item) => ({ item, leaving: false })),\n );\n\n const animationDurationMs = useCallback((): number => {\n if (typeof window === 'undefined') return 200;\n const raw = window\n .getComputedStyle(document.documentElement)\n .getPropertyValue('--animation-duration');\n if (!raw) return 200;\n const trimmed = raw.trim();\n const n = parseFloat(trimmed);\n if (!Number.isFinite(n)) return 200;\n return trimmed.endsWith('ms') ? n : n * 1000;\n }, []);\n\n useLayoutEffect(() => {\n setDisplayed((prev) => {\n const nextIds = new Set(items.map((i) => i.id));\n const prevIds = new Set(prev.map((d) => d.item.id));\n\n const merged: Displayed[] = prev.map((d) => {\n if (nextIds.has(d.item.id)) {\n const fresh = items.find((i) => i.id === d.item.id);\n return fresh\n ? { item: fresh, leaving: false }\n : { ...d, leaving: true };\n }\n return { ...d, leaving: true };\n });\n\n for (const i of items) {\n if (!prevIds.has(i.id)) merged.push({ item: i, leaving: false });\n }\n return merged;\n });\n }, [items]);\n\n useEffect(() => {\n if (!displayed.some((d) => d.leaving)) return;\n const ms = animationDurationMs();\n const timer = setTimeout(() => {\n setDisplayed((prev) => prev.filter((d) => !d.leaving));\n }, ms);\n return () => clearTimeout(timer);\n }, [displayed, animationDurationMs]);\n\n const liveRegionRef = useRef<HTMLDivElement | null>(null);\n const lastTopIdRef = useRef<string | undefined>(items[0]?.id);\n\n useEffect(() => {\n const topId = items[0]?.id;\n const prev = lastTopIdRef.current;\n if (prev && topId && prev !== topId && liveRegionRef.current) {\n const newest = items[0];\n if (newest && !newest.read) {\n liveRegionRef.current.textContent = t(\n 'ui.messageTray.newMessage',\n {\n sender: newest.sender.name,\n defaultValue: 'New message from {{sender}}',\n },\n );\n }\n }\n lastTopIdRef.current = topId;\n }, [items, t]);\n\n const displayCount = unreadCount ?? 0;\n const triggerAriaLabel =\n displayCount > 0\n ? t('ui.messageTray.triggerLabel', {\n count: displayCount,\n defaultValue: 'Messages, {{count}} unread',\n })\n : t('ui.messageTray.triggerLabelNone', 'Messages, none unread');\n\n const badgeLabel = formatBadgeCount(\n displayCount,\n t('ui.messageTray.badgeCountOverflow', '99+'),\n );\n\n const panelClass = panelVariants({ size });\n\n return (\n <div\n ref={ref}\n data-component=\"message-tray\"\n className={[messageTrayVariants({ size }), className]\n .filter(Boolean)\n .join(' ')}\n {...rest}\n >\n <RadixPopover.Root open={isOpen} onOpenChange={handleOpenChange}>\n <RadixPopover.Trigger asChild>\n <IconButton\n icon={<Mail />}\n intent=\"outline\"\n size={size === 'sm' ? 'sm' : 'md'}\n aria-label={triggerAriaLabel}\n aria-haspopup=\"dialog\"\n />\n </RadixPopover.Trigger>\n {displayCount > 0 ? (\n <span\n aria-hidden=\"true\"\n data-testid=\"message-tray-badge\"\n className={badgeVariants()}\n >\n {badgeLabel}\n </span>\n ) : null}\n <div\n ref={liveRegionRef}\n aria-live=\"polite\"\n aria-atomic=\"true\"\n className=\"ds:sr-only\"\n />\n <RadixPopover.Portal>\n <RadixPopover.Content\n role=\"dialog\"\n aria-label={t('ui.messageTray.panelTitle', 'Messages')}\n side={side}\n align={align}\n sideOffset={8}\n // `spacing-md` (16px) keeps Radix's collision-avoidance from\n // flush-mounting the panel against the viewport edge when the\n // trigger is near the inline-end of a narrow screen.\n collisionPadding={16}\n className={panelClass}\n >\n <div className=\"ds:flex ds:items-center ds:justify-between ds:gap-[var(--spacing-sm)] ds:ps-[var(--spacing-sm)] ds:pe-[var(--spacing-sm)] ds:pb-[var(--spacing-xs)]\">\n <h3 className=\"ds:m-0 type-title-card ds:text-[color:var(--foreground)]\">\n {t('ui.messageTray.panelTitle', 'Messages')}\n </h3>\n {onMarkAllRead && items.some((item) => !item.read) ? (\n <Button\n intent=\"link\"\n size=\"sm\"\n onClick={onMarkAllRead}\n className=\"ds:text-[length:var(--font-size-xs)]\"\n >\n {t('ui.messageTray.markAllRead', 'Mark all as read')}\n </Button>\n ) : null}\n </div>\n <Separator />\n <div\n role=\"list\"\n data-max-visible={maxVisible}\n // Below `sm` the panel is a near-full-screen sheet (see\n // `panelVariants`) and the list expands to fill the\n // remaining space with `flex-1`. Above `sm` the list\n // caps at the `--message-tray-max-block-size` custom\n // property so the popover stays compact.\n className=\"ds:flex ds:flex-col ds:gap-[var(--spacing-xs)] ds:overflow-y-auto ds:pt-[var(--spacing-xs)] ds:flex-1 ds:sm:flex-none ds:sm:[max-block-size:var(--message-tray-max-block-size,26rem)]\"\n >\n {loading ? (\n <>\n <SkeletonRow />\n <SkeletonRow />\n <SkeletonRow />\n </>\n ) : displayed.length === 0 ? (\n <EmptyPanel />\n ) : (\n displayed.map(({ item, leaving }) => (\n <MessageCard\n key={item.id}\n item={item}\n variant=\"compact\"\n leaving={leaving}\n onActivate={onItemClick}\n onDismiss={onDismiss}\n />\n ))\n )}\n </div>\n {viewAllLabel ? (\n <>\n <Separator />\n <div className=\"ds:pt-[var(--spacing-xs)]\">\n <Button\n intent=\"link\"\n size=\"sm\"\n onClick={onViewAll}\n className=\"ds:w-full ds:justify-center\"\n >\n {viewAllLabel}\n </Button>\n </div>\n </>\n ) : null}\n </RadixPopover.Content>\n </RadixPopover.Portal>\n </RadixPopover.Root>\n </div>\n );\n },\n);\n\nMessageTray.displayName = 'MessageTray';\n"],"names":["messageTrayVariants","cva","panelVariants","badgeVariants","formatBadgeCount","count","overflowLabel","SkeletonRow","jsxs","jsx","Skeleton","EmptyPanel","t","useTranslation","Mail","MessageTray","forwardRef","items","unreadCount","open","onOpenChange","onItemClick","onDismiss","onMarkAllRead","loading","maxVisible","viewAllLabel","onViewAll","align","side","size","className","rest","ref","isControlled","internalOpen","setInternalOpen","useState","isOpen","handleOpenChange","useCallback","next","displayed","setDisplayed","item","animationDurationMs","raw","trimmed","n","useLayoutEffect","prev","nextIds","i","prevIds","d","merged","fresh","useEffect","ms","timer","liveRegionRef","useRef","lastTopIdRef","_a","topId","newest","displayCount","triggerAriaLabel","badgeLabel","panelClass","RadixPopover","IconButton","Button","Separator","Fragment","leaving","MessageCard"],"mappings":"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"}
|
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
import { jsx as r, jsxs as w } from "react/jsx-runtime";
|
|
2
2
|
import { forwardRef as Fe, useContext as Ve, useState as T, useRef as M, useMemo as j, useLayoutEffect as De } from "react";
|
|
3
3
|
import * as E from "@radix-ui/react-popover";
|
|
4
|
-
import { _ as
|
|
4
|
+
import { _ as l } from "./index-4xgbg-sn.js";
|
|
5
5
|
import { c as re } from "./index-D2ZczOXr.js";
|
|
6
6
|
import { useTranslation as Le } from "react-i18next";
|
|
7
7
|
import { u as ze, F as Oe } from "./form-field-context-94LwgYTQ.js";
|
|
8
8
|
import { T as ee } from "./tooltip-DHik5yRI.js";
|
|
9
9
|
import { c as Me } from "./compose-refs-C0k0tdqF.js";
|
|
10
10
|
import { g as je } from "./group-options-BvKhQ3xb.js";
|
|
11
|
-
import { b as P, c as Pe } from "./input-surface-
|
|
11
|
+
import { b as P, c as Pe } from "./input-surface-u4QB0lxe.js";
|
|
12
12
|
import { X as $e } from "./x-CCcI3eJp.js";
|
|
13
13
|
import { C as qe } from "./check-DPdL_Sm7.js";
|
|
14
14
|
const Be = re(
|
|
@@ -49,37 +49,37 @@ const Be = re(
|
|
|
49
49
|
defaultVariants: { size: "md" }
|
|
50
50
|
}
|
|
51
51
|
), Ke = [
|
|
52
|
-
"inline-flex items-center justify-center shrink-0",
|
|
53
|
-
"rounded-[var(--radius-sm)]",
|
|
54
|
-
"text-muted-foreground hover:text-foreground",
|
|
55
|
-
"transition-colors duration-[var(--animation-duration)] motion-reduce:transition-none",
|
|
56
|
-
"focus-visible:outline-[length:var(--focus-ring-width)] focus-visible:outline-solid",
|
|
57
|
-
"focus-visible:outline-ring focus-visible:outline-offset-[length:var(--focus-ring-offset)]",
|
|
58
|
-
"size-4",
|
|
59
|
-
'relative before:absolute before:inset-[calc((var(--min-target-size)-100%)/-2)] before:content-[""]'
|
|
52
|
+
"ds:inline-flex ds:items-center ds:justify-center ds:shrink-0",
|
|
53
|
+
"ds:rounded-[var(--radius-sm)]",
|
|
54
|
+
"ds:text-muted-foreground ds:hover:text-foreground",
|
|
55
|
+
"ds:transition-colors ds:duration-[var(--animation-duration)] ds:motion-reduce:transition-none",
|
|
56
|
+
"ds:focus-visible:outline-[length:var(--focus-ring-width)] ds:focus-visible:outline-solid",
|
|
57
|
+
"ds:focus-visible:outline-ring ds:focus-visible:outline-offset-[length:var(--focus-ring-offset)]",
|
|
58
|
+
"ds:size-4",
|
|
59
|
+
'ds:relative ds:before:absolute ds:before:inset-[calc((var(--min-target-size)-100%)/-2)] ds:before:content-[""]'
|
|
60
60
|
].join(" "), Ue = [
|
|
61
|
-
"z-[var(--z-dropdown)] overflow-hidden",
|
|
62
|
-
"min-w-[var(--radix-popover-trigger-width)]",
|
|
63
|
-
"rounded-[var(--radius-md)] border border-border bg-background text-foreground",
|
|
64
|
-
"shadow-[var(--shadow-lg)]",
|
|
65
|
-
"animate-in fade-in zoom-in-95",
|
|
66
|
-
"data-[state=closed]:animate-out data-[state=closed]:fade-out",
|
|
67
|
-
"data-[state=closed]:zoom-out-95",
|
|
68
|
-
"data-[side=bottom]:slide-in-from-top-2",
|
|
69
|
-
"data-[side=top]:slide-in-from-bottom-2",
|
|
70
|
-
"motion-reduce:animate-none"
|
|
61
|
+
"ds:z-[var(--z-dropdown)] ds:overflow-hidden",
|
|
62
|
+
"ds:min-w-[var(--radix-popover-trigger-width)]",
|
|
63
|
+
"ds:rounded-[var(--radius-md)] ds:border ds:border-border ds:bg-background ds:text-foreground",
|
|
64
|
+
"ds:shadow-[var(--shadow-lg)]",
|
|
65
|
+
"ds:animate-in ds:fade-in ds:zoom-in-95",
|
|
66
|
+
"ds:data-[state=closed]:animate-out ds:data-[state=closed]:fade-out",
|
|
67
|
+
"ds:data-[state=closed]:zoom-out-95",
|
|
68
|
+
"ds:data-[side=bottom]:slide-in-from-top-2",
|
|
69
|
+
"ds:data-[side=top]:slide-in-from-bottom-2",
|
|
70
|
+
"ds:motion-reduce:animate-none"
|
|
71
71
|
].join(" "), Ye = [
|
|
72
|
-
"relative flex cursor-pointer items-center",
|
|
73
|
-
"rounded-[var(--radius-sm)] ps-2 pe-2 py-1.5",
|
|
74
|
-
"text-[var(--font-size-sm)] text-foreground outline-none select-none",
|
|
75
|
-
"data-[selected=true]:bg-muted data-[selected=true]:text-foreground",
|
|
76
|
-
"aria-[disabled=true]:pointer-events-none aria-[disabled=true]:opacity-50",
|
|
77
|
-
"data-[disabled=true]:pointer-events-none data-[disabled=true]:opacity-50"
|
|
72
|
+
"ds:relative ds:flex ds:cursor-pointer ds:items-center",
|
|
73
|
+
"ds:rounded-[var(--radius-sm)] ds:ps-2 ds:pe-2 ds:py-1.5",
|
|
74
|
+
"ds:text-[var(--font-size-sm)] ds:text-foreground ds:outline-none ds:select-none",
|
|
75
|
+
"ds:data-[selected=true]:bg-muted ds:data-[selected=true]:text-foreground",
|
|
76
|
+
"ds:aria-[disabled=true]:pointer-events-none ds:aria-[disabled=true]:opacity-50",
|
|
77
|
+
"ds:data-[disabled=true]:pointer-events-none ds:data-[disabled=true]:opacity-50"
|
|
78
78
|
].join(" "), se = [
|
|
79
|
-
"relative flex cursor-pointer items-center",
|
|
80
|
-
"rounded-[var(--radius-sm)] ps-2 pe-2 py-1.5",
|
|
81
|
-
"text-[var(--font-size-sm)] font-medium text-primary outline-none select-none",
|
|
82
|
-
"data-[selected=true]:bg-muted"
|
|
79
|
+
"ds:relative ds:flex ds:cursor-pointer ds:items-center",
|
|
80
|
+
"ds:rounded-[var(--radius-sm)] ds:ps-2 ds:pe-2 ds:py-1.5",
|
|
81
|
+
"ds:text-[var(--font-size-sm)] ds:font-medium ds:text-primary ds:outline-none ds:select-none",
|
|
82
|
+
"ds:data-[selected=true]:bg-muted"
|
|
83
83
|
].join(" "), Ge = "__ui-multiselect-select-all__", He = "__ui-multiselect-clear-all__", ne = Fe(
|
|
84
84
|
function({
|
|
85
85
|
options: p,
|
|
@@ -93,14 +93,14 @@ const Be = re(
|
|
|
93
93
|
allowClear: B = !1,
|
|
94
94
|
filter: D,
|
|
95
95
|
size: C = "md",
|
|
96
|
-
disabled:
|
|
97
|
-
className:
|
|
98
|
-
id:
|
|
96
|
+
disabled: de,
|
|
97
|
+
className: ae,
|
|
98
|
+
id: le,
|
|
99
99
|
...ue
|
|
100
100
|
}, ce) {
|
|
101
101
|
const { t: u } = Le(), b = ze(), x = Ve(Oe) !== null, [me, fe] = T(
|
|
102
102
|
oe ?? []
|
|
103
|
-
), K = $ !== void 0, n = K ? $ : me, [U, m] = T(!1), [g, Y] = T(""), v = M(null), y = M([]), G = M(null), pe = Me(ce, G), f = x && b.disabled || !!
|
|
103
|
+
), K = $ !== void 0, n = K ? $ : me, [U, m] = T(!1), [g, Y] = T(""), v = M(null), y = M([]), G = M(null), pe = Me(ce, G), f = x && b.disabled || !!de, he = x && b.required, H = x && b.invalid, be = x && b.describedBy ? b.describedBy : void 0, ge = le ?? (x ? b.id : void 0), ve = j(() => {
|
|
104
104
|
const e = /* @__PURE__ */ new Map();
|
|
105
105
|
for (const t of p) e.set(t.value, t.label);
|
|
106
106
|
return e;
|
|
@@ -132,10 +132,10 @@ const Be = re(
|
|
|
132
132
|
const t = e.currentTarget;
|
|
133
133
|
if (e.key === "Backspace" && g === "" && n.length > 0) {
|
|
134
134
|
e.preventDefault();
|
|
135
|
-
const i = n.length - 1,
|
|
136
|
-
|
|
135
|
+
const i = n.length - 1, a = L(i).length - 1;
|
|
136
|
+
a >= 0 && requestAnimationFrame(() => {
|
|
137
137
|
var c;
|
|
138
|
-
(c = y.current[
|
|
138
|
+
(c = y.current[a]) == null || c.focus();
|
|
139
139
|
});
|
|
140
140
|
return;
|
|
141
141
|
}
|
|
@@ -144,8 +144,8 @@ const Be = re(
|
|
|
144
144
|
const i = document.dir === "rtl" || t.dir === "rtl";
|
|
145
145
|
if (i && e.key === "ArrowRight" || !i && e.key === "ArrowLeft") {
|
|
146
146
|
e.preventDefault();
|
|
147
|
-
const
|
|
148
|
-
(o = y.current[
|
|
147
|
+
const a = n.length - 1;
|
|
148
|
+
(o = y.current[a]) == null || o.focus();
|
|
149
149
|
}
|
|
150
150
|
return;
|
|
151
151
|
}
|
|
@@ -155,7 +155,7 @@ const Be = re(
|
|
|
155
155
|
}
|
|
156
156
|
!U && (e.key === "ArrowDown" || e.key === "Enter") && m(!0);
|
|
157
157
|
}, Ae = (e) => (t) => {
|
|
158
|
-
var
|
|
158
|
+
var d, a, c, A;
|
|
159
159
|
if (t.key === "Backspace" || t.key === "Delete" || t.key === "Enter" || t.key === " ") {
|
|
160
160
|
t.preventDefault(), t.stopPropagation();
|
|
161
161
|
const R = L(e);
|
|
@@ -177,11 +177,11 @@ const Be = re(
|
|
|
177
177
|
if (t.key === o) {
|
|
178
178
|
t.preventDefault();
|
|
179
179
|
const R = Math.max(0, e - 1);
|
|
180
|
-
(
|
|
180
|
+
(d = y.current[R]) == null || d.focus();
|
|
181
181
|
return;
|
|
182
182
|
}
|
|
183
183
|
if (t.key === i) {
|
|
184
|
-
t.preventDefault(), e < n.length - 1 ? (
|
|
184
|
+
t.preventDefault(), e < n.length - 1 ? (a = y.current[e + 1]) == null || a.focus() : (c = v.current) == null || c.focus();
|
|
185
185
|
return;
|
|
186
186
|
}
|
|
187
187
|
t.key === "Escape" && (m(!1), (A = v.current) == null || A.focus());
|
|
@@ -200,11 +200,11 @@ const Be = re(
|
|
|
200
200
|
return;
|
|
201
201
|
}
|
|
202
202
|
const i = o[0].offsetTop;
|
|
203
|
-
let
|
|
204
|
-
for (const
|
|
205
|
-
if (
|
|
203
|
+
let d = 0;
|
|
204
|
+
for (const a of o)
|
|
205
|
+
if (a.offsetTop === i) d++;
|
|
206
206
|
else break;
|
|
207
|
-
|
|
207
|
+
d === o.length ? z(Number.POSITIVE_INFINITY) : z(Math.max(1, d - 1));
|
|
208
208
|
};
|
|
209
209
|
t();
|
|
210
210
|
const s = new ResizeObserver(t);
|
|
@@ -228,12 +228,12 @@ const Be = re(
|
|
|
228
228
|
count: n.length,
|
|
229
229
|
defaultValue: `${n.length} selected`
|
|
230
230
|
}), { onClick: O, ...Te } = ue;
|
|
231
|
-
return /* @__PURE__ */ r(
|
|
231
|
+
return /* @__PURE__ */ r(l, { shouldFilter: !1, label: Re, children: /* @__PURE__ */ w(E.Root, { open: U, onOpenChange: _e, children: [
|
|
232
232
|
/* @__PURE__ */ r(E.Anchor, { asChild: !0, children: /* @__PURE__ */ w(
|
|
233
233
|
"div",
|
|
234
234
|
{
|
|
235
235
|
ref: pe,
|
|
236
|
-
className: Be({ size: C, className:
|
|
236
|
+
className: Be({ size: C, className: ae }),
|
|
237
237
|
"aria-disabled": f || void 0,
|
|
238
238
|
"aria-invalid": H || void 0,
|
|
239
239
|
"data-component": "multi-select",
|
|
@@ -304,7 +304,7 @@ const Be = re(
|
|
|
304
304
|
}
|
|
305
305
|
) : null,
|
|
306
306
|
/* @__PURE__ */ r(
|
|
307
|
-
|
|
307
|
+
l.Input,
|
|
308
308
|
{
|
|
309
309
|
ref: v,
|
|
310
310
|
value: g,
|
|
@@ -338,16 +338,16 @@ const Be = re(
|
|
|
338
338
|
sideOffset: 4,
|
|
339
339
|
className: Ue,
|
|
340
340
|
children: /* @__PURE__ */ w(
|
|
341
|
-
|
|
341
|
+
l.List,
|
|
342
342
|
{
|
|
343
343
|
role: "listbox",
|
|
344
344
|
"aria-multiselectable": "true",
|
|
345
345
|
"aria-label": Q,
|
|
346
346
|
className: "ds:max-h-[20rem] ds:overflow-y-auto ds:p-1",
|
|
347
347
|
children: [
|
|
348
|
-
Se ? /* @__PURE__ */ w(
|
|
348
|
+
Se ? /* @__PURE__ */ w(l.Group, { children: [
|
|
349
349
|
q ? /* @__PURE__ */ r(
|
|
350
|
-
|
|
350
|
+
l.Item,
|
|
351
351
|
{
|
|
352
352
|
value: Ge,
|
|
353
353
|
onSelect: we,
|
|
@@ -356,7 +356,7 @@ const Be = re(
|
|
|
356
356
|
}
|
|
357
357
|
) : null,
|
|
358
358
|
B ? /* @__PURE__ */ r(
|
|
359
|
-
|
|
359
|
+
l.Item,
|
|
360
360
|
{
|
|
361
361
|
value: He,
|
|
362
362
|
onSelect: xe,
|
|
@@ -365,18 +365,18 @@ const Be = re(
|
|
|
365
365
|
}
|
|
366
366
|
) : null
|
|
367
367
|
] }) : null,
|
|
368
|
-
/* @__PURE__ */ r(
|
|
368
|
+
/* @__PURE__ */ r(l.Empty, { className: "ds:ps-2 ds:pe-2 ds:py-2 type-body-sm ds:text-muted-foreground", children: u("ui.inputs.multiSelect.noOptions", "No options found") }),
|
|
369
369
|
Ie.map(({ group: e, items: t }, s) => {
|
|
370
370
|
const o = t.map((i) => {
|
|
371
|
-
const
|
|
372
|
-
|
|
371
|
+
const d = n.includes(i.value), a = !d && X, c = !!i.disabled || a, A = /* @__PURE__ */ w(
|
|
372
|
+
l.Item,
|
|
373
373
|
{
|
|
374
374
|
value: i.value,
|
|
375
375
|
disabled: c,
|
|
376
376
|
onSelect: () => {
|
|
377
377
|
c || ye(i.value);
|
|
378
378
|
},
|
|
379
|
-
"aria-selected":
|
|
379
|
+
"aria-selected": d,
|
|
380
380
|
"aria-disabled": c || void 0,
|
|
381
381
|
className: Ye,
|
|
382
382
|
children: [
|
|
@@ -386,10 +386,10 @@ const Be = re(
|
|
|
386
386
|
className: [
|
|
387
387
|
"ds:inline-flex ds:items-center ds:justify-center ds:me-2 ds:shrink-0",
|
|
388
388
|
"ds:size-4 ds:rounded-[var(--radius-sm)] ds:border ds:border-border",
|
|
389
|
-
|
|
389
|
+
d ? "ds:bg-primary ds:border-primary ds:text-primary-foreground" : "ds:bg-background"
|
|
390
390
|
].join(" "),
|
|
391
391
|
"aria-hidden": "true",
|
|
392
|
-
children:
|
|
392
|
+
children: d ? /* @__PURE__ */ r(qe, { className: "ds:size-3.5" }) : null
|
|
393
393
|
}
|
|
394
394
|
),
|
|
395
395
|
/* @__PURE__ */ r("span", { className: "ds:flex-1 ds:text-start", children: i.label })
|
|
@@ -397,7 +397,7 @@ const Be = re(
|
|
|
397
397
|
},
|
|
398
398
|
i.value
|
|
399
399
|
);
|
|
400
|
-
return
|
|
400
|
+
return a ? /* @__PURE__ */ r(
|
|
401
401
|
ee,
|
|
402
402
|
{
|
|
403
403
|
label: u("ui.inputs.multiSelect.maxReached", {
|
|
@@ -411,14 +411,14 @@ const Be = re(
|
|
|
411
411
|
) : A;
|
|
412
412
|
});
|
|
413
413
|
return e ? /* @__PURE__ */ r(
|
|
414
|
-
|
|
414
|
+
l.Group,
|
|
415
415
|
{
|
|
416
416
|
heading: e,
|
|
417
417
|
className: "ds:[&_[cmdk-group-heading]]:ps-2 ds:[&_[cmdk-group-heading]]:pe-2 ds:[&_[cmdk-group-heading]]:py-1 ds:[&_[cmdk-group-heading]]:type-eyebrow ds:[&_[cmdk-group-heading]]:text-muted-foreground",
|
|
418
418
|
children: o
|
|
419
419
|
},
|
|
420
420
|
`group-${e}`
|
|
421
|
-
) : /* @__PURE__ */ r(
|
|
421
|
+
) : /* @__PURE__ */ r(l.Group, { children: o }, `group-${s}`);
|
|
422
422
|
})
|
|
423
423
|
]
|
|
424
424
|
}
|
|
@@ -429,7 +429,7 @@ const Be = re(
|
|
|
429
429
|
}
|
|
430
430
|
);
|
|
431
431
|
ne.displayName = "MultiSelect";
|
|
432
|
-
const
|
|
432
|
+
const at = ne, lt = {
|
|
433
433
|
id: "multi-select",
|
|
434
434
|
capabilities: ["select_multiple", "filter", "open", "close"],
|
|
435
435
|
state: {},
|
|
@@ -443,8 +443,8 @@ const lt = ne, dt = {
|
|
|
443
443
|
}
|
|
444
444
|
};
|
|
445
445
|
export {
|
|
446
|
-
|
|
446
|
+
at as M,
|
|
447
447
|
Be as a,
|
|
448
|
-
|
|
448
|
+
lt as m
|
|
449
449
|
};
|
|
450
|
-
//# sourceMappingURL=multi-select.agent-
|
|
450
|
+
//# sourceMappingURL=multi-select.agent-CNsyW3n9.js.map
|