@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
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"stepper-calendar-CWZcFgt_.js","sources":["../../node_modules/date-fns/subMonths.js","../../src/components/stepper-calendar/stepper-calendar.tsx"],"sourcesContent":["import { addMonths } from \"./addMonths.js\";\n\n/**\n * The subMonths function options.\n */\n\n/**\n * @name subMonths\n * @category Month Helpers\n * @summary Subtract the specified number of months from the given date.\n *\n * @description\n * Subtract the specified number of months 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 months to be subtracted.\n * @param options - An object with options\n *\n * @returns The new date with the months subtracted\n *\n * @example\n * // Subtract 5 months from 1 February 2015:\n * const result = subMonths(new Date(2015, 1, 1), 5)\n * //=> Mon Sep 01 2014 00:00:00\n */\nexport function subMonths(date, amount, options) {\n return addMonths(date, -amount, options);\n}\n\n// Fallback for modularized imports:\nexport default subMonths;\n","import {\n forwardRef,\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState,\n type ComponentPropsWithoutRef,\n type KeyboardEvent,\n type ReactNode,\n} from 'react';\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport { useTranslation } from 'react-i18next';\nimport {\n addDays,\n addMonths,\n format as fnsFormat,\n isSameDay,\n isSameMonth,\n parseISO,\n startOfMonth,\n startOfWeek,\n subMonths,\n} from 'date-fns';\nimport { ChevronLeft, ChevronRight } from 'lucide-react';\nimport type { StepSpec, StepStatus } from '../_shared/stepper';\nimport { stateForStep } from '../_shared/stepper';\nimport { StepperProgress } from '../stepper-progress/stepper-progress';\nimport { Button } from '../button/button';\nimport { IconButton } from '../button/icon-button';\nimport { SlotGrid, type SlotGridDay, type SlotGridSlot } from '../slot-grid/slot-grid';\nimport { Skeleton } from '../skeleton/skeleton';\nimport { EmptyState } from '../empty-state/empty-state';\nimport { resolveFirstDay } from '../calendar/calendar';\n\n// Slot IDs use a fixed `${yyyy-mm-dd}T${HH:mm}` shape so the trailing time\n// segment can be safely peeled off in onSlotSelect. Validating against the\n// shape rather than splitting blindly so an unexpected ID surfaces as a\n// no-op rather than a malformed time value.\nconst SLOT_ID_PATTERN = /^(\\d{4}-\\d{2}-\\d{2})T(\\d{2}:\\d{2})$/;\n\n/* -------------------------------------------------------------------- */\n/* StepperCalendar */\n/* */\n/* Single-component, A/B-testable appointment-booking flow with 4 */\n/* fixed steps in this order: */\n/* 0. Service — pick from `services` */\n/* 1. Date — inline month grid; only `availableDates` are enabled */\n/* 2. Time — slot grid showing `availableSlots[selectedDate]` */\n/* 3. Details — render-prop slot for the consumer's form fields */\n/* -------------------------------------------------------------------- */\n\n/** Service offering rendered on Step 1. Data is API-driven by the consumer. */\nexport interface StepperCalendarService {\n id: string;\n /** Already-translated label (consumer is responsible for i18n of data). */\n label: string;\n /** Duration in minutes — shown alongside the label. */\n durationMin: number;\n /** Optional secondary line. */\n description?: string;\n}\n\n/** Re-exported for convenience. */\nexport type ServiceOption = StepperCalendarService;\n\n/** Booking selection — controlled by the consumer. */\nexport interface StepperCalendarValue {\n serviceId?: string;\n /** ISO yyyy-mm-dd. */\n date?: string;\n /** HH:mm (24h). */\n time?: string;\n}\n\nconst TOTAL_STEPS = 4;\n\nconst rootVariants = cva(\n 'ds:flex ds:w-full ds:flex-col ds:gap-[var(--spacing-md)] ds:text-[var(--foreground)]',\n {\n variants: {\n layout: {\n vertical: 'ds:flex-col',\n horizontal: 'ds:lg:flex-row ds:lg:items-start',\n },\n density: {\n comfortable: 'ds:gap-[var(--spacing-md)]',\n compact: 'ds:gap-[var(--spacing-sm)]',\n },\n },\n defaultVariants: {\n layout: 'vertical',\n density: 'comfortable',\n },\n },\n);\n\nconst stepBodyVariants = cva(\n [\n 'ds:flex ds:flex-col ds:gap-[var(--spacing-md)]',\n 'ds:rounded-[var(--radius-md)] ds:border ds:border-[var(--border)] ds:bg-[var(--card)]',\n 'ds:ps-[var(--spacing-md)] ds:pe-[var(--spacing-md)]',\n 'ds:pt-[var(--spacing-md)] ds:pb-[var(--spacing-md)]',\n ].join(' '),\n {\n variants: {\n density: {\n comfortable: 'ds:gap-[var(--spacing-md)]',\n compact: 'ds:gap-[var(--spacing-sm)]',\n },\n },\n defaultVariants: { density: 'comfortable' },\n },\n);\n\nconst serviceCardVariants = cva(\n [\n 'ds:group/service ds:flex ds:flex-col ds:items-start ds:gap-[var(--spacing-xs)] ds:text-start',\n 'ds:rounded-[var(--radius-md)] ds:border ds:border-[var(--border)] ds:bg-[var(--background)]',\n 'ds:ps-[var(--spacing-md)] ds:pe-[var(--spacing-md)]',\n 'ds:pt-[var(--spacing-sm)] ds:pb-[var(--spacing-sm)]',\n 'ds:min-h-[var(--min-target-size)]',\n 'ds:transition-[background-color,border-color] ds:duration-[var(--animation-duration)] ds:ease-[var(--ease-out)]',\n 'ds:motion-reduce:transition-none',\n 'ds:hover:enabled:bg-[var(--muted)]/40',\n 'ds:focus-visible:outline-[length:var(--focus-ring-width)] ds:focus-visible:outline-solid',\n 'ds:focus-visible:outline-[var(--ring)] ds:focus-visible:outline-offset-[length:var(--focus-ring-offset)]',\n 'ds:aria-checked:border-[var(--primary)] ds:aria-checked:bg-[var(--primary)]/5',\n 'ds:disabled:opacity-50 ds:disabled:cursor-not-allowed',\n ].join(' '),\n);\n\nconst monthHeaderVariants = cva(\n 'ds:flex ds:items-center ds:justify-between ds:gap-[var(--spacing-sm)]',\n);\n\nconst monthGridVariants = cva(\n 'ds:grid ds:grid-cols-7 ds:gap-[var(--spacing-xs)]',\n);\n\nconst dayCellVariants = cva(\n [\n 'ds:inline-flex ds:items-center ds:justify-center',\n // `min-target-size` (44/48px) governs the rendered size — it always\n // exceeds the explicit floor below. Keeping the explicit floor for\n // grid layout stability when the cell content is empty (skeletons),\n // matching the precedent in `slot-grid`.\n 'ds:min-h-[var(--min-target-size)] ds:min-w-[var(--min-target-size)]',\n 'ds:h-10 ds:w-10 ds:rounded-[var(--radius-sm)]',\n 'ds:text-[length:var(--font-size-sm)] ds:font-[var(--font-weight-medium)]',\n 'ds:border ds:border-transparent ds:bg-[var(--background)] ds:text-[var(--foreground)]',\n 'ds:transition-[background-color,border-color,color] ds:duration-[var(--animation-duration)] ds:ease-[var(--ease-out)]',\n 'ds:motion-reduce:transition-none',\n 'ds:hover:enabled:bg-[var(--muted)]/40',\n 'ds:focus-visible:outline-[length:var(--focus-ring-width)] ds:focus-visible:outline-solid',\n 'ds:focus-visible:outline-[var(--ring)] ds:focus-visible:outline-offset-[length:var(--focus-ring-offset)]',\n 'ds:disabled:opacity-40 ds:disabled:cursor-not-allowed',\n 'ds:aria-selected:bg-[var(--primary)] ds:aria-selected:text-[var(--primary-foreground)]',\n 'ds:aria-selected:border-[var(--primary)]',\n 'ds:data-[outside=true]:text-[var(--muted-foreground)]',\n ].join(' '),\n);\n\nconst actionsRowVariants = cva(\n 'ds:flex ds:items-center ds:justify-between ds:gap-[var(--spacing-sm)] ds:mt-[var(--spacing-md)]',\n);\n\n/* -------------------------------------------------------------------- */\n/* Helpers */\n/* -------------------------------------------------------------------- */\n\nfunction isoDay(date: Date): string {\n return fnsFormat(date, 'yyyy-MM-dd');\n}\n\n/** Compute the first incomplete step from the current value. */\nfunction firstIncompleteStep(value: StepperCalendarValue): number {\n if (!value.serviceId) return 0;\n if (!value.date) return 1;\n if (!value.time) return 2;\n return 3;\n}\n\n/* -------------------------------------------------------------------- */\n/* Public props */\n/* -------------------------------------------------------------------- */\n\nexport interface StepperCalendarProps\n extends Omit<\n ComponentPropsWithoutRef<'div'>,\n 'aria-label' | 'onChange' | 'onSubmit'\n >,\n VariantProps<typeof rootVariants> {\n services: StepperCalendarService[];\n availableDates: string[];\n availableSlots: Record<string, string[]>;\n value: StepperCalendarValue;\n onChange: (next: StepperCalendarValue) => void;\n onSubmit?: (value: StepperCalendarValue) => void;\n detailsFields?: ReactNode;\n loadingDates?: boolean;\n loadingSlots?: boolean;\n /** Per-step status overrides — `error` will mark a step in the rail. */\n stepStatuses?: Partial<Record<0 | 1 | 2 | 3, StepStatus>>;\n 'aria-label'?: string;\n}\n\n/* -------------------------------------------------------------------- */\n/* Service grid (Step 0) */\n/* -------------------------------------------------------------------- */\n\ninterface ServiceGridProps {\n services: StepperCalendarService[];\n selectedId?: string;\n onSelect: (id: string) => void;\n durationLabel: (minutes: number) => string;\n groupLabel: string;\n}\n\nconst ServiceGrid = forwardRef<HTMLDivElement, ServiceGridProps>(\n ({ services, selectedId, onSelect, durationLabel, groupLabel }, ref) => {\n const itemRefs = useRef<(HTMLButtonElement | null)[]>([]);\n const focusedIndex = (() => {\n const i = services.findIndex((s) => s.id === selectedId);\n return i >= 0 ? i : 0;\n })();\n\n const moveFocus = (next: number) => {\n const wrapped = (next + services.length) % services.length;\n const target = itemRefs.current[wrapped];\n if (!target) return;\n // Per WAI-ARIA radiogroup, arrow keys move focus AND selection.\n target.focus();\n const svc = services[wrapped];\n if (svc) onSelect(svc.id);\n };\n\n const handleKeyDown = (\n event: KeyboardEvent<HTMLButtonElement>,\n currentIndex: number,\n ) => {\n // RTL inversion: in an RTL document, ArrowLeft visually advances forward.\n const isRtl =\n typeof document !== 'undefined' &&\n document.documentElement.dir === 'rtl';\n const forward = isRtl ? 'ArrowLeft' : 'ArrowRight';\n const back = isRtl ? 'ArrowRight' : 'ArrowLeft';\n if (event.key === forward || event.key === 'ArrowDown') {\n event.preventDefault();\n moveFocus(currentIndex + 1);\n return;\n }\n if (event.key === back || event.key === 'ArrowUp') {\n event.preventDefault();\n moveFocus(currentIndex - 1);\n return;\n }\n if (event.key === 'Home') {\n event.preventDefault();\n moveFocus(0);\n return;\n }\n if (event.key === 'End') {\n event.preventDefault();\n moveFocus(services.length - 1);\n }\n };\n\n return (\n <div\n ref={ref}\n role=\"radiogroup\"\n aria-label={groupLabel}\n className=\"ds:grid ds:gap-[var(--spacing-sm)] ds:sm:grid-cols-2\"\n >\n {services.map((svc, index) => {\n const checked = svc.id === selectedId;\n const isRovingTabStop = index === focusedIndex;\n return (\n <button\n key={svc.id}\n ref={(el) => {\n itemRefs.current[index] = el;\n }}\n type=\"button\"\n role=\"radio\"\n aria-checked={checked}\n tabIndex={isRovingTabStop ? 0 : -1}\n onClick={() => onSelect(svc.id)}\n onKeyDown={(e) => handleKeyDown(e, index)}\n className={serviceCardVariants()}\n >\n <span className=\"type-body-sm ds:font-[var(--font-weight-semibold)] ds:text-[var(--foreground)]\">\n {svc.label}\n </span>\n {svc.description ? (\n <span className=\"type-meta ds:text-[var(--muted-foreground)]\">\n {svc.description}\n </span>\n ) : null}\n <span className=\"type-meta ds:text-[var(--muted-foreground)]\">\n {durationLabel(svc.durationMin)}\n </span>\n </button>\n );\n })}\n </div>\n );\n },\n);\nServiceGrid.displayName = 'StepperCalendar.ServiceGrid';\n\n/* -------------------------------------------------------------------- */\n/* Inline month grid (Step 1) */\n/* -------------------------------------------------------------------- */\n\ntype WeekStart = 0 | 1 | 2 | 3 | 4 | 5 | 6;\n\ninterface MonthGridProps {\n availableDates: Set<string>;\n selectedDate?: string;\n onSelectDate: (iso: string) => void;\n loading: boolean;\n locale: string;\n weekStartsOn: WeekStart;\n prevLabel: string;\n nextLabel: string;\n emptyLabel: string;\n}\n\nconst MonthGrid = forwardRef<HTMLDivElement, MonthGridProps>(\n (\n {\n availableDates,\n selectedDate,\n onSelectDate,\n loading,\n locale,\n weekStartsOn,\n prevLabel,\n nextLabel,\n emptyLabel,\n },\n ref,\n ) => {\n const initialMonth = useMemo(() => {\n if (selectedDate) return parseISO(selectedDate);\n const first = [...availableDates].sort()[0];\n return first ? parseISO(first) : new Date();\n }, [availableDates, selectedDate]);\n\n const [month, setMonth] = useState<Date>(initialMonth);\n const [focusedDay, setFocusedDay] = useState<Date>(\n selectedDate ? parseISO(selectedDate) : initialMonth,\n );\n\n // Build the 6x7 grid (always full weeks for stable layout).\n const monthStart = startOfMonth(month);\n const gridStart = startOfWeek(monthStart, { weekStartsOn });\n const days: Date[] = useMemo(() => {\n const cells: Date[] = [];\n for (let i = 0; i < 42; i += 1) {\n cells.push(addDays(gridStart, i));\n }\n return cells;\n }, [gridStart]);\n\n const weekdayLabels = useMemo(() => {\n const base = startOfWeek(new Date(), { weekStartsOn });\n const fmt = new Intl.DateTimeFormat(locale, { weekday: 'short' });\n return Array.from({ length: 7 }, (_, i) => fmt.format(addDays(base, i)));\n }, [locale, weekStartsOn]);\n\n const monthLabel = useMemo(() => {\n try {\n return new Intl.DateTimeFormat(locale, {\n month: 'long',\n year: 'numeric',\n }).format(month);\n } catch {\n return fnsFormat(month, 'MMMM yyyy');\n }\n }, [locale, month]);\n\n const isAvailable = useCallback(\n (d: Date) => availableDates.has(isoDay(d)),\n [availableDates],\n );\n\n const moveFocus = useCallback(\n (next: Date) => {\n setFocusedDay(next);\n if (!isSameMonth(next, month)) setMonth(startOfMonth(next));\n },\n [month],\n );\n\n const handleKeyDown = (event: KeyboardEvent<HTMLDivElement>) => {\n const map: Record<string, number> = {\n ArrowLeft: -1,\n ArrowRight: 1,\n ArrowUp: -7,\n ArrowDown: 7,\n };\n if (event.key in map) {\n event.preventDefault();\n moveFocus(addDays(focusedDay, map[event.key]));\n return;\n }\n if (event.key === 'Home') {\n event.preventDefault();\n moveFocus(startOfWeek(focusedDay, { weekStartsOn }));\n return;\n }\n if (event.key === 'End') {\n event.preventDefault();\n moveFocus(addDays(startOfWeek(focusedDay, { weekStartsOn }), 6));\n return;\n }\n if (event.key === 'PageUp') {\n event.preventDefault();\n moveFocus(subMonths(focusedDay, 1));\n return;\n }\n if (event.key === 'PageDown') {\n event.preventDefault();\n moveFocus(addMonths(focusedDay, 1));\n return;\n }\n if (event.key === 'Enter' || event.key === ' ') {\n event.preventDefault();\n if (isAvailable(focusedDay)) onSelectDate(isoDay(focusedDay));\n }\n };\n\n const focusedRef = useRef<HTMLButtonElement>(null);\n useEffect(() => {\n // Move focus to the focused day when it changes. Note: when the parent\n // StepperCalendar transitions Service → Date, its own step-change focus\n // effect *also* tries to focus the body's first interactive element. In\n // practice this effect runs deeper in the tree and after mount, so it\n // wins — but consumers should be aware of the interaction if they\n // tweak the ordering.\n focusedRef.current?.focus();\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [focusedDay.getTime()]);\n\n if (loading) {\n return (\n <div ref={ref} className=\"ds:flex ds:flex-col ds:gap-[var(--spacing-sm)]\">\n <Skeleton variant=\"text\" size=\"md\" width=\"40%\" />\n <div className={monthGridVariants()}>\n {Array.from({ length: 42 }, (_, i) => (\n <Skeleton\n key={`day-skeleton-${i}`}\n variant=\"rounded\"\n size=\"md\"\n height=\"40px\"\n />\n ))}\n </div>\n </div>\n );\n }\n\n if (availableDates.size === 0) {\n return (\n <div ref={ref}>\n <EmptyState variant=\"no-results\" title={emptyLabel} />\n </div>\n );\n }\n\n return (\n <div ref={ref} className=\"ds:flex ds:flex-col ds:gap-[var(--spacing-sm)]\">\n <div className={monthHeaderVariants()}>\n <IconButton\n icon={<ChevronLeft />}\n aria-label={prevLabel}\n size=\"sm\"\n intent=\"ghost\"\n flipIconInRtl\n onClick={() => setMonth(subMonths(month, 1))}\n />\n <span\n className=\"type-body-sm ds:font-[var(--font-weight-semibold)]\"\n aria-live=\"polite\"\n >\n {monthLabel}\n </span>\n <IconButton\n icon={<ChevronRight />}\n aria-label={nextLabel}\n size=\"sm\"\n intent=\"ghost\"\n flipIconInRtl\n onClick={() => setMonth(addMonths(month, 1))}\n />\n </div>\n <div\n role=\"grid\"\n aria-label={monthLabel}\n className=\"ds:flex ds:flex-col ds:gap-[var(--spacing-xs)]\"\n onKeyDown={handleKeyDown}\n >\n <div className={monthGridVariants()} role=\"row\">\n {weekdayLabels.map((wd) => (\n <span\n key={wd}\n role=\"columnheader\"\n className=\"type-meta ds:text-center ds:text-[var(--muted-foreground)]\"\n >\n {wd}\n </span>\n ))}\n </div>\n {Array.from({ length: 6 }, (_, weekIndex) => {\n const week = days.slice(weekIndex * 7, weekIndex * 7 + 7);\n return (\n <div\n key={`week-${weekIndex}`}\n role=\"row\"\n className={monthGridVariants()}\n >\n {week.map((d) => {\n const iso = isoDay(d);\n const outside = !isSameMonth(d, month);\n const available = isAvailable(d);\n const selected = selectedDate === iso;\n const isFocused = isSameDay(d, focusedDay);\n return (\n <button\n key={iso}\n ref={isFocused ? focusedRef : undefined}\n type=\"button\"\n role=\"gridcell\"\n aria-selected={selected}\n aria-disabled={!available || undefined}\n disabled={!available}\n data-outside={outside || undefined}\n tabIndex={isFocused ? 0 : -1}\n onClick={() => available && onSelectDate(iso)}\n className={dayCellVariants()}\n >\n {fnsFormat(d, 'd')}\n </button>\n );\n })}\n </div>\n );\n })}\n </div>\n </div>\n );\n },\n);\nMonthGrid.displayName = 'StepperCalendar.MonthGrid';\n\n/* -------------------------------------------------------------------- */\n/* Time step body */\n/* -------------------------------------------------------------------- */\n\ninterface TimeStepBodyProps {\n date?: string;\n slots: string[];\n selectedTime?: string;\n loading: boolean;\n emptyLabel: string;\n onSelect: (time: string) => void;\n}\n\nfunction TimeStepBody({\n date,\n slots,\n selectedTime,\n loading,\n emptyLabel,\n onSelect,\n}: TimeStepBodyProps) {\n if (!date) return null;\n if (loading) {\n return (\n <SlotGrid\n days={[{ date, slots: [] }]}\n state=\"loading\"\n />\n );\n }\n if (slots.length === 0) {\n return <EmptyState variant=\"no-results\" title={emptyLabel} />;\n }\n const slotObjects: SlotGridSlot[] = slots.map((time) => {\n // Build a Date from `date` + `time` for `Intl` formatting.\n const [h, m] = time.split(':');\n const start = parseISO(date);\n start.setHours(Number(h), Number(m), 0, 0);\n return {\n id: `${date}T${time}`,\n start,\n label: time,\n };\n });\n const day: SlotGridDay = { date, slots: slotObjects };\n return (\n <SlotGrid\n days={[day]}\n selectedSlotId={selectedTime ? `${date}T${selectedTime}` : undefined}\n onSlotSelect={(slot) => {\n // Validate against the documented `${yyyy-mm-dd}T${HH:mm}` shape so\n // an unexpected ID surfaces as a no-op rather than a malformed time.\n const match = SLOT_ID_PATTERN.exec(slot.id);\n if (match) onSelect(match[2]);\n }}\n />\n );\n}\n\n/* -------------------------------------------------------------------- */\n/* Component */\n/* -------------------------------------------------------------------- */\n\nconst StepperCalendar = forwardRef<HTMLDivElement, StepperCalendarProps>(\n (\n {\n services,\n availableDates,\n availableSlots,\n value,\n onChange,\n onSubmit,\n detailsFields,\n loadingDates = false,\n loadingSlots = false,\n stepStatuses,\n layout = 'vertical',\n density = 'comfortable',\n 'aria-label': ariaLabel,\n className,\n ...rest\n },\n ref,\n ) => {\n const { t, i18n } = useTranslation();\n const locale = i18n.language ?? 'en';\n const weekStartsOn = useMemo(\n () => resolveFirstDay(locale) as WeekStart,\n [locale],\n );\n\n // Derive max-allowed step from value, then clamp internal active step.\n const maxAllowed = firstIncompleteStep(value);\n const [activeStep, setActiveStep] = useState<number>(maxAllowed);\n // If `value` regresses (consumer cleared a field), pull active back.\n useEffect(() => {\n if (activeStep > maxAllowed) setActiveStep(maxAllowed);\n }, [activeStep, maxAllowed]);\n\n const headingRef = useRef<HTMLHeadingElement>(null);\n const isFirstRenderRef = useRef(true);\n\n // Move focus to the new step's heading when activeStep changes (skip\n // first render to avoid stealing focus on mount). Targeting the heading\n // (rather than the first interactive control) is the pattern recommended\n // by 05-accessibility.mdx — screen-reader users hear the step label\n // before any field, and sighted keyboard users can Tab into the form.\n useEffect(() => {\n if (isFirstRenderRef.current) {\n isFirstRenderRef.current = false;\n return;\n }\n headingRef.current?.focus();\n }, [activeStep]);\n\n const steps: StepSpec[] = useMemo(\n () => [\n {\n label: t('navigation.stepperCalendar.steps.service'),\n status: stepStatuses?.[0],\n },\n {\n label: t('navigation.stepperCalendar.steps.date'),\n status: stepStatuses?.[1],\n },\n {\n label: t('navigation.stepperCalendar.steps.time'),\n status: stepStatuses?.[2],\n },\n {\n label: t('navigation.stepperCalendar.steps.details'),\n status: stepStatuses?.[3],\n },\n ],\n [stepStatuses, t],\n );\n\n const label = ariaLabel ?? t('navigation.stepperCalendar.label');\n const backLabel = t('navigation.stepperCalendar.actions.back');\n const nextLabel = t('navigation.stepperCalendar.actions.next');\n const submitLabel = t('navigation.stepperCalendar.actions.submit');\n const emptyTimeLabel = t('navigation.stepperCalendar.time.empty');\n const prevMonthLabel = t('navigation.stepperCalendar.date.previousMonth');\n const nextMonthLabel = t('navigation.stepperCalendar.date.nextMonth');\n const serviceGroupLabel = t('navigation.stepperCalendar.steps.service');\n\n const durationLabel = useCallback(\n (minutes: number) =>\n t('navigation.stepperCalendar.service.duration', { minutes }),\n [t],\n );\n\n const canAdvance = (() => {\n if (activeStep === 0) return Boolean(value.serviceId);\n if (activeStep === 1) return Boolean(value.date);\n if (activeStep === 2) return Boolean(value.time);\n return false; // step 3 is terminal\n })();\n\n const handleServiceSelect = (serviceId: string) => {\n onChange({ ...value, serviceId });\n // Auto-advance for conversion. Use a short delay so users see the\n // selection register before the step swaps. Plain `setTimeout` (not\n // `window.setTimeout`) so the component does not assume a DOM global.\n setTimeout(() => {\n setActiveStep((s) => (s === 0 ? 1 : s));\n }, 120);\n };\n\n const handleDateSelect = (date: string) => {\n // Clear time when date changes.\n onChange({ ...value, date, time: undefined });\n };\n\n const handleTimeSelect = (time: string) => {\n onChange({ ...value, time });\n };\n\n const handleBack = () => setActiveStep((s) => Math.max(0, s - 1));\n const handleNext = () =>\n setActiveStep((s) => Math.min(TOTAL_STEPS - 1, s + 1));\n const handleSubmit = () => onSubmit?.(value);\n\n const headingId = `stepper-calendar-step-${activeStep}-heading`;\n const availableDateSet = useMemo(\n () => new Set(availableDates),\n [availableDates],\n );\n\n /* ---- Active step body ---- */\n let body: ReactNode = null;\n if (activeStep === 0) {\n body = (\n <ServiceGrid\n services={services}\n selectedId={value.serviceId}\n onSelect={handleServiceSelect}\n durationLabel={durationLabel}\n groupLabel={serviceGroupLabel}\n />\n );\n } else if (activeStep === 1) {\n body = (\n <MonthGrid\n availableDates={availableDateSet}\n selectedDate={value.date}\n onSelectDate={handleDateSelect}\n loading={loadingDates}\n locale={locale}\n weekStartsOn={weekStartsOn}\n prevLabel={prevMonthLabel}\n nextLabel={nextMonthLabel}\n emptyLabel={emptyTimeLabel}\n />\n );\n } else if (activeStep === 2) {\n body = (\n <TimeStepBody\n date={value.date}\n slots={value.date ? (availableSlots[value.date] ?? []) : []}\n selectedTime={value.time}\n loading={loadingSlots}\n emptyLabel={emptyTimeLabel}\n onSelect={handleTimeSelect}\n />\n );\n } else {\n body = (\n <div className=\"ds:flex ds:flex-col ds:gap-[var(--spacing-sm)]\">\n {detailsFields}\n </div>\n );\n }\n\n const isTerminal = activeStep === TOTAL_STEPS - 1;\n const activeState = stateForStep(\n activeStep,\n activeStep,\n stepStatuses?.[activeStep as 0 | 1 | 2 | 3],\n );\n\n return (\n <div\n ref={ref}\n role=\"region\"\n aria-label={label}\n data-component=\"stepper-calendar\"\n className={rootVariants({ layout, density, className })}\n {...rest}\n >\n <StepperProgress\n activeStep={activeStep}\n steps={steps}\n aria-label={label}\n />\n <section\n aria-labelledby={headingId}\n className={stepBodyVariants({ density })}\n data-step={activeStep}\n data-state={activeState}\n >\n <h2\n ref={headingRef}\n id={headingId}\n tabIndex={-1}\n className=\"type-body-sm ds:font-[var(--font-weight-semibold)] ds:focus:outline-none\"\n >\n {steps[activeStep]?.label}\n </h2>\n {body}\n <div className={actionsRowVariants()}>\n <Button\n type=\"button\"\n intent=\"ghost\"\n size=\"md\"\n onClick={handleBack}\n disabled={activeStep === 0}\n >\n {backLabel}\n </Button>\n {isTerminal ? (\n <Button\n type=\"button\"\n intent=\"primary\"\n size=\"md\"\n onClick={handleSubmit}\n >\n {submitLabel}\n </Button>\n ) : (\n <Button\n type=\"button\"\n intent=\"primary\"\n size=\"md\"\n onClick={handleNext}\n disabled={!canAdvance}\n >\n {nextLabel}\n </Button>\n )}\n </div>\n </section>\n </div>\n );\n },\n);\nStepperCalendar.displayName = 'StepperCalendar';\n\nexport { StepperCalendar };\n"],"names":["subMonths","date","amount","options","addMonths","SLOT_ID_PATTERN","TOTAL_STEPS","rootVariants","cva","stepBodyVariants","serviceCardVariants","monthHeaderVariants","monthGridVariants","dayCellVariants","actionsRowVariants","isoDay","fnsFormat","firstIncompleteStep","value","ServiceGrid","forwardRef","services","selectedId","onSelect","durationLabel","groupLabel","ref","itemRefs","useRef","focusedIndex","i","moveFocus","next","wrapped","target","svc","handleKeyDown","event","currentIndex","isRtl","forward","back","jsx","index","checked","jsxs","el","e","MonthGrid","availableDates","selectedDate","onSelectDate","loading","locale","weekStartsOn","prevLabel","nextLabel","emptyLabel","initialMonth","useMemo","parseISO","first","month","setMonth","useState","focusedDay","setFocusedDay","monthStart","startOfMonth","gridStart","startOfWeek","days","cells","addDays","weekdayLabels","base","fmt","_","monthLabel","isAvailable","useCallback","d","isSameMonth","map","focusedRef","useEffect","_a","Skeleton","EmptyState","IconButton","ChevronLeft","ChevronRight","wd","weekIndex","week","iso","outside","available","selected","isFocused","isSameDay","TimeStepBody","slots","selectedTime","SlotGrid","slotObjects","time","h","m","start","slot","match","StepperCalendar","availableSlots","onChange","onSubmit","detailsFields","loadingDates","loadingSlots","stepStatuses","layout","density","ariaLabel","className","rest","t","i18n","useTranslation","resolveFirstDay","maxAllowed","activeStep","setActiveStep","headingRef","isFirstRenderRef","steps","label","backLabel","submitLabel","emptyTimeLabel","prevMonthLabel","nextMonthLabel","serviceGroupLabel","minutes","canAdvance","handleServiceSelect","serviceId","s","handleDateSelect","handleTimeSelect","handleBack","handleNext","handleSubmit","headingId","availableDateSet","body","isTerminal","activeState","stateForStep","StepperProgress","Button"],"mappings":"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","x_google_ignoreList":[0]}
|
|
1
|
+
{"version":3,"file":"stepper-calendar-_fLOAjus.js","sources":["../../node_modules/date-fns/subMonths.js","../../src/components/stepper-calendar/stepper-calendar.tsx"],"sourcesContent":["import { addMonths } from \"./addMonths.js\";\n\n/**\n * The subMonths function options.\n */\n\n/**\n * @name subMonths\n * @category Month Helpers\n * @summary Subtract the specified number of months from the given date.\n *\n * @description\n * Subtract the specified number of months 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 months to be subtracted.\n * @param options - An object with options\n *\n * @returns The new date with the months subtracted\n *\n * @example\n * // Subtract 5 months from 1 February 2015:\n * const result = subMonths(new Date(2015, 1, 1), 5)\n * //=> Mon Sep 01 2014 00:00:00\n */\nexport function subMonths(date, amount, options) {\n return addMonths(date, -amount, options);\n}\n\n// Fallback for modularized imports:\nexport default subMonths;\n","import {\n forwardRef,\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState,\n type ComponentPropsWithoutRef,\n type KeyboardEvent,\n type ReactNode,\n} from 'react';\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport { useTranslation } from 'react-i18next';\nimport {\n addDays,\n addMonths,\n format as fnsFormat,\n isSameDay,\n isSameMonth,\n parseISO,\n startOfMonth,\n startOfWeek,\n subMonths,\n} from 'date-fns';\nimport { ChevronLeft, ChevronRight } from 'lucide-react';\nimport type { StepSpec, StepStatus } from '../_shared/stepper';\nimport { stateForStep } from '../_shared/stepper';\nimport { StepperProgress } from '../stepper-progress/stepper-progress';\nimport { Button } from '../button/button';\nimport { IconButton } from '../button/icon-button';\nimport { SlotGrid, type SlotGridDay, type SlotGridSlot } from '../slot-grid/slot-grid';\nimport { Skeleton } from '../skeleton/skeleton';\nimport { EmptyState } from '../empty-state/empty-state';\nimport { resolveFirstDay } from '../calendar/calendar';\n\n// Slot IDs use a fixed `${yyyy-mm-dd}T${HH:mm}` shape so the trailing time\n// segment can be safely peeled off in onSlotSelect. Validating against the\n// shape rather than splitting blindly so an unexpected ID surfaces as a\n// no-op rather than a malformed time value.\nconst SLOT_ID_PATTERN = /^(\\d{4}-\\d{2}-\\d{2})T(\\d{2}:\\d{2})$/;\n\n/* -------------------------------------------------------------------- */\n/* StepperCalendar */\n/* */\n/* Single-component, A/B-testable appointment-booking flow with 4 */\n/* fixed steps in this order: */\n/* 0. Service — pick from `services` */\n/* 1. Date — inline month grid; only `availableDates` are enabled */\n/* 2. Time — slot grid showing `availableSlots[selectedDate]` */\n/* 3. Details — render-prop slot for the consumer's form fields */\n/* -------------------------------------------------------------------- */\n\n/** Service offering rendered on Step 1. Data is API-driven by the consumer. */\nexport interface StepperCalendarService {\n id: string;\n /** Already-translated label (consumer is responsible for i18n of data). */\n label: string;\n /** Duration in minutes — shown alongside the label. */\n durationMin: number;\n /** Optional secondary line. */\n description?: string;\n}\n\n/** Re-exported for convenience. */\nexport type ServiceOption = StepperCalendarService;\n\n/** Booking selection — controlled by the consumer. */\nexport interface StepperCalendarValue {\n serviceId?: string;\n /** ISO yyyy-mm-dd. */\n date?: string;\n /** HH:mm (24h). */\n time?: string;\n}\n\nconst TOTAL_STEPS = 4;\n\nconst rootVariants = cva(\n 'ds:flex ds:w-full ds:flex-col ds:gap-[var(--spacing-md)] ds:text-[var(--foreground)]',\n {\n variants: {\n layout: {\n vertical: 'ds:flex-col',\n horizontal: 'ds:lg:flex-row ds:lg:items-start',\n },\n density: {\n comfortable: 'ds:gap-[var(--spacing-md)]',\n compact: 'ds:gap-[var(--spacing-sm)]',\n },\n },\n defaultVariants: {\n layout: 'vertical',\n density: 'comfortable',\n },\n },\n);\n\nconst stepBodyVariants = cva(\n [\n 'ds:flex ds:flex-col ds:gap-[var(--spacing-md)]',\n 'ds:rounded-[var(--radius-md)] ds:border ds:border-[var(--border)] ds:bg-[var(--card)]',\n 'ds:ps-[var(--spacing-md)] ds:pe-[var(--spacing-md)]',\n 'ds:pt-[var(--spacing-md)] ds:pb-[var(--spacing-md)]',\n ].join(' '),\n {\n variants: {\n density: {\n comfortable: 'ds:gap-[var(--spacing-md)]',\n compact: 'ds:gap-[var(--spacing-sm)]',\n },\n },\n defaultVariants: { density: 'comfortable' },\n },\n);\n\nconst serviceCardVariants = cva(\n [\n 'ds:group/service ds:flex ds:flex-col ds:items-start ds:gap-[var(--spacing-xs)] ds:text-start',\n 'ds:rounded-[var(--radius-md)] ds:border ds:border-[var(--border)] ds:bg-[var(--background)]',\n 'ds:ps-[var(--spacing-md)] ds:pe-[var(--spacing-md)]',\n 'ds:pt-[var(--spacing-sm)] ds:pb-[var(--spacing-sm)]',\n 'ds:min-h-[var(--min-target-size)]',\n 'ds:transition-[background-color,border-color] ds:duration-[var(--animation-duration)] ds:ease-[var(--ease-out)]',\n 'ds:motion-reduce:transition-none',\n 'ds:hover:enabled:bg-[var(--muted)]/40',\n 'ds:focus-visible:outline-[length:var(--focus-ring-width)] ds:focus-visible:outline-solid',\n 'ds:focus-visible:outline-[var(--ring)] ds:focus-visible:outline-offset-[length:var(--focus-ring-offset)]',\n 'ds:aria-checked:border-[var(--primary)] ds:aria-checked:bg-[var(--primary)]/5',\n 'ds:disabled:opacity-50 ds:disabled:cursor-not-allowed',\n ].join(' '),\n);\n\nconst monthHeaderVariants = cva(\n 'ds:flex ds:items-center ds:justify-between ds:gap-[var(--spacing-sm)]',\n);\n\nconst monthGridVariants = cva(\n 'ds:grid ds:grid-cols-7 ds:gap-[var(--spacing-xs)]',\n);\n\nconst dayCellVariants = cva(\n [\n 'ds:inline-flex ds:items-center ds:justify-center',\n // `min-target-size` (44/48px) governs the rendered size — it always\n // exceeds the explicit floor below. Keeping the explicit floor for\n // grid layout stability when the cell content is empty (skeletons),\n // matching the precedent in `slot-grid`.\n 'ds:min-h-[var(--min-target-size)] ds:min-w-[var(--min-target-size)]',\n 'ds:h-10 ds:w-10 ds:rounded-[var(--radius-sm)]',\n 'ds:text-[length:var(--font-size-sm)] ds:font-[var(--font-weight-medium)]',\n 'ds:border ds:border-transparent ds:bg-[var(--background)] ds:text-[var(--foreground)]',\n 'ds:transition-[background-color,border-color,color] ds:duration-[var(--animation-duration)] ds:ease-[var(--ease-out)]',\n 'ds:motion-reduce:transition-none',\n 'ds:hover:enabled:bg-[var(--muted)]/40',\n 'ds:focus-visible:outline-[length:var(--focus-ring-width)] ds:focus-visible:outline-solid',\n 'ds:focus-visible:outline-[var(--ring)] ds:focus-visible:outline-offset-[length:var(--focus-ring-offset)]',\n 'ds:disabled:opacity-40 ds:disabled:cursor-not-allowed',\n 'ds:aria-selected:bg-[var(--primary)] ds:aria-selected:text-[var(--primary-foreground)]',\n 'ds:aria-selected:border-[var(--primary)]',\n 'ds:data-[outside=true]:text-[var(--muted-foreground)]',\n ].join(' '),\n);\n\nconst actionsRowVariants = cva(\n 'ds:flex ds:items-center ds:justify-between ds:gap-[var(--spacing-sm)] ds:mt-[var(--spacing-md)]',\n);\n\n/* -------------------------------------------------------------------- */\n/* Helpers */\n/* -------------------------------------------------------------------- */\n\nfunction isoDay(date: Date): string {\n return fnsFormat(date, 'yyyy-MM-dd');\n}\n\n/** Compute the first incomplete step from the current value. */\nfunction firstIncompleteStep(value: StepperCalendarValue): number {\n if (!value.serviceId) return 0;\n if (!value.date) return 1;\n if (!value.time) return 2;\n return 3;\n}\n\n/* -------------------------------------------------------------------- */\n/* Public props */\n/* -------------------------------------------------------------------- */\n\nexport interface StepperCalendarProps\n extends Omit<\n ComponentPropsWithoutRef<'div'>,\n 'aria-label' | 'onChange' | 'onSubmit'\n >,\n VariantProps<typeof rootVariants> {\n services: StepperCalendarService[];\n availableDates: string[];\n availableSlots: Record<string, string[]>;\n value: StepperCalendarValue;\n onChange: (next: StepperCalendarValue) => void;\n onSubmit?: (value: StepperCalendarValue) => void;\n detailsFields?: ReactNode;\n loadingDates?: boolean;\n loadingSlots?: boolean;\n /** Per-step status overrides — `error` will mark a step in the rail. */\n stepStatuses?: Partial<Record<0 | 1 | 2 | 3, StepStatus>>;\n 'aria-label'?: string;\n}\n\n/* -------------------------------------------------------------------- */\n/* Service grid (Step 0) */\n/* -------------------------------------------------------------------- */\n\ninterface ServiceGridProps {\n services: StepperCalendarService[];\n selectedId?: string;\n onSelect: (id: string) => void;\n durationLabel: (minutes: number) => string;\n groupLabel: string;\n}\n\nconst ServiceGrid = forwardRef<HTMLDivElement, ServiceGridProps>(\n ({ services, selectedId, onSelect, durationLabel, groupLabel }, ref) => {\n const itemRefs = useRef<(HTMLButtonElement | null)[]>([]);\n const focusedIndex = (() => {\n const i = services.findIndex((s) => s.id === selectedId);\n return i >= 0 ? i : 0;\n })();\n\n const moveFocus = (next: number) => {\n const wrapped = (next + services.length) % services.length;\n const target = itemRefs.current[wrapped];\n if (!target) return;\n // Per WAI-ARIA radiogroup, arrow keys move focus AND selection.\n target.focus();\n const svc = services[wrapped];\n if (svc) onSelect(svc.id);\n };\n\n const handleKeyDown = (\n event: KeyboardEvent<HTMLButtonElement>,\n currentIndex: number,\n ) => {\n // RTL inversion: in an RTL document, ArrowLeft visually advances forward.\n const isRtl =\n typeof document !== 'undefined' &&\n document.documentElement.dir === 'rtl';\n const forward = isRtl ? 'ArrowLeft' : 'ArrowRight';\n const back = isRtl ? 'ArrowRight' : 'ArrowLeft';\n if (event.key === forward || event.key === 'ArrowDown') {\n event.preventDefault();\n moveFocus(currentIndex + 1);\n return;\n }\n if (event.key === back || event.key === 'ArrowUp') {\n event.preventDefault();\n moveFocus(currentIndex - 1);\n return;\n }\n if (event.key === 'Home') {\n event.preventDefault();\n moveFocus(0);\n return;\n }\n if (event.key === 'End') {\n event.preventDefault();\n moveFocus(services.length - 1);\n }\n };\n\n return (\n <div\n ref={ref}\n role=\"radiogroup\"\n aria-label={groupLabel}\n className=\"ds:grid ds:gap-[var(--spacing-sm)] ds:sm:grid-cols-2\"\n >\n {services.map((svc, index) => {\n const checked = svc.id === selectedId;\n const isRovingTabStop = index === focusedIndex;\n return (\n <button\n key={svc.id}\n ref={(el) => {\n itemRefs.current[index] = el;\n }}\n type=\"button\"\n role=\"radio\"\n aria-checked={checked}\n tabIndex={isRovingTabStop ? 0 : -1}\n onClick={() => onSelect(svc.id)}\n onKeyDown={(e) => handleKeyDown(e, index)}\n className={serviceCardVariants()}\n >\n <span className=\"type-body-sm ds:font-[var(--font-weight-semibold)] ds:text-[var(--foreground)]\">\n {svc.label}\n </span>\n {svc.description ? (\n <span className=\"type-meta ds:text-[var(--muted-foreground)]\">\n {svc.description}\n </span>\n ) : null}\n <span className=\"type-meta ds:text-[var(--muted-foreground)]\">\n {durationLabel(svc.durationMin)}\n </span>\n </button>\n );\n })}\n </div>\n );\n },\n);\nServiceGrid.displayName = 'StepperCalendar.ServiceGrid';\n\n/* -------------------------------------------------------------------- */\n/* Inline month grid (Step 1) */\n/* -------------------------------------------------------------------- */\n\ntype WeekStart = 0 | 1 | 2 | 3 | 4 | 5 | 6;\n\ninterface MonthGridProps {\n availableDates: Set<string>;\n selectedDate?: string;\n onSelectDate: (iso: string) => void;\n loading: boolean;\n locale: string;\n weekStartsOn: WeekStart;\n prevLabel: string;\n nextLabel: string;\n emptyLabel: string;\n}\n\nconst MonthGrid = forwardRef<HTMLDivElement, MonthGridProps>(\n (\n {\n availableDates,\n selectedDate,\n onSelectDate,\n loading,\n locale,\n weekStartsOn,\n prevLabel,\n nextLabel,\n emptyLabel,\n },\n ref,\n ) => {\n const initialMonth = useMemo(() => {\n if (selectedDate) return parseISO(selectedDate);\n const first = [...availableDates].sort()[0];\n return first ? parseISO(first) : new Date();\n }, [availableDates, selectedDate]);\n\n const [month, setMonth] = useState<Date>(initialMonth);\n const [focusedDay, setFocusedDay] = useState<Date>(\n selectedDate ? parseISO(selectedDate) : initialMonth,\n );\n\n // Build the 6x7 grid (always full weeks for stable layout).\n const monthStart = startOfMonth(month);\n const gridStart = startOfWeek(monthStart, { weekStartsOn });\n const days: Date[] = useMemo(() => {\n const cells: Date[] = [];\n for (let i = 0; i < 42; i += 1) {\n cells.push(addDays(gridStart, i));\n }\n return cells;\n }, [gridStart]);\n\n const weekdayLabels = useMemo(() => {\n const base = startOfWeek(new Date(), { weekStartsOn });\n const fmt = new Intl.DateTimeFormat(locale, { weekday: 'short' });\n return Array.from({ length: 7 }, (_, i) => fmt.format(addDays(base, i)));\n }, [locale, weekStartsOn]);\n\n const monthLabel = useMemo(() => {\n try {\n return new Intl.DateTimeFormat(locale, {\n month: 'long',\n year: 'numeric',\n }).format(month);\n } catch {\n return fnsFormat(month, 'MMMM yyyy');\n }\n }, [locale, month]);\n\n const isAvailable = useCallback(\n (d: Date) => availableDates.has(isoDay(d)),\n [availableDates],\n );\n\n const moveFocus = useCallback(\n (next: Date) => {\n setFocusedDay(next);\n if (!isSameMonth(next, month)) setMonth(startOfMonth(next));\n },\n [month],\n );\n\n const handleKeyDown = (event: KeyboardEvent<HTMLDivElement>) => {\n const map: Record<string, number> = {\n ArrowLeft: -1,\n ArrowRight: 1,\n ArrowUp: -7,\n ArrowDown: 7,\n };\n if (event.key in map) {\n event.preventDefault();\n moveFocus(addDays(focusedDay, map[event.key]));\n return;\n }\n if (event.key === 'Home') {\n event.preventDefault();\n moveFocus(startOfWeek(focusedDay, { weekStartsOn }));\n return;\n }\n if (event.key === 'End') {\n event.preventDefault();\n moveFocus(addDays(startOfWeek(focusedDay, { weekStartsOn }), 6));\n return;\n }\n if (event.key === 'PageUp') {\n event.preventDefault();\n moveFocus(subMonths(focusedDay, 1));\n return;\n }\n if (event.key === 'PageDown') {\n event.preventDefault();\n moveFocus(addMonths(focusedDay, 1));\n return;\n }\n if (event.key === 'Enter' || event.key === ' ') {\n event.preventDefault();\n if (isAvailable(focusedDay)) onSelectDate(isoDay(focusedDay));\n }\n };\n\n const focusedRef = useRef<HTMLButtonElement>(null);\n useEffect(() => {\n // Move focus to the focused day when it changes. Note: when the parent\n // StepperCalendar transitions Service → Date, its own step-change focus\n // effect *also* tries to focus the body's first interactive element. In\n // practice this effect runs deeper in the tree and after mount, so it\n // wins — but consumers should be aware of the interaction if they\n // tweak the ordering.\n focusedRef.current?.focus();\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [focusedDay.getTime()]);\n\n if (loading) {\n return (\n <div ref={ref} className=\"ds:flex ds:flex-col ds:gap-[var(--spacing-sm)]\">\n <Skeleton variant=\"text\" size=\"md\" width=\"40%\" />\n <div className={monthGridVariants()}>\n {Array.from({ length: 42 }, (_, i) => (\n <Skeleton\n key={`day-skeleton-${i}`}\n variant=\"rounded\"\n size=\"md\"\n height=\"40px\"\n />\n ))}\n </div>\n </div>\n );\n }\n\n if (availableDates.size === 0) {\n return (\n <div ref={ref}>\n <EmptyState variant=\"no-results\" title={emptyLabel} />\n </div>\n );\n }\n\n return (\n <div ref={ref} className=\"ds:flex ds:flex-col ds:gap-[var(--spacing-sm)]\">\n <div className={monthHeaderVariants()}>\n <IconButton\n icon={<ChevronLeft />}\n aria-label={prevLabel}\n size=\"sm\"\n intent=\"ghost\"\n flipIconInRtl\n onClick={() => setMonth(subMonths(month, 1))}\n />\n <span\n className=\"type-body-sm ds:font-[var(--font-weight-semibold)]\"\n aria-live=\"polite\"\n >\n {monthLabel}\n </span>\n <IconButton\n icon={<ChevronRight />}\n aria-label={nextLabel}\n size=\"sm\"\n intent=\"ghost\"\n flipIconInRtl\n onClick={() => setMonth(addMonths(month, 1))}\n />\n </div>\n <div\n role=\"grid\"\n aria-label={monthLabel}\n className=\"ds:flex ds:flex-col ds:gap-[var(--spacing-xs)]\"\n onKeyDown={handleKeyDown}\n >\n <div className={monthGridVariants()} role=\"row\">\n {weekdayLabels.map((wd) => (\n <span\n key={wd}\n role=\"columnheader\"\n className=\"type-meta ds:text-center ds:text-[var(--muted-foreground)]\"\n >\n {wd}\n </span>\n ))}\n </div>\n {Array.from({ length: 6 }, (_, weekIndex) => {\n const week = days.slice(weekIndex * 7, weekIndex * 7 + 7);\n return (\n <div\n key={`week-${weekIndex}`}\n role=\"row\"\n className={monthGridVariants()}\n >\n {week.map((d) => {\n const iso = isoDay(d);\n const outside = !isSameMonth(d, month);\n const available = isAvailable(d);\n const selected = selectedDate === iso;\n const isFocused = isSameDay(d, focusedDay);\n return (\n <button\n key={iso}\n ref={isFocused ? focusedRef : undefined}\n type=\"button\"\n role=\"gridcell\"\n aria-selected={selected}\n aria-disabled={!available || undefined}\n disabled={!available}\n data-outside={outside || undefined}\n tabIndex={isFocused ? 0 : -1}\n onClick={() => available && onSelectDate(iso)}\n className={dayCellVariants()}\n >\n {fnsFormat(d, 'd')}\n </button>\n );\n })}\n </div>\n );\n })}\n </div>\n </div>\n );\n },\n);\nMonthGrid.displayName = 'StepperCalendar.MonthGrid';\n\n/* -------------------------------------------------------------------- */\n/* Time step body */\n/* -------------------------------------------------------------------- */\n\ninterface TimeStepBodyProps {\n date?: string;\n slots: string[];\n selectedTime?: string;\n loading: boolean;\n emptyLabel: string;\n onSelect: (time: string) => void;\n}\n\nfunction TimeStepBody({\n date,\n slots,\n selectedTime,\n loading,\n emptyLabel,\n onSelect,\n}: TimeStepBodyProps) {\n if (!date) return null;\n if (loading) {\n return (\n <SlotGrid\n days={[{ date, slots: [] }]}\n state=\"loading\"\n />\n );\n }\n if (slots.length === 0) {\n return <EmptyState variant=\"no-results\" title={emptyLabel} />;\n }\n const slotObjects: SlotGridSlot[] = slots.map((time) => {\n // Build a Date from `date` + `time` for `Intl` formatting.\n const [h, m] = time.split(':');\n const start = parseISO(date);\n start.setHours(Number(h), Number(m), 0, 0);\n return {\n id: `${date}T${time}`,\n start,\n label: time,\n };\n });\n const day: SlotGridDay = { date, slots: slotObjects };\n return (\n <SlotGrid\n days={[day]}\n selectedSlotId={selectedTime ? `${date}T${selectedTime}` : undefined}\n onSlotSelect={(slot) => {\n // Validate against the documented `${yyyy-mm-dd}T${HH:mm}` shape so\n // an unexpected ID surfaces as a no-op rather than a malformed time.\n const match = SLOT_ID_PATTERN.exec(slot.id);\n if (match) onSelect(match[2]);\n }}\n />\n );\n}\n\n/* -------------------------------------------------------------------- */\n/* Component */\n/* -------------------------------------------------------------------- */\n\nconst StepperCalendar = forwardRef<HTMLDivElement, StepperCalendarProps>(\n (\n {\n services,\n availableDates,\n availableSlots,\n value,\n onChange,\n onSubmit,\n detailsFields,\n loadingDates = false,\n loadingSlots = false,\n stepStatuses,\n layout = 'vertical',\n density = 'comfortable',\n 'aria-label': ariaLabel,\n className,\n ...rest\n },\n ref,\n ) => {\n const { t, i18n } = useTranslation();\n const locale = i18n.language ?? 'en';\n const weekStartsOn = useMemo(\n () => resolveFirstDay(locale) as WeekStart,\n [locale],\n );\n\n // Derive max-allowed step from value, then clamp internal active step.\n const maxAllowed = firstIncompleteStep(value);\n const [activeStep, setActiveStep] = useState<number>(maxAllowed);\n // If `value` regresses (consumer cleared a field), pull active back.\n useEffect(() => {\n if (activeStep > maxAllowed) setActiveStep(maxAllowed);\n }, [activeStep, maxAllowed]);\n\n const headingRef = useRef<HTMLHeadingElement>(null);\n const isFirstRenderRef = useRef(true);\n\n // Move focus to the new step's heading when activeStep changes (skip\n // first render to avoid stealing focus on mount). Targeting the heading\n // (rather than the first interactive control) is the pattern recommended\n // by 05-accessibility.mdx — screen-reader users hear the step label\n // before any field, and sighted keyboard users can Tab into the form.\n useEffect(() => {\n if (isFirstRenderRef.current) {\n isFirstRenderRef.current = false;\n return;\n }\n headingRef.current?.focus();\n }, [activeStep]);\n\n const steps: StepSpec[] = useMemo(\n () => [\n {\n label: t('navigation.stepperCalendar.steps.service'),\n status: stepStatuses?.[0],\n },\n {\n label: t('navigation.stepperCalendar.steps.date'),\n status: stepStatuses?.[1],\n },\n {\n label: t('navigation.stepperCalendar.steps.time'),\n status: stepStatuses?.[2],\n },\n {\n label: t('navigation.stepperCalendar.steps.details'),\n status: stepStatuses?.[3],\n },\n ],\n [stepStatuses, t],\n );\n\n const label = ariaLabel ?? t('navigation.stepperCalendar.label');\n const backLabel = t('navigation.stepperCalendar.actions.back');\n const nextLabel = t('navigation.stepperCalendar.actions.next');\n const submitLabel = t('navigation.stepperCalendar.actions.submit');\n const emptyTimeLabel = t('navigation.stepperCalendar.time.empty');\n const prevMonthLabel = t('navigation.stepperCalendar.date.previousMonth');\n const nextMonthLabel = t('navigation.stepperCalendar.date.nextMonth');\n const serviceGroupLabel = t('navigation.stepperCalendar.steps.service');\n\n const durationLabel = useCallback(\n (minutes: number) =>\n t('navigation.stepperCalendar.service.duration', { minutes }),\n [t],\n );\n\n const canAdvance = (() => {\n if (activeStep === 0) return Boolean(value.serviceId);\n if (activeStep === 1) return Boolean(value.date);\n if (activeStep === 2) return Boolean(value.time);\n return false; // step 3 is terminal\n })();\n\n const handleServiceSelect = (serviceId: string) => {\n onChange({ ...value, serviceId });\n // Auto-advance for conversion. Use a short delay so users see the\n // selection register before the step swaps. Plain `setTimeout` (not\n // `window.setTimeout`) so the component does not assume a DOM global.\n setTimeout(() => {\n setActiveStep((s) => (s === 0 ? 1 : s));\n }, 120);\n };\n\n const handleDateSelect = (date: string) => {\n // Clear time when date changes.\n onChange({ ...value, date, time: undefined });\n };\n\n const handleTimeSelect = (time: string) => {\n onChange({ ...value, time });\n };\n\n const handleBack = () => setActiveStep((s) => Math.max(0, s - 1));\n const handleNext = () =>\n setActiveStep((s) => Math.min(TOTAL_STEPS - 1, s + 1));\n const handleSubmit = () => onSubmit?.(value);\n\n const headingId = `stepper-calendar-step-${activeStep}-heading`;\n const availableDateSet = useMemo(\n () => new Set(availableDates),\n [availableDates],\n );\n\n /* ---- Active step body ---- */\n let body: ReactNode = null;\n if (activeStep === 0) {\n body = (\n <ServiceGrid\n services={services}\n selectedId={value.serviceId}\n onSelect={handleServiceSelect}\n durationLabel={durationLabel}\n groupLabel={serviceGroupLabel}\n />\n );\n } else if (activeStep === 1) {\n body = (\n <MonthGrid\n availableDates={availableDateSet}\n selectedDate={value.date}\n onSelectDate={handleDateSelect}\n loading={loadingDates}\n locale={locale}\n weekStartsOn={weekStartsOn}\n prevLabel={prevMonthLabel}\n nextLabel={nextMonthLabel}\n emptyLabel={emptyTimeLabel}\n />\n );\n } else if (activeStep === 2) {\n body = (\n <TimeStepBody\n date={value.date}\n slots={value.date ? (availableSlots[value.date] ?? []) : []}\n selectedTime={value.time}\n loading={loadingSlots}\n emptyLabel={emptyTimeLabel}\n onSelect={handleTimeSelect}\n />\n );\n } else {\n body = (\n <div className=\"ds:flex ds:flex-col ds:gap-[var(--spacing-sm)]\">\n {detailsFields}\n </div>\n );\n }\n\n const isTerminal = activeStep === TOTAL_STEPS - 1;\n const activeState = stateForStep(\n activeStep,\n activeStep,\n stepStatuses?.[activeStep as 0 | 1 | 2 | 3],\n );\n\n return (\n <div\n ref={ref}\n role=\"region\"\n aria-label={label}\n data-component=\"stepper-calendar\"\n className={rootVariants({ layout, density, className })}\n {...rest}\n >\n <StepperProgress\n activeStep={activeStep}\n steps={steps}\n aria-label={label}\n />\n <section\n aria-labelledby={headingId}\n className={stepBodyVariants({ density })}\n data-step={activeStep}\n data-state={activeState}\n >\n <h2\n ref={headingRef}\n id={headingId}\n tabIndex={-1}\n className=\"type-body-sm ds:font-[var(--font-weight-semibold)] ds:focus:outline-none\"\n >\n {steps[activeStep]?.label}\n </h2>\n {body}\n <div className={actionsRowVariants()}>\n <Button\n type=\"button\"\n intent=\"ghost\"\n size=\"md\"\n onClick={handleBack}\n disabled={activeStep === 0}\n >\n {backLabel}\n </Button>\n {isTerminal ? (\n <Button\n type=\"button\"\n intent=\"primary\"\n size=\"md\"\n onClick={handleSubmit}\n >\n {submitLabel}\n </Button>\n ) : (\n <Button\n type=\"button\"\n intent=\"primary\"\n size=\"md\"\n onClick={handleNext}\n disabled={!canAdvance}\n >\n {nextLabel}\n </Button>\n )}\n </div>\n </section>\n </div>\n );\n },\n);\nStepperCalendar.displayName = 'StepperCalendar';\n\nexport { StepperCalendar };\n"],"names":["subMonths","date","amount","options","addMonths","SLOT_ID_PATTERN","TOTAL_STEPS","rootVariants","cva","stepBodyVariants","serviceCardVariants","monthHeaderVariants","monthGridVariants","dayCellVariants","actionsRowVariants","isoDay","fnsFormat","firstIncompleteStep","value","ServiceGrid","forwardRef","services","selectedId","onSelect","durationLabel","groupLabel","ref","itemRefs","useRef","focusedIndex","i","moveFocus","next","wrapped","target","svc","handleKeyDown","event","currentIndex","isRtl","forward","back","jsx","index","checked","jsxs","el","e","MonthGrid","availableDates","selectedDate","onSelectDate","loading","locale","weekStartsOn","prevLabel","nextLabel","emptyLabel","initialMonth","useMemo","parseISO","first","month","setMonth","useState","focusedDay","setFocusedDay","monthStart","startOfMonth","gridStart","startOfWeek","days","cells","addDays","weekdayLabels","base","fmt","_","monthLabel","isAvailable","useCallback","d","isSameMonth","map","focusedRef","useEffect","_a","Skeleton","EmptyState","IconButton","ChevronLeft","ChevronRight","wd","weekIndex","week","iso","outside","available","selected","isFocused","isSameDay","TimeStepBody","slots","selectedTime","SlotGrid","slotObjects","time","h","m","start","slot","match","StepperCalendar","availableSlots","onChange","onSubmit","detailsFields","loadingDates","loadingSlots","stepStatuses","layout","density","ariaLabel","className","rest","t","i18n","useTranslation","resolveFirstDay","maxAllowed","activeStep","setActiveStep","headingRef","isFirstRenderRef","steps","label","backLabel","submitLabel","emptyTimeLabel","prevMonthLabel","nextMonthLabel","serviceGroupLabel","minutes","canAdvance","handleServiceSelect","serviceId","s","handleDateSelect","handleTimeSelect","handleBack","handleNext","handleSubmit","headingId","availableDateSet","body","isTerminal","activeState","stateForStep","StepperProgress","Button"],"mappings":"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","x_google_ignoreList":[0]}
|
|
@@ -63,9 +63,9 @@ const D = i(
|
|
|
63
63
|
},
|
|
64
64
|
defaultVariants: { disabled: !1 }
|
|
65
65
|
}), E = {
|
|
66
|
-
sm: "size-2",
|
|
67
|
-
md: "size-2.5",
|
|
68
|
-
lg: "size-3"
|
|
66
|
+
sm: "ds:size-2",
|
|
67
|
+
md: "ds:size-2.5",
|
|
68
|
+
lg: "ds:size-3"
|
|
69
69
|
}, G = R(
|
|
70
70
|
({
|
|
71
71
|
label: b,
|
|
@@ -135,4 +135,4 @@ G.displayName = "Switch";
|
|
|
135
135
|
export {
|
|
136
136
|
G as S
|
|
137
137
|
};
|
|
138
|
-
//# sourceMappingURL=switch-
|
|
138
|
+
//# sourceMappingURL=switch-aN2EYxHh.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"switch-aN2EYxHh.js","sources":["../../src/components/switch/switch.tsx"],"sourcesContent":["import {\n forwardRef,\n useContext,\n useState,\n type ComponentPropsWithoutRef,\n type ReactNode,\n} from 'react';\nimport * as RadixSwitch from '@radix-ui/react-switch';\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport { useTranslation } from 'react-i18next';\nimport {\n FormFieldContext,\n useFormField,\n} from '../form-field/form-field-context';\n\nconst switchVariants = cva(\n [\n 'ds:inline-flex ds:shrink-0 ds:cursor-pointer ds:items-center',\n 'ds:rounded-[var(--radius-full)]',\n 'ds:border-2 ds:border-transparent',\n 'ds:bg-muted',\n 'ds:data-[state=checked]:bg-primary',\n 'ds:transition-colors ds:duration-[var(--animation-duration)] ds:motion-reduce:transition-none',\n 'ds:focus-visible:outline-[length:var(--focus-ring-width)] ds:focus-visible:outline-solid',\n 'ds:focus-visible:outline-ring ds:focus-visible:outline-offset-[length:var(--focus-ring-offset)]',\n 'ds:disabled:cursor-not-allowed ds:disabled:opacity-50',\n ].join(' '),\n {\n variants: {\n size: {\n sm: 'ds:h-4 ds:w-7',\n md: 'ds:h-5 ds:w-9',\n lg: 'ds:h-6 ds:w-11',\n },\n },\n defaultVariants: { size: 'md' },\n },\n);\n\nconst thumbVariants = cva(\n [\n 'ds:pointer-events-none ds:flex ds:items-center ds:justify-center ds:rounded-full ds:bg-background ds:text-foreground ds:shadow-[var(--shadow-sm)]',\n 'ds:transition-transform ds:duration-[var(--animation-duration)] ds:motion-reduce:transition-none',\n 'ds:data-[state=checked]:translate-x-full ds:rtl:data-[state=checked]:-translate-x-full',\n 'ds:data-[state=unchecked]:translate-x-0',\n ].join(' '),\n {\n variants: {\n size: {\n sm: 'ds:size-3',\n md: 'ds:size-4',\n lg: 'ds:size-5',\n },\n },\n defaultVariants: { size: 'md' },\n },\n);\n\nconst wrapperVariants = cva(\n 'ds:inline-flex ds:items-center ds:gap-3 ds:min-h-[var(--min-target-size)]',\n {\n variants: {\n labelSide: {\n start: 'ds:flex-row-reverse',\n end: '',\n },\n },\n defaultVariants: { labelSide: 'end' },\n },\n);\n\nconst labelVariants = cva('type-label ds:text-foreground ds:select-none', {\n variants: {\n disabled: {\n true: 'ds:cursor-not-allowed ds:opacity-50',\n false: 'ds:cursor-pointer',\n },\n },\n defaultVariants: { disabled: false },\n});\n\nconst iconSizeBySwitchSize = {\n sm: 'ds:size-2',\n md: 'ds:size-2.5',\n lg: 'ds:size-3',\n} as const;\n\nexport interface SwitchIcon {\n on: ReactNode;\n off: ReactNode;\n}\n\ntype RadixRootProps = ComponentPropsWithoutRef<typeof RadixSwitch.Root>;\n\nexport interface SwitchProps\n extends Omit<RadixRootProps, 'children'>,\n VariantProps<typeof switchVariants> {\n label: string;\n labelSide?: 'start' | 'end';\n size?: 'sm' | 'md' | 'lg';\n icon?: SwitchIcon;\n showStateText?: boolean;\n}\n\nexport const Switch = forwardRef<HTMLButtonElement, SwitchProps>(\n (\n {\n label,\n labelSide = 'end',\n size = 'md',\n icon,\n showStateText = false,\n checked,\n defaultChecked,\n onCheckedChange,\n disabled,\n id,\n className,\n ...props\n },\n ref,\n ) => {\n const { t } = useTranslation();\n const ctx = useFormField();\n const inFormField = useContext(FormFieldContext) !== null;\n const switchId = id ?? ctx.id;\n\n const [internalChecked, setInternalChecked] = useState<boolean>(\n checked ?? defaultChecked ?? false,\n );\n const isControlled = typeof checked === 'boolean';\n const currentChecked = isControlled ? checked : internalChecked;\n\n const handleCheckedChange = (next: boolean) => {\n if (!isControlled) setInternalChecked(next);\n onCheckedChange?.(next);\n };\n\n const effectiveDisabled = ctx.disabled || disabled;\n const describedBy = ctx.describedBy || undefined;\n\n const stateText = currentChecked\n ? t('ui.inputs.switch.on', 'On')\n : t('ui.inputs.switch.off', 'Off');\n\n return (\n <div className={wrapperVariants({ labelSide })}>\n <RadixSwitch.Root\n ref={ref}\n id={switchId}\n checked={isControlled ? checked : undefined}\n defaultChecked={!isControlled ? defaultChecked : undefined}\n onCheckedChange={handleCheckedChange}\n disabled={effectiveDisabled}\n aria-describedby={describedBy}\n aria-invalid={ctx.invalid || undefined}\n aria-required={ctx.required || undefined}\n data-component=\"switch\"\n className={switchVariants({ size, className })}\n {...props}\n >\n <RadixSwitch.Thumb className={thumbVariants({ size })}>\n {icon ? (\n <span\n aria-hidden=\"true\"\n className={`${iconSizeBySwitchSize[size]} ds:inline-flex ds:items-center ds:justify-center ds:[&_svg]:size-full`}\n >\n {currentChecked ? icon.on : icon.off}\n </span>\n ) : null}\n </RadixSwitch.Thumb>\n </RadixSwitch.Root>\n {showStateText ? (\n <span\n aria-hidden=\"true\"\n className=\"type-meta ds:text-muted-foreground ds:select-none\"\n >\n {stateText}\n </span>\n ) : null}\n {!inFormField ? (\n <label\n htmlFor={switchId}\n className={labelVariants({ disabled: Boolean(effectiveDisabled) })}\n >\n {label}\n </label>\n ) : null}\n </div>\n );\n },\n);\n\nSwitch.displayName = 'Switch';\n"],"names":["switchVariants","cva","thumbVariants","wrapperVariants","labelVariants","iconSizeBySwitchSize","Switch","forwardRef","label","labelSide","size","icon","showStateText","checked","defaultChecked","onCheckedChange","disabled","id","className","props","ref","t","useTranslation","ctx","useFormField","inFormField","useContext","FormFieldContext","switchId","internalChecked","setInternalChecked","useState","isControlled","currentChecked","handleCheckedChange","next","effectiveDisabled","describedBy","stateText","jsx","RadixSwitch"],"mappings":"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"}
|
|
@@ -6,7 +6,7 @@ import { a as y, c as q } from "./index-D2ZczOXr.js";
|
|
|
6
6
|
import { useTranslation as Z } from "react-i18next";
|
|
7
7
|
import { u as D } from "./use-direction-D6rvvG9G.js";
|
|
8
8
|
import { c as K } from "./compose-refs-C0k0tdqF.js";
|
|
9
|
-
import { S as ee } from "./select-
|
|
9
|
+
import { S as ee } from "./select-IY_JQa-F.js";
|
|
10
10
|
import { X as te } from "./x-CCcI3eJp.js";
|
|
11
11
|
import { C as se } from "./chevron-down-BX_NP2Yh.js";
|
|
12
12
|
const M = q(
|
|
@@ -89,25 +89,25 @@ const M = q(
|
|
|
89
89
|
}
|
|
90
90
|
}), S = j(
|
|
91
91
|
({
|
|
92
|
-
variant:
|
|
92
|
+
variant: i = "default",
|
|
93
93
|
size: a = "md",
|
|
94
94
|
orientation: r = "horizontal",
|
|
95
|
-
overflow:
|
|
96
|
-
className:
|
|
95
|
+
overflow: o = "dropdown",
|
|
96
|
+
className: n,
|
|
97
97
|
children: c,
|
|
98
98
|
value: t,
|
|
99
99
|
defaultValue: p,
|
|
100
100
|
onValueChange: l,
|
|
101
101
|
...w
|
|
102
102
|
}, g) => {
|
|
103
|
-
const b = P(null), z = K(g, b), u = D(b), f = t !== void 0, [T, h] = B(p ?? ""), v = f ? t ?? "" : T,
|
|
103
|
+
const b = P(null), z = K(g, b), u = D(b), f = t !== void 0, [T, h] = B(p ?? ""), v = f ? t ?? "" : T, d = W(
|
|
104
104
|
(m) => {
|
|
105
105
|
f || h(m), l == null || l(m);
|
|
106
106
|
},
|
|
107
107
|
[f, l]
|
|
108
108
|
), e = I(
|
|
109
|
-
() => ({ variant:
|
|
110
|
-
[
|
|
109
|
+
() => ({ variant: i, size: a, orientation: r, overflow: o, value: v, setValue: d }),
|
|
110
|
+
[i, a, r, o, v, d]
|
|
111
111
|
);
|
|
112
112
|
return /* @__PURE__ */ s(V.Provider, { value: e, children: /* @__PURE__ */ s(
|
|
113
113
|
R.Root,
|
|
@@ -116,12 +116,12 @@ const M = q(
|
|
|
116
116
|
orientation: r,
|
|
117
117
|
dir: u,
|
|
118
118
|
value: v,
|
|
119
|
-
onValueChange:
|
|
119
|
+
onValueChange: d,
|
|
120
120
|
"data-component": "tabs",
|
|
121
121
|
className: y(
|
|
122
|
-
"flex",
|
|
123
|
-
r === "vertical" ? "flex-row gap-[var(--spacing-md)]" : "flex-col",
|
|
124
|
-
|
|
122
|
+
"ds:flex",
|
|
123
|
+
r === "vertical" ? "ds:flex-row ds:gap-[var(--spacing-md)]" : "ds:flex-col",
|
|
124
|
+
n
|
|
125
125
|
),
|
|
126
126
|
...w,
|
|
127
127
|
children: c
|
|
@@ -131,7 +131,7 @@ const M = q(
|
|
|
131
131
|
);
|
|
132
132
|
S.displayName = "Tabs";
|
|
133
133
|
const X = j(
|
|
134
|
-
({ className:
|
|
134
|
+
({ className: i, children: a, "aria-label": r, ...o }, n) => {
|
|
135
135
|
const { variant: c, size: t, orientation: p, overflow: l, value: w, setValue: g } = L(V), { t: b } = Z("ui"), z = P(null), [u, f] = B([]), T = p === "horizontal", h = l === "dropdown" && T;
|
|
136
136
|
J(() => {
|
|
137
137
|
if (!h) {
|
|
@@ -153,8 +153,8 @@ const X = j(
|
|
|
153
153
|
return x.observe(e), m(), () => x.disconnect();
|
|
154
154
|
}, [h, a]);
|
|
155
155
|
const v = (e) => {
|
|
156
|
-
z.current = e, typeof
|
|
157
|
-
},
|
|
156
|
+
z.current = e, typeof n == "function" ? n(e) : n && (n.current = e);
|
|
157
|
+
}, d = I(() => l !== "select" ? [] : Q.toArray(a).filter((e) => U(e)).filter((e) => typeof e.props.value == "string" && e.props.value.length > 0).map((e) => {
|
|
158
158
|
const m = e.props.value, x = e.props.children, O = typeof x == "string" ? x : typeof x == "number" ? String(x) : m;
|
|
159
159
|
return { value: m, label: O };
|
|
160
160
|
}), [a, l]);
|
|
@@ -162,7 +162,7 @@ const X = j(
|
|
|
162
162
|
/* @__PURE__ */ s("div", { className: "ds:block ds:@md/tabs:hidden", children: /* @__PURE__ */ s(
|
|
163
163
|
ee,
|
|
164
164
|
{
|
|
165
|
-
options:
|
|
165
|
+
options: d,
|
|
166
166
|
value: w,
|
|
167
167
|
onValueChange: (e) => {
|
|
168
168
|
typeof e == "string" && e.length > 0 && g(e);
|
|
@@ -176,8 +176,8 @@ const X = j(
|
|
|
176
176
|
{
|
|
177
177
|
ref: v,
|
|
178
178
|
"aria-label": r,
|
|
179
|
-
className: M({ variant: c, orientation: p, className:
|
|
180
|
-
...
|
|
179
|
+
className: M({ variant: c, orientation: p, className: i }),
|
|
180
|
+
...o,
|
|
181
181
|
children: a
|
|
182
182
|
}
|
|
183
183
|
) })
|
|
@@ -187,8 +187,8 @@ const X = j(
|
|
|
187
187
|
{
|
|
188
188
|
ref: v,
|
|
189
189
|
"aria-label": r,
|
|
190
|
-
className: M({ variant: c, orientation: p, className:
|
|
191
|
-
...
|
|
190
|
+
className: M({ variant: c, orientation: p, className: i }),
|
|
191
|
+
...o,
|
|
192
192
|
children: a
|
|
193
193
|
}
|
|
194
194
|
),
|
|
@@ -197,15 +197,15 @@ const X = j(
|
|
|
197
197
|
}
|
|
198
198
|
);
|
|
199
199
|
X.displayName = "TabsList";
|
|
200
|
-
function ae({ tabs:
|
|
201
|
-
const { variant:
|
|
200
|
+
function ae({ tabs: i, label: a, size: r }) {
|
|
201
|
+
const { variant: o } = L(V);
|
|
202
202
|
return /* @__PURE__ */ k(N.Root, { children: [
|
|
203
203
|
/* @__PURE__ */ k(
|
|
204
204
|
N.Trigger,
|
|
205
205
|
{
|
|
206
206
|
className: y(
|
|
207
|
-
H({ variant:
|
|
208
|
-
"shrink-0 ms-1"
|
|
207
|
+
H({ variant: o, size: r, orientation: "horizontal" }),
|
|
208
|
+
"ds:shrink-0 ds:ms-1"
|
|
209
209
|
),
|
|
210
210
|
"aria-label": a,
|
|
211
211
|
children: [
|
|
@@ -219,31 +219,31 @@ function ae({ tabs: d, label: a, size: r }) {
|
|
|
219
219
|
{
|
|
220
220
|
sideOffset: 4,
|
|
221
221
|
className: y(
|
|
222
|
-
"z-50 min-w-40 overflow-hidden rounded-[var(--radius-md)]",
|
|
223
|
-
"border border-border bg-popover p-1 shadow-md",
|
|
224
|
-
"data-[state=open]:animate-in data-[state=closed]:animate-out",
|
|
225
|
-
"data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0",
|
|
226
|
-
"data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95"
|
|
222
|
+
"ds:z-50 ds:min-w-40 ds:overflow-hidden ds:rounded-[var(--radius-md)]",
|
|
223
|
+
"ds:border ds:border-border ds:bg-popover ds:p-1 ds:shadow-md",
|
|
224
|
+
"ds:data-[state=open]:animate-in ds:data-[state=closed]:animate-out",
|
|
225
|
+
"ds:data-[state=closed]:fade-out-0 ds:data-[state=open]:fade-in-0",
|
|
226
|
+
"ds:data-[state=closed]:zoom-out-95 ds:data-[state=open]:zoom-in-95"
|
|
227
227
|
),
|
|
228
|
-
children:
|
|
228
|
+
children: i.map(({ value: n, label: c }) => /* @__PURE__ */ s(
|
|
229
229
|
N.Item,
|
|
230
230
|
{
|
|
231
231
|
className: y(
|
|
232
|
-
"relative flex cursor-pointer select-none items-center",
|
|
233
|
-
"rounded-[var(--radius-sm)] px-[var(--spacing-sm)] py-[var(--spacing-xs)]",
|
|
234
|
-
"text-[var(--font-size-sm)] text-foreground outline-none",
|
|
235
|
-
"hover:bg-muted focus:bg-muted",
|
|
236
|
-
"data-[disabled]:pointer-events-none data-[disabled]:opacity-50"
|
|
232
|
+
"ds:relative ds:flex ds:cursor-pointer ds:select-none ds:items-center",
|
|
233
|
+
"ds:rounded-[var(--radius-sm)] ds:px-[var(--spacing-sm)] ds:py-[var(--spacing-xs)]",
|
|
234
|
+
"ds:text-[var(--font-size-sm)] ds:text-foreground ds:outline-none",
|
|
235
|
+
"ds:hover:bg-muted ds:focus:bg-muted",
|
|
236
|
+
"ds:data-[disabled]:pointer-events-none ds:data-[disabled]:opacity-50"
|
|
237
237
|
),
|
|
238
238
|
onSelect: () => {
|
|
239
239
|
const t = document.querySelector(
|
|
240
|
-
`[role="tab"][data-value="${CSS.escape(
|
|
240
|
+
`[role="tab"][data-value="${CSS.escape(n)}"]`
|
|
241
241
|
);
|
|
242
242
|
t == null || t.click(), t == null || t.scrollIntoView({ inline: "nearest" });
|
|
243
243
|
},
|
|
244
244
|
children: c
|
|
245
245
|
},
|
|
246
|
-
|
|
246
|
+
n
|
|
247
247
|
))
|
|
248
248
|
}
|
|
249
249
|
) })
|
|
@@ -251,11 +251,11 @@ function ae({ tabs: d, label: a, size: r }) {
|
|
|
251
251
|
}
|
|
252
252
|
const $ = j(
|
|
253
253
|
({
|
|
254
|
-
variant:
|
|
254
|
+
variant: i,
|
|
255
255
|
size: a,
|
|
256
256
|
orientation: r,
|
|
257
|
-
icon:
|
|
258
|
-
badge:
|
|
257
|
+
icon: o,
|
|
258
|
+
badge: n,
|
|
259
259
|
dismissible: c = !1,
|
|
260
260
|
onDismiss: t,
|
|
261
261
|
className: p,
|
|
@@ -264,8 +264,8 @@ const $ = j(
|
|
|
264
264
|
onKeyDown: g,
|
|
265
265
|
...b
|
|
266
266
|
}, z) => {
|
|
267
|
-
const u = L(V), f =
|
|
268
|
-
c && (
|
|
267
|
+
const u = L(V), f = i ?? u.variant, T = a ?? u.size, h = r ?? u.orientation, v = (d) => {
|
|
268
|
+
c && (d.key === "Delete" || d.key === "Backspace") && (d.preventDefault(), t == null || t()), g == null || g(d);
|
|
269
269
|
};
|
|
270
270
|
return /* @__PURE__ */ k(
|
|
271
271
|
R.Trigger,
|
|
@@ -277,9 +277,9 @@ const $ = j(
|
|
|
277
277
|
onKeyDown: v,
|
|
278
278
|
...b,
|
|
279
279
|
children: [
|
|
280
|
-
|
|
280
|
+
o && /* @__PURE__ */ s("span", { "aria-hidden": "true", className: "ds:shrink-0 ds:size-4", children: o }),
|
|
281
281
|
l,
|
|
282
|
-
|
|
282
|
+
n && /* @__PURE__ */ s("span", { className: "ds:shrink-0", children: n }),
|
|
283
283
|
c && // Visual-only dismiss indicator — pointer dismiss fires here; keyboard dismiss fires via Delete/Backspace on the trigger above.
|
|
284
284
|
// No role/tabIndex to avoid nested-interactive (interactive content inside <button> is invalid HTML).
|
|
285
285
|
/* @__PURE__ */ s(
|
|
@@ -287,12 +287,12 @@ const $ = j(
|
|
|
287
287
|
{
|
|
288
288
|
"aria-hidden": "true",
|
|
289
289
|
className: y(
|
|
290
|
-
"inline-flex items-center justify-center shrink-0",
|
|
291
|
-
"size-6 rounded-[var(--radius-sm)]",
|
|
292
|
-
"hover:bg-muted-foreground/20"
|
|
290
|
+
"ds:inline-flex ds:items-center ds:justify-center ds:shrink-0",
|
|
291
|
+
"ds:size-6 ds:rounded-[var(--radius-sm)]",
|
|
292
|
+
"ds:hover:bg-muted-foreground/20"
|
|
293
293
|
),
|
|
294
|
-
onPointerDown: (
|
|
295
|
-
|
|
294
|
+
onPointerDown: (d) => {
|
|
295
|
+
d.stopPropagation(), d.preventDefault(), t == null || t();
|
|
296
296
|
},
|
|
297
297
|
children: /* @__PURE__ */ s(te, { className: "ds:size-3.5" })
|
|
298
298
|
}
|
|
@@ -304,15 +304,15 @@ const $ = j(
|
|
|
304
304
|
);
|
|
305
305
|
$.displayName = "TabsTrigger";
|
|
306
306
|
const F = j(
|
|
307
|
-
({ className:
|
|
307
|
+
({ className: i, children: a, ...r }, o) => /* @__PURE__ */ s(
|
|
308
308
|
R.Content,
|
|
309
309
|
{
|
|
310
|
-
ref:
|
|
310
|
+
ref: o,
|
|
311
311
|
className: y(
|
|
312
|
-
"mt-[var(--spacing-sm)] outline-none",
|
|
313
|
-
"focus-visible:outline-[length:var(--focus-ring-width)] focus-visible:outline-solid",
|
|
314
|
-
"focus-visible:outline-ring focus-visible:outline-offset-[length:var(--focus-ring-offset)]",
|
|
315
|
-
|
|
312
|
+
"ds:mt-[var(--spacing-sm)] ds:outline-none",
|
|
313
|
+
"ds:focus-visible:outline-[length:var(--focus-ring-width)] ds:focus-visible:outline-solid",
|
|
314
|
+
"ds:focus-visible:outline-ring ds:focus-visible:outline-offset-[length:var(--focus-ring-offset)]",
|
|
315
|
+
i
|
|
316
316
|
),
|
|
317
317
|
...r,
|
|
318
318
|
children: a
|
|
@@ -345,4 +345,4 @@ export {
|
|
|
345
345
|
$ as c,
|
|
346
346
|
pe as t
|
|
347
347
|
};
|
|
348
|
-
//# sourceMappingURL=tabs.agent-
|
|
348
|
+
//# sourceMappingURL=tabs.agent-BpbVA-Zh.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tabs.agent-BpbVA-Zh.js","sources":["../../src/components/tabs/tabs.tsx","../../src/components/tabs/tabs.agent.ts"],"sourcesContent":["import {\n Children,\n createContext,\n forwardRef,\n isValidElement,\n useCallback,\n useContext,\n useEffect,\n useMemo,\n useRef,\n useState,\n type ComponentPropsWithoutRef,\n type MutableRefObject,\n type ReactElement,\n type ReactNode,\n} from 'react';\nimport * as TabsPrimitive from '@radix-ui/react-tabs';\nimport * as DropdownMenuPrimitive from '@radix-ui/react-dropdown-menu';\nimport { cva, cx, type VariantProps } from 'class-variance-authority';\nimport { X, ChevronDown } from 'lucide-react';\nimport { useTranslation } from 'react-i18next';\nimport { useDirection } from '../_shared/use-direction';\nimport { composeRefs } from '../_shared/compose-refs';\nimport { Select, type SelectOption } from '../select/select';\n\n// ---------------------------------------------------------------------------\n// CVA recipes\n// ---------------------------------------------------------------------------\n\nexport const tabsListVariants = cva(\n 'ds:relative ds:flex',\n {\n variants: {\n variant: {\n // Shadcn-style segmented control: light container, white active card\n default: 'ds:flex-1 ds:min-w-0 ds:items-center ds:bg-muted/10 ds:rounded-[var(--radius-md)] ds:p-1',\n // Classic underline tabs: bottom border with colored active indicator\n underlined: 'ds:flex-1 ds:min-w-0 ds:items-end ds:[border-block-end:1px_solid_var(--border)]',\n // Segmented control: warm secondary container, content-width\n pills: 'ds:items-center ds:bg-secondary ds:rounded-[var(--radius-md)] ds:p-1',\n },\n orientation: {\n horizontal: 'ds:flex-row ds:overflow-hidden',\n vertical: 'ds:flex-col',\n },\n },\n defaultVariants: {\n variant: 'default',\n orientation: 'horizontal',\n },\n },\n);\n\nexport const tabsTriggerVariants = cva(\n [\n 'ds:relative ds:inline-flex ds:items-center ds:justify-center ds:whitespace-nowrap ds:border-0',\n 'ds:gap-2 ds:font-medium ds:transition-colors',\n 'ds:duration-[var(--animation-duration)] ds:motion-reduce:transition-none',\n 'ds:cursor-pointer ds:select-none',\n 'ds:disabled:pointer-events-none ds:disabled:opacity-50',\n 'ds:focus-visible:outline-[length:var(--focus-ring-width)] ds:focus-visible:outline-solid',\n 'ds:focus-visible:outline-ring ds:focus-visible:outline-offset-[length:var(--focus-ring-offset)]',\n ].join(' '),\n {\n variants: {\n variant: {\n default: [\n 'ds:rounded-[var(--radius-sm)] ds:bg-transparent ds:text-muted-foreground',\n 'ds:hover:bg-muted/10 ds:hover:text-foreground',\n 'ds:data-[state=active]:bg-background ds:data-[state=active]:text-foreground',\n 'ds:data-[state=active]:shadow-sm',\n ].join(' '),\n underlined: [\n 'ds:bg-transparent ds:text-muted-foreground',\n 'ds:[border-block-end:2px_solid_transparent]',\n 'ds:hover:bg-muted/10 ds:hover:text-foreground',\n 'ds:data-[state=active]:[border-block-end-color:var(--primary)]',\n 'ds:data-[state=active]:text-foreground ds:data-[state=active]:[margin-block-end:-1px]',\n ].join(' '),\n pills: [\n 'ds:rounded-[var(--radius-full)] ds:bg-transparent ds:text-muted-foreground',\n 'ds:hover:bg-muted/20 ds:hover:text-foreground',\n 'ds:data-[state=active]:bg-primary ds:data-[state=active]:text-primary-foreground',\n ].join(' '),\n },\n size: {\n sm: 'ds:h-8 ds:px-[var(--spacing-sm)] ds:text-[length:var(--font-size-sm)]',\n md: 'ds:h-10 ds:px-[var(--spacing-md)] ds:text-[length:var(--font-size-base)]',\n lg: 'ds:h-12 ds:px-[var(--spacing-lg)] ds:text-[length:var(--font-size-lg)]',\n },\n orientation: {\n horizontal: '',\n vertical: 'ds:w-full ds:justify-start',\n },\n },\n defaultVariants: {\n variant: 'default',\n size: 'md',\n orientation: 'horizontal',\n },\n },\n);\n\n// ---------------------------------------------------------------------------\n// Context\n// ---------------------------------------------------------------------------\n\ntype TabsOverflow = 'dropdown' | 'select';\n\ninterface TabsContextValue {\n variant: 'default' | 'underlined' | 'pills';\n size: 'sm' | 'md' | 'lg';\n orientation: 'horizontal' | 'vertical';\n overflow: TabsOverflow;\n value: string;\n setValue: (value: string) => void;\n}\n\nconst TabsContext = createContext<TabsContextValue>({\n variant: 'default',\n size: 'md',\n orientation: 'horizontal',\n overflow: 'dropdown',\n value: '',\n setValue: () => {},\n});\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\nexport interface TabsRootProps\n extends Omit<ComponentPropsWithoutRef<typeof TabsPrimitive.Root>, 'orientation'> {\n variant?: 'default' | 'underlined' | 'pills';\n size?: 'sm' | 'md' | 'lg';\n orientation?: 'horizontal' | 'vertical';\n /**\n * Strategy for tabs that don't fit horizontally.\n *\n * - `'dropdown'` (default) — overflowing tabs collapse into a \"More\"\n * `DropdownMenu` rendered next to the visible tab list. Most tabs\n * stay visible inline; the few that don't fit hide behind the menu.\n * Best when there are 5–7 tabs at moderately narrow viewports.\n * - `'select'` — at narrow container widths (under the `@md` breakpoint)\n * the entire tab strip collapses into a single `Select` whose value\n * is the active tab. Best when there are many tabs and the panel is\n * genuinely cramped (mobile, side-panel host). Above `@md`, the\n * inline tab list reappears unchanged.\n *\n * Limitation: the Select mirror builds option labels from each\n * `Tabs.Trigger`'s `children`. Plain string / number children are\n * used verbatim; richer children (icon + text, fragments) fall back\n * to the trigger's `value` so the option remains selectable. Prefer\n * plain-text trigger children when using `overflow=\"select\"`, or use\n * the trigger's `icon` prop for the icon and keep `children` a\n * plain string.\n *\n * @default 'dropdown'\n */\n overflow?: TabsOverflow;\n}\n\nexport interface TabsListProps extends ComponentPropsWithoutRef<typeof TabsPrimitive.List> {\n 'aria-label'?: string;\n}\n\nexport interface TabsTriggerProps\n extends ComponentPropsWithoutRef<typeof TabsPrimitive.Trigger>,\n VariantProps<typeof tabsTriggerVariants> {\n icon?: ReactNode;\n badge?: ReactNode;\n dismissible?: boolean;\n onDismiss?: () => void;\n}\n\nexport type TabsContentProps = ComponentPropsWithoutRef<typeof TabsPrimitive.Content>;\n\n// ---------------------------------------------------------------------------\n// TabsRoot\n// ---------------------------------------------------------------------------\n\nconst TabsRoot = forwardRef<HTMLDivElement, TabsRootProps>(\n (\n {\n variant = 'default',\n size = 'md',\n orientation = 'horizontal',\n overflow = 'dropdown',\n className,\n children,\n value: valueProp,\n defaultValue,\n onValueChange,\n ...props\n },\n ref,\n ) => {\n const rootRef = useRef<HTMLDivElement>(null);\n const composedRef = composeRefs(ref, rootRef);\n const dir = useDirection(rootRef);\n\n // Track the active tab so the `overflow=\"select\"` mirror can read it\n // without forcing consumers into controlled mode. If `value` is passed\n // we honour it; otherwise we manage internal state seeded from\n // `defaultValue` and notify consumers via `onValueChange`. Net effect\n // is identical to Radix's own controlled / uncontrolled split — we\n // just shadow the value into context so the Select can mirror it.\n const isControlled = valueProp !== undefined;\n const [internalValue, setInternalValue] = useState<string>(defaultValue ?? '');\n const value = isControlled ? (valueProp ?? '') : internalValue;\n const setValue = useCallback(\n (next: string) => {\n if (!isControlled) setInternalValue(next);\n onValueChange?.(next);\n },\n [isControlled, onValueChange],\n );\n\n const ctxValue = useMemo(\n () => ({ variant, size, orientation, overflow, value, setValue }),\n [variant, size, orientation, overflow, value, setValue],\n );\n\n return (\n <TabsContext.Provider value={ctxValue}>\n <TabsPrimitive.Root\n ref={composedRef}\n orientation={orientation}\n dir={dir}\n // We always run Radix in controlled mode against our shadow state\n // (seeded from `defaultValue`) so the `overflow=\"select\"` mirror\n // can read the active value via context without DOM observation.\n value={value}\n onValueChange={setValue}\n data-component=\"tabs\"\n className={cx(\n 'ds:flex',\n orientation === 'vertical' ? 'ds:flex-row ds:gap-[var(--spacing-md)]' : 'ds:flex-col',\n className,\n )}\n {...props}\n >\n {children}\n </TabsPrimitive.Root>\n </TabsContext.Provider>\n );\n },\n);\nTabsRoot.displayName = 'Tabs';\n\n// ---------------------------------------------------------------------------\n// TabsList — with overflow detection\n// ---------------------------------------------------------------------------\n\nconst TabsList = forwardRef<HTMLDivElement, TabsListProps>(\n ({ className, children, 'aria-label': ariaLabel, ...props }, ref) => {\n const { variant, size, orientation, overflow, value, setValue } = useContext(TabsContext);\n const { t } = useTranslation('ui');\n\n const listRef = useRef<HTMLDivElement>(null);\n const [overflowTabs, setOverflowTabs] = useState<{ value: string; label: string }[]>([]);\n const isHorizontal = orientation === 'horizontal';\n // The `select` overflow strategy renders a Select mirror at narrow\n // container widths and skips the DropdownMenu overflow detector\n // (it's the wrong UX for that case — a select-and-a-dropdown would\n // double up). The dropdown detector only runs when `overflow` is\n // `dropdown` and the strip is horizontal.\n const isDropdownOverflow = overflow === 'dropdown' && isHorizontal;\n\n useEffect(() => {\n if (!isDropdownOverflow) {\n setOverflowTabs([]);\n return;\n }\n const el = listRef.current;\n if (!el) return;\n\n const detectOverflow = () => {\n const containerRight = el.getBoundingClientRect().right;\n const hidden: { value: string; label: string }[] = [];\n el.querySelectorAll<HTMLButtonElement>('[role=\"tab\"]').forEach((tab) => {\n const rect = tab.getBoundingClientRect();\n if (rect.right > containerRight + 2) {\n const value = tab.getAttribute('data-value') ?? tab.dataset['value'] ?? '';\n const label = tab.textContent?.trim() ?? value;\n hidden.push({ value, label });\n }\n });\n setOverflowTabs(hidden);\n };\n\n const ro = new ResizeObserver(detectOverflow);\n ro.observe(el);\n detectOverflow();\n return () => ro.disconnect();\n }, [isDropdownOverflow, children]);\n\n const combinedRef = (node: HTMLDivElement | null) => {\n (listRef as MutableRefObject<HTMLDivElement | null>).current = node;\n if (typeof ref === 'function') ref(node);\n else if (ref) (ref as MutableRefObject<HTMLDivElement | null>).current = node;\n };\n\n // For `overflow=\"select\"` we mirror the Trigger children as Select\n // options. Triggers may carry icon + text; for the Select label we\n // prefer the trigger's plain-text children — anything else falls\n // back to the trigger's `value` so the option is at least selectable.\n const selectOptions = useMemo<SelectOption<string>[]>(() => {\n if (overflow !== 'select') return [];\n return Children.toArray(children)\n .filter((child): child is ReactElement<TabsTriggerProps> => isValidElement(child))\n .filter((child) => typeof child.props.value === 'string' && child.props.value.length > 0)\n .map((child) => {\n const triggerValue = child.props.value as string;\n const labelChild = child.props.children;\n const label =\n typeof labelChild === 'string'\n ? labelChild\n : typeof labelChild === 'number'\n ? String(labelChild)\n : triggerValue;\n return { value: triggerValue, label };\n });\n }, [children, overflow]);\n\n if (overflow === 'select' && isHorizontal) {\n // Container queries gate the swap: above `@md` (Tailwind v4 default\n // 28rem container width) the inline tab strip renders; below it,\n // the Select takes over. The Tabs.List markup stays mounted in\n // both modes so Radix's roving-tabindex / ARIA wiring is preserved\n // even when the strip is visually hidden — keyboard users who land\n // on the panel via skip-link still get to the active tab.\n return (\n <div className=\"ds:@container/tabs ds:relative ds:w-full\">\n {/* Select mirror — visible at narrow container widths only. */}\n <div className=\"ds:block ds:@md/tabs:hidden\">\n <Select\n options={selectOptions}\n value={value}\n onValueChange={(next) => {\n if (typeof next === 'string' && next.length > 0) setValue(next);\n }}\n size={size}\n aria-label={ariaLabel ?? t('tabs.selectLabel')}\n />\n </div>\n {/* Inline tab strip — visible at wider container widths. */}\n <div className=\"ds:hidden ds:@md/tabs:flex ds:relative ds:items-center\">\n <TabsPrimitive.List\n ref={combinedRef}\n aria-label={ariaLabel}\n className={tabsListVariants({ variant, orientation, className })}\n {...props}\n >\n {children}\n </TabsPrimitive.List>\n </div>\n </div>\n );\n }\n\n return (\n <div className=\"ds:relative ds:flex ds:items-center\">\n <TabsPrimitive.List\n ref={combinedRef}\n aria-label={ariaLabel}\n className={tabsListVariants({ variant, orientation, className })}\n {...props}\n >\n {children}\n </TabsPrimitive.List>\n\n {isDropdownOverflow && overflowTabs.length > 0 && (\n <OverflowMenu tabs={overflowTabs} label={t('tabs.moreTabs')} size={size} />\n )}\n </div>\n );\n },\n);\nTabsList.displayName = 'TabsList';\n\n// ---------------------------------------------------------------------------\n// OverflowMenu (internal)\n// ---------------------------------------------------------------------------\n\ninterface OverflowMenuProps {\n tabs: { value: string; label: string }[];\n label: string;\n size: 'sm' | 'md' | 'lg';\n}\n\nfunction OverflowMenu({ tabs, label, size }: OverflowMenuProps) {\n const { variant } = useContext(TabsContext);\n\n return (\n <DropdownMenuPrimitive.Root>\n <DropdownMenuPrimitive.Trigger\n className={cx(\n tabsTriggerVariants({ variant, size, orientation: 'horizontal' }),\n 'ds:shrink-0 ds:ms-1',\n )}\n aria-label={label}\n >\n {label}\n <ChevronDown aria-hidden=\"true\" className=\"ds:size-4\" />\n </DropdownMenuPrimitive.Trigger>\n <DropdownMenuPrimitive.Portal>\n <DropdownMenuPrimitive.Content\n sideOffset={4}\n className={cx(\n 'ds:z-50 ds:min-w-40 ds:overflow-hidden ds:rounded-[var(--radius-md)]',\n 'ds:border ds:border-border ds:bg-popover ds:p-1 ds:shadow-md',\n 'ds:data-[state=open]:animate-in ds:data-[state=closed]:animate-out',\n 'ds:data-[state=closed]:fade-out-0 ds:data-[state=open]:fade-in-0',\n 'ds:data-[state=closed]:zoom-out-95 ds:data-[state=open]:zoom-in-95',\n )}\n >\n {tabs.map(({ value, label: tabLabel }) => (\n <DropdownMenuPrimitive.Item\n key={value}\n className={cx(\n 'ds:relative ds:flex ds:cursor-pointer ds:select-none ds:items-center',\n 'ds:rounded-[var(--radius-sm)] ds:px-[var(--spacing-sm)] ds:py-[var(--spacing-xs)]',\n 'ds:text-[var(--font-size-sm)] ds:text-foreground ds:outline-none',\n 'ds:hover:bg-muted ds:focus:bg-muted',\n 'ds:data-[disabled]:pointer-events-none ds:data-[disabled]:opacity-50',\n )}\n onSelect={() => {\n const tab = document.querySelector<HTMLButtonElement>(\n `[role=\"tab\"][data-value=\"${CSS.escape(value)}\"]`,\n );\n tab?.click();\n tab?.scrollIntoView({ inline: 'nearest' });\n }}\n >\n {tabLabel}\n </DropdownMenuPrimitive.Item>\n ))}\n </DropdownMenuPrimitive.Content>\n </DropdownMenuPrimitive.Portal>\n </DropdownMenuPrimitive.Root>\n );\n}\n\n// ---------------------------------------------------------------------------\n// TabsTrigger\n// ---------------------------------------------------------------------------\n\nconst TabsTrigger = forwardRef<HTMLButtonElement, TabsTriggerProps>(\n (\n {\n variant: variantProp,\n size: sizeProp,\n orientation: orientationProp,\n icon,\n badge,\n dismissible = false,\n onDismiss,\n className,\n children,\n value,\n onKeyDown,\n ...props\n },\n ref,\n ) => {\n const ctx = useContext(TabsContext);\n const variant = variantProp ?? ctx.variant;\n const size = sizeProp ?? ctx.size;\n const orientation = orientationProp ?? ctx.orientation;\n\n const handleKeyDown = (e: React.KeyboardEvent<HTMLButtonElement>) => {\n // APG dismissible-tab pattern: Delete/Backspace while trigger is focused closes the tab.\n // The visual X is pointer-only (aria-hidden) to avoid nested-interactive HTML violation.\n if (dismissible && (e.key === 'Delete' || e.key === 'Backspace')) {\n e.preventDefault();\n onDismiss?.();\n }\n onKeyDown?.(e);\n };\n\n return (\n <TabsPrimitive.Trigger\n ref={ref}\n value={value}\n data-value={value}\n className={tabsTriggerVariants({ variant, size, orientation, className })}\n onKeyDown={handleKeyDown}\n {...props}\n >\n {icon && <span aria-hidden=\"true\" className=\"ds:shrink-0 ds:size-4\">{icon}</span>}\n {children}\n {badge && <span className=\"ds:shrink-0\">{badge}</span>}\n {dismissible && (\n // Visual-only dismiss indicator — pointer dismiss fires here; keyboard dismiss fires via Delete/Backspace on the trigger above.\n // No role/tabIndex to avoid nested-interactive (interactive content inside <button> is invalid HTML).\n <span\n aria-hidden=\"true\"\n className={cx(\n 'ds:inline-flex ds:items-center ds:justify-center ds:shrink-0',\n 'ds:size-6 ds:rounded-[var(--radius-sm)]',\n 'ds:hover:bg-muted-foreground/20',\n )}\n onPointerDown={(e) => {\n e.stopPropagation();\n e.preventDefault();\n onDismiss?.();\n }}\n >\n <X className=\"ds:size-3.5\" />\n </span>\n )}\n </TabsPrimitive.Trigger>\n );\n },\n);\nTabsTrigger.displayName = 'TabsTrigger';\n\n// ---------------------------------------------------------------------------\n// TabsContent\n// ---------------------------------------------------------------------------\n\nconst TabsContent = forwardRef<HTMLDivElement, TabsContentProps>(\n ({ className, children, ...props }, ref) => (\n <TabsPrimitive.Content\n ref={ref}\n className={cx(\n 'ds:mt-[var(--spacing-sm)] ds:outline-none',\n 'ds:focus-visible:outline-[length:var(--focus-ring-width)] ds:focus-visible:outline-solid',\n 'ds:focus-visible:outline-ring ds:focus-visible:outline-offset-[length:var(--focus-ring-offset)]',\n className,\n )}\n {...props}\n >\n {children}\n </TabsPrimitive.Content>\n ),\n);\nTabsContent.displayName = 'TabsContent';\n\n// ---------------------------------------------------------------------------\n// Compound export\n// ---------------------------------------------------------------------------\n\nexport const Tabs = Object.assign(TabsRoot, {\n Root: TabsRoot,\n List: TabsList,\n Trigger: TabsTrigger,\n Content: TabsContent,\n});\n\nexport { TabsList, TabsTrigger, TabsContent };\n\n","import type { AgentAdapter } from '../../agent/types';\n\nexport const tabsAgent: AgentAdapter<unknown> = {\n id: 'tabs',\n capabilities: ['select_single', 'navigate'],\n state: {},\n actions: {},\n domHooks: {\n root: { attr: 'data-component', value: 'tabs' },\n item: {\n attr: 'data-tab-id',\n description: 'Each Tab.Trigger emits its value as data-tab-id. The agent reads this to identify the active tab via the DOM.',\n },\n },\n};\n"],"names":["tabsListVariants","cva","tabsTriggerVariants","TabsContext","createContext","TabsRoot","forwardRef","variant","size","orientation","overflow","className","children","valueProp","defaultValue","onValueChange","props","ref","rootRef","useRef","composedRef","composeRefs","dir","useDirection","isControlled","internalValue","setInternalValue","useState","value","setValue","useCallback","next","ctxValue","useMemo","jsx","TabsPrimitive","cx","TabsList","ariaLabel","useContext","t","useTranslation","listRef","overflowTabs","setOverflowTabs","isHorizontal","isDropdownOverflow","useEffect","el","detectOverflow","containerRight","hidden","tab","label","_a","ro","combinedRef","node","selectOptions","Children","child","isValidElement","triggerValue","labelChild","jsxs","Select","OverflowMenu","tabs","DropdownMenuPrimitive","ChevronDown","tabLabel","TabsTrigger","variantProp","sizeProp","orientationProp","icon","badge","dismissible","onDismiss","onKeyDown","ctx","handleKeyDown","e","X","TabsContent","Tabs","tabsAgent"],"mappings":"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"}
|