@alfadocs/ui-kit-debug 0.1.9 → 0.2.0
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 +30 -0
- package/dist/_chunks/accordion-DOmxGEWU.js +228 -0
- package/dist/_chunks/accordion-DOmxGEWU.js.map +1 -0
- package/dist/_chunks/{agenda-card-DwLIxgi7.js → agenda-card-CalZqycc.js} +12 -3
- package/dist/_chunks/agenda-card-CalZqycc.js.map +1 -0
- package/dist/_chunks/{agenda-tray-DUvengGQ.js → agenda-tray-3ffFDQZC.js} +54 -51
- package/dist/_chunks/agenda-tray-3ffFDQZC.js.map +1 -0
- package/dist/_chunks/{ai-prompt-input.agent-0NHYLTWD.js → ai-prompt-input-BBiDlEIS.js} +231 -231
- package/dist/_chunks/ai-prompt-input-BBiDlEIS.js.map +1 -0
- package/dist/_chunks/{alert-BlOUMkXj.js → alert-B1sj8Ss0.js} +24 -14
- package/dist/_chunks/alert-B1sj8Ss0.js.map +1 -0
- package/dist/_chunks/{apexcharts-theme-BkSShpEy.js → apexcharts-theme-BJigns_V.js} +7 -2
- package/dist/_chunks/{apexcharts-theme-BkSShpEy.js.map → apexcharts-theme-BJigns_V.js.map} +1 -1
- package/dist/_chunks/{app-frame-6d7Lu4ea.js → app-frame-CDJOgPXe.js} +7 -16
- package/dist/_chunks/app-frame-CDJOgPXe.js.map +1 -0
- package/dist/_chunks/aspect-ratio-DeSNzASA.js.map +1 -1
- package/dist/_chunks/{audio-recorder.agent--VKeykUp.js → audio-recorder-B4U1LuiQ.js} +161 -162
- package/dist/_chunks/audio-recorder-B4U1LuiQ.js.map +1 -0
- package/dist/_chunks/{audio-visualiser-CeMPCZkd.js → audio-visualiser-ByDEFLNm.js} +25 -19
- package/dist/_chunks/audio-visualiser-ByDEFLNm.js.map +1 -0
- package/dist/_chunks/autocomplete-D4oUZbsP.js +466 -0
- package/dist/_chunks/autocomplete-D4oUZbsP.js.map +1 -0
- package/dist/_chunks/avatar-Dcr6XuDQ.js.map +1 -1
- package/dist/_chunks/{badge-mrstWxve.js → badge-DKFbntoa.js} +16 -13
- package/dist/_chunks/badge-DKFbntoa.js.map +1 -0
- package/dist/_chunks/{balance-cell-renderer-5CA7zpAi.js → balance-cell-renderer-B8zgIM-m.js} +63 -44
- package/dist/_chunks/balance-cell-renderer-B8zgIM-m.js.map +1 -0
- package/dist/_chunks/{breadcrumb.agent-GM2hAKFX.js → breadcrumb-D1snXjPb.js} +165 -157
- package/dist/_chunks/breadcrumb-D1snXjPb.js.map +1 -0
- package/dist/_chunks/{button-7mLWcMp_.js → button-DD_0Xdmr.js} +12 -2
- package/dist/_chunks/button-DD_0Xdmr.js.map +1 -0
- package/dist/_chunks/button-group-CONver7M.js.map +1 -1
- package/dist/_chunks/button.agent-BuGZBktn.js.map +1 -1
- package/dist/_chunks/{calendar-nGEgelJs.js → calendar-zy0tUUVG.js} +13 -18
- package/dist/_chunks/calendar-zy0tUUVG.js.map +1 -0
- package/dist/_chunks/{card-BEy58ZKp.js → card-CWzuTLYE.js} +40 -34
- package/dist/_chunks/card-CWzuTLYE.js.map +1 -0
- package/dist/_chunks/{chart.agent-_pRYS17d.js → chart-BLvFl169.js} +147 -131
- package/dist/_chunks/chart-BLvFl169.js.map +1 -0
- package/dist/_chunks/chat-container-ClzsWXp2.js +220 -0
- package/dist/_chunks/chat-container-ClzsWXp2.js.map +1 -0
- package/dist/_chunks/chat-input-DOlsB1fm.js +333 -0
- package/dist/_chunks/chat-input-DOlsB1fm.js.map +1 -0
- package/dist/_chunks/{chat-message-ByouZpPP.js → chat-message-DoAhgUTj.js} +23 -13
- package/dist/_chunks/chat-message-DoAhgUTj.js.map +1 -0
- package/dist/_chunks/checkbox-CtPM6Rup.js.map +1 -1
- package/dist/_chunks/checkbox-group-BTdEB6Yo.js.map +1 -1
- package/dist/_chunks/{collapsible.agent-DkS1jVyn.js → collapsible-CuxUBoHJ.js} +97 -99
- package/dist/_chunks/collapsible-CuxUBoHJ.js.map +1 -0
- package/dist/_chunks/{color-picker-94qcBZqZ.js → color-picker-CTIcHlDF.js} +111 -45
- package/dist/_chunks/color-picker-CTIcHlDF.js.map +1 -0
- package/dist/_chunks/combobox-DCNXqbC7.js +460 -0
- package/dist/_chunks/combobox-DCNXqbC7.js.map +1 -0
- package/dist/_chunks/command-palette-C_vgSgrI.js +441 -0
- package/dist/_chunks/command-palette-C_vgSgrI.js.map +1 -0
- package/dist/_chunks/{date-picker-BqPTn7bO.js → date-picker-B1PO1ZQP.js} +190 -181
- package/dist/_chunks/{date-picker-BqPTn7bO.js.map → date-picker-B1PO1ZQP.js.map} +1 -1
- package/dist/_chunks/{date-range-picker-B2hGsffw.js → date-range-picker-mix2nEVC.js} +21 -8
- package/dist/_chunks/date-range-picker-mix2nEVC.js.map +1 -0
- package/dist/_chunks/{date-time-picker-Bzt0S8yO.js → date-time-picker-Dnong_BY.js} +30 -15
- package/dist/_chunks/date-time-picker-Dnong_BY.js.map +1 -0
- package/dist/_chunks/{description-list-DvJbp6Yg.js → description-list-BYA77Yud.js} +26 -23
- package/dist/_chunks/description-list-BYA77Yud.js.map +1 -0
- package/dist/_chunks/dialog-BPD7wlGE.js +211 -0
- package/dist/_chunks/dialog-BPD7wlGE.js.map +1 -0
- package/dist/_chunks/dropdown-menu-CpiF6CPz.js +300 -0
- package/dist/_chunks/dropdown-menu-CpiF6CPz.js.map +1 -0
- package/dist/_chunks/{empty-state-DQPtRp2b.js → empty-state-3CLJIXSj.js} +132 -101
- package/dist/_chunks/empty-state-3CLJIXSj.js.map +1 -0
- package/dist/_chunks/file-upload-C947ACDK.js +829 -0
- package/dist/_chunks/file-upload-C947ACDK.js.map +1 -0
- package/dist/_chunks/flag-DZ6V7-hU.js.map +1 -1
- package/dist/_chunks/{floating-action-button-Cnw-f6AG.js → floating-action-button-C8OYj8mE.js} +9 -2
- package/dist/_chunks/floating-action-button-C8OYj8mE.js.map +1 -0
- package/dist/_chunks/{form-field-BfsPLTSc.js → form-field-Bmkeh7WY.js} +12 -11
- package/dist/_chunks/form-field-Bmkeh7WY.js.map +1 -0
- package/dist/_chunks/{form-field-context-94LwgYTQ.js → form-field-context-B3APVHKx.js} +4 -2
- package/dist/_chunks/form-field-context-B3APVHKx.js.map +1 -0
- package/dist/_chunks/{freemium-paywall.agent-_nQqLyRF.js → freemium-paywall-CnvceDav.js} +124 -117
- package/dist/_chunks/freemium-paywall-CnvceDav.js.map +1 -0
- package/dist/_chunks/{header-BGn1mRp8.js → header-D0ULgQl3.js} +69 -68
- package/dist/_chunks/header-D0ULgQl3.js.map +1 -0
- package/dist/_chunks/{icon-button-Wnnde5lc.js → icon-button-C4CGcYuz.js} +11 -3
- package/dist/_chunks/icon-button-C4CGcYuz.js.map +1 -0
- package/dist/_chunks/icon-button-group-DeV3FpNY.js.map +1 -1
- package/dist/_chunks/{kbd-8baVw3KU.js → kbd-Cglkd7CY.js} +6 -2
- package/dist/_chunks/kbd-Cglkd7CY.js.map +1 -0
- package/dist/_chunks/{key-value-pair-JRFS9Xrh.js → key-value-pair-CgWvAIGb.js} +2 -2
- package/dist/_chunks/key-value-pair-CgWvAIGb.js.map +1 -0
- package/dist/_chunks/{leo-sidebar-BwINPdix.js → leo-sidebar-CfEY-xi2.js} +16 -20
- package/dist/_chunks/leo-sidebar-CfEY-xi2.js.map +1 -0
- package/dist/_chunks/{link-QheANk74.js → link-8QmFjIz2.js} +2 -5
- package/dist/_chunks/link-8QmFjIz2.js.map +1 -0
- package/dist/_chunks/list-qP6p0NTw.js +434 -0
- package/dist/_chunks/list-qP6p0NTw.js.map +1 -0
- package/dist/_chunks/live-region-C41SO3cA.js.map +1 -1
- package/dist/_chunks/{logo-BpFoCL-s.js → logo-_Z-jLq80.js} +155 -26
- package/dist/_chunks/logo-_Z-jLq80.js.map +1 -0
- package/dist/_chunks/{matrix-rain-BEkvux64.js → matrix-rain-CRPMXcVx.js} +8 -2
- package/dist/_chunks/matrix-rain-CRPMXcVx.js.map +1 -0
- package/dist/_chunks/{message-card-qhoGv947.js → message-card-ChCX9Iv6.js} +63 -60
- package/dist/_chunks/message-card-ChCX9Iv6.js.map +1 -0
- package/dist/_chunks/{message-tray-xHUCra-Y.js → message-tray-n8q9ITXI.js} +71 -76
- package/dist/_chunks/message-tray-n8q9ITXI.js.map +1 -0
- package/dist/_chunks/{multi-select.agent-Do6CeQUT.js → multi-select-wqqrgjUQ.js} +326 -291
- package/dist/_chunks/multi-select-wqqrgjUQ.js.map +1 -0
- package/dist/_chunks/{navigation-menu.agent-D69ND6Qq.js → navigation-menu-ClbHeawy.js} +136 -123
- package/dist/_chunks/navigation-menu-ClbHeawy.js.map +1 -0
- package/dist/_chunks/normalize-diacritics-BNGbFNlJ.js.map +1 -1
- package/dist/_chunks/{notification-card-CsVEYJE-.js → notification-card-hBlPN1-c.js} +3 -3
- package/dist/_chunks/notification-card-hBlPN1-c.js.map +1 -0
- package/dist/_chunks/{notification-tray-DTXMq42J.js → notification-tray-C5cnXbl9.js} +70 -66
- package/dist/_chunks/notification-tray-C5cnXbl9.js.map +1 -0
- package/dist/_chunks/{number-input-fvGmnRy9.js → number-input-Q7wkHnvQ.js} +7 -3
- package/dist/_chunks/number-input-Q7wkHnvQ.js.map +1 -0
- package/dist/_chunks/{otp-input-EglXOUue.js → otp-input-C9gUByF0.js} +6 -3
- package/dist/_chunks/otp-input-C9gUByF0.js.map +1 -0
- package/dist/_chunks/{pagination.agent-BkZQl45y.js → pagination-3AC4zTsi.js} +234 -194
- package/dist/_chunks/pagination-3AC4zTsi.js.map +1 -0
- package/dist/_chunks/{password-input-D6kuYXmr.js → password-input-C4LmjIH1.js} +6 -9
- package/dist/_chunks/password-input-C4LmjIH1.js.map +1 -0
- package/dist/_chunks/{patient-shell-BRmrrUUW.js → patient-shell-BlsEUKWB.js} +10 -15
- package/dist/_chunks/{patient-shell-BRmrrUUW.js.map → patient-shell-BlsEUKWB.js.map} +1 -1
- package/dist/_chunks/{payment-form-BWaXas8z.js → payment-form-C3vT_npe.js} +195 -186
- package/dist/_chunks/payment-form-C3vT_npe.js.map +1 -0
- package/dist/_chunks/{pdf-viewer.agent-BaGEDheA.js → pdf-viewer-CZIfY08H.js} +270 -241
- package/dist/_chunks/pdf-viewer-CZIfY08H.js.map +1 -0
- package/dist/_chunks/{phone-input-C8Op4sEc.js → phone-input-CSHJOJ13.js} +4 -9
- package/dist/_chunks/phone-input-CSHJOJ13.js.map +1 -0
- package/dist/_chunks/popover-DekUKNBk.js +293 -0
- package/dist/_chunks/popover-DekUKNBk.js.map +1 -0
- package/dist/_chunks/{privacy-lock.agent-C1i1-T58.js → privacy-lock-BKsI6ReN.js} +117 -109
- package/dist/_chunks/privacy-lock-BKsI6ReN.js.map +1 -0
- package/dist/_chunks/progress-C11tqhoI.js +298 -0
- package/dist/_chunks/progress-C11tqhoI.js.map +1 -0
- package/dist/_chunks/radio-DvF59ThA.js.map +1 -1
- package/dist/_chunks/radio-group-Cz1a4QCA.js.map +1 -1
- package/dist/_chunks/react-day-picker-C04L_28V.js.map +1 -1
- package/dist/_chunks/{recaptcha-widget.agent-BGHpU5zD.js → recaptcha-widget-NyfOfLII.js} +95 -86
- package/dist/_chunks/recaptcha-widget-NyfOfLII.js.map +1 -0
- package/dist/_chunks/resizable-mpXXyIsN.js +483 -0
- package/dist/_chunks/resizable-mpXXyIsN.js.map +1 -0
- package/dist/_chunks/{rich-text-editor.agent-DnE125Tz.js → rich-text-editor-C7TCIlQO.js} +298 -209
- package/dist/_chunks/rich-text-editor-C7TCIlQO.js.map +1 -0
- package/dist/_chunks/safe-image-src-DstKgCo7.js.map +1 -1
- package/dist/_chunks/{scroll-area-DLr5w9Dd.js → scroll-area-DEDU-lp-.js} +67 -54
- package/dist/_chunks/scroll-area-DEDU-lp-.js.map +1 -0
- package/dist/_chunks/{search-bar.agent-DxFAxctc.js → search-bar-BTDfgYtg.js} +291 -268
- package/dist/_chunks/search-bar-BTDfgYtg.js.map +1 -0
- package/dist/_chunks/{search-input-Xw3cdWXW.js → search-input-CdJIEjFo.js} +116 -107
- package/dist/_chunks/search-input-CdJIEjFo.js.map +1 -0
- package/dist/_chunks/search-input.agent-CfZvViOd.js.map +1 -1
- package/dist/_chunks/{select-DY1Cb2Tg.js → select-y6bXV1f1.js} +84 -83
- package/dist/_chunks/select-y6bXV1f1.js.map +1 -0
- package/dist/_chunks/{separator-B4wXDLNC.js → separator-CYU_bGFn.js} +2 -5
- package/dist/_chunks/separator-CYU_bGFn.js.map +1 -0
- package/dist/_chunks/{sheet-B9kH9pcI.js → sheet-4tgMFwj0.js} +135 -60
- package/dist/_chunks/sheet-4tgMFwj0.js.map +1 -0
- package/dist/_chunks/{sidebar-CHF5xr_P.js → sidebar-Bx3wCDyy.js} +546 -457
- package/dist/_chunks/sidebar-Bx3wCDyy.js.map +1 -0
- package/dist/_chunks/{sign-in-with-alfadocs-button-BN_FPGHT.js → sign-in-with-alfadocs-button-B9UrqOqH.js} +9 -5
- package/dist/_chunks/sign-in-with-alfadocs-button-B9UrqOqH.js.map +1 -0
- package/dist/_chunks/{signature-capture.agent-BpeDwFht.js → signature-capture-DjMlFOzS.js} +210 -212
- package/dist/_chunks/signature-capture-DjMlFOzS.js.map +1 -0
- package/dist/_chunks/{skeleton-dtqyF09N.js → skeleton-CZbwyJAA.js} +9 -3
- package/dist/_chunks/skeleton-CZbwyJAA.js.map +1 -0
- package/dist/_chunks/skip-link-DmZ3c6cb.js.map +1 -1
- package/dist/_chunks/{slider-CcsQTZTA.js → slider-BT2bZWsy.js} +138 -134
- package/dist/_chunks/slider-BT2bZWsy.js.map +1 -0
- package/dist/_chunks/{slot-grid-D_l5VsHG.js → slot-grid-CgpYgBkW.js} +105 -95
- package/dist/_chunks/slot-grid-CgpYgBkW.js.map +1 -0
- package/dist/_chunks/{sparkline.agent-56Sj7nOP.js → sparkline-_gy8aJDG.js} +107 -100
- package/dist/_chunks/sparkline-_gy8aJDG.js.map +1 -0
- package/dist/_chunks/{spinner-GCcv67vh.js → spinner-DLaYfLPl.js} +66 -14
- package/dist/_chunks/spinner-DLaYfLPl.js.map +1 -0
- package/dist/_chunks/{stat-DUB6g90R.js → stat-B9PHSPbN.js} +45 -27
- package/dist/_chunks/stat-B9PHSPbN.js.map +1 -0
- package/dist/_chunks/stepper-accordion.agent-ckKYZCIP.js.map +1 -1
- package/dist/_chunks/{stepper-calendar.agent-9iT3ClIB.js → stepper-calendar-BLOJUE0-.js} +189 -187
- package/dist/_chunks/stepper-calendar-BLOJUE0-.js.map +1 -0
- package/dist/_chunks/stepper-progress-jFY8BSf7.js +208 -0
- package/dist/_chunks/stepper-progress-jFY8BSf7.js.map +1 -0
- package/dist/_chunks/streaming-text-BgjCTVOw.js.map +1 -1
- package/dist/_chunks/{suggestion-chip-DhFrkRPj.js → suggestion-chip-C4Jz0LrM.js} +50 -52
- package/dist/_chunks/suggestion-chip-C4Jz0LrM.js.map +1 -0
- package/dist/_chunks/suggestion-chip.agent-6sNWFj7m.js.map +1 -1
- package/dist/_chunks/{switch-BYEH8I53.js → switch-C0psfIQF.js} +2 -2
- package/dist/_chunks/switch-C0psfIQF.js.map +1 -0
- package/dist/_chunks/{tabs.agent-h7NvsTR1.js → tabs-DaFA3Muo.js} +183 -155
- package/dist/_chunks/tabs-DaFA3Muo.js.map +1 -0
- package/dist/_chunks/{tag-BqidXKo3.js → tag-DuLMjRbF.js} +90 -32
- package/dist/_chunks/tag-DuLMjRbF.js.map +1 -0
- package/dist/_chunks/{task-card-CY5ztNkU.js → task-card-Dw_ZJDL8.js} +5 -2
- package/dist/_chunks/task-card-Dw_ZJDL8.js.map +1 -0
- package/dist/_chunks/{task-tray-CCoUdorl.js → task-tray-XlIW9ueh.js} +50 -49
- package/dist/_chunks/task-tray-XlIW9ueh.js.map +1 -0
- package/dist/_chunks/{text-area-C_M8wliK.js → text-area-CO9Dz0qX.js} +2 -2
- package/dist/_chunks/text-area-CO9Dz0qX.js.map +1 -0
- package/dist/_chunks/{text-input-BX39e6T6.js → text-input-DZwt9L8H.js} +65 -62
- package/dist/_chunks/text-input-DZwt9L8H.js.map +1 -0
- package/dist/_chunks/{theme-root-DDb0TJjd.js → theme-root-CSKD5ZRm.js} +9 -2
- package/dist/_chunks/{theme-root-DDb0TJjd.js.map → theme-root-CSKD5ZRm.js.map} +1 -1
- package/dist/_chunks/{theme-toggle.agent-btmXTWdW.js → theme-toggle-B9zzCnvl.js} +179 -177
- package/dist/_chunks/theme-toggle-B9zzCnvl.js.map +1 -0
- package/dist/_chunks/{time-picker-B8AMIrX7.js → time-picker-DvPUmHH-.js} +95 -93
- package/dist/_chunks/time-picker-DvPUmHH-.js.map +1 -0
- package/dist/_chunks/{timeline.agent-CRPza9wc.js → timeline-BvmnQadS.js} +96 -96
- package/dist/_chunks/timeline-BvmnQadS.js.map +1 -0
- package/dist/_chunks/timestamp-BV2lC-wV.js.map +1 -1
- package/dist/_chunks/{toast.agent-BjEGuq1Z.js → toast.agent-BwKXA0km.js} +46 -8
- package/dist/_chunks/{toast.agent-BjEGuq1Z.js.map → toast.agent-BwKXA0km.js.map} +1 -1
- package/dist/_chunks/{tooth-scheme.agent-CWrQBjJM.js → tooth-scheme-3mITSXiZ.js} +146 -162
- package/dist/_chunks/tooth-scheme-3mITSXiZ.js.map +1 -0
- package/dist/_chunks/{transcript-panel.agent-BXEYP6w-.js → transcript-panel-Bx5ANMsv.js} +110 -101
- package/dist/_chunks/transcript-panel-Bx5ANMsv.js.map +1 -0
- package/dist/_chunks/{typing-indicator-CbUBf-Dx.js → typing-indicator-BZ5jXZPn.js} +27 -5
- package/dist/_chunks/typing-indicator-BZ5jXZPn.js.map +1 -0
- package/dist/_chunks/use-prefers-reduced-motion-BMwIQRjB.js.map +1 -1
- package/dist/_chunks/{use-theme-BMUhembX.js → use-theme-B1cwAXJR.js} +2 -5
- package/dist/_chunks/use-theme-B1cwAXJR.js.map +1 -0
- package/dist/_chunks/{visually-hidden-Bw7vBHLm.js → visually-hidden-BHxEUGyT.js} +11 -2
- package/dist/_chunks/{visually-hidden-Bw7vBHLm.js.map → visually-hidden-BHxEUGyT.js.map} +1 -1
- package/dist/_chunks/{warning-stack-8Pa3pekh.js → warning-stack-VygGHSqC.js} +11 -13
- package/dist/_chunks/warning-stack-VygGHSqC.js.map +1 -0
- package/dist/_chunks/{workflow-map-D2A7rTEG.js → workflow-map-C-nlogPC.js} +430 -452
- package/dist/_chunks/workflow-map-C-nlogPC.js.map +1 -0
- package/dist/agent-catalog.json +580 -15
- package/dist/brand/logo-asset/Alfadocs_Logo_BW.d.ts.map +1 -1
- package/dist/brand/logo-asset/Alfadocs_Logo_Main.d.ts.map +1 -1
- package/dist/brand/logo-asset/Alfadocs_Logo_Mark.d.ts.map +1 -1
- package/dist/brand/logo-asset/Alfadocs_Logo_Neg.d.ts.map +1 -1
- package/dist/brand/logo-asset/Alfadocs_Logo_Purple.d.ts.map +1 -1
- package/dist/components/_shared/date-locale.d.ts.map +1 -1
- package/dist/components/_shared/index.d.ts +2 -2
- package/dist/components/_shared/index.d.ts.map +1 -1
- package/dist/components/_shared/normalize-diacritics.d.ts.map +1 -1
- package/dist/components/_shared/safe-html.d.ts.map +1 -1
- package/dist/components/_shared/safe-image-src.d.ts.map +1 -1
- package/dist/components/_shared/use-focus-trap.d.ts.map +1 -1
- package/dist/components/accordion/accordion.agent.d.ts.map +1 -1
- package/dist/components/accordion/accordion.d.ts.map +1 -1
- package/dist/components/accordion/index.d.ts +1 -1
- package/dist/components/accordion/index.d.ts.map +1 -1
- package/dist/components/accordion/index.js +5 -6
- package/dist/components/accordion/index.js.map +1 -1
- package/dist/components/agenda-card/agenda-card.d.ts.map +1 -1
- package/dist/components/agenda-card/index.js +1 -1
- package/dist/components/agenda-tray/agenda-tray.agent.d.ts.map +1 -1
- package/dist/components/agenda-tray/agenda-tray.d.ts +1 -1
- package/dist/components/agenda-tray/agenda-tray.d.ts.map +1 -1
- package/dist/components/agenda-tray/index.js +1 -1
- package/dist/components/ai-prompt-input/ai-prompt-input.agent.d.ts.map +1 -1
- package/dist/components/ai-prompt-input/ai-prompt-input.d.ts +1 -1
- package/dist/components/ai-prompt-input/ai-prompt-input.d.ts.map +1 -1
- package/dist/components/ai-prompt-input/index.js +1 -1
- package/dist/components/alert/alert.d.ts.map +1 -1
- package/dist/components/alert/index.d.ts +1 -1
- package/dist/components/alert/index.d.ts.map +1 -1
- package/dist/components/alert/index.js +1 -1
- package/dist/components/app-frame/app-frame.d.ts.map +1 -1
- package/dist/components/app-frame/index.js +1 -1
- package/dist/components/aspect-ratio/aspect-ratio.d.ts.map +1 -1
- package/dist/components/audio-recorder/audio-recorder.agent.d.ts.map +1 -1
- package/dist/components/audio-recorder/audio-recorder.d.ts.map +1 -1
- package/dist/components/audio-recorder/index.js +1 -1
- package/dist/components/audio-visualiser/audio-visualiser.d.ts.map +1 -1
- package/dist/components/audio-visualiser/index.js +1 -1
- package/dist/components/autocomplete/autocomplete.agent.d.ts.map +1 -1
- package/dist/components/autocomplete/autocomplete.d.ts.map +1 -1
- package/dist/components/autocomplete/index.js +1 -1
- package/dist/components/avatar/avatar.d.ts.map +1 -1
- package/dist/components/badge/badge.d.ts.map +1 -1
- package/dist/components/badge/index.js +1 -1
- package/dist/components/breadcrumb/breadcrumb.agent.d.ts.map +1 -1
- package/dist/components/breadcrumb/breadcrumb.d.ts +1 -1
- package/dist/components/breadcrumb/breadcrumb.d.ts.map +1 -1
- package/dist/components/breadcrumb/index.js +1 -1
- package/dist/components/button/button.agent.d.ts.map +1 -1
- package/dist/components/button/button.d.ts.map +1 -1
- package/dist/components/button/icon-button.d.ts.map +1 -1
- package/dist/components/button/index.js +2 -2
- package/dist/components/button-group/button-group.d.ts.map +1 -1
- package/dist/components/calendar/calendar.agent.d.ts.map +1 -1
- package/dist/components/calendar/calendar.d.ts.map +1 -1
- package/dist/components/calendar/contrast-warning.d.ts.map +1 -1
- package/dist/components/calendar/index.js +1 -1
- package/dist/components/card/card.d.ts.map +1 -1
- package/dist/components/card/index.js +1 -1
- package/dist/components/chart/chart.agent.d.ts.map +1 -1
- package/dist/components/chart/chart.d.ts.map +1 -1
- package/dist/components/chart/index.d.ts +1 -1
- package/dist/components/chart/index.d.ts.map +1 -1
- package/dist/components/chart/index.js +1 -1
- package/dist/components/chat-container/chat-container.d.ts +1 -1
- package/dist/components/chat-container/chat-container.d.ts.map +1 -1
- package/dist/components/chat-container/index.js +2 -3
- package/dist/components/chat-container/index.js.map +1 -1
- package/dist/components/chat-input/chat-input.d.ts +1 -1
- package/dist/components/chat-input/chat-input.d.ts.map +1 -1
- package/dist/components/chat-input/index.js +3 -4
- package/dist/components/chat-input/index.js.map +1 -1
- package/dist/components/chat-message/chat-message.d.ts.map +1 -1
- package/dist/components/chat-message/index.js +1 -1
- package/dist/components/checkbox/checkbox.d.ts.map +1 -1
- package/dist/components/checkbox-group/checkbox-group.agent.d.ts.map +1 -1
- package/dist/components/checkbox-group/checkbox-group.d.ts.map +1 -1
- package/dist/components/checkbox-group/index.d.ts +1 -1
- package/dist/components/checkbox-group/index.d.ts.map +1 -1
- package/dist/components/collapsible/collapsible.d.ts +1 -1
- package/dist/components/collapsible/collapsible.d.ts.map +1 -1
- package/dist/components/collapsible/index.d.ts +1 -1
- package/dist/components/collapsible/index.d.ts.map +1 -1
- package/dist/components/collapsible/index.js +1 -1
- package/dist/components/color-picker/color-picker.agent.d.ts.map +1 -1
- package/dist/components/color-picker/color-picker.d.ts.map +1 -1
- package/dist/components/color-picker/index.js +1 -1
- package/dist/components/combobox/combobox.agent.d.ts.map +1 -1
- package/dist/components/combobox/combobox.d.ts.map +1 -1
- package/dist/components/combobox/index.d.ts +1 -1
- package/dist/components/combobox/index.d.ts.map +1 -1
- package/dist/components/combobox/index.js +1 -1
- package/dist/components/command-palette/command-palette.d.ts +46 -13
- package/dist/components/command-palette/command-palette.d.ts.map +1 -1
- package/dist/components/command-palette/index.js +1 -1
- package/dist/components/data-table/cell-renderers/actions-cell-renderer.d.ts.map +1 -1
- package/dist/components/data-table/cell-renderers/balance-cell-renderer.d.ts.map +1 -1
- package/dist/components/data-table/cell-renderers/color-dot-cell-renderer.d.ts.map +1 -1
- package/dist/components/data-table/cell-renderers/currency-cell-renderer.d.ts.map +1 -1
- package/dist/components/data-table/cell-renderers/date-cell-renderer.d.ts.map +1 -1
- package/dist/components/data-table/cell-renderers/link-cell-renderer.d.ts.map +1 -1
- package/dist/components/data-table/cell-renderers/toggle-cell-renderer.d.ts.map +1 -1
- package/dist/components/data-table/data-table.agent.d.ts.map +1 -1
- package/dist/components/data-table/data-table.d.ts +3 -1
- package/dist/components/data-table/data-table.d.ts.map +1 -1
- package/dist/components/data-table/index.js +1 -1
- package/dist/components/data-table/toolbar.d.ts +6 -5
- package/dist/components/data-table/toolbar.d.ts.map +1 -1
- package/dist/components/date-picker/date-picker.d.ts +1 -1
- package/dist/components/date-picker/date-picker.d.ts.map +1 -1
- package/dist/components/date-picker/index.d.ts +1 -1
- package/dist/components/date-picker/index.d.ts.map +1 -1
- package/dist/components/date-picker/index.js +1 -1
- package/dist/components/date-range-picker/date-range-picker.agent.d.ts.map +1 -1
- package/dist/components/date-range-picker/date-range-picker.d.ts.map +1 -1
- package/dist/components/date-range-picker/index.js +1 -1
- package/dist/components/date-time-picker/date-time-picker.d.ts.map +1 -1
- package/dist/components/date-time-picker/index.d.ts +1 -1
- package/dist/components/date-time-picker/index.d.ts.map +1 -1
- package/dist/components/date-time-picker/index.js +1 -1
- package/dist/components/description-list/description-list.d.ts +1 -2
- package/dist/components/description-list/description-list.d.ts.map +1 -1
- package/dist/components/description-list/index.js +1 -1
- package/dist/components/dialog/dialog.agent.d.ts.map +1 -1
- package/dist/components/dialog/dialog.d.ts +2 -2
- package/dist/components/dialog/dialog.d.ts.map +1 -1
- package/dist/components/dialog/index.js +1 -1
- package/dist/components/dropdown-menu/dropdown-menu.d.ts +11 -16
- package/dist/components/dropdown-menu/dropdown-menu.d.ts.map +1 -1
- package/dist/components/dropdown-menu/index.js +3 -4
- package/dist/components/dropdown-menu/index.js.map +1 -1
- package/dist/components/empty-state/empty-state.d.ts.map +1 -1
- package/dist/components/empty-state/index.js +1 -1
- package/dist/components/file-upload/file-upload.agent.d.ts.map +1 -1
- package/dist/components/file-upload/file-upload.d.ts.map +1 -1
- package/dist/components/file-upload/index.d.ts +1 -1
- package/dist/components/file-upload/index.d.ts.map +1 -1
- package/dist/components/file-upload/index.js +1 -1
- package/dist/components/flag/flag.d.ts.map +1 -1
- package/dist/components/floating-action-button/floating-action-button.d.ts.map +1 -1
- package/dist/components/floating-action-button/index.js +1 -1
- package/dist/components/form-field/form-field-context.d.ts.map +1 -1
- package/dist/components/form-field/form-field.d.ts.map +1 -1
- package/dist/components/form-field/index.js +2 -2
- package/dist/components/freemium-paywall/freemium-paywall.agent.d.ts.map +1 -1
- package/dist/components/freemium-paywall/freemium-paywall.d.ts +1 -1
- package/dist/components/freemium-paywall/freemium-paywall.d.ts.map +1 -1
- package/dist/components/freemium-paywall/index.js +1 -1
- package/dist/components/header/header.d.ts.map +1 -1
- package/dist/components/header/index.js +1 -1
- package/dist/components/icon-button/index.js +1 -1
- package/dist/components/icon-button-group/icon-button-group.d.ts.map +1 -1
- package/dist/components/kbd/index.js +1 -1
- package/dist/components/kbd/kbd.d.ts.map +1 -1
- package/dist/components/key-value-pair/index.js +1 -1
- package/dist/components/key-value-pair/key-value-pair.d.ts.map +1 -1
- package/dist/components/link/index.js +1 -1
- package/dist/components/link/link.d.ts.map +1 -1
- package/dist/components/list/index.js +1 -1
- package/dist/components/list/list.agent.d.ts.map +1 -1
- package/dist/components/list/list.d.ts.map +1 -1
- package/dist/components/live-region/live-region.d.ts.map +1 -1
- package/dist/components/logo/index.js +1 -1
- package/dist/components/logo/logo.d.ts.map +1 -1
- package/dist/components/matrix-rain/index.js +1 -1
- package/dist/components/matrix-rain/matrix-rain.d.ts.map +1 -1
- package/dist/components/message-card/index.d.ts +1 -1
- package/dist/components/message-card/index.d.ts.map +1 -1
- package/dist/components/message-card/index.js +1 -1
- package/dist/components/message-card/message-card.d.ts.map +1 -1
- package/dist/components/message-tray/index.js +1 -1
- package/dist/components/message-tray/message-tray.agent.d.ts.map +1 -1
- package/dist/components/message-tray/message-tray.d.ts +1 -1
- package/dist/components/message-tray/message-tray.d.ts.map +1 -1
- package/dist/components/multi-select/index.js +1 -1
- package/dist/components/multi-select/multi-select.agent.d.ts.map +1 -1
- package/dist/components/multi-select/multi-select.d.ts.map +1 -1
- package/dist/components/navigation-menu/index.js +1 -1
- package/dist/components/navigation-menu/navigation-menu.agent.d.ts.map +1 -1
- package/dist/components/navigation-menu/navigation-menu.d.ts +1 -1
- package/dist/components/navigation-menu/navigation-menu.d.ts.map +1 -1
- package/dist/components/notification-card/index.d.ts +1 -1
- package/dist/components/notification-card/index.d.ts.map +1 -1
- package/dist/components/notification-card/index.js +1 -1
- package/dist/components/notification-card/notification-card.d.ts.map +1 -1
- package/dist/components/notification-tray/index.js +1 -1
- package/dist/components/notification-tray/notification-tray.agent.d.ts.map +1 -1
- package/dist/components/notification-tray/notification-tray.d.ts +1 -1
- package/dist/components/notification-tray/notification-tray.d.ts.map +1 -1
- package/dist/components/number-input/index.js +1 -1
- package/dist/components/number-input/number-input.d.ts.map +1 -1
- package/dist/components/number-input/use-locale-number.d.ts.map +1 -1
- package/dist/components/otp-input/index.js +1 -1
- package/dist/components/otp-input/otp-input.agent.d.ts.map +1 -1
- package/dist/components/otp-input/otp-input.d.ts.map +1 -1
- package/dist/components/pagination/index.js +1 -1
- package/dist/components/pagination/pagination.d.ts +4 -6
- package/dist/components/pagination/pagination.d.ts.map +1 -1
- package/dist/components/password-input/index.js +1 -1
- package/dist/components/password-input/password-input.agent.d.ts.map +1 -1
- package/dist/components/password-input/password-input.d.ts.map +1 -1
- package/dist/components/payment-form/index.js +7 -8
- package/dist/components/payment-form/index.js.map +1 -1
- package/dist/components/payment-form/payment-form.agent.d.ts.map +1 -1
- package/dist/components/payment-form/payment-form.d.ts +1 -1
- package/dist/components/payment-form/payment-form.d.ts.map +1 -1
- package/dist/components/pdf-viewer/index.js +1 -1
- package/dist/components/pdf-viewer/pdf-viewer.agent.d.ts.map +1 -1
- package/dist/components/pdf-viewer/pdf-viewer.d.ts.map +1 -1
- package/dist/components/phone-input/index.d.ts +1 -1
- package/dist/components/phone-input/index.d.ts.map +1 -1
- package/dist/components/phone-input/index.js +1 -1
- package/dist/components/phone-input/phone-input.agent.d.ts.map +1 -1
- package/dist/components/phone-input/phone-input.d.ts.map +1 -1
- package/dist/components/popover/index.js +3 -4
- package/dist/components/popover/index.js.map +1 -1
- package/dist/components/popover/popover.d.ts.map +1 -1
- package/dist/components/privacy-lock/index.js +1 -1
- package/dist/components/privacy-lock/privacy-lock.d.ts +1 -1
- package/dist/components/privacy-lock/privacy-lock.d.ts.map +1 -1
- package/dist/components/progress/index.js +3 -4
- package/dist/components/progress/index.js.map +1 -1
- package/dist/components/progress/progress.d.ts.map +1 -1
- package/dist/components/radio-group/radio-group.d.ts.map +1 -1
- package/dist/components/radio-group/radio.d.ts.map +1 -1
- package/dist/components/recaptcha-widget/index.js +1 -1
- package/dist/components/recaptcha-widget/recaptcha-widget.agent.d.ts.map +1 -1
- package/dist/components/recaptcha-widget/recaptcha-widget.d.ts.map +1 -1
- package/dist/components/resizable/index.d.ts +1 -1
- package/dist/components/resizable/index.d.ts.map +1 -1
- package/dist/components/resizable/index.js +1 -1
- package/dist/components/resizable/resizable-context.d.ts.map +1 -1
- package/dist/components/resizable/resizable.agent.d.ts.map +1 -1
- package/dist/components/resizable/resizable.d.ts.map +1 -1
- package/dist/components/rich-text-editor/index.js +1 -1
- package/dist/components/rich-text-editor/rich-text-editor.d.ts.map +1 -1
- package/dist/components/scroll-area/index.js +1 -1
- package/dist/components/scroll-area/scroll-area.d.ts.map +1 -1
- package/dist/components/search-bar/index.js +1 -1
- package/dist/components/search-bar/search-bar.agent.d.ts.map +1 -1
- package/dist/components/search-bar/search-bar.d.ts +1 -1
- package/dist/components/search-bar/search-bar.d.ts.map +1 -1
- package/dist/components/search-input/index.js +1 -1
- package/dist/components/search-input/search-input.agent.d.ts.map +1 -1
- package/dist/components/search-input/search-input.d.ts.map +1 -1
- package/dist/components/select/index.js +1 -1
- package/dist/components/select/select.agent.d.ts.map +1 -1
- package/dist/components/select/select.d.ts +1 -1
- package/dist/components/select/select.d.ts.map +1 -1
- package/dist/components/separator/index.js +1 -1
- package/dist/components/separator/separator.d.ts.map +1 -1
- package/dist/components/sheet/index.js +3 -4
- package/dist/components/sheet/index.js.map +1 -1
- package/dist/components/sheet/sheet.agent.d.ts.map +1 -1
- package/dist/components/sheet/sheet.d.ts +2 -2
- package/dist/components/sheet/sheet.d.ts.map +1 -1
- package/dist/components/sidebar/index.js +7 -8
- package/dist/components/sidebar/index.js.map +1 -1
- package/dist/components/sidebar/sidebar.agent.d.ts.map +1 -1
- package/dist/components/sidebar/sidebar.d.ts +0 -2
- package/dist/components/sidebar/sidebar.d.ts.map +1 -1
- package/dist/components/sign-in-with-alfadocs-button/index.js +1 -1
- package/dist/components/sign-in-with-alfadocs-button/sign-in-with-alfadocs-button.d.ts.map +1 -1
- package/dist/components/signature-capture/index.js +1 -1
- package/dist/components/signature-capture/signature-capture.d.ts.map +1 -1
- package/dist/components/skeleton/index.js +1 -1
- package/dist/components/skeleton/skeleton.d.ts.map +1 -1
- package/dist/components/skip-link/skip-link.d.ts.map +1 -1
- package/dist/components/slider/index.js +1 -1
- package/dist/components/slider/slider.agent.d.ts.map +1 -1
- package/dist/components/slider/slider.d.ts.map +1 -1
- package/dist/components/slot-grid/index.js +1 -1
- package/dist/components/slot-grid/slot-grid.d.ts.map +1 -1
- package/dist/components/sparkline/index.js +1 -1
- package/dist/components/sparkline/sparkline.d.ts.map +1 -1
- package/dist/components/sparkline/use-linear-trend.d.ts.map +1 -1
- package/dist/components/spinner/index.js +1 -1
- package/dist/components/spinner/spinner.d.ts.map +1 -1
- package/dist/components/stat/index.js +1 -1
- package/dist/components/stat/stat.d.ts.map +1 -1
- package/dist/components/stepper-accordion/stepper-accordion.agent.d.ts.map +1 -1
- package/dist/components/stepper-accordion/stepper-accordion.d.ts.map +1 -1
- package/dist/components/stepper-calendar/index.js +1 -1
- package/dist/components/stepper-calendar/stepper-calendar.agent.d.ts.map +1 -1
- package/dist/components/stepper-calendar/stepper-calendar.d.ts +1 -1
- package/dist/components/stepper-calendar/stepper-calendar.d.ts.map +1 -1
- package/dist/components/stepper-progress/index.d.ts +1 -1
- package/dist/components/stepper-progress/index.d.ts.map +1 -1
- package/dist/components/stepper-progress/index.js +1 -2
- package/dist/components/stepper-progress/index.js.map +1 -1
- package/dist/components/stepper-progress/stepper-progress.agent.d.ts.map +1 -1
- package/dist/components/stepper-progress/stepper-progress.d.ts +1 -1
- package/dist/components/stepper-progress/stepper-progress.d.ts.map +1 -1
- package/dist/components/streaming-text/streaming-text.d.ts.map +1 -1
- package/dist/components/suggestion-chip/index.js +1 -1
- package/dist/components/suggestion-chip/suggestion-chip.agent.d.ts.map +1 -1
- package/dist/components/suggestion-chip/suggestion-chip.d.ts.map +1 -1
- package/dist/components/switch/index.js +1 -1
- package/dist/components/switch/switch.d.ts.map +1 -1
- package/dist/components/tabs/index.d.ts +1 -1
- package/dist/components/tabs/index.d.ts.map +1 -1
- package/dist/components/tabs/index.js +1 -1
- package/dist/components/tabs/tabs.d.ts.map +1 -1
- package/dist/components/tag/index.js +1 -1
- package/dist/components/tag/tag.d.ts.map +1 -1
- package/dist/components/task-card/index.js +1 -1
- package/dist/components/task-card/task-card.d.ts.map +1 -1
- package/dist/components/task-tray/index.js +1 -1
- package/dist/components/task-tray/task-tray.agent.d.ts.map +1 -1
- package/dist/components/task-tray/task-tray.d.ts +1 -1
- package/dist/components/task-tray/task-tray.d.ts.map +1 -1
- package/dist/components/text-area/index.js +1 -1
- package/dist/components/text-area/text-area.d.ts.map +1 -1
- package/dist/components/text-input/index.js +1 -1
- package/dist/components/text-input/text-input.d.ts.map +1 -1
- package/dist/components/theme-root/index.js +1 -1
- package/dist/components/theme-root/theme-root.d.ts.map +1 -1
- package/dist/components/theme-toggle/index.js +1 -1
- package/dist/components/theme-toggle/theme-toggle.d.ts +1 -1
- package/dist/components/theme-toggle/theme-toggle.d.ts.map +1 -1
- package/dist/components/time-picker/index.js +1 -1
- package/dist/components/time-picker/time-picker.agent.d.ts.map +1 -1
- package/dist/components/time-picker/time-picker.d.ts +1 -1
- package/dist/components/time-picker/time-picker.d.ts.map +1 -1
- package/dist/components/timeline/index.js +1 -1
- package/dist/components/timeline/timeline.agent.d.ts.map +1 -1
- package/dist/components/timeline/timeline.d.ts +1 -1
- package/dist/components/timeline/timeline.d.ts.map +1 -1
- package/dist/components/timestamp/timestamp.d.ts.map +1 -1
- package/dist/components/toast/index.js +1 -1
- package/dist/components/toast/toast.agent.d.ts.map +1 -1
- package/dist/components/toast/toast.d.ts.map +1 -1
- package/dist/components/tooth-scheme/index.js +1 -1
- package/dist/components/tooth-scheme/tooth-data.d.ts.map +1 -1
- package/dist/components/tooth-scheme/tooth-scheme.agent.d.ts.map +1 -1
- package/dist/components/tooth-scheme/tooth-scheme.d.ts +1 -1
- package/dist/components/tooth-scheme/tooth-scheme.d.ts.map +1 -1
- package/dist/components/transcript-panel/index.js +1 -1
- package/dist/components/transcript-panel/transcript-panel.agent.d.ts.map +1 -1
- package/dist/components/transcript-panel/transcript-panel.d.ts +1 -1
- package/dist/components/transcript-panel/transcript-panel.d.ts.map +1 -1
- package/dist/components/typing-indicator/index.js +1 -1
- package/dist/components/typing-indicator/typing-indicator.d.ts.map +1 -1
- package/dist/components/visually-hidden/index.js +1 -1
- package/dist/components/visually-hidden/visually-hidden.d.ts.map +1 -1
- package/dist/components/warning-stack/index.js +1 -1
- package/dist/components/warning-stack/warning-stack.d.ts.map +1 -1
- package/dist/components/workflow/index.js +1 -1
- package/dist/components/workflow/workflow-card.d.ts.map +1 -1
- package/dist/components/workflow/workflow-editor.d.ts +1 -1
- package/dist/components/workflow/workflow-editor.d.ts.map +1 -1
- package/dist/components/workflow/workflow-map.d.ts.map +1 -1
- package/dist/components/workflow/workflow-types.d.ts.map +1 -1
- package/dist/components/workflow/workflow.agent.d.ts.map +1 -1
- package/dist/hooks/index.js +1 -1
- package/dist/hooks/use-prefers-reduced-motion.d.ts.map +1 -1
- package/dist/hooks/use-theme.d.ts.map +1 -1
- package/dist/i18n/config.d.ts.map +1 -1
- package/dist/i18n/config.js.map +1 -1
- package/dist/i18n/resources.d.ts.map +1 -1
- package/dist/index.js +392 -402
- package/dist/index.js.map +1 -1
- package/dist/patterns/leo-assistant/index.js +1 -1
- package/dist/patterns/leo-assistant/leo-chat-surface.d.ts.map +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/patterns/patient-shell/patient-shell.d.ts.map +1 -1
- package/dist/safe-html/index.js +20 -3
- package/dist/safe-html/index.js.map +1 -1
- package/dist/tokens/apexcharts-theme.d.ts.map +1 -1
- package/dist/tokens.css +2 -2
- package/package.json +12 -2
- package/dist/_chunks/accordion-BEnrZmAn.js +0 -120
- package/dist/_chunks/accordion-BEnrZmAn.js.map +0 -1
- package/dist/_chunks/accordion.agent-BTjeO1Sx.js +0 -52
- package/dist/_chunks/accordion.agent-BTjeO1Sx.js.map +0 -1
- package/dist/_chunks/agenda-card-DwLIxgi7.js.map +0 -1
- package/dist/_chunks/agenda-tray-DUvengGQ.js.map +0 -1
- package/dist/_chunks/ai-prompt-input.agent-0NHYLTWD.js.map +0 -1
- package/dist/_chunks/alert-BlOUMkXj.js.map +0 -1
- package/dist/_chunks/app-frame-6d7Lu4ea.js.map +0 -1
- package/dist/_chunks/audio-recorder.agent--VKeykUp.js.map +0 -1
- package/dist/_chunks/audio-visualiser-CeMPCZkd.js.map +0 -1
- package/dist/_chunks/autocomplete.agent-Dh7KioS6.js +0 -432
- package/dist/_chunks/autocomplete.agent-Dh7KioS6.js.map +0 -1
- package/dist/_chunks/badge-mrstWxve.js.map +0 -1
- package/dist/_chunks/balance-cell-renderer-5CA7zpAi.js.map +0 -1
- package/dist/_chunks/breadcrumb.agent-GM2hAKFX.js.map +0 -1
- package/dist/_chunks/button-7mLWcMp_.js.map +0 -1
- package/dist/_chunks/calendar-nGEgelJs.js.map +0 -1
- package/dist/_chunks/card-BEy58ZKp.js.map +0 -1
- package/dist/_chunks/chart.agent-_pRYS17d.js.map +0 -1
- package/dist/_chunks/chat-container-Dl0Kfy5a.js +0 -175
- package/dist/_chunks/chat-container-Dl0Kfy5a.js.map +0 -1
- package/dist/_chunks/chat-container.agent-CM4WModE.js +0 -27
- package/dist/_chunks/chat-container.agent-CM4WModE.js.map +0 -1
- package/dist/_chunks/chat-input-C_tMQv92.js +0 -252
- package/dist/_chunks/chat-input-C_tMQv92.js.map +0 -1
- package/dist/_chunks/chat-input.agent-Bsz3ckGa.js +0 -69
- package/dist/_chunks/chat-input.agent-Bsz3ckGa.js.map +0 -1
- package/dist/_chunks/chat-message-ByouZpPP.js.map +0 -1
- package/dist/_chunks/collapsible.agent-DkS1jVyn.js.map +0 -1
- package/dist/_chunks/color-picker-94qcBZqZ.js.map +0 -1
- package/dist/_chunks/combobox.agent-CAvUkkIe.js +0 -410
- package/dist/_chunks/combobox.agent-CAvUkkIe.js.map +0 -1
- package/dist/_chunks/command-palette.agent-HatEt_EM.js +0 -391
- package/dist/_chunks/command-palette.agent-HatEt_EM.js.map +0 -1
- package/dist/_chunks/date-range-picker-B2hGsffw.js.map +0 -1
- package/dist/_chunks/date-time-picker-Bzt0S8yO.js.map +0 -1
- package/dist/_chunks/description-list-DvJbp6Yg.js.map +0 -1
- package/dist/_chunks/dialog.agent-Daf1TTko.js +0 -179
- package/dist/_chunks/dialog.agent-Daf1TTko.js.map +0 -1
- package/dist/_chunks/dropdown-menu-C7AZipNz.js +0 -219
- package/dist/_chunks/dropdown-menu-C7AZipNz.js.map +0 -1
- package/dist/_chunks/dropdown-menu.agent-BcxIKOjK.js +0 -43
- package/dist/_chunks/dropdown-menu.agent-BcxIKOjK.js.map +0 -1
- package/dist/_chunks/empty-state-DQPtRp2b.js.map +0 -1
- package/dist/_chunks/file-upload.agent-DJaH2dHg.js +0 -681
- package/dist/_chunks/file-upload.agent-DJaH2dHg.js.map +0 -1
- package/dist/_chunks/floating-action-button-Cnw-f6AG.js.map +0 -1
- package/dist/_chunks/form-field-BfsPLTSc.js.map +0 -1
- package/dist/_chunks/form-field-context-94LwgYTQ.js.map +0 -1
- package/dist/_chunks/freemium-paywall.agent-_nQqLyRF.js.map +0 -1
- package/dist/_chunks/header-BGn1mRp8.js.map +0 -1
- package/dist/_chunks/icon-button-Wnnde5lc.js.map +0 -1
- package/dist/_chunks/kbd-8baVw3KU.js.map +0 -1
- package/dist/_chunks/key-value-pair-JRFS9Xrh.js.map +0 -1
- package/dist/_chunks/leo-sidebar-BwINPdix.js.map +0 -1
- package/dist/_chunks/link-QheANk74.js.map +0 -1
- package/dist/_chunks/list.agent-D0iWt4VI.js +0 -420
- package/dist/_chunks/list.agent-D0iWt4VI.js.map +0 -1
- package/dist/_chunks/logo-BpFoCL-s.js.map +0 -1
- package/dist/_chunks/matrix-rain-BEkvux64.js.map +0 -1
- package/dist/_chunks/message-card-qhoGv947.js.map +0 -1
- package/dist/_chunks/message-tray-xHUCra-Y.js.map +0 -1
- package/dist/_chunks/multi-select.agent-Do6CeQUT.js.map +0 -1
- package/dist/_chunks/navigation-menu.agent-D69ND6Qq.js.map +0 -1
- package/dist/_chunks/notification-card-CsVEYJE-.js.map +0 -1
- package/dist/_chunks/notification-tray-DTXMq42J.js.map +0 -1
- package/dist/_chunks/number-input-fvGmnRy9.js.map +0 -1
- package/dist/_chunks/otp-input-EglXOUue.js.map +0 -1
- package/dist/_chunks/pagination.agent-BkZQl45y.js.map +0 -1
- package/dist/_chunks/password-input-D6kuYXmr.js.map +0 -1
- package/dist/_chunks/payment-form-BWaXas8z.js.map +0 -1
- package/dist/_chunks/payment-form.agent-kuIfodCj.js +0 -31
- package/dist/_chunks/payment-form.agent-kuIfodCj.js.map +0 -1
- package/dist/_chunks/pdf-viewer.agent-BaGEDheA.js.map +0 -1
- package/dist/_chunks/phone-input-C8Op4sEc.js.map +0 -1
- package/dist/_chunks/popover-kFN8s84V.js +0 -229
- package/dist/_chunks/popover-kFN8s84V.js.map +0 -1
- package/dist/_chunks/popover.agent-K_d1cfbj.js +0 -39
- package/dist/_chunks/popover.agent-K_d1cfbj.js.map +0 -1
- package/dist/_chunks/privacy-lock.agent-C1i1-T58.js.map +0 -1
- package/dist/_chunks/progress-wNsqkw8I.js +0 -253
- package/dist/_chunks/progress-wNsqkw8I.js.map +0 -1
- package/dist/_chunks/progress.agent-C68rDOXL.js +0 -27
- package/dist/_chunks/progress.agent-C68rDOXL.js.map +0 -1
- package/dist/_chunks/recaptcha-widget.agent-BGHpU5zD.js.map +0 -1
- package/dist/_chunks/resizable.agent-CMwZzvsi.js +0 -456
- package/dist/_chunks/resizable.agent-CMwZzvsi.js.map +0 -1
- package/dist/_chunks/rich-text-editor.agent-DnE125Tz.js.map +0 -1
- package/dist/_chunks/scroll-area-DLr5w9Dd.js.map +0 -1
- package/dist/_chunks/search-bar.agent-DxFAxctc.js.map +0 -1
- package/dist/_chunks/search-input-Xw3cdWXW.js.map +0 -1
- package/dist/_chunks/select-DY1Cb2Tg.js.map +0 -1
- package/dist/_chunks/separator-B4wXDLNC.js.map +0 -1
- package/dist/_chunks/sheet-B9kH9pcI.js.map +0 -1
- package/dist/_chunks/sheet.agent-QAyTOxgk.js +0 -46
- package/dist/_chunks/sheet.agent-QAyTOxgk.js.map +0 -1
- package/dist/_chunks/sidebar-CHF5xr_P.js.map +0 -1
- package/dist/_chunks/sidebar.agent-C9TM_ZDZ.js +0 -49
- package/dist/_chunks/sidebar.agent-C9TM_ZDZ.js.map +0 -1
- package/dist/_chunks/sign-in-with-alfadocs-button-BN_FPGHT.js.map +0 -1
- package/dist/_chunks/signature-capture.agent-BpeDwFht.js.map +0 -1
- package/dist/_chunks/skeleton-dtqyF09N.js.map +0 -1
- package/dist/_chunks/slider-CcsQTZTA.js.map +0 -1
- package/dist/_chunks/slot-grid-D_l5VsHG.js.map +0 -1
- package/dist/_chunks/sparkline.agent-56Sj7nOP.js.map +0 -1
- package/dist/_chunks/spinner-GCcv67vh.js.map +0 -1
- package/dist/_chunks/stat-DUB6g90R.js.map +0 -1
- package/dist/_chunks/stepper-calendar.agent-9iT3ClIB.js.map +0 -1
- package/dist/_chunks/stepper-progress-Bmen-YXB.js +0 -149
- package/dist/_chunks/stepper-progress-Bmen-YXB.js.map +0 -1
- package/dist/_chunks/stepper-progress.agent-q9InWca4.js +0 -61
- package/dist/_chunks/stepper-progress.agent-q9InWca4.js.map +0 -1
- package/dist/_chunks/suggestion-chip-DhFrkRPj.js.map +0 -1
- package/dist/_chunks/switch-BYEH8I53.js.map +0 -1
- package/dist/_chunks/tabs.agent-h7NvsTR1.js.map +0 -1
- package/dist/_chunks/tag-BqidXKo3.js.map +0 -1
- package/dist/_chunks/task-card-CY5ztNkU.js.map +0 -1
- package/dist/_chunks/task-tray-CCoUdorl.js.map +0 -1
- package/dist/_chunks/text-area-C_M8wliK.js.map +0 -1
- package/dist/_chunks/text-input-BX39e6T6.js.map +0 -1
- package/dist/_chunks/theme-toggle.agent-btmXTWdW.js.map +0 -1
- package/dist/_chunks/time-picker-B8AMIrX7.js.map +0 -1
- package/dist/_chunks/timeline.agent-CRPza9wc.js.map +0 -1
- package/dist/_chunks/tooth-scheme.agent-CWrQBjJM.js.map +0 -1
- package/dist/_chunks/transcript-panel.agent-BXEYP6w-.js.map +0 -1
- package/dist/_chunks/typing-indicator-CbUBf-Dx.js.map +0 -1
- package/dist/_chunks/use-theme-BMUhembX.js.map +0 -1
- package/dist/_chunks/warning-stack-8Pa3pekh.js.map +0 -1
- package/dist/_chunks/workflow-map-D2A7rTEG.js.map +0 -1
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"stepper-progress.agent-q9InWca4.js","sources":["../../src/components/stepper-progress/stepper-progress.agent.ts"],"sourcesContent":["/* -------------------------------------------------------------------- */\n/* Agent adapter — StepperProgress. */\n/* */\n/* Pure indicator — the component itself has no internal step-change */\n/* affordance. The adapter exposes the active step + total and forwards */\n/* goto/next/previous to the consumer-supplied onStepChange handler so */\n/* an agent can drive a hosting wizard by step index. */\n/* -------------------------------------------------------------------- */\n\nimport type { AgentAdapter } from '../../agent/types';\nimport type { StepperProgressHandle } from './stepper-progress';\n\nexport const stepperProgressAgent: AgentAdapter<StepperProgressHandle> = {\n id: 'stepper-progress',\n capabilities: ['navigate'],\n state: {\n currentStep: {\n type: 'number',\n descriptionKey: 'ui.agent.stepperProgress.state.currentStep',\n description: 'Zero-indexed active step.',\n read: (handle) => handle.getCurrentStep(),\n },\n totalSteps: {\n type: 'number',\n descriptionKey: 'ui.agent.stepperProgress.state.totalSteps',\n description: 'Total number of steps in the flow.',\n read: (handle) => handle.getTotalSteps(),\n },\n },\n actions: {\n goto_step: {\n safety: 'read',\n argsType: '{ step: number }',\n descriptionKey: 'ui.agent.stepperProgress.actions.gotoStep',\n description: 'Request the host to activate the given step via onStepChange. No-op when no handler is wired.',\n invoke: (handle, args: { step: number }) => {\n handle.gotoStep(args.step);\n },\n },\n next: {\n safety: 'read',\n descriptionKey: 'ui.agent.stepperProgress.actions.next',\n description: 'Request the host to advance one step via onStepChange.',\n invoke: (handle) => {\n handle.next();\n },\n },\n previous: {\n safety: 'read',\n descriptionKey: 'ui.agent.stepperProgress.actions.previous',\n description: 'Request the host to retreat one step via onStepChange.',\n invoke: (handle) => {\n handle.previous();\n },\n },\n },\n domHooks: {\n root: {\n attr: 'data-component',\n value: 'stepper-progress',\n description: 'Marks the StepperProgress root.',\n },\n instanceId: {\n attr: 'data-component-id',\n sourceProp: 'id',\n description: 'Sourced from the id prop.',\n },\n },\n};\n"],"names":["stepperProgressAgent","handle","args"],"mappings":"AAYO,MAAMA,IAA4D;AAAA,EACvE,IAAI;AAAA,EACJ,cAAc,CAAC,UAAU;AAAA,EACzB,OAAO;AAAA,IACL,aAAa;AAAA,MACX,MAAM;AAAA,MACN,gBAAgB;AAAA,MAChB,aAAa;AAAA,MACb,MAAM,CAACC,MAAWA,EAAO,eAAA;AAAA,IAAe;AAAA,IAE1C,YAAY;AAAA,MACV,MAAM;AAAA,MACN,gBAAgB;AAAA,MAChB,aAAa;AAAA,MACb,MAAM,CAACA,MAAWA,EAAO,cAAA;AAAA,IAAc;AAAA,EACzC;AAAA,EAEF,SAAS;AAAA,IACP,WAAW;AAAA,MACT,QAAQ;AAAA,MACR,UAAU;AAAA,MACV,gBAAgB;AAAA,MAChB,aAAa;AAAA,MACb,QAAQ,CAACA,GAAQC,MAA2B;AAC1C,QAAAD,EAAO,SAASC,EAAK,IAAI;AAAA,MAC3B;AAAA,IAAA;AAAA,IAEF,MAAM;AAAA,MACJ,QAAQ;AAAA,MACR,gBAAgB;AAAA,MAChB,aAAa;AAAA,MACb,QAAQ,CAACD,MAAW;AAClB,QAAAA,EAAO,KAAA;AAAA,MACT;AAAA,IAAA;AAAA,IAEF,UAAU;AAAA,MACR,QAAQ;AAAA,MACR,gBAAgB;AAAA,MAChB,aAAa;AAAA,MACb,QAAQ,CAACA,MAAW;AAClB,QAAAA,EAAO,SAAA;AAAA,MACT;AAAA,IAAA;AAAA,EACF;AAAA,EAEF,UAAU;AAAA,IACR,MAAM;AAAA,MACJ,MAAM;AAAA,MACN,OAAO;AAAA,MACP,aAAa;AAAA,IAAA;AAAA,IAEf,YAAY;AAAA,MACV,MAAM;AAAA,MACN,YAAY;AAAA,MACZ,aAAa;AAAA,IAAA;AAAA,EACf;AAEJ;"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"suggestion-chip-DhFrkRPj.js","sources":["../../src/components/suggestion-chip/suggestion-chip.tsx"],"sourcesContent":["import {\n createContext,\n forwardRef,\n useCallback,\n useContext,\n useEffect,\n useId,\n useImperativeHandle,\n useMemo,\n useRef,\n useState,\n type ButtonHTMLAttributes,\n type HTMLAttributes,\n type KeyboardEvent,\n type ReactNode,\n} from 'react';\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport { useTranslation } from 'react-i18next';\n\n/* ------------------------------------------------------------------ */\n/* CVA */\n/* ------------------------------------------------------------------ */\n\nconst chipVariants = cva(\n [\n // `max-w-full` keeps a chip from blowing past its container when the\n // label is long and the container is narrow (e.g. a 22rem Leo sidebar\n // dock). Labels wrap onto multiple lines via `whitespace-normal` +\n // `break-words` so the full text stays legible — rounded pills grow\n // taller rather than hiding content behind an ellipsis.\n 'ds:inline-flex ds:items-center ds:justify-start ds:text-start ds:whitespace-normal ds:break-words ds:max-w-full',\n 'ds:rounded-[var(--radius-full)] ds:border',\n 'ds:min-h-[var(--min-target-size)]',\n 'ds:pt-[var(--spacing-xs)] ds:pb-[var(--spacing-xs)]',\n 'type-label',\n 'ds:transition-colors ds:duration-[var(--animation-duration)] ds:motion-reduce:transition-none',\n 'ds:focus-visible:outline-[length:var(--focus-ring-width)] ds:focus-visible:outline-solid',\n 'ds:focus-visible:outline-[color:var(--ring)] ds:focus-visible:outline-offset-[length:var(--focus-ring-offset)]',\n 'ds:disabled:cursor-not-allowed ds:disabled:opacity-50',\n 'ds:forced-colors:border-[ButtonText] ds:forced-colors:text-[ButtonText]',\n ].join(' '),\n {\n variants: {\n intent: {\n default:\n 'ds:bg-muted/20 ds:text-foreground ds:border-transparent ds:hover:bg-accent/10',\n suggestion:\n 'ds:bg-[color:var(--primary)]/10 ds:text-foreground ds:border-transparent ds:hover:bg-[color:var(--primary)]/15',\n followup:\n 'ds:bg-muted/30 ds:text-foreground ds:border-transparent ds:hover:bg-muted/40',\n },\n // Weight, family, tracking, line-height all come from `.type-label` on the base.\n // Size variants override --type-label-size to shift the ramp step.\n size: {\n sm: 'ds:ps-[var(--spacing-sm)] ds:pe-[var(--spacing-sm)] ds:[--type-label-size:var(--font-size-xs)]',\n md: 'ds:ps-[var(--spacing-md)] ds:pe-[var(--spacing-md)]',\n lg: 'ds:ps-[var(--spacing-lg)] ds:pe-[var(--spacing-lg)] ds:[--type-label-size:var(--font-size-base)]',\n },\n },\n defaultVariants: { intent: 'default', size: 'md' },\n },\n);\n\n/* ------------------------------------------------------------------ */\n/* Group context — roving tabIndex */\n/* ------------------------------------------------------------------ */\n\ninterface ChipGroupCtxValue {\n register: (id: string) => void;\n unregister: (id: string) => void;\n focusedId: string | null;\n setFocus: (id: string) => void;\n onArrowMove: (\n id: string,\n direction: 'prev' | 'next' | 'first' | 'last',\n ) => void;\n isRTL: boolean;\n}\n\nconst ChipGroupCtx = createContext<ChipGroupCtxValue | null>(null);\n\n/* ------------------------------------------------------------------ */\n/* SuggestionChipGroup */\n/* ------------------------------------------------------------------ */\n\nexport interface SuggestionChipGroupProps\n extends Omit<HTMLAttributes<HTMLDivElement>, 'role' | 'aria-label'> {\n /** Override the default group label (ui.chat.suggestions). */\n label?: string;\n}\n\nexport const SuggestionChipGroup = forwardRef<HTMLDivElement, SuggestionChipGroupProps>(\n ({ label, className, children, ...rest }, ref) => {\n const { t, i18n } = useTranslation();\n const isRTL = i18n.dir() === 'rtl';\n const [order, setOrder] = useState<string[]>([]);\n const [focusedId, setFocusedId] = useState<string | null>(null);\n const nodeMap = useRef<Map<string, HTMLButtonElement>>(new Map());\n\n const register = useCallback((id: string) => {\n setOrder((prev) => (prev.includes(id) ? prev : [...prev, id]));\n }, []);\n const unregister = useCallback((id: string) => {\n setOrder((prev) => prev.filter((x) => x !== id));\n nodeMap.current.delete(id);\n }, []);\n\n const setFocus = useCallback((id: string) => setFocusedId(id), []);\n\n useEffect(() => {\n // Ensure focusedId stays valid — default to first registered.\n if (!focusedId && order.length > 0) setFocusedId(order[0]);\n if (focusedId && !order.includes(focusedId)) {\n setFocusedId(order[0] ?? null);\n }\n }, [focusedId, order]);\n\n const onArrowMove: ChipGroupCtxValue['onArrowMove'] = useCallback(\n (id, direction) => {\n const idx = order.indexOf(id);\n if (idx === -1) return;\n let next = idx;\n if (direction === 'next') next = (idx + 1) % order.length;\n if (direction === 'prev') next = (idx - 1 + order.length) % order.length;\n if (direction === 'first') next = 0;\n if (direction === 'last') next = order.length - 1;\n const nextId = order[next];\n setFocusedId(nextId);\n const el = nodeMap.current.get(nextId);\n el?.focus();\n },\n [order],\n );\n\n // Wrapped in useCallback so the context value reference is stable across\n // renders — otherwise every chip re-runs its ref-registering effect on\n // every focus change.\n const registerNode = useCallback(\n (id: string, el: HTMLButtonElement | null) => {\n if (el) nodeMap.current.set(id, el);\n else nodeMap.current.delete(id);\n },\n [],\n );\n\n // Memoise the context value so child chips don't see a new `group`\n // reference on every render — otherwise their register/unregister\n // effect re-runs each render, driving setOrder in the parent and\n // producing an infinite render loop.\n const ctxValue = useMemo(\n () => ({ register, unregister, focusedId, setFocus, onArrowMove, isRTL }),\n [register, unregister, focusedId, setFocus, onArrowMove, isRTL],\n );\n\n return (\n <ChipGroupCtxNodeContext.Provider value={registerNode}>\n <ChipGroupCtx.Provider value={ctxValue}>\n <div\n ref={ref}\n role=\"group\"\n aria-label={label ?? t('chat.suggestions')}\n className={[\n 'ds:flex ds:flex-wrap ds:items-center',\n 'ds:gap-y-[var(--spacing-xs)] ds:gap-x-[var(--spacing-sm)]',\n className,\n ]\n .filter(Boolean)\n .join(' ')}\n {...rest}\n >\n {children}\n </div>\n </ChipGroupCtx.Provider>\n </ChipGroupCtxNodeContext.Provider>\n );\n },\n);\n\nSuggestionChipGroup.displayName = 'SuggestionChipGroup';\n\n// Separate context to register the DOM node from the chip without tripping\n// eslint `react-hooks/exhaustive-deps`.\nconst ChipGroupCtxNodeContext = createContext<\n ((id: string, el: HTMLButtonElement | null) => void) | null\n>(null);\n\n/* ------------------------------------------------------------------ */\n/* SuggestionChip */\n/* ------------------------------------------------------------------ */\n\ntype NativeButtonProps = Omit<\n ButtonHTMLAttributes<HTMLButtonElement>,\n 'onSelect' | 'children'\n>;\n\n/** Curated imperative handle for agent / external automation. */\nexport interface SuggestionChipHandle {\n getValue: () => string;\n select: () => void;\n dismiss: () => void;\n}\n\nexport interface SuggestionChipProps\n extends NativeButtonProps,\n VariantProps<typeof chipVariants> {\n /** Value emitted on activation. Falls back to children when a string. */\n value?: string;\n startIcon?: ReactNode;\n children: ReactNode;\n /** Activation handler. */\n onSelect?: (value: string) => void;\n /** When provided, parent owns removal. Otherwise the chip manages its own\n * `removed` state and unmounts after selection. */\n onRemove?: () => void;\n /** Opt out of self-removal — useful inside controlled lists. */\n keepOnSelect?: boolean;\n}\n\nexport const SuggestionChip = forwardRef<SuggestionChipHandle, SuggestionChipProps>(\n (\n {\n intent = 'default',\n size = 'md',\n value,\n startIcon,\n children,\n onSelect,\n onRemove,\n keepOnSelect = false,\n className,\n disabled,\n onKeyDown,\n onFocus,\n onClick,\n ...rest\n },\n ref,\n ) => {\n const id = useId();\n const group = useContext(ChipGroupCtx);\n const registerNode = useContext(ChipGroupCtxNodeContext);\n const [removed, setRemoved] = useState(false);\n const localRef = useRef<HTMLButtonElement | null>(null);\n\n const setRef = (node: HTMLButtonElement | null) => {\n localRef.current = node;\n registerNode?.(id, node);\n };\n\n // Keep register/unregister in a ref so the effect runs only on\n // mount / unmount. Depending on `group` directly would re-fire the\n // effect on every parent render (focusedId changes invalidate the\n // group context value), which in turn mutates the parent's `order`\n // state and loops.\n const groupRef = useRef(group);\n groupRef.current = group;\n\n useEffect(() => {\n const g = groupRef.current;\n if (!g) return;\n g.register(id);\n return () => g.unregister(id);\n }, [id]);\n\n if (removed) return null;\n\n const isFocused = group ? group.focusedId === id : true;\n const tabIndex = group ? (isFocused ? 0 : -1) : 0;\n\n const resolvedValue =\n typeof value === 'string'\n ? value\n : typeof children === 'string'\n ? children\n : '';\n\n const performSelect = useCallback(() => {\n onSelect?.(resolvedValue);\n if (onRemove) onRemove();\n else if (!keepOnSelect) setRemoved(true);\n }, [onSelect, resolvedValue, onRemove, keepOnSelect]);\n\n const performDismiss = useCallback(() => {\n if (onRemove) onRemove();\n else setRemoved(true);\n }, [onRemove]);\n\n useImperativeHandle(\n ref,\n () => ({\n getValue: () => resolvedValue,\n select: performSelect,\n dismiss: performDismiss,\n }),\n [resolvedValue, performSelect, performDismiss],\n );\n\n const handleClick: NonNullable<NativeButtonProps['onClick']> = (e) => {\n onClick?.(e);\n performSelect();\n };\n\n const handleKeyDown: NonNullable<NativeButtonProps['onKeyDown']> = (e) => {\n onKeyDown?.(e);\n if (!group) return;\n // Arrow navigation inside a group — RTL inverts Left/Right.\n const nextKey = group.isRTL ? 'ArrowLeft' : 'ArrowRight';\n const prevKey = group.isRTL ? 'ArrowRight' : 'ArrowLeft';\n if (e.key === nextKey || e.key === 'ArrowDown') {\n e.preventDefault();\n group.onArrowMove(id, 'next');\n } else if (e.key === prevKey || e.key === 'ArrowUp') {\n e.preventDefault();\n group.onArrowMove(id, 'prev');\n } else if (e.key === 'Home') {\n e.preventDefault();\n group.onArrowMove(id, 'first');\n } else if (e.key === 'End') {\n e.preventDefault();\n group.onArrowMove(id, 'last');\n }\n };\n\n const handleFocus: NonNullable<NativeButtonProps['onFocus']> = (e) => {\n onFocus?.(e);\n if (group && !isFocused) group.setFocus(id);\n };\n\n return (\n <button\n ref={setRef}\n type=\"button\"\n tabIndex={tabIndex}\n disabled={disabled}\n onClick={disabled ? undefined : handleClick}\n onKeyDown={handleKeyDown as unknown as (e: KeyboardEvent<HTMLButtonElement>) => void}\n onFocus={handleFocus}\n data-component=\"suggestion-chip\"\n data-component-id={rest.id}\n className={chipVariants({ intent, size, className })}\n {...rest}\n >\n {startIcon ? (\n <span\n aria-hidden=\"true\"\n className=\"ds:me-[var(--spacing-xs)] ds:inline-flex ds:items-center ds:[&>svg]:size-4\"\n >\n {startIcon}\n </span>\n ) : null}\n <span>{children}</span>\n </button>\n );\n },\n);\n\nSuggestionChip.displayName = 'SuggestionChip';\n"],"names":["chipVariants","cva","ChipGroupCtx","createContext","SuggestionChipGroup","forwardRef","label","className","children","rest","ref","t","i18n","useTranslation","isRTL","order","setOrder","useState","focusedId","setFocusedId","nodeMap","useRef","register","useCallback","id","prev","unregister","x","setFocus","useEffect","onArrowMove","direction","idx","next","nextId","el","registerNode","ctxValue","useMemo","jsx","ChipGroupCtxNodeContext","SuggestionChip","intent","size","value","startIcon","onSelect","onRemove","keepOnSelect","disabled","onKeyDown","onFocus","onClick","useId","group","useContext","removed","setRemoved","localRef","setRef","node","groupRef","g","isFocused","tabIndex","resolvedValue","performSelect","performDismiss","useImperativeHandle","jsxs","e","nextKey","prevKey"],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"switch-BYEH8I53.js","sources":["../../src/components/switch/switch.agent.ts","../../src/components/switch/switch.tsx"],"sourcesContent":["/* -------------------------------------------------------------------- */\n/* Agent adapter — Switch. */\n/* */\n/* See `src/docs/26-agent-readiness.mdx` for the contract. */\n/* -------------------------------------------------------------------- */\n\nimport type { AgentAdapter } from '../../agent/types';\nimport type { SwitchHandle } from './switch';\n\nexport const switchAgent: AgentAdapter<SwitchHandle> = {\n id: 'switch',\n capabilities: ['select_single'],\n state: {\n checked: {\n type: 'boolean',\n descriptionKey: 'ui.agent.switch.state.checked',\n description: 'Whether the switch is on.',\n read: (handle) => handle.getChecked(),\n },\n },\n actions: {\n set_checked: {\n safety: 'write',\n argsType: '{ checked: boolean }',\n descriptionKey: 'ui.agent.switch.actions.setChecked',\n description: 'Set the on/off state to a specific value.',\n invoke: (handle, args: { checked: boolean }) => {\n handle.setChecked(args.checked);\n },\n },\n toggle: {\n safety: 'write',\n descriptionKey: 'ui.agent.switch.actions.toggle',\n description: 'Flip the on/off state.',\n invoke: (handle) => {\n handle.toggle();\n },\n },\n },\n domHooks: {\n root: {\n attr: 'data-component',\n value: 'switch',\n description: 'Marks the Switch root.',\n },\n instanceId: {\n attr: 'data-component-id',\n sourceProp: 'id',\n description: 'Sourced from the id prop.',\n },\n },\n};\n","import {\n forwardRef,\n useContext,\n useMemo,\n useRef,\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';\nimport { useAgentRegistration } from '../../agent';\nimport { switchAgent } from './switch.agent';\n\n/** Agent-readiness curated handle for Switch. */\nexport interface SwitchHandle {\n getChecked: () => boolean;\n setChecked: (checked: boolean) => void;\n toggle: () => void;\n}\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 checkedRef = useRef<boolean>(currentChecked);\n checkedRef.current = currentChecked;\n\n const agentHandle = useMemo<SwitchHandle>(\n () => ({\n getChecked: () => checkedRef.current,\n setChecked: (next) => handleCheckedChange(next),\n toggle: () => handleCheckedChange(!checkedRef.current),\n }),\n // handleCheckedChange closes over isControlled / onCheckedChange and is\n // recreated each render; we accept the re-registration cost.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [],\n );\n useAgentRegistration(switchAgent, agentHandle, id);\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 data-component-id={id}\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":["switchAgent","handle","args","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","checkedRef","useRef","agentHandle","useMemo","useAgentRegistration","stateText","jsx","RadixSwitch"],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"tabs.agent-h7NvsTR1.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\n// Curated agent-readiness handle — see tabs.agent.ts.\nexport interface TabsHandle {\n getActiveTab: () => string | null;\n selectTab: (value: string) => void;\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 id,\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 id={id}\n data-component=\"tabs\"\n data-component-id={id}\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';\nimport type { TabsHandle } from './tabs';\n\nexport const tabsAgent: AgentAdapter<TabsHandle> = {\n id: 'tabs',\n capabilities: ['select_single', 'navigate'],\n state: {\n activeTab: {\n type: 'string | null',\n description: 'Value of the currently-active tab.',\n read: (handle) => handle.getActiveTab(),\n },\n },\n actions: {\n select_tab: {\n safety: 'read',\n argsType: '{ value: string }',\n description: 'Activate the tab with the given value.',\n invoke: (handle, args: { value: string }) => {\n handle.selectTab(args.value);\n },\n },\n },\n domHooks: {\n root: { attr: 'data-component', value: 'tabs' },\n instanceId: {\n attr: 'data-component-id',\n sourceProp: 'id',\n description: 'Sourced from the id prop on Tabs.Root.',\n },\n item: {\n attr: 'data-tab-id',\n description: 'Each Tab.Trigger emits its value as data-tab-id.',\n },\n },\n};\n"],"names":["tabsListVariants","cva","tabsTriggerVariants","TabsContext","createContext","TabsRoot","forwardRef","variant","size","orientation","overflow","className","children","valueProp","defaultValue","onValueChange","id","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","handle","args"],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"tag-BqidXKo3.js","sources":["../../src/components/tag/tag.tsx"],"sourcesContent":["import {\n forwardRef,\n useRef,\n useState,\n useEffect,\n type ReactNode,\n} from 'react';\nimport { cva } from 'class-variance-authority';\nimport { useTranslation } from 'react-i18next';\nimport { X } from 'lucide-react';\nimport { Tooltip } from '../tooltip';\n\n/* ------------------------------------------------------------------ */\n/* CVA — tag pill */\n/* ------------------------------------------------------------------ */\n\nconst tagVariants = cva(\n [\n 'ds:inline-flex ds:items-center ds:gap-[var(--spacing-xs)]',\n 'ds:rounded-[var(--radius-full)]',\n 'type-eyebrow ds:whitespace-nowrap',\n 'ds:transition-colors ds:duration-[var(--animation-duration)] ds:motion-reduce:transition-none',\n 'ds:focus-visible:outline-[length:var(--focus-ring-width)] ds:focus-visible:outline-solid',\n 'ds:focus-visible:outline-[color:var(--ring)] ds:focus-visible:outline-offset-[length:var(--focus-ring-offset)]',\n 'ds:aria-disabled:cursor-not-allowed ds:aria-disabled:opacity-50',\n 'ds:disabled:cursor-not-allowed ds:disabled:opacity-50',\n ].join(' '),\n {\n variants: {\n variant: {\n neutral: '',\n info: '',\n success: '',\n warning: '',\n error: '',\n brand: '',\n },\n fill: {\n solid: '',\n outline: 'ds:border ds:bg-transparent',\n },\n size: {\n // Symmetric start/end padding — close button uses negative margin to stay flush.\n // Size is the only eyebrow-role axis that varies per Tag size; weight, transform,\n // tracking, line-height, and features all come from `.type-eyebrow` on the base.\n sm: 'ds:h-[calc(var(--spacing)*4)] ds:ps-[var(--spacing-xs)] ds:pe-[var(--spacing-xs)] ds:[--type-eyebrow-size:var(--font-size-2xs)]',\n md: 'ds:h-[calc(var(--spacing)*5)] ds:ps-[var(--spacing-sm)] ds:pe-[var(--spacing-sm)] ds:[--type-eyebrow-size:var(--font-size-2xs)]',\n lg: 'ds:h-[calc(var(--spacing)*6)] ds:ps-[var(--spacing-sm)] ds:pe-[var(--spacing-sm)] ds:[--type-eyebrow-size:var(--font-size-xs)]',\n },\n },\n compoundVariants: [\n // Solid fills — foreground tokens adapt per theme\n { fill: 'solid', variant: 'neutral', className: 'ds:bg-muted/20 ds:text-muted-foreground' },\n { fill: 'solid', variant: 'info', className: 'ds:bg-info ds:text-[color:var(--info-solid-foreground)]' },\n { fill: 'solid', variant: 'success', className: 'ds:bg-success ds:text-[color:var(--success-solid-foreground)]' },\n { fill: 'solid', variant: 'warning', className: 'ds:bg-warning ds:text-foreground' },\n { fill: 'solid', variant: 'error', className: 'ds:bg-destructive ds:text-destructive-foreground' },\n { fill: 'solid', variant: 'brand', className: 'ds:bg-primary ds:text-primary-foreground' },\n // Outline fills\n { fill: 'outline', variant: 'neutral', className: 'ds:border-muted ds:text-muted-foreground' },\n { fill: 'outline', variant: 'info', className: 'ds:border-info ds:text-[var(--info-foreground)]' },\n { fill: 'outline', variant: 'success', className: 'ds:border-success ds:text-[var(--success-foreground)]' },\n { fill: 'outline', variant: 'warning', className: 'ds:border-warning ds:text-[var(--warning-foreground)]' },\n { fill: 'outline', variant: 'error', className: 'ds:border-destructive ds:text-[var(--error-foreground)]' },\n { fill: 'outline', variant: 'brand', className: 'ds:border-primary ds:text-primary' },\n ],\n defaultVariants: {\n variant: 'neutral',\n fill: 'solid',\n size: 'md',\n },\n },\n);\n\n/* ------------------------------------------------------------------ */\n/* CVA — close button */\n/* ------------------------------------------------------------------ */\n\nconst closeButtonVariants = cva(\n [\n 'ds:inline-flex ds:items-center ds:justify-center ds:shrink-0 ds:rounded-full',\n // Negative end margin keeps the button flush with the pill edge\n 'ds:-me-[var(--spacing-xs)]',\n 'ds:hover:bg-foreground/10',\n 'ds:transition-colors ds:duration-[var(--animation-duration)] ds:motion-reduce:transition-none',\n 'ds:focus-visible:outline-[length:var(--focus-ring-width)] ds:focus-visible:outline-solid',\n 'ds:focus-visible:outline-[color:var(--ring)] ds:focus-visible:outline-offset-[length:var(--focus-ring-offset)]',\n 'ds:disabled:cursor-not-allowed ds:disabled:opacity-50',\n ].join(' '),\n {\n variants: {\n size: {\n sm: 'ds:p-1 ds:[&>svg]:size-3',\n md: 'ds:p-1 ds:[&>svg]:size-3.5',\n lg: 'ds:p-1.5 ds:[&>svg]:size-4',\n },\n },\n defaultVariants: { size: 'md' },\n },\n);\n\n/* ------------------------------------------------------------------ */\n/* TagProps */\n/* ------------------------------------------------------------------ */\n\nexport interface TagProps {\n /** The visible label text */\n label: string;\n /** Semantic colour variant */\n variant?: 'neutral' | 'info' | 'success' | 'warning' | 'error' | 'brand';\n /** Visual fill style */\n fill?: 'solid' | 'outline';\n /** Size */\n size?: 'sm' | 'md' | 'lg';\n /** Leading slot — icon element or dot */\n leading?: ReactNode;\n /** Called when the tag is removed (enables close button + Backspace/Delete) */\n onRemove?: () => void;\n /** Called when the tag is clicked (non-removable interactive tag) */\n onClick?: () => void;\n /** Disabled state */\n disabled?: boolean;\n /** Max inline size before truncation with tooltip — default 'none' */\n maxInlineSize?: string | 'none';\n /** Additional class names */\n className?: string;\n}\n\n/* ------------------------------------------------------------------ */\n/* Tag */\n/* ------------------------------------------------------------------ */\n\nexport const Tag = forwardRef<HTMLElement, TagProps>(\n (\n {\n label,\n variant = 'neutral',\n fill = 'solid',\n size = 'md',\n leading,\n onRemove,\n onClick,\n disabled = false,\n maxInlineSize = 'none',\n className,\n },\n ref,\n ) => {\n const { t } = useTranslation();\n const labelRef = useRef<HTMLSpanElement>(null);\n const [isOverflowing, setIsOverflowing] = useState(false);\n const [announcement, setAnnouncement] = useState('');\n\n useEffect(() => {\n const el = labelRef.current;\n if (!el || maxInlineSize === 'none') return;\n\n const check = () => setIsOverflowing(el.scrollWidth > el.clientWidth);\n const observer = new ResizeObserver(check);\n observer.observe(el);\n check();\n return () => observer.disconnect();\n }, [maxInlineSize]);\n\n const handleKeyDown = (e: React.KeyboardEvent) => {\n if ((e.key === 'Backspace' || e.key === 'Delete') && onRemove && !disabled) {\n e.preventDefault();\n announce();\n // Delay gives the live region one render cycle before unmount\n setTimeout(onRemove, 100);\n }\n };\n\n const announce = () => {\n setAnnouncement(t('ui.tag.removed', { label }));\n };\n\n const handleRemove = () => {\n if (!disabled && onRemove) {\n announce();\n setTimeout(onRemove, 100);\n }\n };\n\n const isRemovable = !!onRemove;\n const isClickable = !!onClick && !isRemovable;\n\n const rootClasses = tagVariants({\n variant,\n fill,\n size,\n className: [\n isClickable && !disabled ? 'ds:hover:brightness-90 ds:cursor-pointer' : '',\n className ?? '',\n ]\n .filter(Boolean)\n .join(' '),\n });\n\n const leadingEl = leading ? (\n <span aria-hidden=\"true\" className=\"ds:shrink-0 ds:inline-flex ds:items-center ds:[&>svg]:size-3.5\">\n {leading}\n </span>\n ) : null;\n\n // Consumer-controlled layout constraint — not a design token.\n // maxInlineSize is an arbitrary caller-supplied value that cannot be expressed\n // as a static Tailwind class; the style prop is the only cross-browser option.\n const labelEl = (\n <span\n ref={labelRef}\n className={\n maxInlineSize !== 'none'\n ? 'ds:overflow-hidden ds:text-ellipsis ds:whitespace-nowrap'\n : undefined\n }\n // eslint-disable-next-line react/forbid-component-props\n style={maxInlineSize !== 'none' ? { maxInlineSize } : undefined}\n >\n {label}\n </span>\n );\n\n // Live region — only for removable tags; must be a sibling outside the button.\n const liveRegion = (\n <span role=\"status\" aria-live=\"polite\" className=\"ds:sr-only\">\n {announcement}\n </span>\n );\n\n const closeButton = isRemovable ? (\n <button\n type=\"button\"\n aria-label={t('ui.tag.remove', { label })}\n onClick={handleRemove}\n disabled={disabled}\n // Intentionally excluded from tab order: Backspace/Delete on the focused\n // group element provides the same keyboard action.\n tabIndex={-1}\n className={closeButtonVariants({ size })}\n >\n <X aria-hidden=\"true\" />\n </button>\n ) : null;\n\n const shouldWrapTooltip = maxInlineSize !== 'none' && isOverflowing;\n\n // Clickable tag — renders as <button>; live region is a sibling, not inside button\n if (isClickable) {\n const tagEl = (\n <button\n ref={ref as React.Ref<HTMLButtonElement>}\n type=\"button\"\n onClick={!disabled ? onClick : undefined}\n disabled={disabled}\n data-component=\"tag\"\n className={rootClasses}\n >\n {leadingEl}\n {labelEl}\n </button>\n );\n return shouldWrapTooltip ? <Tooltip label={label}>{tagEl}</Tooltip> : tagEl;\n }\n\n // Removable tag — focusable <span> with embedded close button\n if (isRemovable) {\n const tagEl = (\n <span\n ref={ref as React.Ref<HTMLSpanElement>}\n role=\"group\"\n aria-label={label}\n tabIndex={disabled ? -1 : 0}\n aria-disabled={disabled || undefined}\n onKeyDown={handleKeyDown}\n data-component=\"tag\"\n className={rootClasses}\n >\n {liveRegion}\n {leadingEl}\n {labelEl}\n {closeButton}\n </span>\n );\n return shouldWrapTooltip ? <Tooltip label={label}>{tagEl}</Tooltip> : tagEl;\n }\n\n // Decorative tag — plain <span>, no interactive role\n const tagEl = (\n <span\n ref={ref as React.Ref<HTMLSpanElement>}\n data-component=\"tag\"\n className={tagVariants({ variant, fill, size, className })}\n >\n {leadingEl}\n {labelEl}\n </span>\n );\n return shouldWrapTooltip ? <Tooltip label={label}>{tagEl}</Tooltip> : tagEl;\n },\n);\n\nTag.displayName = 'Tag';\n"],"names":["tagVariants","cva","closeButtonVariants","Tag","forwardRef","label","variant","fill","size","leading","onRemove","onClick","disabled","maxInlineSize","className","ref","t","useTranslation","labelRef","useRef","isOverflowing","setIsOverflowing","useState","announcement","setAnnouncement","useEffect","el","check","observer","handleKeyDown","e","announce","handleRemove","isRemovable","isClickable","rootClasses","leadingEl","jsx","labelEl","liveRegion","closeButton","X","shouldWrapTooltip","tagEl","jsxs","Tooltip"],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"task-card-CY5ztNkU.js","sources":["../../src/components/task-card/task-card.tsx"],"sourcesContent":["import {\n forwardRef,\n type HTMLAttributes,\n type ReactNode,\n} from 'react';\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport { useTranslation } from 'react-i18next';\nimport { CheckSquare, Square, AlertCircle, ChevronRight } from 'lucide-react';\n\n/* ------------------------------------------------------------------ */\n/* Types */\n/* ------------------------------------------------------------------ */\n\nexport type TaskStatus = 'open' | 'in-progress' | 'done';\nexport type TaskPriority = 'low' | 'normal' | 'high';\n\nexport interface TaskItem {\n /** Unique identifier for the task. */\n id: string;\n /** Title — single line, primary content. */\n title: string;\n /** Optional secondary line (e.g. \"Patient A · Due today\"). */\n description?: string;\n /**\n * Localised due-date hint (e.g. \"Due today\" / \"Tomorrow\"). Rendered as a\n * trailing eyebrow chip when set; consumers compute the bucket and pass\n * the localised string.\n */\n dueLabel?: string;\n /** Lifecycle state — drives the leading icon. */\n status?: TaskStatus;\n /** Priority — `high` colours the leading icon as `--destructive`. */\n priority?: TaskPriority;\n /** Optional deep link — when present the row is an anchor. */\n url?: string;\n}\n\nexport interface TaskCardProps\n extends Omit<HTMLAttributes<HTMLDivElement>, 'onClick' | 'role' | 'title'>,\n VariantProps<typeof taskCardVariants> {\n /** The task to render. */\n item: TaskItem;\n /** Visual density. */\n size?: 'sm' | 'md';\n /** Fires when the row is activated (click / Enter / Space). */\n onActivate?: (item: TaskItem) => void;\n}\n\n/* ------------------------------------------------------------------ */\n/* CVA */\n/* ------------------------------------------------------------------ */\n\nconst taskCardVariants = cva(\n [\n 'ds:relative ds:flex ds:items-start ds:gap-[var(--spacing-sm)]',\n 'ds:rounded-[var(--radius-sm)]',\n 'ds:transition-colors',\n 'ds:motion-reduce:transition-none',\n 'ds:text-start ds:group',\n 'ds:forced-colors:border ds:forced-colors:border-[CanvasText]',\n ].join(' '),\n {\n variants: {\n size: {\n sm: 'ds:p-[var(--spacing-sm)]',\n md: 'ds:p-[var(--spacing-md)]',\n },\n interactive: {\n true: 'ds:hover:bg-[color:var(--muted)]/40 ds:cursor-pointer',\n false: '',\n },\n },\n defaultVariants: {\n size: 'sm',\n interactive: false,\n },\n },\n);\n\nconst stretchedLinkClass = [\n 'ds:focus-visible:outline-none',\n \"ds:after:content-[''] ds:after:absolute ds:after:inset-0 ds:after:rounded-[var(--radius-sm)]\",\n 'ds:after:pointer-events-auto',\n 'ds:focus-visible:after:outline-[length:var(--focus-ring-width)]',\n 'ds:focus-visible:after:outline-solid',\n 'ds:focus-visible:after:outline-[color:var(--ring)]',\n 'ds:focus-visible:after:outline-offset-[length:var(--focus-ring-offset)]',\n 'ds:forced-colors:focus-visible:after:outline-[CanvasText]',\n].join(' ');\n\n/* ------------------------------------------------------------------ */\n/* Helpers */\n/* ------------------------------------------------------------------ */\n\nexport function isSafeTaskUrl(url: string): boolean {\n return /^(https?:\\/\\/(?!\\/)|\\/(?!\\/)|#)/.test(url);\n}\n\nfunction StatusIcon({ status, priority }: { status?: TaskStatus; priority?: TaskPriority }): ReactNode {\n const tone =\n priority === 'high'\n ? 'ds:text-[color:var(--destructive)]'\n : 'ds:text-[color:var(--muted-foreground)]';\n if (status === 'done') {\n return <CheckSquare aria-hidden=\"true\" className={`ds:size-4 ${tone}`} />;\n }\n if (priority === 'high') {\n return <AlertCircle aria-hidden=\"true\" className={`ds:size-4 ${tone}`} />;\n }\n return <Square aria-hidden=\"true\" className={`ds:size-4 ${tone}`} />;\n}\n\n/* ------------------------------------------------------------------ */\n/* Component */\n/* ------------------------------------------------------------------ */\n\nexport const TaskCard = forwardRef<HTMLDivElement, TaskCardProps>(\n ({ item, size = 'sm', onActivate, className, ...rest }, ref) => {\n const { t } = useTranslation();\n const interactive = !!onActivate;\n const hasSafeUrl = !!item.url && isSafeTaskUrl(item.url);\n const ariaLabel = t('ui.taskCard.itemLabel', {\n title: item.title,\n due: item.dueLabel ?? '',\n defaultValue: '{{title}}{{due, prepend, \" · \"}}',\n });\n\n const titleNode = (\n <span className=\"ds:flex-1 ds:min-w-0 ds:truncate type-body-sm ds:text-[color:var(--foreground)]\">\n {item.title}\n </span>\n );\n\n let activator: ReactNode;\n if (interactive && hasSafeUrl) {\n activator = (\n <a\n href={item.url}\n aria-label={ariaLabel}\n className={stretchedLinkClass + ' ds:contents'}\n onClick={(e) => {\n if (e.defaultPrevented || e.metaKey || e.ctrlKey || e.shiftKey) return;\n onActivate?.(item);\n }}\n >\n {titleNode}\n </a>\n );\n } else if (interactive) {\n activator = (\n <button\n type=\"button\"\n aria-label={ariaLabel}\n className={stretchedLinkClass + ' ds:contents ds:bg-transparent ds:border-0 ds:p-0 ds:text-start'}\n onClick={() => onActivate?.(item)}\n >\n {titleNode}\n </button>\n );\n } else {\n activator = titleNode;\n }\n\n return (\n <div\n ref={ref}\n role=\"listitem\"\n data-component=\"task-card\"\n data-component-id={item.id}\n data-status={item.status ?? 'open'}\n data-priority={item.priority ?? 'normal'}\n className={taskCardVariants({ size, interactive, className })}\n {...rest}\n >\n <span className=\"ds:mt-[var(--spacing-2xs)] ds:shrink-0\">\n <StatusIcon status={item.status} priority={item.priority} />\n </span>\n\n <div className=\"ds:flex-1 ds:min-w-0 ds:flex ds:flex-col ds:gap-[var(--spacing-2xs)]\">\n {activator}\n {item.description ? (\n <span className=\"type-body-sm ds:text-[color:var(--muted-foreground)] ds:truncate\">\n {item.description}\n </span>\n ) : null}\n {item.dueLabel ? (\n <span className=\"type-eyebrow ds:text-[color:var(--muted-foreground)]\">\n {item.dueLabel}\n </span>\n ) : null}\n </div>\n\n {interactive ? (\n <ChevronRight\n aria-hidden=\"true\"\n className=\"ds:mt-[var(--spacing-2xs)] ds:size-4 ds:shrink-0 ds:text-[color:var(--muted-foreground)] ds:opacity-0 ds:transition-opacity ds:motion-reduce:transition-none ds:group-hover:opacity-100 ds:group-focus-within:opacity-100 ds:rtl:rotate-180\"\n />\n ) : null}\n </div>\n );\n },\n);\n\nTaskCard.displayName = 'TaskCard';\n"],"names":["taskCardVariants","cva","stretchedLinkClass","isSafeTaskUrl","url","StatusIcon","status","priority","tone","CheckSquare","AlertCircle","Square","TaskCard","forwardRef","item","size","onActivate","className","rest","ref","t","useTranslation","interactive","hasSafeUrl","ariaLabel","titleNode","jsx","activator","e","jsxs","ChevronRight"],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"task-tray-CCoUdorl.js","sources":["../../node_modules/lucide-react/dist/esm/icons/list-todo.js","../../src/components/task-tray/task-tray.agent.ts","../../src/components/task-tray/task-tray.tsx"],"sourcesContent":["/**\n * @license lucide-react v1.8.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst __iconNode = [\n [\"path\", { d: \"M13 5h8\", key: \"a7qcls\" }],\n [\"path\", { d: \"M13 12h8\", key: \"h98zly\" }],\n [\"path\", { d: \"M13 19h8\", key: \"c3s6r1\" }],\n [\"path\", { d: \"m3 17 2 2 4-4\", key: \"1jhpwq\" }],\n [\"rect\", { x: \"3\", y: \"4\", width: \"6\", height: \"6\", rx: \"1\", key: \"cif1o7\" }]\n];\nconst ListTodo = createLucideIcon(\"list-todo\", __iconNode);\n\nexport { __iconNode, ListTodo as default };\n//# sourceMappingURL=list-todo.js.map\n","/* -------------------------------------------------------------------- */\n/* Agent adapter — TaskTray. */\n/* */\n/* Tray-level surface: read the current task ids + status, route a */\n/* `select_item` activation, and `toggle_done` / `dismiss` per task */\n/* through the curated handle. TaskTray is in-page (no open/close), */\n/* so it declares neither `open` nor `close`. */\n/* -------------------------------------------------------------------- */\n\nimport type { AgentAdapter } from '../../agent/types';\nimport type { TaskTrayHandle } from './task-tray';\n\nexport const taskTrayAgent: AgentAdapter<TaskTrayHandle> = {\n id: 'task-tray',\n capabilities: ['select_single', 'dismiss'],\n state: {\n items: {\n type: 'Array<{ id: string; status: string }>',\n descriptionKey: 'ui.agent.taskTray.state.items',\n description:\n 'Currently-displayed tasks. Ids + status only — never task title / patient.',\n read: (handle) => handle.getItems(),\n },\n },\n actions: {\n select_item: {\n safety: 'read',\n argsType: '{ id: string }',\n descriptionKey: 'ui.agent.taskTray.actions.selectItem',\n description: 'Activate the task with the given id.',\n invoke: (handle, args: { id: string }) => {\n handle.selectItem(args.id);\n },\n },\n toggle_done: {\n safety: 'write',\n argsType: '{ id: string }',\n descriptionKey: 'ui.agent.taskTray.actions.toggleDone',\n description: 'Request the host to toggle the done state of a task.',\n invoke: (handle, args: { id: string }) => {\n handle.toggleDone(args.id);\n },\n },\n dismiss: {\n safety: 'destructive',\n argsType: '{ id: string }',\n descriptionKey: 'ui.agent.taskTray.actions.dismiss',\n description: 'Request the host to dismiss / remove the task with the given id.',\n invoke: (handle, args: { id: string }) => {\n handle.dismiss(args.id);\n },\n },\n },\n domHooks: {\n root: {\n attr: 'data-component',\n value: 'task-tray',\n description: 'Marks the TaskTray wrapper.',\n },\n instanceId: {\n attr: 'data-component-id',\n sourceProp: 'id',\n description: 'Sourced from the id prop. Required to address a specific tray from the agent.',\n },\n item: {\n attr: 'data-task-id',\n description:\n 'Stable task id emitted on each rendered TaskCard inside the tray.',\n },\n },\n};\n","import {\n forwardRef,\n useImperativeHandle,\n useMemo,\n useRef,\n type HTMLAttributes,\n type ReactNode,\n} from 'react';\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport { useTranslation } from 'react-i18next';\nimport { ListTodo, Plus } from 'lucide-react';\nimport { IconButton } from '../button/icon-button';\nimport { Skeleton } from '../skeleton/skeleton';\nimport { EmptyState } from '../empty-state/empty-state';\nimport { TaskCard, type TaskItem } from '../task-card';\nimport { useAgentRegistration } from '../../agent/registry';\nimport { taskTrayAgent } from './task-tray.agent';\n\n/* ------------------------------------------------------------------ */\n/* CVA */\n/* ------------------------------------------------------------------ */\n\nconst taskTrayVariants = cva(\n [\n 'ds:flex ds:flex-col',\n 'ds:rounded-[var(--radius-md)] ds:shadow-[var(--shadow-card)]',\n 'ds:bg-[color:var(--card)] ds:text-[color:var(--card-foreground)]',\n 'ds:overflow-hidden',\n ].join(' '),\n {\n variants: {\n size: {\n sm: '',\n md: '',\n },\n },\n defaultVariants: {\n size: 'sm',\n },\n },\n);\n\n/* ------------------------------------------------------------------ */\n/* Types */\n/* ------------------------------------------------------------------ */\n\n/**\n * Curated imperative handle for TaskTray. Exposed as the forwardRef\n * target so a future agent / MCP UI bridge can drive the tray without\n * touching the DOM. See `task-tray.agent.ts`.\n */\nexport interface TaskTrayHandle {\n getItems: () => Array<{ id: string; status: string }>;\n selectItem: (id: string) => void;\n toggleDone: (id: string) => void;\n dismiss: (id: string) => void;\n}\n\nexport interface TaskTrayProps\n extends Omit<HTMLAttributes<HTMLElement>, 'onClick' | 'id'>,\n VariantProps<typeof taskTrayVariants> {\n /**\n * Stable instance id. Surfaced on the root as `data-component-id` so\n * an agent / MCP UI bridge can address this specific tray.\n */\n id?: string;\n /** Tasks rendered inside the panel. */\n items: TaskItem[];\n /** Section title — rendered in the header. Localised by the consumer. */\n title?: string;\n /** Visual density forwarded to each TaskCard. */\n size?: 'sm' | 'md';\n /** Fires when the user activates a task (click / Enter / Space). */\n onOpenTask?: (item: TaskItem) => void;\n /** Fires when the host should toggle the done state of a task. Used by agent integration. */\n onToggleDone?: (item: TaskItem) => void;\n /** Fires when the host should dismiss / remove a task. Used by agent integration. */\n onDismissTask?: (item: TaskItem) => void;\n /** Fires when the user activates the header \"Add\" affordance. */\n onAddTask?: () => void;\n /** Localised label for the \"Add\" affordance. Defaults to `ui.taskTray.add`. */\n addLabel?: string;\n /** When true the panel renders skeleton placeholders. */\n loading?: boolean;\n /** Render an empty state when `items` is empty and `loading` is false. */\n emptyTitle?: string;\n emptyDescription?: string;\n}\n\n/* ------------------------------------------------------------------ */\n/* Component */\n/* ------------------------------------------------------------------ */\n\nexport const TaskTray = forwardRef<TaskTrayHandle, TaskTrayProps>(\n (\n {\n id,\n items,\n title,\n size = 'sm',\n onOpenTask,\n onToggleDone,\n onDismissTask,\n onAddTask,\n addLabel,\n loading = false,\n emptyTitle,\n emptyDescription,\n className,\n ...rest\n },\n ref,\n ) => {\n const { t } = useTranslation();\n const heading = title ?? t('ui.taskTray.title', 'Tasks');\n const resolvedAddLabel = addLabel ?? t('ui.taskTray.add', 'Add task');\n const isEmpty = !loading && items.length === 0;\n\n let body: ReactNode;\n if (loading) {\n body = (\n <div className=\"ds:flex ds:flex-col ds:gap-[var(--spacing-sm)] ds:p-[var(--spacing-sm)]\">\n {[0, 1, 2].map((i) => (\n <Skeleton key={i} variant=\"rectangular\" height=\"2.5rem\" />\n ))}\n </div>\n );\n } else if (isEmpty) {\n body = (\n <div className=\"ds:p-[var(--spacing-md)]\">\n <EmptyState\n variant=\"first-use\"\n size=\"sm\"\n title={emptyTitle ?? t('ui.taskTray.empty.title', 'No tasks yet')}\n description={\n emptyDescription ??\n t('ui.taskTray.empty.description', 'New tasks will appear here.')\n }\n />\n </div>\n );\n } else {\n body = (\n <ul className=\"ds:flex ds:list-none ds:flex-col\">\n {items.map((item) => (\n <TaskCard\n key={item.id}\n item={item}\n size={size}\n onActivate={onOpenTask}\n data-task-id={item.id}\n />\n ))}\n </ul>\n );\n }\n\n /* Curated imperative handle for agent integration. See\n * task-tray.agent.ts. */\n const itemsRef = useRef<TaskItem[]>(items);\n itemsRef.current = items;\n\n const handle = useMemo<TaskTrayHandle>(\n () => ({\n getItems: () =>\n itemsRef.current.map((i) => ({\n id: i.id,\n status: i.status ?? 'open',\n })),\n selectItem: (targetId: string) => {\n const found = itemsRef.current.find((i) => i.id === targetId);\n if (found) onOpenTask?.(found);\n },\n toggleDone: (targetId: string) => {\n const found = itemsRef.current.find((i) => i.id === targetId);\n if (found) onToggleDone?.(found);\n },\n dismiss: (targetId: string) => {\n const found = itemsRef.current.find((i) => i.id === targetId);\n if (found) onDismissTask?.(found);\n },\n }),\n [onOpenTask, onToggleDone, onDismissTask],\n );\n\n useImperativeHandle(ref, () => handle, [handle]);\n useAgentRegistration(taskTrayAgent, handle, id);\n\n return (\n <section\n aria-label={heading}\n data-component=\"task-tray\"\n data-component-id={id}\n className={taskTrayVariants({ size, className })}\n {...rest}\n >\n <header className=\"ds:flex ds:items-center ds:justify-between ds:gap-[var(--spacing-sm)] ds:p-[var(--spacing-sm)]\">\n <h3 className=\"ds:m-0 ds:inline-flex ds:items-center ds:gap-[var(--spacing-xs)] type-title-card\">\n <ListTodo aria-hidden=\"true\" className=\"ds:size-4\" />\n {heading}\n </h3>\n {onAddTask ? (\n <IconButton\n icon={<Plus />}\n intent=\"outline\"\n size=\"sm\"\n aria-label={resolvedAddLabel}\n onClick={onAddTask}\n />\n ) : null}\n </header>\n {body}\n </section>\n );\n },\n);\n\nTaskTray.displayName = 'TaskTray';\n"],"names":["__iconNode","ListTodo","createLucideIcon","taskTrayAgent","handle","args","taskTrayVariants","cva","TaskTray","forwardRef","id","items","title","size","onOpenTask","onToggleDone","onDismissTask","onAddTask","addLabel","loading","emptyTitle","emptyDescription","className","rest","ref","t","useTranslation","heading","resolvedAddLabel","isEmpty","body","jsx","i","Skeleton","EmptyState","item","TaskCard","itemsRef","useRef","useMemo","targetId","found","useImperativeHandle","useAgentRegistration","jsxs","IconButton","Plus"],"mappings":";;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AASA,MAAMA,IAAa;AAAA,EACjB,CAAC,QAAQ,EAAE,GAAG,WAAW,KAAK,SAAQ,CAAE;AAAA,EACxC,CAAC,QAAQ,EAAE,GAAG,YAAY,KAAK,SAAQ,CAAE;AAAA,EACzC,CAAC,QAAQ,EAAE,GAAG,YAAY,KAAK,SAAQ,CAAE;AAAA,EACzC,CAAC,QAAQ,EAAE,GAAG,iBAAiB,KAAK,SAAQ,CAAE;AAAA,EAC9C,CAAC,QAAQ,EAAE,GAAG,KAAK,GAAG,KAAK,OAAO,KAAK,QAAQ,KAAK,IAAI,KAAK,KAAK,SAAQ,CAAE;AAC9E,GACMC,IAAWC,EAAiB,aAAaF,CAAU,GCJ5CG,IAA8C;AAAA,EACzD,IAAI;AAAA,EACJ,cAAc,CAAC,iBAAiB,SAAS;AAAA,EACzC,OAAO;AAAA,IACL,OAAO;AAAA,MACL,MAAM;AAAA,MACN,gBAAgB;AAAA,MAChB,aACE;AAAA,MACF,MAAM,CAACC,MAAWA,EAAO,SAAA;AAAA,IAAS;AAAA,EACpC;AAAA,EAEF,SAAS;AAAA,IACP,aAAa;AAAA,MACX,QAAQ;AAAA,MACR,UAAU;AAAA,MACV,gBAAgB;AAAA,MAChB,aAAa;AAAA,MACb,QAAQ,CAACA,GAAQC,MAAyB;AACxC,QAAAD,EAAO,WAAWC,EAAK,EAAE;AAAA,MAC3B;AAAA,IAAA;AAAA,IAEF,aAAa;AAAA,MACX,QAAQ;AAAA,MACR,UAAU;AAAA,MACV,gBAAgB;AAAA,MAChB,aAAa;AAAA,MACb,QAAQ,CAACD,GAAQC,MAAyB;AACxC,QAAAD,EAAO,WAAWC,EAAK,EAAE;AAAA,MAC3B;AAAA,IAAA;AAAA,IAEF,SAAS;AAAA,MACP,QAAQ;AAAA,MACR,UAAU;AAAA,MACV,gBAAgB;AAAA,MAChB,aAAa;AAAA,MACb,QAAQ,CAACD,GAAQC,MAAyB;AACxC,QAAAD,EAAO,QAAQC,EAAK,EAAE;AAAA,MACxB;AAAA,IAAA;AAAA,EACF;AAAA,EAEF,UAAU;AAAA,IACR,MAAM;AAAA,MACJ,MAAM;AAAA,MACN,OAAO;AAAA,MACP,aAAa;AAAA,IAAA;AAAA,IAEf,YAAY;AAAA,MACV,MAAM;AAAA,MACN,YAAY;AAAA,MACZ,aAAa;AAAA,IAAA;AAAA,IAEf,MAAM;AAAA,MACJ,MAAM;AAAA,MACN,aACE;AAAA,IAAA;AAAA,EACJ;AAEJ,GChDMC,IAAmBC;AAAA,EACvB;AAAA,IACE;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EAAA,EACA,KAAK,GAAG;AAAA,EACV;AAAA,IACE,UAAU;AAAA,MACR,MAAM;AAAA,QACJ,IAAI;AAAA,QACJ,IAAI;AAAA,MAAA;AAAA,IACN;AAAA,IAEF,iBAAiB;AAAA,MACf,MAAM;AAAA,IAAA;AAAA,EACR;AAEJ,GAqDaC,IAAWC;AAAA,EACtB,CACE;AAAA,IACE,IAAAC;AAAA,IACA,OAAAC;AAAA,IACA,OAAAC;AAAA,IACA,MAAAC,IAAO;AAAA,IACP,YAAAC;AAAA,IACA,cAAAC;AAAA,IACA,eAAAC;AAAA,IACA,WAAAC;AAAA,IACA,UAAAC;AAAA,IACA,SAAAC,IAAU;AAAA,IACV,YAAAC;AAAA,IACA,kBAAAC;AAAA,IACA,WAAAC;AAAA,IACA,GAAGC;AAAA,EAAA,GAELC,MACG;AACH,UAAM,EAAE,GAAAC,EAAA,IAAMC,EAAA,GACRC,IAAUf,KAASa,EAAE,qBAAqB,OAAO,GACjDG,IAAmBV,KAAYO,EAAE,mBAAmB,UAAU,GAC9DI,IAAU,CAACV,KAAWR,EAAM,WAAW;AAE7C,QAAImB;AACJ,IAAIX,IACFW,IACE,gBAAAC,EAAC,SAAI,WAAU,2EACZ,WAAC,GAAG,GAAG,CAAC,EAAE,IAAI,CAACC,MACd,gBAAAD,EAACE,KAAiB,SAAQ,eAAc,QAAO,SAAA,GAAhCD,CAAyC,CACzD,GACH,IAEOH,IACTC,IACE,gBAAAC,EAAC,OAAA,EAAI,WAAU,4BACb,UAAA,gBAAAA;AAAA,MAACG;AAAA,MAAA;AAAA,QACC,SAAQ;AAAA,QACR,MAAK;AAAA,QACL,OAAOd,KAAcK,EAAE,2BAA2B,cAAc;AAAA,QAChE,aACEJ,KACAI,EAAE,iCAAiC,6BAA6B;AAAA,MAAA;AAAA,IAAA,GAGtE,IAGFK,sBACG,MAAA,EAAG,WAAU,oCACX,UAAAnB,EAAM,IAAI,CAACwB,MACV,gBAAAJ;AAAA,MAACK;AAAA,MAAA;AAAA,QAEC,MAAAD;AAAA,QACA,MAAAtB;AAAA,QACA,YAAYC;AAAA,QACZ,gBAAcqB,EAAK;AAAA,MAAA;AAAA,MAJdA,EAAK;AAAA,IAAA,CAMb,GACH;AAMJ,UAAME,IAAWC,EAAmB3B,CAAK;AACzC,IAAA0B,EAAS,UAAU1B;AAEnB,UAAMP,IAASmC;AAAA,MACb,OAAO;AAAA,QACL,UAAU,MACRF,EAAS,QAAQ,IAAI,CAACL,OAAO;AAAA,UAC3B,IAAIA,EAAE;AAAA,UACN,QAAQA,EAAE,UAAU;AAAA,QAAA,EACpB;AAAA,QACJ,YAAY,CAACQ,MAAqB;AAChC,gBAAMC,IAAQJ,EAAS,QAAQ,KAAK,CAACL,MAAMA,EAAE,OAAOQ,CAAQ;AAC5D,UAAIC,qBAAoBA;AAAA,QAC1B;AAAA,QACA,YAAY,CAACD,MAAqB;AAChC,gBAAMC,IAAQJ,EAAS,QAAQ,KAAK,CAACL,MAAMA,EAAE,OAAOQ,CAAQ;AAC5D,UAAIC,qBAAsBA;AAAA,QAC5B;AAAA,QACA,SAAS,CAACD,MAAqB;AAC7B,gBAAMC,IAAQJ,EAAS,QAAQ,KAAK,CAACL,MAAMA,EAAE,OAAOQ,CAAQ;AAC5D,UAAIC,qBAAuBA;AAAA,QAC7B;AAAA,MAAA;AAAA,MAEF,CAAC3B,GAAYC,GAAcC,CAAa;AAAA,IAAA;AAG1C,WAAA0B,EAAoBlB,GAAK,MAAMpB,GAAQ,CAACA,CAAM,CAAC,GAC/CuC,EAAqBxC,GAAeC,GAAQM,CAAE,GAG5C,gBAAAkC;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,cAAYjB;AAAA,QACZ,kBAAe;AAAA,QACf,qBAAmBjB;AAAA,QACnB,WAAWJ,EAAiB,EAAE,MAAAO,GAAM,WAAAS,GAAW;AAAA,QAC9C,GAAGC;AAAA,QAEJ,UAAA;AAAA,UAAA,gBAAAqB,EAAC,UAAA,EAAO,WAAU,kGAChB,UAAA;AAAA,YAAA,gBAAAA,EAAC,MAAA,EAAG,WAAU,oFACZ,UAAA;AAAA,cAAA,gBAAAb,EAAC9B,GAAA,EAAS,eAAY,QAAO,WAAU,aAAY;AAAA,cAClD0B;AAAA,YAAA,GACH;AAAA,YACCV,IACC,gBAAAc;AAAA,cAACc;AAAA,cAAA;AAAA,gBACC,wBAAOC,GAAA,EAAK;AAAA,gBACZ,QAAO;AAAA,gBACP,MAAK;AAAA,gBACL,cAAYlB;AAAA,gBACZ,SAASX;AAAA,cAAA;AAAA,YAAA,IAET;AAAA,UAAA,GACN;AAAA,UACCa;AAAA,QAAA;AAAA,MAAA;AAAA,IAAA;AAAA,EAGP;AACF;AAEAtB,EAAS,cAAc;","x_google_ignoreList":[0]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"text-area-C_M8wliK.js","sources":["../../src/components/text-area/text-area.agent.ts","../../src/components/text-area/text-area.tsx"],"sourcesContent":["/* -------------------------------------------------------------------- */\n/* Agent adapter — TextArea. */\n/* */\n/* See `src/docs/26-agent-readiness.mdx` for the contract. */\n/* -------------------------------------------------------------------- */\n\nimport type { AgentAdapter } from '../../agent/types';\nimport type { TextAreaHandle } from './text-area';\n\nexport const textAreaAgent: AgentAdapter<TextAreaHandle> = {\n id: 'text-area',\n capabilities: ['edit_inline'],\n state: {\n value: {\n type: 'string',\n descriptionKey: 'ui.agent.textArea.state.value',\n description: 'Current value of the textarea.',\n read: (handle) => handle.getValue(),\n },\n isEmpty: {\n type: 'boolean',\n descriptionKey: 'ui.agent.textArea.state.isEmpty',\n description: 'Whether the textarea has no value.',\n read: (handle) => handle.getValue() === '',\n },\n },\n actions: {\n set_value: {\n safety: 'write',\n argsType: '{ value: string }',\n descriptionKey: 'ui.agent.textArea.actions.setValue',\n description: 'Replace the textarea value.',\n invoke: (handle, args: { value: string }) => {\n handle.setValue(args.value);\n },\n },\n clear: {\n safety: 'destructive',\n descriptionKey: 'ui.agent.textArea.actions.clear',\n description: 'Empty the textarea. Loses any typed value.',\n invoke: (handle) => {\n handle.clear();\n },\n },\n focus: {\n safety: 'read',\n descriptionKey: 'ui.agent.textArea.actions.focus',\n description: 'Move keyboard focus to the textarea.',\n invoke: (handle) => {\n handle.focus();\n },\n },\n },\n domHooks: {\n root: {\n attr: 'data-component',\n value: 'text-area',\n description: 'Marks the TextArea wrapper.',\n },\n instanceId: {\n attr: 'data-component-id',\n sourceProp: 'id',\n description: 'Sourced from the id prop.',\n },\n },\n};\n","import {\n forwardRef,\n useCallback,\n useEffect,\n useLayoutEffect,\n useMemo,\n useRef,\n useState,\n type ChangeEvent,\n type CompositionEvent,\n type TextareaHTMLAttributes,\n} from 'react';\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport { useTranslation } from 'react-i18next';\nimport { useFormField } from '../form-field/form-field-context';\nimport { useAgentRegistration } from '../../agent';\nimport { textAreaAgent } from './text-area.agent';\n\n/** Agent-readiness curated handle for TextArea. */\nexport interface TextAreaHandle {\n getValue: () => string;\n setValue: (value: string) => void;\n clear: () => void;\n focus: () => void;\n}\n\nconst textAreaVariants = cva(\n [\n 'ds:block ds:w-full ds:border ds:rounded-[var(--radius-sm)] ds:bg-background ds:text-foreground',\n 'ds:leading-[var(--line-height-base)]',\n 'ds:ps-[var(--spacing-sm)] ds:pe-[var(--spacing-sm)] ds:py-[var(--spacing-xs)]',\n 'ds:focus: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 'ds:forced-colors:focus-visible:outline-[CanvasText]',\n 'ds:disabled:cursor-not-allowed ds:disabled:opacity-50',\n 'ds:read-only:bg-muted ds:read-only:cursor-default',\n 'ds:transition-[height,color,background-color,border-color] ds:duration-[var(--animation-duration)] ds:motion-reduce:transition-none',\n 'ds:placeholder:text-muted-foreground',\n ].join(' '),\n {\n variants: {\n size: {\n sm: 'ds:min-h-8 ds:text-[length:var(--font-size-sm)]',\n md: 'ds:min-h-[var(--min-target-size)] ds:text-[length:var(--font-size-base)]',\n lg: 'ds:min-h-[calc(var(--min-target-size)*1.5)] ds:text-[length:var(--font-size-lg)]',\n },\n tone: {\n default: 'ds:border-border',\n error: 'ds:border-destructive',\n },\n resize: {\n auto: 'ds:resize-none',\n manual: 'ds:resize-y',\n },\n },\n defaultVariants: { size: 'md', tone: 'default', resize: 'manual' },\n },\n);\n\nconst counterToneClass = (ratio: number): string => {\n if (ratio >= 1) return 'ds:text-destructive';\n if (ratio >= 0.9) return 'ds:text-warning';\n return 'ds:text-muted-foreground';\n};\n\ntype NativeTextareaProps = Omit<\n TextareaHTMLAttributes<HTMLTextAreaElement>,\n 'children' | 'size'\n>;\n\nexport interface TextAreaProps\n extends NativeTextareaProps,\n Pick<VariantProps<typeof textAreaVariants>, 'size' | 'tone'> {\n size?: 'sm' | 'md' | 'lg';\n tone?: 'default' | 'error';\n autoResize?: boolean;\n minRows?: number;\n maxRows?: number;\n showCounter?: boolean;\n}\n\nconst codePointLength = (value: string): number => [...value].length;\n\nexport const TextArea = forwardRef<HTMLTextAreaElement, TextAreaProps>(\n (\n {\n size = 'md',\n tone = 'default',\n autoResize = false,\n minRows = 2,\n maxRows,\n showCounter,\n className,\n id,\n disabled,\n value,\n defaultValue,\n maxLength,\n rows,\n onChange,\n onCompositionStart,\n onCompositionEnd,\n onInput,\n ...props\n },\n ref,\n ) => {\n const { t } = useTranslation();\n const ctx = useFormField();\n const textAreaId = id ?? ctx.id;\n const effectiveDisabled = ctx.disabled || disabled;\n const effectiveTone: 'default' | 'error' = ctx.invalid ? 'error' : tone;\n\n const innerRef = useRef<HTMLTextAreaElement | null>(null);\n const setRefs = useCallback(\n (node: HTMLTextAreaElement | null) => {\n innerRef.current = node;\n if (typeof ref === 'function') {\n ref(node);\n } else if (ref) {\n ref.current = node;\n }\n },\n [ref],\n );\n\n const isControlled = value !== undefined;\n const [internalValue, setInternalValue] = useState<string>(\n String(defaultValue ?? ''),\n );\n const currentValue = isControlled ? String(value) : internalValue;\n\n const composingRef = useRef(false);\n\n const resizeTextArea = useCallback(() => {\n const el = innerRef.current;\n if (!el || !autoResize) return;\n\n const styles = window.getComputedStyle(el);\n const lineHeight = parseFloat(styles.lineHeight);\n const paddingTop = parseFloat(styles.paddingTop);\n const paddingBottom = parseFloat(styles.paddingBottom);\n const borderTop = parseFloat(styles.borderTopWidth);\n const borderBottom = parseFloat(styles.borderBottomWidth);\n const verticalChrome =\n paddingTop + paddingBottom + borderTop + borderBottom;\n\n const minH =\n (Number.isFinite(lineHeight) ? lineHeight : 24) * minRows +\n verticalChrome;\n const maxH =\n typeof maxRows === 'number'\n ? (Number.isFinite(lineHeight) ? lineHeight : 24) * maxRows +\n verticalChrome\n : Number.POSITIVE_INFINITY;\n\n // EXCEPTION to constraint #4 (no inline styles): height is computed from\n // runtime scrollHeight and cannot be expressed as a static Tailwind class.\n el.style.height = 'auto';\n const next = Math.max(minH, Math.min(el.scrollHeight, maxH));\n el.style.height = `${next}px`;\n }, [autoResize, minRows, maxRows]);\n\n useLayoutEffect(() => {\n if (!autoResize) return;\n resizeTextArea();\n }, [autoResize, resizeTextArea, currentValue]);\n\n const handleChange = (event: ChangeEvent<HTMLTextAreaElement>) => {\n if (!isControlled) {\n setInternalValue(event.target.value);\n }\n if (composingRef.current) return;\n onChange?.(event);\n };\n\n const handleCompositionStart = (\n event: CompositionEvent<HTMLTextAreaElement>,\n ) => {\n composingRef.current = true;\n onCompositionStart?.(event);\n };\n\n const handleCompositionEnd = (\n event: CompositionEvent<HTMLTextAreaElement>,\n ) => {\n composingRef.current = false;\n onCompositionEnd?.(event);\n const target = event.currentTarget;\n if (!isControlled) {\n setInternalValue(target.value);\n }\n // Synthesise a ChangeEvent from the CompositionEvent so consumers receive\n // a single post-IME change. nativeEvent is still the CompositionEvent, so\n // consumers inspecting `nativeEvent.inputType` will not find the usual\n // \"insertCompositionText\" value — documented as a known limitation.\n onChange?.({\n ...event,\n target,\n currentTarget: target,\n } as unknown as ChangeEvent<HTMLTextAreaElement>);\n if (autoResize) resizeTextArea();\n };\n\n const writeValueToTextArea = useCallback((next: string) => {\n const node = innerRef.current;\n if (!node) return;\n const prototype = Object.getPrototypeOf(node) as HTMLTextAreaElement;\n const setter = Object.getOwnPropertyDescriptor(prototype, 'value')?.set;\n setter?.call(node, next);\n node.dispatchEvent(new Event('input', { bubbles: true }));\n node.dispatchEvent(new Event('change', { bubbles: true }));\n }, []);\n\n const agentHandle = useMemo<TextAreaHandle>(\n () => ({\n getValue: () => innerRef.current?.value ?? '',\n setValue: (next) => writeValueToTextArea(next),\n clear: () => writeValueToTextArea(''),\n focus: () => innerRef.current?.focus(),\n }),\n [writeValueToTextArea],\n );\n useAgentRegistration(textAreaAgent, agentHandle, id);\n\n const counterEnabled =\n typeof maxLength === 'number' &&\n (showCounter ?? true) &&\n maxLength > 0;\n\n const current = codePointLength(currentValue);\n const remaining = counterEnabled\n ? Math.max(0, (maxLength as number) - current)\n : 0;\n const ratio = counterEnabled ? current / (maxLength as number) : 0;\n\n const [announced, setAnnounced] = useState<string>('');\n useEffect(() => {\n if (!counterEnabled) return;\n const handle = window.setTimeout(() => {\n if (composingRef.current) return;\n setAnnounced(\n t('ui.inputs.textarea.charactersRemaining', {\n count: remaining,\n defaultValue: '{{count}} characters remaining',\n }),\n );\n }, 500);\n return () => window.clearTimeout(handle);\n }, [counterEnabled, remaining, t]);\n\n const counterId = counterEnabled ? `${textAreaId}-counter` : undefined;\n const describedBy =\n [ctx.describedBy || undefined, counterId].filter(Boolean).join(' ') ||\n undefined;\n\n const resizeVariant: 'auto' | 'manual' = autoResize ? 'auto' : 'manual';\n\n return (\n <div\n data-component=\"text-area\"\n data-component-id={id}\n className=\"ds:flex ds:w-full ds:flex-col ds:gap-[var(--spacing-xs)]\"\n >\n <textarea\n ref={setRefs}\n id={textAreaId}\n value={isControlled ? currentValue : undefined}\n defaultValue={!isControlled ? defaultValue : undefined}\n disabled={effectiveDisabled}\n aria-describedby={describedBy}\n aria-invalid={ctx.invalid || undefined}\n aria-required={ctx.required || undefined}\n maxLength={maxLength}\n rows={autoResize ? minRows : rows}\n onChange={handleChange}\n onCompositionStart={handleCompositionStart}\n onCompositionEnd={handleCompositionEnd}\n onInput={onInput}\n className={textAreaVariants({\n size,\n tone: effectiveTone,\n resize: resizeVariant,\n className,\n })}\n {...props}\n />\n {counterEnabled ? (\n <div\n id={counterId}\n className=\"ds:flex ds:justify-end type-meta ds:tabular-nums\"\n >\n <span aria-hidden=\"true\" className={counterToneClass(ratio)}>\n {current} / {maxLength}\n </span>\n <span className=\"ds:sr-only\" aria-live=\"polite\">\n {announced}\n </span>\n </div>\n ) : null}\n </div>\n );\n },\n);\n\nTextArea.displayName = 'TextArea';\n"],"names":["textAreaAgent","handle","args","textAreaVariants","cva","counterToneClass","ratio","codePointLength","value","TextArea","forwardRef","size","tone","autoResize","minRows","maxRows","showCounter","className","id","disabled","defaultValue","maxLength","rows","onChange","onCompositionStart","onCompositionEnd","onInput","props","ref","t","useTranslation","ctx","useFormField","textAreaId","effectiveDisabled","effectiveTone","innerRef","useRef","setRefs","useCallback","node","isControlled","internalValue","setInternalValue","useState","currentValue","composingRef","resizeTextArea","el","styles","lineHeight","paddingTop","paddingBottom","borderTop","borderBottom","verticalChrome","minH","maxH","next","useLayoutEffect","handleChange","event","handleCompositionStart","handleCompositionEnd","target","writeValueToTextArea","prototype","setter","_a","agentHandle","useMemo","useAgentRegistration","counterEnabled","current","remaining","announced","setAnnounced","useEffect","counterId","describedBy","resizeVariant","jsxs","jsx"],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"text-input-BX39e6T6.js","sources":["../../src/components/text-input/text-input.agent.ts","../../src/components/text-input/text-input.tsx"],"sourcesContent":["/* -------------------------------------------------------------------- */\n/* Agent adapter — TextInput. */\n/* */\n/* See `src/docs/26-agent-readiness.mdx` for the contract. */\n/* -------------------------------------------------------------------- */\n\nimport type { AgentAdapter } from '../../agent/types';\nimport type { TextInputHandle } from './text-input';\n\nexport const textInputAgent: AgentAdapter<TextInputHandle> = {\n id: 'text-input',\n capabilities: ['edit_inline'],\n state: {\n value: {\n type: 'string',\n descriptionKey: 'ui.agent.textInput.state.value',\n description: 'Current value of the text input.',\n read: (handle) => handle.getValue(),\n },\n isEmpty: {\n type: 'boolean',\n descriptionKey: 'ui.agent.textInput.state.isEmpty',\n description: 'Whether the input has no value.',\n read: (handle) => handle.getValue() === '',\n },\n },\n actions: {\n set_value: {\n safety: 'write',\n argsType: '{ value: string }',\n descriptionKey: 'ui.agent.textInput.actions.setValue',\n description: 'Replace the input value.',\n invoke: (handle, args: { value: string }) => {\n handle.setValue(args.value);\n },\n },\n clear: {\n safety: 'destructive',\n descriptionKey: 'ui.agent.textInput.actions.clear',\n description: 'Empty the input. Loses any typed value.',\n invoke: (handle) => {\n handle.clear();\n },\n },\n focus: {\n safety: 'read',\n descriptionKey: 'ui.agent.textInput.actions.focus',\n description: 'Move keyboard focus to the input.',\n invoke: (handle) => {\n handle.focus();\n },\n },\n },\n domHooks: {\n root: {\n attr: 'data-component',\n value: 'text-input',\n description: 'Marks the TextInput wrapper.',\n },\n instanceId: {\n attr: 'data-component-id',\n sourceProp: 'id',\n description: 'Sourced from the id prop.',\n },\n },\n};\n","import {\n forwardRef,\n useCallback,\n useMemo,\n useRef,\n useState,\n type ChangeEvent,\n type CompositionEvent,\n type InputHTMLAttributes,\n type MouseEvent,\n type ReactNode,\n} from 'react';\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport { useTranslation } from 'react-i18next';\nimport { X } from 'lucide-react';\nimport { useFormField } from '../form-field/form-field-context';\nimport {\n INPUT_SURFACE_HEIGHT,\n INPUT_SURFACE_TEXT,\n INPUT_SURFACE_TONE,\n} from '../_shared/input-surface';\nimport { useAgentRegistration } from '../../agent';\nimport { textInputAgent } from './text-input.agent';\n\n/**\n * Agent-readiness curated handle. The internal value setter drives the DOM\n * input via the native value setter so React picks up the change.\n */\nexport interface TextInputHandle {\n getValue: () => string;\n setValue: (value: string) => void;\n clear: () => void;\n focus: () => void;\n}\n\nconst wrapperVariants = cva(\n [\n 'ds:relative ds:flex ds:items-center ds:w-full',\n 'ds:rounded-[var(--radius-sm)]',\n 'ds:focus-within:outline-[length:var(--focus-ring-width)] ds:focus-within:outline-solid',\n 'ds:focus-within:outline-ring ds:focus-within:outline-offset-[length:var(--focus-ring-offset)]',\n 'ds:forced-colors:focus-within:outline-[CanvasText]',\n 'ds:has-[:disabled]:cursor-not-allowed',\n ].join(' '),\n);\n\nconst inputVariants = cva(\n [\n 'ds:w-full ds:rounded-[var(--radius-sm)] ds:border ds:bg-background ds:text-foreground',\n 'ds:placeholder:text-muted-foreground',\n 'ds:transition-colors ds:duration-[var(--animation-duration)] ds:motion-reduce:transition-none',\n 'ds:focus:outline-none ds:focus-visible:outline-none',\n 'ds:disabled:cursor-not-allowed ds:disabled:opacity-50',\n 'ds:read-only:bg-muted ds:read-only:cursor-default',\n ].join(' '),\n {\n variants: {\n size: {\n sm: `${INPUT_SURFACE_HEIGHT.sm} ${INPUT_SURFACE_TEXT.sm}`,\n md: `${INPUT_SURFACE_HEIGHT.md} ${INPUT_SURFACE_TEXT.md}`,\n lg: `${INPUT_SURFACE_HEIGHT.lg} ${INPUT_SURFACE_TEXT.lg}`,\n },\n tone: INPUT_SURFACE_TONE,\n hasStart: {\n true: 'ds:ps-10',\n false: '',\n },\n hasEnd: {\n true: 'ds:pe-10',\n false: '',\n },\n },\n compoundVariants: [\n { size: 'sm', hasStart: false, class: 'ds:ps-3' },\n { size: 'md', hasStart: false, class: 'ds:ps-3' },\n { size: 'lg', hasStart: false, class: 'ds:ps-4' },\n { size: 'sm', hasEnd: false, class: 'ds:pe-3' },\n { size: 'md', hasEnd: false, class: 'ds:pe-3' },\n { size: 'lg', hasEnd: false, class: 'ds:pe-4' },\n ],\n defaultVariants: {\n size: 'md',\n tone: 'default',\n hasStart: false,\n hasEnd: false,\n },\n },\n);\n\nconst adornmentBase =\n 'ds:absolute ds:inset-y-0 ds:flex ds:items-center ds:pointer-events-none ds:text-muted-foreground';\n\nexport interface TextInputProps\n extends Omit<\n InputHTMLAttributes<HTMLInputElement>,\n 'size' | 'onChange' | 'onCompositionStart' | 'onCompositionEnd'\n >,\n Pick<VariantProps<typeof inputVariants>, 'size' | 'tone'> {\n size?: 'sm' | 'md' | 'lg';\n tone?: 'default' | 'error';\n startAdornment?: ReactNode;\n endAdornment?: ReactNode;\n clearable?: boolean;\n onClear?: () => void;\n onChange?: (event: ChangeEvent<HTMLInputElement>) => void;\n onCompositionStart?: (event: CompositionEvent<HTMLInputElement>) => void;\n onCompositionEnd?: (event: CompositionEvent<HTMLInputElement>) => void;\n}\n\nexport const TextInput = forwardRef<HTMLInputElement, TextInputProps>(\n (\n {\n size = 'md',\n tone = 'default',\n startAdornment,\n endAdornment,\n clearable = false,\n onClear,\n className,\n id,\n disabled,\n value,\n defaultValue,\n onChange,\n onCompositionStart,\n onCompositionEnd,\n ...props\n },\n ref,\n ) => {\n const { t } = useTranslation();\n const ctx = useFormField();\n const inputId = id ?? ctx.id;\n const effectiveDisabled = ctx.disabled || disabled;\n const effectiveTone = ctx.invalid ? 'error' : tone;\n\n const isControlled = value !== undefined;\n const [internalValue, setInternalValue] = useState<string>(\n String(defaultValue ?? ''),\n );\n const currentValue = isControlled ? String(value) : internalValue;\n const hasValue = currentValue.length > 0;\n\n const composingRef = useRef(false);\n const [composingState, setComposingState] = useState(false);\n\n const innerRef = useRef<HTMLInputElement | null>(null);\n const setRefs = useCallback(\n (node: HTMLInputElement | null) => {\n innerRef.current = node;\n if (typeof ref === 'function') {\n ref(node);\n } else if (ref) {\n ref.current = node;\n }\n },\n [ref],\n );\n\n const hasStart = Boolean(startAdornment);\n const showClear = clearable && hasValue && !effectiveDisabled && !props.readOnly;\n const hasEnd = Boolean(endAdornment) || showClear;\n\n const handleChange = (event: ChangeEvent<HTMLInputElement>) => {\n if (!isControlled) {\n setInternalValue(event.target.value);\n }\n if (composingRef.current) return;\n onChange?.(event);\n };\n\n const handleCompositionStart = (event: CompositionEvent<HTMLInputElement>) => {\n composingRef.current = true;\n setComposingState(true);\n onCompositionStart?.(event);\n };\n\n const handleCompositionEnd = (event: CompositionEvent<HTMLInputElement>) => {\n composingRef.current = false;\n setComposingState(false);\n onCompositionEnd?.(event);\n const target = event.currentTarget;\n if (!isControlled) {\n setInternalValue(target.value);\n }\n // Synthesise a ChangeEvent from the CompositionEvent so consumers receive\n // a single post-IME change. nativeEvent is still the CompositionEvent, so\n // consumers inspecting `nativeEvent.inputType` will not find the usual\n // \"insertCompositionText\" value — documented as a known limitation.\n onChange?.({\n ...event,\n target,\n currentTarget: target,\n } as unknown as ChangeEvent<HTMLInputElement>);\n };\n\n const handleClear = () => {\n if (!isControlled) {\n setInternalValue('');\n }\n const node = innerRef.current;\n if (node && onChange) {\n // Drive the DOM value to '' via the prototype setter so downstream\n // reads of event.target.value see the cleared value, then forward a\n // synthesised ChangeEvent to consumers (form libraries drive state\n // from onChange, not onClear).\n const prototype = Object.getPrototypeOf(node) as HTMLInputElement;\n const setter = Object.getOwnPropertyDescriptor(prototype, 'value')?.set;\n setter?.call(node, '');\n onChange({\n target: node,\n currentTarget: node,\n bubbles: true,\n type: 'change',\n nativeEvent: new Event('change', { bubbles: true }),\n preventDefault: () => {},\n stopPropagation: () => {},\n isDefaultPrevented: () => false,\n isPropagationStopped: () => false,\n persist: () => {},\n } as unknown as ChangeEvent<HTMLInputElement>);\n }\n onClear?.();\n node?.focus();\n };\n\n const writeValueToInput = useCallback((next: string) => {\n const node = innerRef.current;\n if (!node) return;\n const prototype = Object.getPrototypeOf(node) as HTMLInputElement;\n const setter = Object.getOwnPropertyDescriptor(prototype, 'value')?.set;\n setter?.call(node, next);\n node.dispatchEvent(new Event('input', { bubbles: true }));\n node.dispatchEvent(new Event('change', { bubbles: true }));\n }, []);\n\n const agentHandle = useMemo<TextInputHandle>(\n () => ({\n getValue: () => innerRef.current?.value ?? '',\n setValue: (next) => {\n writeValueToInput(next);\n },\n clear: () => {\n writeValueToInput('');\n },\n focus: () => {\n innerRef.current?.focus();\n },\n }),\n [writeValueToInput],\n );\n useAgentRegistration(textInputAgent, agentHandle, id);\n\n const handleWrapperClick = (event: MouseEvent<HTMLDivElement>) => {\n if (event.target === innerRef.current) return;\n if ((event.target as HTMLElement).closest('button')) return;\n innerRef.current?.focus();\n };\n\n return (\n <div\n className={wrapperVariants()}\n onClick={handleWrapperClick}\n data-component=\"text-input\"\n data-component-id={id}\n data-composing={composingState ? 'true' : undefined}\n >\n {startAdornment ? (\n <span\n aria-hidden=\"true\"\n className={`${adornmentBase} ds:start-0 ds:ps-3 ds:[&_svg]:size-4`}\n >\n {startAdornment}\n </span>\n ) : null}\n <input\n ref={setRefs}\n id={inputId}\n type=\"text\"\n value={currentValue}\n disabled={effectiveDisabled}\n aria-describedby={ctx.describedBy || undefined}\n aria-invalid={ctx.invalid || undefined}\n aria-required={ctx.required || undefined}\n onChange={handleChange}\n onCompositionStart={handleCompositionStart}\n onCompositionEnd={handleCompositionEnd}\n className={inputVariants({\n size,\n tone: effectiveTone,\n hasStart,\n hasEnd,\n className,\n })}\n {...props}\n />\n {showClear ? (\n <button\n type=\"button\"\n aria-label={t('ui.inputs.text.clear', 'Clear input')}\n onClick={handleClear}\n className=\"ds:absolute ds:inset-y-0 ds:end-0 ds:pe-3 ds:flex ds:items-center ds:pointer-events-auto ds:text-muted-foreground ds:hover:text-foreground ds:transition-colors ds:duration-[var(--animation-duration)] ds:motion-reduce:transition-none\"\n >\n <X aria-hidden=\"true\" className=\"ds:size-4\" />\n </button>\n ) : endAdornment ? (\n <span\n aria-hidden=\"true\"\n className={`${adornmentBase} ds:end-0 ds:pe-3 ds:[&_svg]:size-4`}\n >\n {endAdornment}\n </span>\n ) : null}\n </div>\n );\n },\n);\n\nTextInput.displayName = 'TextInput';\n"],"names":["textInputAgent","handle","args","wrapperVariants","cva","inputVariants","INPUT_SURFACE_HEIGHT","INPUT_SURFACE_TEXT","INPUT_SURFACE_TONE","adornmentBase","TextInput","forwardRef","size","tone","startAdornment","endAdornment","clearable","onClear","className","id","disabled","value","defaultValue","onChange","onCompositionStart","onCompositionEnd","props","ref","t","useTranslation","ctx","useFormField","inputId","effectiveDisabled","effectiveTone","isControlled","internalValue","setInternalValue","useState","currentValue","hasValue","composingRef","useRef","composingState","setComposingState","innerRef","setRefs","useCallback","node","hasStart","showClear","hasEnd","handleChange","event","handleCompositionStart","handleCompositionEnd","target","handleClear","prototype","setter","_a","writeValueToInput","next","agentHandle","useMemo","useAgentRegistration","handleWrapperClick","jsxs","jsx","X"],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"theme-toggle.agent-btmXTWdW.js","sources":["../../node_modules/lucide-react/dist/esm/icons/monitor.js","../../node_modules/lucide-react/dist/esm/icons/moon.js","../../node_modules/lucide-react/dist/esm/icons/sun.js","../../src/components/theme-toggle/theme-toggle.tsx","../../src/components/theme-toggle/theme-toggle.agent.ts"],"sourcesContent":["/**\n * @license lucide-react v1.8.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst __iconNode = [\n [\"rect\", { width: \"20\", height: \"14\", x: \"2\", y: \"3\", rx: \"2\", key: \"48i651\" }],\n [\"line\", { x1: \"8\", x2: \"16\", y1: \"21\", y2: \"21\", key: \"1svkeh\" }],\n [\"line\", { x1: \"12\", x2: \"12\", y1: \"17\", y2: \"21\", key: \"vw1qmm\" }]\n];\nconst Monitor = createLucideIcon(\"monitor\", __iconNode);\n\nexport { __iconNode, Monitor as default };\n//# sourceMappingURL=monitor.js.map\n","/**\n * @license lucide-react v1.8.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst __iconNode = [\n [\n \"path\",\n {\n d: \"M20.985 12.486a9 9 0 1 1-9.473-9.472c.405-.022.617.46.402.803a6 6 0 0 0 8.268 8.268c.344-.215.825-.004.803.401\",\n key: \"kfwtm\"\n }\n ]\n];\nconst Moon = createLucideIcon(\"moon\", __iconNode);\n\nexport { __iconNode, Moon as default };\n//# sourceMappingURL=moon.js.map\n","/**\n * @license lucide-react v1.8.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst __iconNode = [\n [\"circle\", { cx: \"12\", cy: \"12\", r: \"4\", key: \"4exip2\" }],\n [\"path\", { d: \"M12 2v2\", key: \"tus03m\" }],\n [\"path\", { d: \"M12 20v2\", key: \"1lh1kg\" }],\n [\"path\", { d: \"m4.93 4.93 1.41 1.41\", key: \"149t6j\" }],\n [\"path\", { d: \"m17.66 17.66 1.41 1.41\", key: \"ptbguv\" }],\n [\"path\", { d: \"M2 12h2\", key: \"1t8f8n\" }],\n [\"path\", { d: \"M20 12h2\", key: \"1q8mjw\" }],\n [\"path\", { d: \"m6.34 17.66-1.41 1.41\", key: \"1m8zz5\" }],\n [\"path\", { d: \"m19.07 4.93-1.41 1.41\", key: \"1shlcs\" }]\n];\nconst Sun = createLucideIcon(\"sun\", __iconNode);\n\nexport { __iconNode, Sun as default };\n//# sourceMappingURL=sun.js.map\n","import {\n forwardRef,\n useCallback,\n useImperativeHandle,\n useRef,\n type HTMLAttributes,\n} from 'react';\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport { useTranslation } from 'react-i18next';\nimport { Monitor, Moon, Sun } from 'lucide-react';\nimport { IconButton } from '../button/icon-button';\nimport { IconButtonGroup } from '../icon-button-group/icon-button-group';\nimport { Switch } from '../switch/switch';\nimport { DropdownMenu } from '../dropdown-menu/dropdown-menu';\nimport {\n useTheme,\n type AccessibilityPreference,\n type ThemePreference,\n type UseThemeReturn,\n} from '../../hooks';\n\n/* ------------------------------------------------------------------ */\n/* CVA */\n/* ------------------------------------------------------------------ */\n\nconst wrapperVariants = cva('ds:inline-flex ds:items-center', {\n variants: {\n variant: {\n menu: '',\n compact: '',\n split: 'ds:gap-[var(--spacing-md)]',\n },\n },\n defaultVariants: { variant: 'menu' },\n});\n\n/* ------------------------------------------------------------------ */\n/* Public types */\n/* ------------------------------------------------------------------ */\n\nexport type ThemeToggleVariant = 'menu' | 'compact' | 'split';\n\ninterface ThemeToggleBaseProps\n extends Omit<HTMLAttributes<HTMLDivElement>, 'onChange'>,\n VariantProps<typeof wrapperVariants> {\n /**\n * Visual form factor.\n * - `menu` (default) — single trigger that opens a dropdown with both\n * Appearance and Accessibility controls. Best for headers / nav rails.\n * - `compact` — segmented Appearance control only. Use when accessibility\n * lives on a separate settings surface.\n * - `split` — segmented Appearance control plus an inline Accessibility\n * switch. Best for full-width settings panels.\n */\n variant?: ThemeToggleVariant;\n /** Hide the accessibility control. Ignored on `compact`, which never renders it. */\n showAccessibility?: boolean;\n /**\n * Controlled escape hatch — when omitted the component reads/writes\n * `useTheme()` directly so it can drop into any header with no wiring.\n * Pass all four to opt into controlled mode.\n */\n theme?: ThemePreference;\n accessibility?: AccessibilityPreference;\n onThemeChange?: (next: ThemePreference) => void;\n onAccessibilityChange?: (next: AccessibilityPreference) => void;\n}\n\nexport type ThemeToggleProps = ThemeToggleBaseProps;\n\n/** Curated imperative handle for agent / external automation. */\nexport interface ThemeToggleHandle {\n getCurrentTheme: () => ThemePreference;\n getCurrentAccessibility: () => AccessibilityPreference;\n setTheme: (next: ThemePreference) => void;\n setAccessibility: (next: AccessibilityPreference) => void;\n}\n\n/* ------------------------------------------------------------------ */\n/* Hook adapter */\n/* ------------------------------------------------------------------ */\n\n/**\n * Resolves controlled props against the store. When the consumer passes\n * `theme` / `onThemeChange` (etc.) we honour those; otherwise we fall\n * through to the singleton `useTheme()` hook so a bare `<ThemeToggle />`\n * works with zero wiring.\n */\nfunction useResolvedTheme(props: ThemeToggleBaseProps): UseThemeReturn {\n const {\n theme: themeProp,\n accessibility: accessibilityProp,\n onThemeChange,\n onAccessibilityChange,\n } = props;\n const store = useTheme();\n const theme = themeProp ?? store.theme;\n const accessibility = accessibilityProp ?? store.accessibility;\n\n const storeSetTheme = store.setTheme;\n const storeSetAccessibility = store.setAccessibility;\n\n const setTheme = useCallback(\n (next: ThemePreference) => {\n if (onThemeChange) {\n onThemeChange(next);\n return;\n }\n storeSetTheme(next);\n },\n [onThemeChange, storeSetTheme],\n );\n\n const setAccessibility = useCallback(\n (next: AccessibilityPreference) => {\n if (onAccessibilityChange) {\n onAccessibilityChange(next);\n return;\n }\n storeSetAccessibility(next);\n },\n [onAccessibilityChange, storeSetAccessibility],\n );\n\n return {\n theme,\n accessibility,\n resolvedTheme: store.resolvedTheme,\n setTheme,\n setAccessibility,\n };\n}\n\n/* ------------------------------------------------------------------ */\n/* Sub-pieces */\n/* ------------------------------------------------------------------ */\n\ninterface AppearanceSegmentProps {\n value: ThemePreference;\n onValueChange: (next: ThemePreference) => void;\n ariaLabel: string;\n size?: 'sm' | 'md' | 'lg';\n}\n\nfunction AppearanceSegment({\n value,\n onValueChange,\n ariaLabel,\n size = 'md',\n}: AppearanceSegmentProps) {\n const { t } = useTranslation();\n return (\n <IconButtonGroup\n aria-label={ariaLabel}\n role=\"radiogroup\"\n mode=\"toggle-single\"\n size={size}\n value={value}\n onValueChange={(next) => onValueChange(next as ThemePreference)}\n >\n <IconButton\n icon={<Sun aria-hidden />}\n aria-label={t('ui.navigation.themeToggle.appearance.light')}\n value=\"light\"\n />\n <IconButton\n icon={<Moon aria-hidden />}\n aria-label={t('ui.navigation.themeToggle.appearance.dark')}\n value=\"dark\"\n />\n <IconButton\n icon={<Monitor aria-hidden />}\n aria-label={t('ui.navigation.themeToggle.appearance.system')}\n value=\"system\"\n />\n </IconButtonGroup>\n );\n}\n\ninterface AccessibilitySwitchProps {\n value: AccessibilityPreference;\n onValueChange: (next: AccessibilityPreference) => void;\n size?: 'sm' | 'md' | 'lg';\n}\n\nfunction AccessibilitySwitch({\n value,\n onValueChange,\n size = 'md',\n}: AccessibilitySwitchProps) {\n const { t } = useTranslation();\n // 'system' is treated as \"off\" visually — the OS preference flows through\n // automatically. Flipping the switch on creates an explicit override.\n const checked = value === 'accessible';\n return (\n <Switch\n label={t('ui.navigation.themeToggle.accessibility.label')}\n labelSide=\"start\"\n size={size}\n checked={checked}\n onCheckedChange={(next) =>\n onValueChange(next ? 'accessible' : 'default')\n }\n />\n );\n}\n\n/* ------------------------------------------------------------------ */\n/* Variants */\n/* ------------------------------------------------------------------ */\n\ninterface VariantRenderProps {\n state: UseThemeReturn;\n className?: string;\n rest: HTMLAttributes<HTMLDivElement>;\n forwardedRef: React.Ref<HTMLDivElement>;\n showAccessibility: boolean;\n}\n\nfunction MenuVariant({\n state,\n className,\n rest,\n forwardedRef,\n showAccessibility,\n}: VariantRenderProps) {\n const { t } = useTranslation();\n const triggerIcon =\n state.resolvedTheme === 'dark' || state.resolvedTheme === 'dark-accessible'\n ? <Moon aria-hidden />\n : <Sun aria-hidden />;\n\n const accessibleChecked = state.accessibility === 'accessible';\n\n return (\n <div\n ref={forwardedRef}\n data-component=\"theme-toggle\"\n data-component-id={rest.id}\n className={wrapperVariants({ variant: 'menu', className })}\n {...rest}\n >\n <DropdownMenu.Root>\n <DropdownMenu.Trigger asChild>\n <IconButton\n icon={triggerIcon}\n aria-label={t('ui.navigation.themeToggle.trigger')}\n />\n </DropdownMenu.Trigger>\n <DropdownMenu.Portal>\n <DropdownMenu.Content align=\"end\" sideOffset={8}>\n <DropdownMenu.Label>\n {t('ui.navigation.themeToggle.appearance.label')}\n </DropdownMenu.Label>\n <DropdownMenu.RadioGroup\n value={state.theme}\n onValueChange={(next) =>\n state.setTheme(next as ThemePreference)\n }\n >\n <DropdownMenu.RadioItem value=\"light\">\n <Sun aria-hidden className=\"ds:size-4\" />\n {t('ui.navigation.themeToggle.appearance.light')}\n </DropdownMenu.RadioItem>\n <DropdownMenu.RadioItem value=\"dark\">\n <Moon aria-hidden className=\"ds:size-4\" />\n {t('ui.navigation.themeToggle.appearance.dark')}\n </DropdownMenu.RadioItem>\n <DropdownMenu.RadioItem value=\"system\">\n <Monitor aria-hidden className=\"ds:size-4\" />\n {t('ui.navigation.themeToggle.appearance.system')}\n </DropdownMenu.RadioItem>\n </DropdownMenu.RadioGroup>\n {showAccessibility ? (\n <>\n <DropdownMenu.Separator />\n {/* CheckboxItem keeps the accessibility toggle inside the\n Radix menu collection so ArrowDown reaches it and Space\n activates it; `onSelect={preventDefault}` prevents the\n menu from closing on toggle. */}\n <DropdownMenu.CheckboxItem\n checked={accessibleChecked}\n onCheckedChange={(next) =>\n state.setAccessibility(next ? 'accessible' : 'default')\n }\n onSelect={(event) => event.preventDefault()}\n >\n {t('ui.navigation.themeToggle.accessibility.label')}\n </DropdownMenu.CheckboxItem>\n </>\n ) : null}\n </DropdownMenu.Content>\n </DropdownMenu.Portal>\n </DropdownMenu.Root>\n </div>\n );\n}\n\nfunction CompactVariant({\n state,\n className,\n rest,\n forwardedRef,\n}: VariantRenderProps) {\n const { t } = useTranslation();\n return (\n <div\n ref={forwardedRef}\n data-component=\"theme-toggle\"\n data-component-id={rest.id}\n className={wrapperVariants({ variant: 'compact', className })}\n {...rest}\n >\n <AppearanceSegment\n value={state.theme}\n onValueChange={state.setTheme}\n ariaLabel={t('ui.navigation.themeToggle.appearance.label')}\n />\n </div>\n );\n}\n\nfunction SplitVariant({\n state,\n className,\n rest,\n forwardedRef,\n showAccessibility,\n}: VariantRenderProps) {\n const { t } = useTranslation();\n return (\n <div\n ref={forwardedRef}\n data-component=\"theme-toggle\"\n data-component-id={rest.id}\n className={wrapperVariants({ variant: 'split', className })}\n {...rest}\n >\n <AppearanceSegment\n value={state.theme}\n onValueChange={state.setTheme}\n ariaLabel={t('ui.navigation.themeToggle.appearance.label')}\n />\n {showAccessibility ? (\n <AccessibilitySwitch\n value={state.accessibility}\n onValueChange={state.setAccessibility}\n />\n ) : null}\n </div>\n );\n}\n\n/* ------------------------------------------------------------------ */\n/* ThemeToggle */\n/* ------------------------------------------------------------------ */\n\nexport const ThemeToggle = forwardRef<ThemeToggleHandle, ThemeToggleProps>(\n (props, ref) => {\n const {\n variant = 'menu',\n showAccessibility = true,\n className,\n // Strip controlled props from the spread — they are read by the\n // adapter, not by the DOM element.\n theme: _theme,\n accessibility: _accessibility,\n onThemeChange: _onThemeChange,\n onAccessibilityChange: _onAccessibilityChange,\n ...rest\n } = props;\n\n const state = useResolvedTheme(props);\n const stateRef = useRef(state);\n stateRef.current = state;\n\n useImperativeHandle(\n ref,\n () => ({\n getCurrentTheme: () => stateRef.current.theme,\n getCurrentAccessibility: () => stateRef.current.accessibility,\n setTheme: (next) => stateRef.current.setTheme(next),\n setAccessibility: (next) => stateRef.current.setAccessibility(next),\n }),\n [],\n );\n\n // Internal variant wrappers attach refs to <div> elements — agent handle is\n // separately exposed above via useImperativeHandle(ref).\n const forwardedRef = useRef<HTMLDivElement | null>(null);\n\n if (variant === 'compact') {\n return (\n <CompactVariant\n state={state}\n className={className}\n rest={rest}\n forwardedRef={forwardedRef}\n showAccessibility={showAccessibility}\n />\n );\n }\n if (variant === 'split') {\n return (\n <SplitVariant\n state={state}\n className={className}\n rest={rest}\n forwardedRef={forwardedRef}\n showAccessibility={showAccessibility}\n />\n );\n }\n return (\n <MenuVariant\n state={state}\n className={className}\n rest={rest}\n forwardedRef={forwardedRef}\n showAccessibility={showAccessibility}\n />\n );\n },\n);\n\nThemeToggle.displayName = 'ThemeToggle';\n","/* -------------------------------------------------------------------- */\n/* Agent adapter — ThemeToggle. */\n/* -------------------------------------------------------------------- */\n\nimport type { AgentAdapter } from '../../agent/types';\nimport type { ThemeToggleHandle } from './theme-toggle';\n\nexport const themeToggleAgent: AgentAdapter<ThemeToggleHandle> = {\n id: 'theme-toggle',\n capabilities: ['view_change'],\n state: {\n currentTheme: {\n type: 'ThemePreference',\n descriptionKey: 'ui.agent.themeToggle.state.currentTheme',\n description: 'Active theme preference: light, dark, or system.',\n read: (handle) => handle.getCurrentTheme(),\n },\n currentAccessibility: {\n type: 'AccessibilityPreference',\n descriptionKey: 'ui.agent.themeToggle.state.currentAccessibility',\n description: 'Active accessibility preference: default or accessible.',\n read: (handle) => handle.getCurrentAccessibility(),\n },\n },\n actions: {\n set_theme: {\n safety: 'write',\n argsType: '{ theme: \"light\" | \"dark\" | \"system\" }',\n descriptionKey: 'ui.agent.themeToggle.actions.setTheme',\n description: 'Switch the theme preference.',\n invoke: (handle, args: { theme: 'light' | 'dark' | 'system' }) => {\n handle.setTheme(args.theme);\n },\n },\n set_accessibility: {\n safety: 'write',\n argsType: '{ accessibility: \"default\" | \"accessible\" }',\n descriptionKey: 'ui.agent.themeToggle.actions.setAccessibility',\n description: 'Switch the accessibility preference.',\n invoke: (handle, args: { accessibility: 'default' | 'accessible' }) => {\n handle.setAccessibility(args.accessibility);\n },\n },\n },\n domHooks: {\n root: {\n attr: 'data-component',\n value: 'theme-toggle',\n description: 'Marks the ThemeToggle wrapper.',\n },\n instanceId: {\n attr: 'data-component-id',\n sourceProp: 'id',\n description: 'Sourced from the id prop.',\n },\n },\n};\n"],"names":["__iconNode","Monitor","createLucideIcon","Moon","Sun","wrapperVariants","cva","useResolvedTheme","props","themeProp","accessibilityProp","onThemeChange","onAccessibilityChange","store","useTheme","theme","accessibility","storeSetTheme","storeSetAccessibility","setTheme","useCallback","next","setAccessibility","AppearanceSegment","value","onValueChange","ariaLabel","size","t","useTranslation","jsxs","IconButtonGroup","jsx","IconButton","AccessibilitySwitch","checked","Switch","MenuVariant","state","className","rest","forwardedRef","showAccessibility","triggerIcon","accessibleChecked","DropdownMenu","Fragment","event","CompactVariant","SplitVariant","ThemeToggle","forwardRef","ref","variant","_theme","_accessibility","_onThemeChange","_onAccessibilityChange","stateRef","useRef","useImperativeHandle","themeToggleAgent","handle","args"],"mappings":"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","x_google_ignoreList":[0,1,2]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"time-picker-B8AMIrX7.js","sources":["../../src/components/time-picker/time-picker.agent.ts","../../src/components/time-picker/time-picker.tsx"],"sourcesContent":["/* -------------------------------------------------------------------- */\n/* Agent adapter — TimePicker. */\n/* */\n/* TimePicker is a segmented time input. It has no popover of its own — */\n/* `open` / `close` are still declared as capabilities so the adapter */\n/* shape stays consistent with the other pickers; on this component they */\n/* resolve to no-ops on the curated handle (kept for shape parity, see */\n/* PRS §26 §15 on curated handles). */\n/* */\n/* See `src/docs/26-agent-readiness.mdx` §15. */\n/* -------------------------------------------------------------------- */\n\nimport type { AgentAdapter } from '../../agent/types';\nimport type { TimePickerHandle } from './time-picker';\n\nexport const timePickerAgent: AgentAdapter<TimePickerHandle> = {\n id: 'time-picker',\n capabilities: ['pick', 'open', 'close'],\n state: {\n value: {\n type: 'HH:MM',\n descriptionKey: 'ui.agent.timePicker.state.value',\n description: 'Currently-selected time as 24h HH:MM (always present — defaults to 00:00 when unset).',\n read: (handle) => {\n const value = handle.getValue();\n if (!value) return null;\n const hh = String(value.hours).padStart(2, '0');\n const mm = String(value.minutes).padStart(2, '0');\n return `${hh}:${mm}`;\n },\n },\n isOpen: {\n type: 'boolean',\n descriptionKey: 'ui.agent.timePicker.state.isOpen',\n description: 'Whether the time popover is open. TimePicker has no popover of its own; always false.',\n read: (handle) => handle.isOpen(),\n },\n },\n actions: {\n set_time: {\n safety: 'write',\n argsType: '{ time: string }',\n descriptionKey: 'ui.agent.timePicker.actions.setTime',\n description: 'Set the time using a 24h HH:MM string.',\n invoke: (handle, args: { time: string }) => {\n const [hStr, mStr] = args.time.split(':');\n handle.setValue({\n hours: Number.parseInt(hStr ?? '0', 10),\n minutes: Number.parseInt(mStr ?? '0', 10),\n });\n },\n },\n clear: {\n safety: 'destructive',\n descriptionKey: 'ui.agent.timePicker.actions.clear',\n description: 'Clear the time (resets to 00:00).',\n invoke: (handle) => {\n handle.clear();\n },\n },\n open: {\n safety: 'read',\n descriptionKey: 'ui.agent.timePicker.actions.open',\n description: 'No-op: TimePicker has no popover of its own.',\n invoke: (handle) => {\n handle.open();\n },\n },\n close: {\n safety: 'read',\n descriptionKey: 'ui.agent.timePicker.actions.close',\n description: 'No-op: TimePicker has no popover of its own.',\n invoke: (handle) => {\n handle.close();\n },\n },\n },\n domHooks: {\n root: {\n attr: 'data-component',\n value: 'time-picker',\n description: 'Marks the TimePicker wrapper.',\n },\n instanceId: {\n attr: 'data-component-id',\n sourceProp: 'id',\n description: 'Sourced from the id prop.',\n },\n },\n};\n","import {\n forwardRef,\n useCallback,\n useEffect,\n useImperativeHandle,\n useMemo,\n useRef,\n useState,\n type KeyboardEvent,\n type FocusEvent,\n} from 'react';\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport { useTranslation } from 'react-i18next';\nimport { useFormField } from '../form-field/form-field-context';\nimport type { TimeValue } from '../_shared/time';\nimport { useAgentRegistration } from '../../agent';\nimport { timePickerAgent } from './time-picker.agent';\n\n/* -------------------------------------------------------------------------- */\n/* Imperative handle */\n/* -------------------------------------------------------------------------- */\n\n/** Curated imperative handle exposed via `ref` — also consumed by the agent adapter. */\nexport interface TimePickerHandle {\n /** Get the current time value, or null when unset. */\n getValue: () => TimeValue | null;\n /** Set the time value. */\n setValue: (value: TimeValue) => void;\n /** Clear the value (resets to 00:00). */\n clear: () => void;\n /** Whether a popover is open. TimePicker has no popover; always false. */\n isOpen: () => boolean;\n /** No-op: TimePicker has no popover. */\n open: () => void;\n /** No-op: TimePicker has no popover. */\n close: () => void;\n}\n\n/* -------------------------------------------------------------------------- */\n/* Helpers */\n/* -------------------------------------------------------------------------- */\n\n/** Detect 12h vs 24h from the browser locale. */\nfunction detectHour12(locale: string): boolean {\n try {\n const resolved = new Intl.DateTimeFormat(locale, {\n hour: 'numeric',\n }).resolvedOptions();\n return resolved.hourCycle === 'h12' || resolved.hourCycle === 'h11';\n } catch {\n return false;\n }\n}\n\n/** Get localised AM/PM labels via Intl. */\nfunction getLocalePeriodLabels(locale: string): { am: string; pm: string } {\n try {\n const am = new Intl.DateTimeFormat(locale, {\n hour: 'numeric',\n hour12: true,\n })\n .formatToParts(new Date(2000, 0, 1, 9))\n .find((p) => p.type === 'dayPeriod')?.value ?? 'AM';\n\n const pm = new Intl.DateTimeFormat(locale, {\n hour: 'numeric',\n hour12: true,\n })\n .formatToParts(new Date(2000, 0, 1, 15))\n .find((p) => p.type === 'dayPeriod')?.value ?? 'PM';\n\n return { am, pm };\n } catch {\n return { am: 'AM', pm: 'PM' };\n }\n}\n\n/** Clamp a number between min and max. */\nfunction clamp(value: number, min: number, max: number): number {\n return Math.min(max, Math.max(min, value));\n}\n\n/** Round to nearest step. */\nfunction roundToStep(value: number, step: number): number {\n return Math.round(value / step) * step;\n}\n\n/** Convert 24h hour to 12h display hour. */\nfunction to12Hour(h24: number): number {\n if (h24 === 0) return 12;\n if (h24 > 12) return h24 - 12;\n return h24;\n}\n\n/** Convert 12h display hour + period to 24h hour. */\nfunction to24Hour(h12: number, isPM: boolean): number {\n if (isPM) return h12 === 12 ? 12 : h12 + 12;\n return h12 === 12 ? 0 : h12;\n}\n\n/* -------------------------------------------------------------------------- */\n/* CVA variants */\n/* -------------------------------------------------------------------------- */\n\nconst wrapperVariants = cva(\n [\n 'ds:inline-flex ds:items-center ds:gap-[var(--spacing-xs)]',\n 'ds:rounded-[var(--radius-sm)] ds:border ds:border-border ds:bg-background',\n 'ds:transition-colors ds:duration-[var(--animation-duration)] ds:motion-reduce:transition-none',\n 'ds:focus-within:outline-[length:var(--focus-ring-width)] ds:focus-within:outline-solid',\n 'ds:focus-within:outline-ring ds:focus-within:outline-offset-[length:var(--focus-ring-offset)]',\n 'ds:forced-colors:focus-within:outline-[CanvasText]',\n ].join(' '),\n {\n variants: {\n size: {\n sm: 'ds:h-8 ds:ps-[var(--spacing-sm)] ds:pe-[var(--spacing-sm)] ds:text-[length:var(--font-size-sm)]',\n md: 'ds:h-[var(--min-target-size)] ds:ps-[var(--spacing-md)] ds:pe-[var(--spacing-md)] ds:text-[length:var(--font-size-base)]',\n lg: 'ds:h-12 ds:ps-[var(--spacing-md)] ds:pe-[var(--spacing-md)] ds:text-[length:var(--font-size-lg)]',\n },\n tone: {\n default: 'ds:border-border',\n error: 'ds:border-destructive',\n },\n isDisabled: {\n true: 'ds:cursor-not-allowed ds:opacity-50',\n false: '',\n },\n },\n defaultVariants: {\n size: 'md',\n tone: 'default',\n isDisabled: false,\n },\n },\n);\n\nconst segmentVariants = cva(\n [\n 'ds:inline-flex ds:items-center ds:justify-center',\n 'ds:rounded-[var(--radius-sm)] ds:text-center ds:tabular-nums',\n 'ds:bg-transparent ds:text-foreground',\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:select-none',\n ].join(' '),\n {\n variants: {\n size: {\n sm: 'ds:min-w-6 ds:h-6 ds:text-[length:var(--font-size-sm)]',\n md: 'ds:min-w-8 ds:h-8 ds:text-[length:var(--font-size-base)]',\n lg: 'ds:min-w-10 ds:h-10 ds:text-[length:var(--font-size-lg)]',\n },\n },\n defaultVariants: { size: 'md' },\n },\n);\n\nconst periodButtonVariants = cva(\n [\n 'ds:inline-flex ds:items-center ds:justify-center',\n 'ds:rounded-[var(--radius-sm)] ds:text-center',\n 'ds:bg-transparent ds:text-foreground ds:cursor-pointer',\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:select-none',\n 'ds:transition-colors ds:duration-[var(--animation-duration)] ds:motion-reduce:transition-none',\n 'ds:hover:bg-muted',\n ].join(' '),\n {\n variants: {\n size: {\n sm: 'ds:min-w-8 ds:h-6 ds:text-[length:var(--font-size-sm)] ds:ps-1 ds:pe-1',\n md: 'ds:min-w-10 ds:h-8 ds:text-[length:var(--font-size-base)] ds:ps-1.5 ds:pe-1.5',\n lg: 'ds:min-w-12 ds:h-10 ds:text-[length:var(--font-size-lg)] ds:ps-2 ds:pe-2',\n },\n },\n defaultVariants: { size: 'md' },\n },\n);\n\nconst separatorVariants = cva('ds:text-muted-foreground ds:select-none', {\n variants: {\n size: {\n sm: 'ds:text-[length:var(--font-size-sm)]',\n md: 'ds:text-[length:var(--font-size-base)]',\n lg: 'ds:text-[length:var(--font-size-lg)]',\n },\n },\n defaultVariants: { size: 'md' },\n});\n\n/* -------------------------------------------------------------------------- */\n/* Props */\n/* -------------------------------------------------------------------------- */\n\ntype MinuteStep = 1 | 5 | 10 | 15 | 30;\n\nexport interface TimePickerProps\n extends Pick<VariantProps<typeof wrapperVariants>, 'size'> {\n /** Current value — controlled. */\n value?: TimeValue;\n /** Default value — uncontrolled. */\n defaultValue?: TimeValue;\n /** Called when the value changes. */\n onChange?: (value: TimeValue) => void;\n /** Force 12h/24h mode. Defaults to locale detection. */\n hour12?: boolean;\n /** Minute increment step. */\n minuteStep?: MinuteStep;\n /** Use full-width colon separator for CJK apps. */\n fullWidthSeparator?: boolean;\n /** Custom AM/PM labels. */\n periodLabels?: { am: string; pm: string };\n /** Component size. */\n size?: 'sm' | 'md' | 'lg';\n /** Whether the input is disabled. */\n disabled?: boolean;\n /** Additional class names. */\n className?: string;\n /** id override. */\n id?: string;\n}\n\n/* -------------------------------------------------------------------------- */\n/* Component */\n/* -------------------------------------------------------------------------- */\n\nexport const TimePicker = forwardRef<TimePickerHandle, TimePickerProps>(\n (\n {\n value,\n defaultValue,\n onChange,\n hour12: hour12Prop,\n minuteStep = 1,\n fullWidthSeparator = false,\n periodLabels: periodLabelsProp,\n size = 'md',\n disabled,\n className,\n id,\n },\n ref,\n ) => {\n const { t, i18n } = useTranslation();\n const ctx = useFormField();\n const effectiveId = id ?? ctx.id;\n const effectiveDisabled = ctx.disabled || disabled;\n const effectiveTone = ctx.invalid ? 'error' : 'default';\n\n const isHour12 =\n hour12Prop !== undefined ? hour12Prop : detectHour12(i18n.language);\n const localePeriods = getLocalePeriodLabels(i18n.language);\n const periods = periodLabelsProp ?? localePeriods;\n\n const isControlled = value !== undefined;\n const [internalValue, setInternalValue] = useState<TimeValue>(\n value ?? defaultValue ?? { hours: 0, minutes: 0 },\n );\n const currentValue: TimeValue = isControlled ? value : internalValue;\n\n const emit = useCallback(\n (next: TimeValue) => {\n if (!isControlled) setInternalValue(next);\n onChange?.(next);\n },\n [isControlled, onChange],\n );\n\n // Segment refs\n const hourRef = useRef<HTMLSpanElement>(null);\n const minuteRef = useRef<HTMLSpanElement>(null);\n const periodRef = useRef<HTMLSpanElement>(null);\n\n // Typing buffer for each segment\n const [hourBuffer, setHourBuffer] = useState('');\n const [minuteBuffer, setMinuteBuffer] = useState('');\n const hourTimerRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n const minuteTimerRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n\n // Clear buffers on blur\n const clearHourBuffer = useCallback(() => {\n setHourBuffer('');\n if (hourTimerRef.current) {\n clearTimeout(hourTimerRef.current);\n hourTimerRef.current = null;\n }\n }, []);\n\n const clearMinuteBuffer = useCallback(() => {\n setMinuteBuffer('');\n if (minuteTimerRef.current) {\n clearTimeout(minuteTimerRef.current);\n minuteTimerRef.current = null;\n }\n }, []);\n\n // Cleanup timers\n useEffect(() => {\n return () => {\n if (hourTimerRef.current) clearTimeout(hourTimerRef.current);\n if (minuteTimerRef.current) clearTimeout(minuteTimerRef.current);\n };\n }, []);\n\n const separator = fullWidthSeparator ? '\\uFF1A' : ':';\n\n // Display values\n const displayHour = isHour12\n ? String(to12Hour(currentValue.hours)).padStart(2, '0')\n : String(currentValue.hours).padStart(2, '0');\n const displayMinute = String(currentValue.minutes).padStart(2, '0');\n const isPM = currentValue.hours >= 12;\n\n // Hour segment keyboard handler\n const handleHourKeyDown = (e: KeyboardEvent<HTMLSpanElement>) => {\n if (effectiveDisabled) return;\n\n if (e.key === 'ArrowUp' || e.key === 'ArrowDown') {\n e.preventDefault();\n const delta = e.key === 'ArrowUp' ? 1 : -1;\n const maxH = 23;\n let newH = currentValue.hours + delta;\n if (newH < 0) newH = maxH;\n if (newH > maxH) newH = 0;\n emit({ ...currentValue, hours: newH });\n clearHourBuffer();\n return;\n }\n\n if (e.key === 'Tab' && !e.shiftKey) {\n e.preventDefault();\n minuteRef.current?.focus();\n clearHourBuffer();\n return;\n }\n\n if (e.key >= '0' && e.key <= '9') {\n e.preventDefault();\n const next = hourBuffer + e.key;\n setHourBuffer(next);\n\n if (hourTimerRef.current) clearTimeout(hourTimerRef.current);\n\n const num = parseInt(next, 10);\n const maxH = isHour12 ? 12 : 23;\n\n if (next.length >= 2) {\n const clamped = clamp(num, isHour12 ? 1 : 0, maxH);\n const h24 = isHour12 ? to24Hour(clamped, isPM) : clamped;\n emit({ ...currentValue, hours: h24 });\n setHourBuffer('');\n minuteRef.current?.focus();\n } else {\n // If first digit makes it impossible to form a valid 2-digit number, commit now\n if (num > (isHour12 ? 1 : 2)) {\n const clamped = clamp(num, isHour12 ? 1 : 0, maxH);\n const h24 = isHour12 ? to24Hour(clamped, isPM) : clamped;\n emit({ ...currentValue, hours: h24 });\n setHourBuffer('');\n minuteRef.current?.focus();\n } else {\n hourTimerRef.current = setTimeout(() => {\n const clamped = clamp(num, isHour12 ? 1 : 0, maxH);\n const h24 = isHour12 ? to24Hour(clamped, isPM) : clamped;\n emit({ ...currentValue, hours: h24 });\n setHourBuffer('');\n }, 1000);\n }\n }\n }\n };\n\n // Minute segment keyboard handler\n const handleMinuteKeyDown = (e: KeyboardEvent<HTMLSpanElement>) => {\n if (effectiveDisabled) return;\n\n if (e.key === 'ArrowUp' || e.key === 'ArrowDown') {\n e.preventDefault();\n const delta = e.key === 'ArrowUp' ? minuteStep : -minuteStep;\n let newM = currentValue.minutes + delta;\n if (newM < 0) newM = 60 + newM;\n if (newM >= 60) newM = newM - 60;\n emit({ ...currentValue, minutes: newM });\n clearMinuteBuffer();\n return;\n }\n\n if (e.key === 'Tab' && !e.shiftKey && isHour12) {\n e.preventDefault();\n periodRef.current?.focus();\n clearMinuteBuffer();\n return;\n }\n\n if (e.key === 'Tab' && e.shiftKey) {\n e.preventDefault();\n hourRef.current?.focus();\n clearMinuteBuffer();\n return;\n }\n\n if (e.key >= '0' && e.key <= '9') {\n e.preventDefault();\n const next = minuteBuffer + e.key;\n setMinuteBuffer(next);\n\n if (minuteTimerRef.current) clearTimeout(minuteTimerRef.current);\n\n const num = parseInt(next, 10);\n\n if (next.length >= 2) {\n const clamped = clamp(num, 0, 59);\n const rounded = roundToStep(clamped, minuteStep);\n emit({ ...currentValue, minutes: rounded });\n setMinuteBuffer('');\n if (isHour12) {\n periodRef.current?.focus();\n }\n } else {\n if (num > 5) {\n const clamped = clamp(num, 0, 59);\n const rounded = roundToStep(clamped, minuteStep);\n emit({ ...currentValue, minutes: rounded });\n setMinuteBuffer('');\n if (isHour12) {\n periodRef.current?.focus();\n }\n } else {\n minuteTimerRef.current = setTimeout(() => {\n const clamped = clamp(num, 0, 59);\n const rounded = roundToStep(clamped, minuteStep);\n emit({ ...currentValue, minutes: rounded });\n setMinuteBuffer('');\n }, 1000);\n }\n }\n }\n };\n\n // Period toggle handler\n const handlePeriodKeyDown = (e: KeyboardEvent<HTMLSpanElement>) => {\n if (effectiveDisabled) return;\n\n if (e.key === 'ArrowUp' || e.key === 'ArrowDown') {\n e.preventDefault();\n const newH = isPM\n ? currentValue.hours - 12\n : currentValue.hours + 12;\n emit({ ...currentValue, hours: clamp(newH, 0, 23) });\n return;\n }\n\n if (e.key === 'Tab' && e.shiftKey) {\n e.preventDefault();\n minuteRef.current?.focus();\n return;\n }\n\n // a/p keys toggle AM/PM\n if (e.key === 'a' || e.key === 'A') {\n e.preventDefault();\n if (isPM) {\n emit({ ...currentValue, hours: currentValue.hours - 12 });\n }\n }\n if (e.key === 'p' || e.key === 'P') {\n e.preventDefault();\n if (!isPM) {\n emit({ ...currentValue, hours: currentValue.hours + 12 });\n }\n }\n };\n\n const handleHourBlur = (_e: FocusEvent) => {\n clearHourBuffer();\n };\n\n const handleMinuteBlur = () => {\n clearMinuteBuffer();\n // Round to step on blur\n const rounded = roundToStep(currentValue.minutes, minuteStep);\n if (rounded !== currentValue.minutes) {\n emit({ ...currentValue, minutes: rounded });\n }\n // Prevent blur from propagating if moving within the component\n };\n\n const hourLabel = t('ui.inputs.timePicker.hour', 'Hour');\n const minuteLabel = t('ui.inputs.timePicker.minute', 'Minute');\n const periodLabel = t('ui.inputs.timePicker.period', 'Period');\n const groupLabel = t('ui.inputs.timePicker.groupLabel', 'Time');\n\n const handle = useMemo<TimePickerHandle>(\n () => ({\n getValue: () => currentValue,\n setValue: (next) => emit(next),\n clear: () => emit({ hours: 0, minutes: 0 }),\n isOpen: () => false,\n open: () => {\n /* TimePicker has no popover — no-op. */\n },\n close: () => {\n /* TimePicker has no popover — no-op. */\n },\n }),\n [currentValue, emit],\n );\n\n useImperativeHandle(ref, () => handle, [handle]);\n useAgentRegistration(timePickerAgent, handle, effectiveId);\n\n return (\n <div\n id={effectiveId}\n role=\"group\"\n aria-label={groupLabel}\n aria-describedby={ctx.describedBy || undefined}\n aria-invalid={ctx.invalid || undefined}\n // `aria-required` is not valid on `role=\"group\"` per ARIA 1.2 — the\n // FormField label's visible asterisk + `aria-describedby` link\n // communicate the required state instead.\n aria-disabled={effectiveDisabled || undefined}\n data-component=\"time-picker\"\n data-component-id={effectiveId}\n className={wrapperVariants({\n size,\n tone: effectiveTone,\n isDisabled: effectiveDisabled ?? false,\n className,\n })}\n >\n {/* Hour segment */}\n <span\n ref={hourRef}\n role=\"spinbutton\"\n aria-label={hourLabel}\n aria-valuemin={isHour12 ? 1 : 0}\n aria-valuemax={isHour12 ? 12 : 23}\n aria-valuenow={isHour12 ? to12Hour(currentValue.hours) : currentValue.hours}\n aria-valuetext={displayHour}\n tabIndex={effectiveDisabled ? -1 : 0}\n inputMode=\"numeric\"\n onKeyDown={handleHourKeyDown}\n onBlur={handleHourBlur}\n className={segmentVariants({ size })}\n >\n {displayHour}\n </span>\n\n {/* Separator */}\n <span aria-hidden=\"true\" className={separatorVariants({ size })}>\n {separator}\n </span>\n\n {/* Minute segment */}\n <span\n ref={minuteRef}\n role=\"spinbutton\"\n aria-label={minuteLabel}\n aria-valuemin={0}\n aria-valuemax={59}\n aria-valuenow={currentValue.minutes}\n aria-valuetext={displayMinute}\n tabIndex={effectiveDisabled ? -1 : 0}\n inputMode=\"numeric\"\n onKeyDown={handleMinuteKeyDown}\n onBlur={handleMinuteBlur}\n className={segmentVariants({ size })}\n >\n {displayMinute}\n </span>\n\n {/* AM/PM toggle (12h mode only) */}\n {isHour12 ? (\n <span\n ref={periodRef}\n role=\"spinbutton\"\n aria-label={periodLabel}\n aria-valuemin={0}\n aria-valuemax={1}\n aria-valuenow={isPM ? 1 : 0}\n aria-valuetext={isPM ? periods.pm : periods.am}\n tabIndex={effectiveDisabled ? -1 : 0}\n onKeyDown={handlePeriodKeyDown}\n className={periodButtonVariants({ size })}\n >\n {isPM ? periods.pm : periods.am}\n </span>\n ) : null}\n </div>\n );\n },\n);\n\nTimePicker.displayName = 'TimePicker';\n"],"names":["timePickerAgent","handle","value","hh","mm","args","hStr","mStr","detectHour12","locale","resolved","getLocalePeriodLabels","am","_a","p","pm","_b","clamp","min","max","roundToStep","step","to12Hour","h24","to24Hour","h12","isPM","wrapperVariants","cva","segmentVariants","periodButtonVariants","separatorVariants","TimePicker","forwardRef","defaultValue","onChange","hour12Prop","minuteStep","fullWidthSeparator","periodLabelsProp","size","disabled","className","id","ref","t","i18n","useTranslation","ctx","useFormField","effectiveId","effectiveDisabled","effectiveTone","isHour12","localePeriods","periods","isControlled","internalValue","setInternalValue","useState","currentValue","emit","useCallback","next","hourRef","useRef","minuteRef","periodRef","hourBuffer","setHourBuffer","minuteBuffer","setMinuteBuffer","hourTimerRef","minuteTimerRef","clearHourBuffer","clearMinuteBuffer","useEffect","separator","displayHour","displayMinute","handleHourKeyDown","delta","maxH","newH","num","clamped","_c","handleMinuteKeyDown","newM","rounded","_d","handlePeriodKeyDown","handleHourBlur","_e","handleMinuteBlur","hourLabel","minuteLabel","periodLabel","groupLabel","useMemo","useImperativeHandle","useAgentRegistration","jsxs","jsx"],"mappings":"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"}
|