@alfadocs/ui-kit 0.1.10 → 0.2.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/_chunks/accordion-DOmxGEWU.js +228 -0
- package/dist/_chunks/{agenda-card-DwLIxgi7.js → agenda-card-CalZqycc.js} +12 -3
- package/dist/_chunks/{agenda-tray-DUvengGQ.js → agenda-tray-3ffFDQZC.js} +54 -51
- package/dist/_chunks/{ai-prompt-input.agent-0NHYLTWD.js → ai-prompt-input-BBiDlEIS.js} +231 -231
- package/dist/_chunks/{alert-BlOUMkXj.js → alert-B1sj8Ss0.js} +24 -14
- package/dist/_chunks/{apexcharts-theme-BkSShpEy.js → apexcharts-theme-BJigns_V.js} +7 -2
- package/dist/_chunks/{app-frame-6d7Lu4ea.js → app-frame-CDJOgPXe.js} +7 -16
- package/dist/_chunks/{audio-recorder.agent--VKeykUp.js → audio-recorder-B4U1LuiQ.js} +161 -162
- package/dist/_chunks/{audio-visualiser-CeMPCZkd.js → audio-visualiser-ByDEFLNm.js} +25 -19
- package/dist/_chunks/autocomplete-D4oUZbsP.js +466 -0
- package/dist/_chunks/{badge-mrstWxve.js → badge-DKFbntoa.js} +16 -13
- package/dist/_chunks/{balance-cell-renderer-5CA7zpAi.js → balance-cell-renderer-B8zgIM-m.js} +63 -44
- package/dist/_chunks/{breadcrumb.agent-GM2hAKFX.js → breadcrumb-D1snXjPb.js} +165 -157
- package/dist/_chunks/{button-7mLWcMp_.js → button-DD_0Xdmr.js} +12 -2
- package/dist/_chunks/{calendar-nGEgelJs.js → calendar-zy0tUUVG.js} +13 -18
- package/dist/_chunks/{card-BEy58ZKp.js → card-CWzuTLYE.js} +40 -34
- package/dist/_chunks/{chart.agent-_pRYS17d.js → chart-BLvFl169.js} +147 -131
- package/dist/_chunks/chat-container-ClzsWXp2.js +220 -0
- package/dist/_chunks/chat-input-DOlsB1fm.js +333 -0
- package/dist/_chunks/{chat-message-ByouZpPP.js → chat-message-DoAhgUTj.js} +23 -13
- package/dist/_chunks/{collapsible.agent-DkS1jVyn.js → collapsible-CuxUBoHJ.js} +97 -99
- package/dist/_chunks/{color-picker-94qcBZqZ.js → color-picker-CTIcHlDF.js} +111 -45
- package/dist/_chunks/combobox-BLWruOxK.js +459 -0
- package/dist/_chunks/command-palette-C_vgSgrI.js +441 -0
- package/dist/_chunks/{date-picker-BqPTn7bO.js → date-picker-B1PO1ZQP.js} +190 -181
- package/dist/_chunks/{date-range-picker-B2hGsffw.js → date-range-picker-mix2nEVC.js} +21 -8
- package/dist/_chunks/{date-time-picker-Bzt0S8yO.js → date-time-picker-Dnong_BY.js} +30 -15
- package/dist/_chunks/{description-list-DvJbp6Yg.js → description-list-BYA77Yud.js} +26 -23
- package/dist/_chunks/dialog-BPD7wlGE.js +211 -0
- package/dist/_chunks/dropdown-menu-CpiF6CPz.js +300 -0
- package/dist/_chunks/{empty-state-DQPtRp2b.js → empty-state-3CLJIXSj.js} +132 -101
- package/dist/_chunks/file-upload-C947ACDK.js +829 -0
- package/dist/_chunks/{floating-action-button-Cnw-f6AG.js → floating-action-button-C8OYj8mE.js} +9 -2
- package/dist/_chunks/{form-field-BfsPLTSc.js → form-field-Bmkeh7WY.js} +12 -11
- package/dist/_chunks/{form-field-context-94LwgYTQ.js → form-field-context-B3APVHKx.js} +4 -2
- package/dist/_chunks/{freemium-paywall.agent-_nQqLyRF.js → freemium-paywall-CrVefV0M.js} +124 -117
- package/dist/_chunks/{header-BGn1mRp8.js → header-D0ULgQl3.js} +69 -68
- package/dist/_chunks/{icon-button-Wnnde5lc.js → icon-button-C4CGcYuz.js} +11 -3
- package/dist/_chunks/{kbd-8baVw3KU.js → kbd-Cglkd7CY.js} +6 -2
- package/dist/_chunks/{key-value-pair-JRFS9Xrh.js → key-value-pair-CgWvAIGb.js} +2 -2
- package/dist/_chunks/{leo-sidebar-BwINPdix.js → leo-sidebar-CfEY-xi2.js} +16 -20
- package/dist/_chunks/{link-QheANk74.js → link-BcYW1eNM.js} +48 -35
- package/dist/_chunks/list-qP6p0NTw.js +434 -0
- package/dist/_chunks/{logo-BpFoCL-s.js → logo-_Z-jLq80.js} +155 -26
- package/dist/_chunks/{matrix-rain-BEkvux64.js → matrix-rain-CRPMXcVx.js} +8 -2
- package/dist/_chunks/{message-card-qhoGv947.js → message-card-DjvsB_3U.js} +58 -55
- package/dist/_chunks/{message-tray-xHUCra-Y.js → message-tray-BbnAzlLH.js} +86 -91
- package/dist/_chunks/{multi-select.agent-Do6CeQUT.js → multi-select-wqqrgjUQ.js} +326 -291
- package/dist/_chunks/{navigation-menu.agent-D69ND6Qq.js → navigation-menu-ClbHeawy.js} +136 -123
- package/dist/_chunks/{notification-card-CsVEYJE-.js → notification-card-uTPEvAQS.js} +22 -22
- package/dist/_chunks/{notification-tray-DTXMq42J.js → notification-tray-PGtMqXbP.js} +84 -80
- package/dist/_chunks/{number-input-fvGmnRy9.js → number-input-Q7wkHnvQ.js} +7 -3
- package/dist/_chunks/{otp-input-EglXOUue.js → otp-input-C9gUByF0.js} +6 -3
- package/dist/_chunks/{pagination.agent-BkZQl45y.js → pagination-3AC4zTsi.js} +234 -194
- package/dist/_chunks/{password-input-D6kuYXmr.js → password-input-C4LmjIH1.js} +6 -9
- package/dist/_chunks/{patient-shell-BRmrrUUW.js → patient-shell-BlsEUKWB.js} +10 -15
- package/dist/_chunks/{payment-form-BWaXas8z.js → payment-form-B_BdHwjb.js} +197 -188
- package/dist/_chunks/{pdf-viewer.agent-BaGEDheA.js → pdf-viewer-CZIfY08H.js} +270 -241
- package/dist/_chunks/{phone-input-C8Op4sEc.js → phone-input-CSHJOJ13.js} +4 -9
- package/dist/_chunks/popover-DekUKNBk.js +293 -0
- package/dist/_chunks/{privacy-lock.agent-C1i1-T58.js → privacy-lock-BKsI6ReN.js} +117 -109
- package/dist/_chunks/progress-C11tqhoI.js +298 -0
- package/dist/_chunks/{recaptcha-widget.agent-BGHpU5zD.js → recaptcha-widget-NyfOfLII.js} +95 -86
- package/dist/_chunks/resizable-mpXXyIsN.js +483 -0
- package/dist/_chunks/{rich-text-editor.agent-DnE125Tz.js → rich-text-editor-C7TCIlQO.js} +298 -209
- package/dist/_chunks/{scroll-area-DLr5w9Dd.js → scroll-area-DEDU-lp-.js} +67 -54
- package/dist/_chunks/{search-bar.agent-DxFAxctc.js → search-bar-BTDfgYtg.js} +291 -268
- package/dist/_chunks/{search-input-Xw3cdWXW.js → search-input-CdJIEjFo.js} +116 -107
- package/dist/_chunks/{select-DY1Cb2Tg.js → select-y6bXV1f1.js} +84 -83
- package/dist/_chunks/{separator-B4wXDLNC.js → separator-CYU_bGFn.js} +2 -5
- package/dist/_chunks/{sheet-B9kH9pcI.js → sheet-4tgMFwj0.js} +135 -60
- package/dist/_chunks/{sidebar-CHF5xr_P.js → sidebar-Bx3wCDyy.js} +546 -457
- package/dist/_chunks/{sign-in-with-alfadocs-button-BN_FPGHT.js → sign-in-with-alfadocs-button-B9UrqOqH.js} +9 -5
- package/dist/_chunks/{signature-capture.agent-BpeDwFht.js → signature-capture-DjMlFOzS.js} +210 -212
- package/dist/_chunks/{skeleton-dtqyF09N.js → skeleton-CZbwyJAA.js} +9 -3
- package/dist/_chunks/{slider-CcsQTZTA.js → slider-BT2bZWsy.js} +138 -134
- package/dist/_chunks/{slot-grid-D_l5VsHG.js → slot-grid-CgpYgBkW.js} +105 -95
- package/dist/_chunks/{sparkline.agent-56Sj7nOP.js → sparkline-_gy8aJDG.js} +107 -100
- package/dist/_chunks/{spinner-GCcv67vh.js → spinner-DLaYfLPl.js} +66 -14
- package/dist/_chunks/{stat-DUB6g90R.js → stat-B9PHSPbN.js} +45 -27
- package/dist/_chunks/{stepper-calendar.agent-9iT3ClIB.js → stepper-calendar-BLOJUE0-.js} +189 -187
- package/dist/_chunks/stepper-progress-jFY8BSf7.js +208 -0
- package/dist/_chunks/{suggestion-chip-DhFrkRPj.js → suggestion-chip-C4Jz0LrM.js} +50 -52
- package/dist/_chunks/{switch-BYEH8I53.js → switch-C0psfIQF.js} +2 -2
- package/dist/_chunks/{tabs.agent-h7NvsTR1.js → tabs-DaFA3Muo.js} +183 -155
- package/dist/_chunks/{tag-BqidXKo3.js → tag-DuLMjRbF.js} +90 -32
- package/dist/_chunks/{task-card-CY5ztNkU.js → task-card-Dw_ZJDL8.js} +5 -2
- package/dist/_chunks/{task-tray-CCoUdorl.js → task-tray-XlIW9ueh.js} +50 -49
- package/dist/_chunks/{text-area-C_M8wliK.js → text-area-CO9Dz0qX.js} +2 -2
- package/dist/_chunks/{text-input-BX39e6T6.js → text-input-DZwt9L8H.js} +65 -62
- package/dist/_chunks/{theme-root-DDb0TJjd.js → theme-root-CSKD5ZRm.js} +9 -2
- package/dist/_chunks/{theme-toggle.agent-btmXTWdW.js → theme-toggle-B9zzCnvl.js} +179 -177
- package/dist/_chunks/{time-picker-B8AMIrX7.js → time-picker-DvPUmHH-.js} +95 -93
- package/dist/_chunks/{timeline.agent-CRPza9wc.js → timeline-BvmnQadS.js} +96 -96
- package/dist/_chunks/{toast.agent-BjEGuq1Z.js → toast.agent-BwKXA0km.js} +46 -8
- package/dist/_chunks/{tooth-scheme.agent-CWrQBjJM.js → tooth-scheme-3mITSXiZ.js} +146 -162
- package/dist/_chunks/transaction-chip-DE6DITun.js +196 -0
- package/dist/_chunks/{transcript-panel.agent-BXEYP6w-.js → transcript-panel-Bx5ANMsv.js} +110 -101
- package/dist/_chunks/{typing-indicator-CbUBf-Dx.js → typing-indicator-BZ5jXZPn.js} +27 -5
- package/dist/_chunks/{use-theme-BMUhembX.js → use-theme-B1cwAXJR.js} +2 -5
- package/dist/_chunks/{visually-hidden-Bw7vBHLm.js → visually-hidden-BHxEUGyT.js} +11 -2
- package/dist/_chunks/{warning-stack-8Pa3pekh.js → warning-stack-VygGHSqC.js} +11 -13
- package/dist/_chunks/{workflow-map-D2A7rTEG.js → workflow-map-C-nlogPC.js} +430 -452
- package/dist/agent-catalog.json +594 -15
- package/dist/components/_shared/index.d.ts +2 -2
- package/dist/components/accordion/index.d.ts +1 -1
- package/dist/components/accordion/index.js +5 -6
- package/dist/components/agenda-card/index.js +1 -1
- package/dist/components/agenda-tray/agenda-tray.d.ts +1 -1
- package/dist/components/agenda-tray/index.js +1 -1
- package/dist/components/ai-prompt-input/ai-prompt-input.d.ts +1 -1
- package/dist/components/ai-prompt-input/index.js +1 -1
- package/dist/components/alert/index.d.ts +1 -1
- package/dist/components/alert/index.js +1 -1
- package/dist/components/app-frame/index.js +1 -1
- package/dist/components/audio-recorder/index.js +1 -1
- package/dist/components/audio-visualiser/index.js +1 -1
- package/dist/components/autocomplete/index.js +1 -1
- package/dist/components/badge/index.js +1 -1
- package/dist/components/breadcrumb/breadcrumb.d.ts +1 -1
- package/dist/components/breadcrumb/index.js +1 -1
- package/dist/components/button/index.js +2 -2
- package/dist/components/calendar/index.js +1 -1
- package/dist/components/card/index.js +1 -1
- package/dist/components/chart/index.d.ts +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/index.js +2 -3
- package/dist/components/chat-input/chat-input.d.ts +1 -1
- package/dist/components/chat-input/index.js +3 -4
- package/dist/components/chat-message/index.js +1 -1
- package/dist/components/checkbox-group/index.d.ts +1 -1
- package/dist/components/collapsible/collapsible.d.ts +1 -1
- package/dist/components/collapsible/index.d.ts +1 -1
- package/dist/components/collapsible/index.js +1 -1
- package/dist/components/color-picker/index.js +1 -1
- package/dist/components/combobox/index.d.ts +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/index.js +1 -1
- package/dist/components/data-table/data-table.d.ts +3 -1
- package/dist/components/data-table/index.js +1 -1
- package/dist/components/data-table/toolbar.d.ts +6 -5
- package/dist/components/date-picker/date-picker.d.ts +1 -1
- package/dist/components/date-picker/index.d.ts +1 -1
- package/dist/components/date-picker/index.js +1 -1
- package/dist/components/date-range-picker/index.js +1 -1
- package/dist/components/date-time-picker/index.d.ts +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/index.js +1 -1
- package/dist/components/dialog/dialog.d.ts +2 -2
- package/dist/components/dialog/index.js +1 -1
- package/dist/components/dropdown-menu/dropdown-menu.d.ts +11 -16
- package/dist/components/dropdown-menu/index.js +3 -4
- package/dist/components/empty-state/index.js +1 -1
- package/dist/components/file-upload/index.d.ts +1 -1
- package/dist/components/file-upload/index.js +1 -1
- package/dist/components/floating-action-button/index.js +1 -1
- package/dist/components/form-field/index.js +2 -2
- package/dist/components/freemium-paywall/freemium-paywall.d.ts +1 -1
- package/dist/components/freemium-paywall/index.js +1 -1
- package/dist/components/header/index.js +1 -1
- package/dist/components/icon-button/index.js +1 -1
- package/dist/components/index.d.ts +1 -0
- package/dist/components/kbd/index.js +1 -1
- package/dist/components/key-value-pair/index.js +1 -1
- package/dist/components/link/index.js +1 -1
- package/dist/components/link/link.d.ts +1 -0
- package/dist/components/list/index.js +1 -1
- package/dist/components/logo/index.js +1 -1
- package/dist/components/matrix-rain/index.js +1 -1
- package/dist/components/message-card/index.d.ts +1 -1
- package/dist/components/message-card/index.js +1 -1
- package/dist/components/message-tray/index.js +1 -1
- package/dist/components/message-tray/message-tray.d.ts +1 -1
- package/dist/components/multi-select/index.js +1 -1
- package/dist/components/navigation-menu/index.js +1 -1
- package/dist/components/navigation-menu/navigation-menu.d.ts +1 -1
- package/dist/components/notification-card/index.d.ts +1 -1
- package/dist/components/notification-card/index.js +1 -1
- package/dist/components/notification-tray/index.js +1 -1
- package/dist/components/notification-tray/notification-tray.d.ts +1 -1
- package/dist/components/number-input/index.js +1 -1
- package/dist/components/otp-input/index.js +1 -1
- package/dist/components/pagination/index.js +1 -1
- package/dist/components/pagination/pagination.d.ts +4 -6
- package/dist/components/password-input/index.js +1 -1
- package/dist/components/payment-form/index.js +7 -8
- package/dist/components/payment-form/payment-form.d.ts +1 -1
- package/dist/components/pdf-viewer/index.js +1 -1
- package/dist/components/phone-input/index.d.ts +1 -1
- package/dist/components/phone-input/index.js +1 -1
- package/dist/components/popover/index.js +3 -4
- package/dist/components/privacy-lock/index.js +1 -1
- package/dist/components/privacy-lock/privacy-lock.d.ts +1 -1
- package/dist/components/progress/index.js +3 -4
- package/dist/components/recaptcha-widget/index.js +1 -1
- package/dist/components/resizable/index.d.ts +1 -1
- package/dist/components/resizable/index.js +1 -1
- package/dist/components/rich-text-editor/index.js +1 -1
- package/dist/components/scroll-area/index.js +1 -1
- package/dist/components/search-bar/index.js +1 -1
- package/dist/components/search-bar/search-bar.d.ts +1 -1
- package/dist/components/search-input/index.js +1 -1
- package/dist/components/select/index.js +1 -1
- package/dist/components/select/select.d.ts +1 -1
- package/dist/components/separator/index.js +1 -1
- package/dist/components/sheet/index.js +3 -4
- package/dist/components/sheet/sheet.d.ts +2 -2
- package/dist/components/sidebar/index.js +7 -8
- package/dist/components/sidebar/sidebar.d.ts +0 -2
- package/dist/components/sign-in-with-alfadocs-button/index.js +1 -1
- package/dist/components/signature-capture/index.js +1 -1
- package/dist/components/skeleton/index.js +1 -1
- package/dist/components/slider/index.js +1 -1
- package/dist/components/slot-grid/index.js +1 -1
- package/dist/components/sparkline/index.js +1 -1
- package/dist/components/spinner/index.js +1 -1
- package/dist/components/stat/index.js +1 -1
- package/dist/components/stepper-calendar/index.js +1 -1
- package/dist/components/stepper-calendar/stepper-calendar.d.ts +1 -1
- package/dist/components/stepper-progress/index.d.ts +1 -1
- package/dist/components/stepper-progress/index.js +1 -2
- package/dist/components/stepper-progress/stepper-progress.d.ts +1 -1
- package/dist/components/suggestion-chip/index.js +1 -1
- package/dist/components/switch/index.js +1 -1
- package/dist/components/tabs/index.d.ts +1 -1
- package/dist/components/tabs/index.js +1 -1
- package/dist/components/tag/index.js +1 -1
- package/dist/components/task-card/index.js +1 -1
- package/dist/components/task-tray/index.js +1 -1
- package/dist/components/task-tray/task-tray.d.ts +1 -1
- package/dist/components/text-area/index.js +1 -1
- package/dist/components/text-input/index.js +1 -1
- package/dist/components/theme-root/index.js +1 -1
- package/dist/components/theme-toggle/index.js +1 -1
- package/dist/components/theme-toggle/theme-toggle.d.ts +1 -1
- package/dist/components/time-picker/index.js +1 -1
- package/dist/components/time-picker/time-picker.d.ts +1 -1
- package/dist/components/timeline/index.js +1 -1
- package/dist/components/timeline/timeline.d.ts +1 -1
- package/dist/components/toast/index.js +1 -1
- package/dist/components/tooth-scheme/index.js +1 -1
- package/dist/components/tooth-scheme/tooth-scheme.d.ts +1 -1
- package/dist/components/transaction-chip/index.d.ts +3 -0
- package/dist/components/transaction-chip/index.js +5 -0
- package/dist/components/transaction-chip/transaction-chip.d.ts +30 -0
- package/dist/components/transcript-panel/index.js +1 -1
- package/dist/components/transcript-panel/transcript-panel.d.ts +1 -1
- package/dist/components/typing-indicator/index.js +1 -1
- package/dist/components/visually-hidden/index.js +1 -1
- package/dist/components/warning-stack/index.js +1 -1
- package/dist/components/workflow/index.js +1 -1
- package/dist/components/workflow/workflow-editor.d.ts +1 -1
- package/dist/hooks/index.js +1 -1
- package/dist/i18n/config.js +36 -0
- package/dist/i18n/resources.d.ts +36 -0
- package/dist/index.js +394 -402
- package/dist/locales/de.json +12 -0
- package/dist/locales/en.json +12 -0
- package/dist/locales/it.json +12 -0
- package/dist/patterns/leo-assistant/index.js +1 -1
- package/dist/patterns/patient-shell/index.js +1 -1
- package/dist/safe-html/index.js +20 -3
- package/dist/tokens.css +2 -2
- package/package.json +8 -6
- 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-card.agent-B_R47-c9.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/apexcharts-theme-BkSShpEy.js.map +0 -1
- package/dist/_chunks/app-frame-6d7Lu4ea.js.map +0 -1
- package/dist/_chunks/aspect-ratio-DeSNzASA.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/avatar-Dcr6XuDQ.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/button-group-CONver7M.js.map +0 -1
- package/dist/_chunks/button.agent-BuGZBktn.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/check-DPdL_Sm7.js.map +0 -1
- package/dist/_chunks/checkbox-CtPM6Rup.js.map +0 -1
- package/dist/_chunks/checkbox-group-BTdEB6Yo.js.map +0 -1
- package/dist/_chunks/chevron-down-BX_NP2Yh.js.map +0 -1
- package/dist/_chunks/chevron-left-CX1jqD2M.js.map +0 -1
- package/dist/_chunks/chevron-right-BrpYejk0.js.map +0 -1
- package/dist/_chunks/chevron-up-zOEDrmBB.js.map +0 -1
- package/dist/_chunks/chevrons-right-d9MwesPG.js.map +0 -1
- package/dist/_chunks/circle-BkqTgYmt.js.map +0 -1
- package/dist/_chunks/circle-alert-ChA9opNA.js.map +0 -1
- package/dist/_chunks/circle-check-9AeSgJD_.js.map +0 -1
- package/dist/_chunks/circle-x-Du2CmjaU.js.map +0 -1
- package/dist/_chunks/clock-21AGPWJ5.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/compose-refs-C0k0tdqF.js.map +0 -1
- package/dist/_chunks/copy-B00HK7tj.js.map +0 -1
- package/dist/_chunks/createLucideIcon-CrFbzy84.js.map +0 -1
- package/dist/_chunks/date-picker-BqPTn7bO.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/ellipsis-rgGdiK_9.js.map +0 -1
- package/dist/_chunks/empty-state-DQPtRp2b.js.map +0 -1
- package/dist/_chunks/eye-off-xEXDAh5z.js.map +0 -1
- package/dist/_chunks/file-text-DSNuv2B8.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/flag-DZ6V7-hU.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/globe-BkEFMNSg.js.map +0 -1
- package/dist/_chunks/group-options-BvKhQ3xb.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/icon-button-group-DeV3FpNY.js.map +0 -1
- package/dist/_chunks/index-4xgbg-sn.js.map +0 -1
- package/dist/_chunks/index-CJE9uQmb.js.map +0 -1
- package/dist/_chunks/index-CeY1nNvd.js.map +0 -1
- package/dist/_chunks/index-D2ZczOXr.js.map +0 -1
- package/dist/_chunks/info-B9XNKn05.js.map +0 -1
- package/dist/_chunks/input-surface-u4QB0lxe.js.map +0 -1
- package/dist/_chunks/isSameDay-ecuM8PBB.js.map +0 -1
- package/dist/_chunks/isSameMonth-5wNF2f4I.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/live-region-C41SO3cA.js.map +0 -1
- package/dist/_chunks/log-out-616hnn2-.js.map +0 -1
- package/dist/_chunks/logo-BpFoCL-s.js.map +0 -1
- package/dist/_chunks/mail-C8irm52s.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-card.agent-4IeIgrnJ.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/normalize-diacritics-BNGbFNlJ.js.map +0 -1
- package/dist/_chunks/notification-card-CsVEYJE-.js.map +0 -1
- package/dist/_chunks/notification-card.agent-Rqt3ofk9.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/patient-shell-BRmrrUUW.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/plus-CYKNmfuA.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/printer-CeVEWfQq.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/purify.es-DpIUMBYC.js.map +0 -1
- package/dist/_chunks/radio-DvF59ThA.js.map +0 -1
- package/dist/_chunks/radio-group-Cz1a4QCA.js.map +0 -1
- package/dist/_chunks/react-day-picker-C04L_28V.js.map +0 -1
- package/dist/_chunks/recaptcha-widget.agent-BGHpU5zD.js.map +0 -1
- package/dist/_chunks/registry-C9nwlNyL.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/safe-image-src-DstKgCo7.js.map +0 -1
- package/dist/_chunks/scroll-area-DLr5w9Dd.js.map +0 -1
- package/dist/_chunks/search-BonnQsHv.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/search-input.agent-CfZvViOd.js.map +0 -1
- package/dist/_chunks/select-DY1Cb2Tg.js.map +0 -1
- package/dist/_chunks/send-CySZIRPJ.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/skip-link-DmZ3c6cb.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/square-CZoGU14v.js.map +0 -1
- package/dist/_chunks/square-check-big-Jr-0202D.js.map +0 -1
- package/dist/_chunks/stat-DUB6g90R.js.map +0 -1
- package/dist/_chunks/stepper-C-sIpRRU.js.map +0 -1
- package/dist/_chunks/stepper-accordion.agent-ckKYZCIP.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/streaming-text-BgjCTVOw.js.map +0 -1
- package/dist/_chunks/suggestion-chip-DhFrkRPj.js.map +0 -1
- package/dist/_chunks/suggestion-chip.agent-6sNWFj7m.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-card.agent-CUPKYd7w.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-root-DDb0TJjd.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/timestamp-BV2lC-wV.js.map +0 -1
- package/dist/_chunks/toast.agent-BjEGuq1Z.js.map +0 -1
- package/dist/_chunks/tooltip-DHik5yRI.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/triangle-alert-CBPUIzQo.js.map +0 -1
- package/dist/_chunks/typing-indicator-CbUBf-Dx.js.map +0 -1
- package/dist/_chunks/use-debounced-callback-BisrB-Fq.js.map +0 -1
- package/dist/_chunks/use-direction-D6rvvG9G.js.map +0 -1
- package/dist/_chunks/use-locale-BuXR_Zl9.js.map +0 -1
- package/dist/_chunks/use-prefers-reduced-motion-BMwIQRjB.js.map +0 -1
- package/dist/_chunks/use-theme-BMUhembX.js.map +0 -1
- package/dist/_chunks/user-CPxpqFjJ.js.map +0 -1
- package/dist/_chunks/visually-hidden-Bw7vBHLm.js.map +0 -1
- package/dist/_chunks/warning-stack-8Pa3pekh.js.map +0 -1
- package/dist/_chunks/workflow-map-D2A7rTEG.js.map +0 -1
- package/dist/_chunks/x-CCcI3eJp.js.map +0 -1
- package/dist/agent/index.d.ts.map +0 -1
- package/dist/agent/registry.d.ts.map +0 -1
- package/dist/agent/types.d.ts.map +0 -1
- package/dist/brand/logo-asset/Alfadocs_Logo_BW.d.ts.map +0 -1
- package/dist/brand/logo-asset/Alfadocs_Logo_Main.d.ts.map +0 -1
- package/dist/brand/logo-asset/Alfadocs_Logo_Mark.d.ts.map +0 -1
- package/dist/brand/logo-asset/Alfadocs_Logo_Neg.d.ts.map +0 -1
- package/dist/brand/logo-asset/Alfadocs_Logo_Purple.d.ts.map +0 -1
- package/dist/brand/logo-asset/index.d.ts.map +0 -1
- package/dist/components/_shared/calendar-chevron.d.ts.map +0 -1
- package/dist/components/_shared/compose-refs.d.ts.map +0 -1
- package/dist/components/_shared/date-locale.d.ts.map +0 -1
- package/dist/components/_shared/date-picker-variants.d.ts.map +0 -1
- package/dist/components/_shared/date-utils.d.ts.map +0 -1
- package/dist/components/_shared/group-options.d.ts.map +0 -1
- package/dist/components/_shared/index.d.ts.map +0 -1
- package/dist/components/_shared/input-surface.d.ts.map +0 -1
- package/dist/components/_shared/normalize-diacritics.d.ts.map +0 -1
- package/dist/components/_shared/option.d.ts.map +0 -1
- package/dist/components/_shared/safe-html.d.ts.map +0 -1
- package/dist/components/_shared/safe-image-src.d.ts.map +0 -1
- package/dist/components/_shared/stepper.d.ts.map +0 -1
- package/dist/components/_shared/time.d.ts.map +0 -1
- package/dist/components/_shared/use-debounced-callback.d.ts.map +0 -1
- package/dist/components/_shared/use-direction.d.ts.map +0 -1
- package/dist/components/_shared/use-focus-trap.d.ts.map +0 -1
- package/dist/components/_shared/use-neutralize-hidden-focus.d.ts.map +0 -1
- package/dist/components/accordion/accordion.agent.d.ts.map +0 -1
- package/dist/components/accordion/accordion.d.ts.map +0 -1
- package/dist/components/accordion/index.d.ts.map +0 -1
- package/dist/components/accordion/index.js.map +0 -1
- package/dist/components/agenda-card/agenda-card.agent.d.ts.map +0 -1
- package/dist/components/agenda-card/agenda-card.d.ts.map +0 -1
- package/dist/components/agenda-card/index.d.ts.map +0 -1
- package/dist/components/agenda-card/index.js.map +0 -1
- package/dist/components/agenda-tray/agenda-tray.agent.d.ts.map +0 -1
- package/dist/components/agenda-tray/agenda-tray.d.ts.map +0 -1
- package/dist/components/agenda-tray/index.d.ts.map +0 -1
- package/dist/components/agenda-tray/index.js.map +0 -1
- package/dist/components/ai-prompt-input/ai-prompt-input.agent.d.ts.map +0 -1
- package/dist/components/ai-prompt-input/ai-prompt-input.d.ts.map +0 -1
- package/dist/components/ai-prompt-input/index.d.ts.map +0 -1
- package/dist/components/ai-prompt-input/index.js.map +0 -1
- package/dist/components/alert/alert.d.ts.map +0 -1
- package/dist/components/alert/index.d.ts.map +0 -1
- package/dist/components/alert/index.js.map +0 -1
- package/dist/components/app-frame/app-frame.d.ts.map +0 -1
- package/dist/components/app-frame/index.d.ts.map +0 -1
- package/dist/components/app-frame/index.js.map +0 -1
- package/dist/components/aspect-ratio/aspect-ratio.d.ts.map +0 -1
- package/dist/components/aspect-ratio/index.d.ts.map +0 -1
- package/dist/components/aspect-ratio/index.js.map +0 -1
- package/dist/components/audio-recorder/audio-recorder.agent.d.ts.map +0 -1
- package/dist/components/audio-recorder/audio-recorder.d.ts.map +0 -1
- package/dist/components/audio-recorder/index.d.ts.map +0 -1
- package/dist/components/audio-recorder/index.js.map +0 -1
- package/dist/components/audio-visualiser/audio-visualiser.d.ts.map +0 -1
- package/dist/components/audio-visualiser/index.d.ts.map +0 -1
- package/dist/components/audio-visualiser/index.js.map +0 -1
- package/dist/components/autocomplete/autocomplete.agent.d.ts.map +0 -1
- package/dist/components/autocomplete/autocomplete.d.ts.map +0 -1
- package/dist/components/autocomplete/index.d.ts.map +0 -1
- package/dist/components/autocomplete/index.js.map +0 -1
- package/dist/components/avatar/avatar.d.ts.map +0 -1
- package/dist/components/avatar/index.d.ts.map +0 -1
- package/dist/components/avatar/index.js.map +0 -1
- package/dist/components/badge/badge.d.ts.map +0 -1
- package/dist/components/badge/index.d.ts.map +0 -1
- package/dist/components/badge/index.js.map +0 -1
- package/dist/components/breadcrumb/breadcrumb.agent.d.ts.map +0 -1
- package/dist/components/breadcrumb/breadcrumb.d.ts.map +0 -1
- package/dist/components/breadcrumb/index.d.ts.map +0 -1
- package/dist/components/breadcrumb/index.js.map +0 -1
- package/dist/components/button/button.agent.d.ts.map +0 -1
- package/dist/components/button/button.d.ts.map +0 -1
- package/dist/components/button/icon-button.d.ts.map +0 -1
- package/dist/components/button/index.d.ts.map +0 -1
- package/dist/components/button/index.js.map +0 -1
- package/dist/components/button-group/button-group.d.ts.map +0 -1
- package/dist/components/button-group/index.d.ts.map +0 -1
- package/dist/components/button-group/index.js.map +0 -1
- package/dist/components/calendar/calendar.agent.d.ts.map +0 -1
- package/dist/components/calendar/calendar.d.ts.map +0 -1
- package/dist/components/calendar/contrast-warning.d.ts.map +0 -1
- package/dist/components/calendar/index.d.ts.map +0 -1
- package/dist/components/calendar/index.js.map +0 -1
- package/dist/components/card/card.d.ts.map +0 -1
- package/dist/components/card/index.d.ts.map +0 -1
- package/dist/components/card/index.js.map +0 -1
- package/dist/components/chart/chart.agent.d.ts.map +0 -1
- package/dist/components/chart/chart.d.ts.map +0 -1
- package/dist/components/chart/index.d.ts.map +0 -1
- package/dist/components/chart/index.js.map +0 -1
- package/dist/components/chat-container/chat-container.agent.d.ts.map +0 -1
- package/dist/components/chat-container/chat-container.d.ts.map +0 -1
- package/dist/components/chat-container/index.d.ts.map +0 -1
- package/dist/components/chat-container/index.js.map +0 -1
- package/dist/components/chat-input/chat-input.agent.d.ts.map +0 -1
- package/dist/components/chat-input/chat-input.d.ts.map +0 -1
- package/dist/components/chat-input/index.d.ts.map +0 -1
- package/dist/components/chat-input/index.js.map +0 -1
- package/dist/components/chat-message/chat-message.d.ts.map +0 -1
- package/dist/components/chat-message/index.d.ts.map +0 -1
- package/dist/components/chat-message/index.js.map +0 -1
- package/dist/components/checkbox/checkbox-group-context.d.ts.map +0 -1
- package/dist/components/checkbox/checkbox.agent.d.ts.map +0 -1
- package/dist/components/checkbox/checkbox.d.ts.map +0 -1
- package/dist/components/checkbox/index.d.ts.map +0 -1
- package/dist/components/checkbox/index.js.map +0 -1
- package/dist/components/checkbox-group/checkbox-group.agent.d.ts.map +0 -1
- package/dist/components/checkbox-group/checkbox-group.d.ts.map +0 -1
- package/dist/components/checkbox-group/index.d.ts.map +0 -1
- package/dist/components/checkbox-group/index.js.map +0 -1
- package/dist/components/collapsible/collapsible.agent.d.ts.map +0 -1
- package/dist/components/collapsible/collapsible.d.ts.map +0 -1
- package/dist/components/collapsible/index.d.ts.map +0 -1
- package/dist/components/collapsible/index.js.map +0 -1
- package/dist/components/color-picker/color-picker.agent.d.ts.map +0 -1
- package/dist/components/color-picker/color-picker.d.ts.map +0 -1
- package/dist/components/color-picker/color-utils.d.ts.map +0 -1
- package/dist/components/color-picker/index.d.ts.map +0 -1
- package/dist/components/color-picker/index.js.map +0 -1
- package/dist/components/color-picker/palettes.d.ts.map +0 -1
- package/dist/components/combobox/combobox.agent.d.ts.map +0 -1
- package/dist/components/combobox/combobox.d.ts.map +0 -1
- package/dist/components/combobox/index.d.ts.map +0 -1
- package/dist/components/combobox/index.js.map +0 -1
- package/dist/components/command-palette/command-palette.agent.d.ts.map +0 -1
- package/dist/components/command-palette/command-palette.d.ts.map +0 -1
- package/dist/components/command-palette/index.d.ts.map +0 -1
- package/dist/components/command-palette/index.js.map +0 -1
- package/dist/components/data-table/cell-renderers/actions-cell-renderer.d.ts.map +0 -1
- package/dist/components/data-table/cell-renderers/balance-cell-renderer.d.ts.map +0 -1
- package/dist/components/data-table/cell-renderers/color-dot-cell-renderer.d.ts.map +0 -1
- package/dist/components/data-table/cell-renderers/currency-cell-renderer.d.ts.map +0 -1
- package/dist/components/data-table/cell-renderers/date-cell-renderer.d.ts.map +0 -1
- package/dist/components/data-table/cell-renderers/link-cell-renderer.d.ts.map +0 -1
- package/dist/components/data-table/cell-renderers/status-cell-renderer.d.ts.map +0 -1
- package/dist/components/data-table/cell-renderers/tag-list-cell-renderer.d.ts.map +0 -1
- package/dist/components/data-table/cell-renderers/toggle-cell-renderer.d.ts.map +0 -1
- package/dist/components/data-table/cell-renderers/user-cell-renderer.d.ts.map +0 -1
- package/dist/components/data-table/data-table.agent.d.ts.map +0 -1
- package/dist/components/data-table/data-table.d.ts.map +0 -1
- package/dist/components/data-table/hooks/use-total-row.d.ts.map +0 -1
- package/dist/components/data-table/index.d.ts.map +0 -1
- package/dist/components/data-table/index.js.map +0 -1
- package/dist/components/data-table/toolbar.d.ts.map +0 -1
- package/dist/components/date-picker/date-picker.agent.d.ts.map +0 -1
- package/dist/components/date-picker/date-picker.d.ts.map +0 -1
- package/dist/components/date-picker/index.d.ts.map +0 -1
- package/dist/components/date-picker/index.js.map +0 -1
- package/dist/components/date-range-picker/date-range-picker.agent.d.ts.map +0 -1
- package/dist/components/date-range-picker/date-range-picker.d.ts.map +0 -1
- package/dist/components/date-range-picker/index.d.ts.map +0 -1
- package/dist/components/date-range-picker/index.js.map +0 -1
- package/dist/components/date-time-picker/date-time-picker.agent.d.ts.map +0 -1
- package/dist/components/date-time-picker/date-time-picker.d.ts.map +0 -1
- package/dist/components/date-time-picker/index.d.ts.map +0 -1
- package/dist/components/date-time-picker/index.js.map +0 -1
- package/dist/components/description-list/description-list.d.ts.map +0 -1
- package/dist/components/description-list/index.d.ts.map +0 -1
- package/dist/components/description-list/index.js.map +0 -1
- package/dist/components/dialog/dialog.agent.d.ts.map +0 -1
- package/dist/components/dialog/dialog.d.ts.map +0 -1
- package/dist/components/dialog/index.d.ts.map +0 -1
- package/dist/components/dialog/index.js.map +0 -1
- package/dist/components/dropdown-menu/dropdown-menu.agent.d.ts.map +0 -1
- package/dist/components/dropdown-menu/dropdown-menu.d.ts.map +0 -1
- package/dist/components/dropdown-menu/index.d.ts.map +0 -1
- package/dist/components/dropdown-menu/index.js.map +0 -1
- package/dist/components/empty-state/empty-state.d.ts.map +0 -1
- package/dist/components/empty-state/index.d.ts.map +0 -1
- package/dist/components/empty-state/index.js.map +0 -1
- package/dist/components/file-upload/file-upload.agent.d.ts.map +0 -1
- package/dist/components/file-upload/file-upload.d.ts.map +0 -1
- package/dist/components/file-upload/index.d.ts.map +0 -1
- package/dist/components/file-upload/index.js.map +0 -1
- package/dist/components/flag/flag.d.ts.map +0 -1
- package/dist/components/flag/index.d.ts.map +0 -1
- package/dist/components/flag/index.js.map +0 -1
- package/dist/components/floating-action-button/floating-action-button.d.ts.map +0 -1
- package/dist/components/floating-action-button/index.d.ts.map +0 -1
- package/dist/components/floating-action-button/index.js.map +0 -1
- package/dist/components/form-field/form-field-context.d.ts.map +0 -1
- package/dist/components/form-field/form-field.d.ts.map +0 -1
- package/dist/components/form-field/index.d.ts.map +0 -1
- package/dist/components/form-field/index.js.map +0 -1
- package/dist/components/freemium-paywall/freemium-paywall.agent.d.ts.map +0 -1
- package/dist/components/freemium-paywall/freemium-paywall.d.ts.map +0 -1
- package/dist/components/freemium-paywall/index.d.ts.map +0 -1
- package/dist/components/freemium-paywall/index.js.map +0 -1
- package/dist/components/header/header.d.ts.map +0 -1
- package/dist/components/header/index.d.ts.map +0 -1
- package/dist/components/header/index.js.map +0 -1
- package/dist/components/icon-button/index.d.ts.map +0 -1
- package/dist/components/icon-button/index.js.map +0 -1
- package/dist/components/icon-button-group/icon-button-group.d.ts.map +0 -1
- package/dist/components/icon-button-group/index.d.ts.map +0 -1
- package/dist/components/icon-button-group/index.js.map +0 -1
- package/dist/components/index.d.ts.map +0 -1
- package/dist/components/kbd/index.d.ts.map +0 -1
- package/dist/components/kbd/index.js.map +0 -1
- package/dist/components/kbd/kbd.d.ts.map +0 -1
- package/dist/components/key-value-pair/index.d.ts.map +0 -1
- package/dist/components/key-value-pair/index.js.map +0 -1
- package/dist/components/key-value-pair/key-value-pair.d.ts.map +0 -1
- package/dist/components/link/index.d.ts.map +0 -1
- package/dist/components/link/index.js.map +0 -1
- package/dist/components/link/link.d.ts.map +0 -1
- package/dist/components/list/index.d.ts.map +0 -1
- package/dist/components/list/index.js.map +0 -1
- package/dist/components/list/list.agent.d.ts.map +0 -1
- package/dist/components/list/list.d.ts.map +0 -1
- package/dist/components/live-region/index.d.ts.map +0 -1
- package/dist/components/live-region/index.js.map +0 -1
- package/dist/components/live-region/live-region.d.ts.map +0 -1
- package/dist/components/logo/index.d.ts.map +0 -1
- package/dist/components/logo/index.js.map +0 -1
- package/dist/components/logo/logo.d.ts.map +0 -1
- package/dist/components/matrix-rain/index.d.ts.map +0 -1
- package/dist/components/matrix-rain/index.js.map +0 -1
- package/dist/components/matrix-rain/matrix-rain.d.ts.map +0 -1
- package/dist/components/message-card/index.d.ts.map +0 -1
- package/dist/components/message-card/index.js.map +0 -1
- package/dist/components/message-card/message-card.agent.d.ts.map +0 -1
- package/dist/components/message-card/message-card.d.ts.map +0 -1
- package/dist/components/message-tray/index.d.ts.map +0 -1
- package/dist/components/message-tray/index.js.map +0 -1
- package/dist/components/message-tray/message-tray.agent.d.ts.map +0 -1
- package/dist/components/message-tray/message-tray.d.ts.map +0 -1
- package/dist/components/multi-select/index.d.ts.map +0 -1
- package/dist/components/multi-select/index.js.map +0 -1
- package/dist/components/multi-select/multi-select.agent.d.ts.map +0 -1
- package/dist/components/multi-select/multi-select.d.ts.map +0 -1
- package/dist/components/navigation-menu/index.d.ts.map +0 -1
- package/dist/components/navigation-menu/index.js.map +0 -1
- package/dist/components/navigation-menu/navigation-menu.agent.d.ts.map +0 -1
- package/dist/components/navigation-menu/navigation-menu.d.ts.map +0 -1
- package/dist/components/notification-card/index.d.ts.map +0 -1
- package/dist/components/notification-card/index.js.map +0 -1
- package/dist/components/notification-card/notification-card.agent.d.ts.map +0 -1
- package/dist/components/notification-card/notification-card.d.ts.map +0 -1
- package/dist/components/notification-tray/index.d.ts.map +0 -1
- package/dist/components/notification-tray/index.js.map +0 -1
- package/dist/components/notification-tray/notification-tray.agent.d.ts.map +0 -1
- package/dist/components/notification-tray/notification-tray.d.ts.map +0 -1
- package/dist/components/number-input/index.d.ts.map +0 -1
- package/dist/components/number-input/index.js.map +0 -1
- package/dist/components/number-input/number-input.agent.d.ts.map +0 -1
- package/dist/components/number-input/number-input.d.ts.map +0 -1
- package/dist/components/number-input/use-locale-number.d.ts.map +0 -1
- package/dist/components/otp-input/index.d.ts.map +0 -1
- package/dist/components/otp-input/index.js.map +0 -1
- package/dist/components/otp-input/otp-input.agent.d.ts.map +0 -1
- package/dist/components/otp-input/otp-input.d.ts.map +0 -1
- package/dist/components/pagination/index.d.ts.map +0 -1
- package/dist/components/pagination/index.js.map +0 -1
- package/dist/components/pagination/pagination.agent.d.ts.map +0 -1
- package/dist/components/pagination/pagination.d.ts.map +0 -1
- package/dist/components/password-input/index.d.ts.map +0 -1
- package/dist/components/password-input/index.js.map +0 -1
- package/dist/components/password-input/password-input.agent.d.ts.map +0 -1
- package/dist/components/password-input/password-input.d.ts.map +0 -1
- package/dist/components/payment-form/index.d.ts.map +0 -1
- package/dist/components/payment-form/index.js.map +0 -1
- package/dist/components/payment-form/payment-form.agent.d.ts.map +0 -1
- package/dist/components/payment-form/payment-form.d.ts.map +0 -1
- package/dist/components/pdf-viewer/index.d.ts.map +0 -1
- package/dist/components/pdf-viewer/index.js.map +0 -1
- package/dist/components/pdf-viewer/pdf-viewer.agent.d.ts.map +0 -1
- package/dist/components/pdf-viewer/pdf-viewer.d.ts.map +0 -1
- package/dist/components/phone-input/index.d.ts.map +0 -1
- package/dist/components/phone-input/index.js.map +0 -1
- package/dist/components/phone-input/phone-input.agent.d.ts.map +0 -1
- package/dist/components/phone-input/phone-input.d.ts.map +0 -1
- package/dist/components/popover/index.d.ts.map +0 -1
- package/dist/components/popover/index.js.map +0 -1
- package/dist/components/popover/popover.agent.d.ts.map +0 -1
- package/dist/components/popover/popover.d.ts.map +0 -1
- package/dist/components/privacy-lock/index.d.ts.map +0 -1
- package/dist/components/privacy-lock/index.js.map +0 -1
- package/dist/components/privacy-lock/privacy-lock.agent.d.ts.map +0 -1
- package/dist/components/privacy-lock/privacy-lock.d.ts.map +0 -1
- package/dist/components/progress/index.d.ts.map +0 -1
- package/dist/components/progress/index.js.map +0 -1
- package/dist/components/progress/progress.agent.d.ts.map +0 -1
- package/dist/components/progress/progress.d.ts.map +0 -1
- package/dist/components/radio/index.d.ts.map +0 -1
- package/dist/components/radio/index.js.map +0 -1
- package/dist/components/radio-group/index.d.ts.map +0 -1
- package/dist/components/radio-group/index.js.map +0 -1
- package/dist/components/radio-group/radio-group-context.d.ts.map +0 -1
- package/dist/components/radio-group/radio-group.agent.d.ts.map +0 -1
- package/dist/components/radio-group/radio-group.d.ts.map +0 -1
- package/dist/components/radio-group/radio.d.ts.map +0 -1
- package/dist/components/recaptcha-widget/index.d.ts.map +0 -1
- package/dist/components/recaptcha-widget/index.js.map +0 -1
- package/dist/components/recaptcha-widget/recaptcha-widget.agent.d.ts.map +0 -1
- package/dist/components/recaptcha-widget/recaptcha-widget.d.ts.map +0 -1
- package/dist/components/resizable/index.d.ts.map +0 -1
- package/dist/components/resizable/index.js.map +0 -1
- package/dist/components/resizable/resizable-context.d.ts.map +0 -1
- package/dist/components/resizable/resizable.agent.d.ts.map +0 -1
- package/dist/components/resizable/resizable.d.ts.map +0 -1
- package/dist/components/rich-text-editor/index.d.ts.map +0 -1
- package/dist/components/rich-text-editor/index.js.map +0 -1
- package/dist/components/rich-text-editor/rich-text-editor.agent.d.ts.map +0 -1
- package/dist/components/rich-text-editor/rich-text-editor.d.ts.map +0 -1
- package/dist/components/scroll-area/index.d.ts.map +0 -1
- package/dist/components/scroll-area/index.js.map +0 -1
- package/dist/components/scroll-area/scroll-area.d.ts.map +0 -1
- package/dist/components/search-bar/index.d.ts.map +0 -1
- package/dist/components/search-bar/index.js.map +0 -1
- package/dist/components/search-bar/search-bar.agent.d.ts.map +0 -1
- package/dist/components/search-bar/search-bar.d.ts.map +0 -1
- package/dist/components/search-input/index.d.ts.map +0 -1
- package/dist/components/search-input/index.js.map +0 -1
- package/dist/components/search-input/search-input.agent.d.ts.map +0 -1
- package/dist/components/search-input/search-input.d.ts.map +0 -1
- package/dist/components/select/index.d.ts.map +0 -1
- package/dist/components/select/index.js.map +0 -1
- package/dist/components/select/select.agent.d.ts.map +0 -1
- package/dist/components/select/select.d.ts.map +0 -1
- package/dist/components/separator/index.d.ts.map +0 -1
- package/dist/components/separator/index.js.map +0 -1
- package/dist/components/separator/separator.d.ts.map +0 -1
- package/dist/components/sheet/index.d.ts.map +0 -1
- package/dist/components/sheet/index.js.map +0 -1
- package/dist/components/sheet/sheet.agent.d.ts.map +0 -1
- package/dist/components/sheet/sheet.d.ts.map +0 -1
- package/dist/components/sidebar/index.d.ts.map +0 -1
- package/dist/components/sidebar/index.js.map +0 -1
- package/dist/components/sidebar/sidebar.agent.d.ts.map +0 -1
- package/dist/components/sidebar/sidebar.d.ts.map +0 -1
- package/dist/components/sign-in-with-alfadocs-button/index.d.ts.map +0 -1
- package/dist/components/sign-in-with-alfadocs-button/index.js.map +0 -1
- package/dist/components/sign-in-with-alfadocs-button/sign-in-with-alfadocs-button.d.ts.map +0 -1
- package/dist/components/signature-capture/index.d.ts.map +0 -1
- package/dist/components/signature-capture/index.js.map +0 -1
- package/dist/components/signature-capture/signature-capture.agent.d.ts.map +0 -1
- package/dist/components/signature-capture/signature-capture.d.ts.map +0 -1
- package/dist/components/skeleton/index.d.ts.map +0 -1
- package/dist/components/skeleton/index.js.map +0 -1
- package/dist/components/skeleton/skeleton.d.ts.map +0 -1
- package/dist/components/skip-link/index.d.ts.map +0 -1
- package/dist/components/skip-link/index.js.map +0 -1
- package/dist/components/skip-link/skip-link.d.ts.map +0 -1
- package/dist/components/slider/index.d.ts.map +0 -1
- package/dist/components/slider/index.js.map +0 -1
- package/dist/components/slider/slider.agent.d.ts.map +0 -1
- package/dist/components/slider/slider.d.ts.map +0 -1
- package/dist/components/slot-grid/index.d.ts.map +0 -1
- package/dist/components/slot-grid/index.js.map +0 -1
- package/dist/components/slot-grid/slot-grid.d.ts.map +0 -1
- package/dist/components/sparkline/index.d.ts.map +0 -1
- package/dist/components/sparkline/index.js.map +0 -1
- package/dist/components/sparkline/sparkline.agent.d.ts.map +0 -1
- package/dist/components/sparkline/sparkline.d.ts.map +0 -1
- package/dist/components/sparkline/use-linear-trend.d.ts.map +0 -1
- package/dist/components/spinner/index.d.ts.map +0 -1
- package/dist/components/spinner/index.js.map +0 -1
- package/dist/components/spinner/spinner.d.ts.map +0 -1
- package/dist/components/stat/index.d.ts.map +0 -1
- package/dist/components/stat/index.js.map +0 -1
- package/dist/components/stat/stat.d.ts.map +0 -1
- package/dist/components/stepper-accordion/index.d.ts.map +0 -1
- package/dist/components/stepper-accordion/index.js.map +0 -1
- package/dist/components/stepper-accordion/stepper-accordion.agent.d.ts.map +0 -1
- package/dist/components/stepper-accordion/stepper-accordion.d.ts.map +0 -1
- package/dist/components/stepper-calendar/index.d.ts.map +0 -1
- package/dist/components/stepper-calendar/index.js.map +0 -1
- package/dist/components/stepper-calendar/stepper-calendar.agent.d.ts.map +0 -1
- package/dist/components/stepper-calendar/stepper-calendar.d.ts.map +0 -1
- package/dist/components/stepper-progress/index.d.ts.map +0 -1
- package/dist/components/stepper-progress/index.js.map +0 -1
- package/dist/components/stepper-progress/stepper-progress.agent.d.ts.map +0 -1
- package/dist/components/stepper-progress/stepper-progress.d.ts.map +0 -1
- package/dist/components/streaming-text/index.d.ts.map +0 -1
- package/dist/components/streaming-text/index.js.map +0 -1
- package/dist/components/streaming-text/streaming-text.d.ts.map +0 -1
- package/dist/components/suggestion-chip/index.d.ts.map +0 -1
- package/dist/components/suggestion-chip/index.js.map +0 -1
- package/dist/components/suggestion-chip/suggestion-chip.agent.d.ts.map +0 -1
- package/dist/components/suggestion-chip/suggestion-chip.d.ts.map +0 -1
- package/dist/components/switch/index.d.ts.map +0 -1
- package/dist/components/switch/index.js.map +0 -1
- package/dist/components/switch/switch.agent.d.ts.map +0 -1
- package/dist/components/switch/switch.d.ts.map +0 -1
- package/dist/components/tabs/index.d.ts.map +0 -1
- package/dist/components/tabs/index.js.map +0 -1
- package/dist/components/tabs/tabs.agent.d.ts.map +0 -1
- package/dist/components/tabs/tabs.d.ts.map +0 -1
- package/dist/components/tag/index.d.ts.map +0 -1
- package/dist/components/tag/index.js.map +0 -1
- package/dist/components/tag/tag.d.ts.map +0 -1
- package/dist/components/task-card/index.d.ts.map +0 -1
- package/dist/components/task-card/index.js.map +0 -1
- package/dist/components/task-card/task-card.agent.d.ts.map +0 -1
- package/dist/components/task-card/task-card.d.ts.map +0 -1
- package/dist/components/task-tray/index.d.ts.map +0 -1
- package/dist/components/task-tray/index.js.map +0 -1
- package/dist/components/task-tray/task-tray.agent.d.ts.map +0 -1
- package/dist/components/task-tray/task-tray.d.ts.map +0 -1
- package/dist/components/text-area/index.d.ts.map +0 -1
- package/dist/components/text-area/index.js.map +0 -1
- package/dist/components/text-area/text-area.agent.d.ts.map +0 -1
- package/dist/components/text-area/text-area.d.ts.map +0 -1
- package/dist/components/text-input/index.d.ts.map +0 -1
- package/dist/components/text-input/index.js.map +0 -1
- package/dist/components/text-input/text-input.agent.d.ts.map +0 -1
- package/dist/components/text-input/text-input.d.ts.map +0 -1
- package/dist/components/theme-root/index.d.ts.map +0 -1
- package/dist/components/theme-root/index.js.map +0 -1
- package/dist/components/theme-root/theme-root.d.ts.map +0 -1
- package/dist/components/theme-toggle/index.d.ts.map +0 -1
- package/dist/components/theme-toggle/index.js.map +0 -1
- package/dist/components/theme-toggle/theme-toggle.agent.d.ts.map +0 -1
- package/dist/components/theme-toggle/theme-toggle.d.ts.map +0 -1
- package/dist/components/time-picker/index.d.ts.map +0 -1
- package/dist/components/time-picker/index.js.map +0 -1
- package/dist/components/time-picker/time-picker.agent.d.ts.map +0 -1
- package/dist/components/time-picker/time-picker.d.ts.map +0 -1
- package/dist/components/timeline/index.d.ts.map +0 -1
- package/dist/components/timeline/index.js.map +0 -1
- package/dist/components/timeline/timeline.agent.d.ts.map +0 -1
- package/dist/components/timeline/timeline.d.ts.map +0 -1
- package/dist/components/timestamp/index.d.ts.map +0 -1
- package/dist/components/timestamp/index.js.map +0 -1
- package/dist/components/timestamp/timestamp.d.ts.map +0 -1
- package/dist/components/toast/index.d.ts.map +0 -1
- package/dist/components/toast/index.js.map +0 -1
- package/dist/components/toast/toast.agent.d.ts.map +0 -1
- package/dist/components/toast/toast.d.ts.map +0 -1
- package/dist/components/tooltip/index.d.ts.map +0 -1
- package/dist/components/tooltip/index.js.map +0 -1
- package/dist/components/tooltip/tooltip.d.ts.map +0 -1
- package/dist/components/tooth-scheme/index.d.ts.map +0 -1
- package/dist/components/tooth-scheme/index.js.map +0 -1
- package/dist/components/tooth-scheme/tooth-data.d.ts.map +0 -1
- package/dist/components/tooth-scheme/tooth-scheme.agent.d.ts.map +0 -1
- package/dist/components/tooth-scheme/tooth-scheme.d.ts.map +0 -1
- package/dist/components/transcript-panel/index.d.ts.map +0 -1
- package/dist/components/transcript-panel/index.js.map +0 -1
- package/dist/components/transcript-panel/transcript-panel.agent.d.ts.map +0 -1
- package/dist/components/transcript-panel/transcript-panel.d.ts.map +0 -1
- package/dist/components/typing-indicator/index.d.ts.map +0 -1
- package/dist/components/typing-indicator/index.js.map +0 -1
- package/dist/components/typing-indicator/typing-indicator.d.ts.map +0 -1
- package/dist/components/visually-hidden/index.d.ts.map +0 -1
- package/dist/components/visually-hidden/index.js.map +0 -1
- package/dist/components/visually-hidden/visually-hidden.d.ts.map +0 -1
- package/dist/components/warning-stack/index.d.ts.map +0 -1
- package/dist/components/warning-stack/index.js.map +0 -1
- package/dist/components/warning-stack/warning-stack.d.ts.map +0 -1
- package/dist/components/workflow/index.d.ts.map +0 -1
- package/dist/components/workflow/index.js.map +0 -1
- package/dist/components/workflow/workflow-card.d.ts.map +0 -1
- package/dist/components/workflow/workflow-editor.d.ts.map +0 -1
- package/dist/components/workflow/workflow-map.d.ts.map +0 -1
- package/dist/components/workflow/workflow-types.d.ts.map +0 -1
- package/dist/components/workflow/workflow.agent.d.ts.map +0 -1
- package/dist/hooks/index.d.ts.map +0 -1
- package/dist/hooks/index.js.map +0 -1
- package/dist/hooks/use-locale.d.ts.map +0 -1
- package/dist/hooks/use-media-query.d.ts.map +0 -1
- package/dist/hooks/use-prefers-reduced-motion.d.ts.map +0 -1
- package/dist/hooks/use-theme.d.ts.map +0 -1
- package/dist/i18n/config.d.ts.map +0 -1
- package/dist/i18n/config.js.map +0 -1
- package/dist/i18n/resources.d.ts.map +0 -1
- package/dist/index.js.map +0 -1
- package/dist/option/index.js.map +0 -1
- package/dist/patterns/leo-assistant/index.d.ts.map +0 -1
- package/dist/patterns/leo-assistant/index.js.map +0 -1
- package/dist/patterns/leo-assistant/leo-chat-surface.d.ts.map +0 -1
- package/dist/patterns/leo-assistant/leo-embedded.d.ts.map +0 -1
- package/dist/patterns/leo-assistant/leo-popout.d.ts.map +0 -1
- package/dist/patterns/leo-assistant/leo-sidebar.d.ts.map +0 -1
- package/dist/patterns/leo-assistant/leo-types.d.ts.map +0 -1
- package/dist/patterns/patient-shell/index.d.ts.map +0 -1
- package/dist/patterns/patient-shell/index.js.map +0 -1
- package/dist/patterns/patient-shell/patient-shell.d.ts.map +0 -1
- package/dist/safe-html/index.js.map +0 -1
- package/dist/tokens/apexcharts-theme.d.ts.map +0 -1
- package/dist/tokens/themes/bridges/stripe-appearance.d.ts.map +0 -1
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"stepper-progress-Bmen-YXB.js","sources":["../../src/components/stepper-progress/stepper-progress.tsx"],"sourcesContent":["import {\n forwardRef,\n useEffect,\n useImperativeHandle,\n useLayoutEffect,\n useMemo,\n useRef,\n useState,\n type ComponentPropsWithoutRef,\n} from 'react';\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport { useTranslation } from 'react-i18next';\nimport type { StepSpec, StepState } from '../_shared/stepper';\n\n/* -------------------------------------------------------------------- */\n/* StepperProgress */\n/* */\n/* A lightweight \"Step N of M — {label}\" caption + fill bar. Pure */\n/* indicator — no revisit, no per-step click targets. For flows that */\n/* need editable completed steps, reach for `StepperAccordion`. */\n/* -------------------------------------------------------------------- */\n\ntype Size = 'sm' | 'default';\ntype CaptionPosition = 'top' | 'bottom';\ntype Tone = 'progress' | 'error' | 'complete';\n\nconst rootVariants = cva('ds:flex ds:w-full', {\n variants: {\n captionPosition: {\n top: 'ds:flex-col ds:gap-[var(--spacing-xs)]',\n bottom: 'ds:flex-col-reverse ds:gap-[var(--spacing-xs)]',\n },\n },\n defaultVariants: { captionPosition: 'top' },\n});\n\nconst trackVariants = cva(\n 'ds:relative ds:w-full ds:overflow-hidden ds:rounded-[var(--radius-full)] ds:bg-[var(--muted)]',\n {\n variants: {\n size: {\n sm: 'ds:h-[var(--spacing-xs)]',\n default: 'ds:h-[var(--spacing-sm)]',\n },\n },\n defaultVariants: { size: 'default' },\n },\n);\n\nconst fillVariants = cva(\n [\n 'ds:block ds:h-full ds:rounded-[var(--radius-full)]',\n 'ds:[inline-size:calc(var(--stepper-progress-value,0)*1%)]',\n 'ds:transition-[inline-size,background-color] ds:duration-[var(--animation-duration)] ds:ease-[var(--ease-out)]',\n 'ds:motion-reduce:transition-none',\n ].join(' '),\n {\n variants: {\n tone: {\n progress: 'ds:bg-[var(--primary)]',\n error: 'ds:bg-[var(--destructive)]',\n complete: 'ds:bg-[var(--success,var(--primary))]',\n },\n },\n defaultVariants: { tone: 'progress' },\n },\n);\n\nconst captionVariants = cva(\n 'ds:flex ds:items-baseline ds:gap-[var(--spacing-sm)] ds:flex-wrap',\n {\n variants: {\n tone: {\n progress: 'ds:text-[var(--foreground)]',\n error: 'ds:text-[var(--destructive)]',\n complete: 'ds:text-[var(--foreground)]',\n },\n },\n defaultVariants: { tone: 'progress' },\n },\n);\n\nexport interface StepperProgressProps\n extends Omit<ComponentPropsWithoutRef<'div'>, 'aria-label'>,\n VariantProps<typeof trackVariants>,\n VariantProps<typeof rootVariants> {\n /** Active step (0-indexed). */\n activeStep: number;\n /** Step specs — `label` is used in the caption for the active step. */\n steps: StepSpec[];\n /** Override the default `aria-label` on the progressbar. */\n 'aria-label'?: string;\n /** Hide the \"Step N of M — label\" caption. @default false */\n hideCaption?: boolean;\n /** Track size. @default 'default' */\n size?: Size;\n /** Caption position relative to the bar. @default 'top' */\n captionPosition?: CaptionPosition;\n /**\n * Consumer-supplied instance id, surfaced as `data-component-id` so an\n * agent / UI bridge can address this instance.\n */\n id?: string;\n /**\n * Called when an external driver (agent adapter) requests a step change.\n * StepperProgress is a pure indicator and does not own step state itself\n * — this hook lets a host wizard react to agent-driven navigation.\n */\n onStepChange?: (next: number) => void;\n}\n\n/**\n * Imperative handle for agent-readiness. Exposed via `ref`.\n *\n * The handle is the surface the future MCP UI bridge invokes through the\n * runtime registry. Methods are pure functions of the current props +\n * internal state; mutations route through the consumer's `onStepChange`.\n */\nexport interface StepperProgressHandle {\n getCurrentStep: () => number;\n getTotalSteps: () => number;\n gotoStep: (step: number) => void;\n next: () => void;\n previous: () => void;\n}\n\nconst StepperProgress = forwardRef<StepperProgressHandle, StepperProgressProps>(\n (\n {\n activeStep,\n steps,\n 'aria-label': ariaLabel,\n hideCaption = false,\n size = 'default',\n captionPosition = 'top',\n id,\n onStepChange,\n className,\n ...rest\n },\n ref,\n ) => {\n const { t } = useTranslation();\n const fillRef = useRef<HTMLSpanElement>(null);\n\n const total = steps.length;\n const clampedActive = Math.max(0, Math.min(activeStep, total - 1));\n const activeSpec = steps[clampedActive];\n // The progress variant only renders one \"active\" step at a time — the\n // shared four-way state machine collapses to error-or-current here.\n const activeState: StepState =\n activeSpec?.status === 'error' ? 'error' : 'current';\n\n // Fill reaches through the completed segments plus the current one, so\n // a 4-step flow at index 1 fills 50% (2/4). Matches the user's mental\n // model for \"how far along am I\".\n const filledCount = clampedActive + 1;\n const targetPercent = total === 0 ? 0 : (filledCount / total) * 100;\n\n const tone: Tone =\n activeState === 'error'\n ? 'error'\n : clampedActive === total - 1 && total > 0\n ? 'complete'\n : 'progress';\n\n // Mount-in animation: paint at 0 on first render, then swap to the\n // target in a post-mount effect so the CSS transition animates from\n // empty → target. Matches the pattern in `components/progress`.\n const [hasMounted, setHasMounted] = useState(false);\n useEffect(() => {\n setHasMounted(true);\n }, []);\n const percent = hasMounted ? targetPercent : 0;\n\n // Setting a CSS custom property via `style.setProperty` (rather than a\n // JSX `style={{}}` attribute) is the sanctioned escape hatch for\n // runtime-computed CSS tokens per `src/docs/23-constraints.mdx` §4;\n // the `components/progress` bar uses the same pattern for its fill.\n useLayoutEffect(() => {\n fillRef.current?.style.setProperty(\n '--stepper-progress-value',\n String(percent),\n );\n }, [percent]);\n\n const captionText = t('navigation.stepper.stepOfTotal', {\n n: clampedActive + 1,\n total,\n });\n const label = ariaLabel ?? t('navigation.stepper.label');\n const errorCopy =\n activeState === 'error' && activeSpec?.description\n ? activeSpec.description\n : null;\n // `aria-valuetext` is the single AT source — the caption is aria-hidden\n // so anything the caption exposes (label, error description) must be\n // appended here too, or it's invisible to screen-reader users who set\n // `hideCaption`.\n const valueText = [\n captionText,\n activeSpec ? `— ${activeSpec.label}` : null,\n errorCopy,\n ]\n .filter(Boolean)\n .join(' ');\n\n const handle = useMemo<StepperProgressHandle>(\n () => ({\n getCurrentStep: () => clampedActive,\n getTotalSteps: () => total,\n gotoStep: (step: number) => {\n if (!onStepChange) return;\n const clamped = Math.max(0, Math.min(step, Math.max(total - 1, 0)));\n if (clamped !== clampedActive) onStepChange(clamped);\n },\n next: () => {\n if (!onStepChange) return;\n if (clampedActive < total - 1) onStepChange(clampedActive + 1);\n },\n previous: () => {\n if (!onStepChange) return;\n if (clampedActive > 0) onStepChange(clampedActive - 1);\n },\n }),\n [clampedActive, total, onStepChange],\n );\n useImperativeHandle(ref, () => handle, [handle]);\n\n return (\n <div\n id={id}\n data-component=\"stepper-progress\"\n data-component-id={id}\n className={rootVariants({ captionPosition, className })}\n {...rest}\n >\n {hideCaption ? null : (\n <div className={captionVariants({ tone })} aria-hidden=\"true\">\n <span className=\"type-meta ds:font-[var(--font-weight-semibold)]\">\n {captionText}\n </span>\n {activeSpec ? (\n <span className=\"type-meta ds:text-[var(--muted-foreground)]\">\n — {activeSpec.label}\n </span>\n ) : null}\n {errorCopy ? (\n <span className=\"type-meta ds:ms-auto ds:text-[var(--destructive)]\">\n {errorCopy}\n </span>\n ) : null}\n </div>\n )}\n <div\n role=\"progressbar\"\n aria-label={label}\n aria-valuemin={0}\n aria-valuemax={total}\n aria-valuenow={filledCount}\n aria-valuetext={valueText}\n className={trackVariants({ size })}\n >\n <span\n ref={fillRef}\n aria-hidden=\"true\"\n className={fillVariants({ tone })}\n />\n </div>\n </div>\n );\n },\n);\nStepperProgress.displayName = 'StepperProgress';\n\nexport { StepperProgress };\n"],"names":["rootVariants","cva","trackVariants","fillVariants","captionVariants","StepperProgress","forwardRef","activeStep","steps","ariaLabel","hideCaption","size","captionPosition","id","onStepChange","className","rest","ref","t","useTranslation","fillRef","useRef","total","clampedActive","activeSpec","activeState","filledCount","targetPercent","tone","hasMounted","setHasMounted","useState","useEffect","percent","useLayoutEffect","_a","captionText","label","errorCopy","valueText","handle","useMemo","step","clamped","useImperativeHandle","jsxs","jsx"],"mappings":"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"}
|
|
@@ -1,61 +0,0 @@
|
|
|
1
|
-
const s = {
|
|
2
|
-
id: "stepper-progress",
|
|
3
|
-
capabilities: ["navigate"],
|
|
4
|
-
state: {
|
|
5
|
-
currentStep: {
|
|
6
|
-
type: "number",
|
|
7
|
-
descriptionKey: "ui.agent.stepperProgress.state.currentStep",
|
|
8
|
-
description: "Zero-indexed active step.",
|
|
9
|
-
read: (e) => e.getCurrentStep()
|
|
10
|
-
},
|
|
11
|
-
totalSteps: {
|
|
12
|
-
type: "number",
|
|
13
|
-
descriptionKey: "ui.agent.stepperProgress.state.totalSteps",
|
|
14
|
-
description: "Total number of steps in the flow.",
|
|
15
|
-
read: (e) => e.getTotalSteps()
|
|
16
|
-
}
|
|
17
|
-
},
|
|
18
|
-
actions: {
|
|
19
|
-
goto_step: {
|
|
20
|
-
safety: "read",
|
|
21
|
-
argsType: "{ step: number }",
|
|
22
|
-
descriptionKey: "ui.agent.stepperProgress.actions.gotoStep",
|
|
23
|
-
description: "Request the host to activate the given step via onStepChange. No-op when no handler is wired.",
|
|
24
|
-
invoke: (e, t) => {
|
|
25
|
-
e.gotoStep(t.step);
|
|
26
|
-
}
|
|
27
|
-
},
|
|
28
|
-
next: {
|
|
29
|
-
safety: "read",
|
|
30
|
-
descriptionKey: "ui.agent.stepperProgress.actions.next",
|
|
31
|
-
description: "Request the host to advance one step via onStepChange.",
|
|
32
|
-
invoke: (e) => {
|
|
33
|
-
e.next();
|
|
34
|
-
}
|
|
35
|
-
},
|
|
36
|
-
previous: {
|
|
37
|
-
safety: "read",
|
|
38
|
-
descriptionKey: "ui.agent.stepperProgress.actions.previous",
|
|
39
|
-
description: "Request the host to retreat one step via onStepChange.",
|
|
40
|
-
invoke: (e) => {
|
|
41
|
-
e.previous();
|
|
42
|
-
}
|
|
43
|
-
}
|
|
44
|
-
},
|
|
45
|
-
domHooks: {
|
|
46
|
-
root: {
|
|
47
|
-
attr: "data-component",
|
|
48
|
-
value: "stepper-progress",
|
|
49
|
-
description: "Marks the StepperProgress root."
|
|
50
|
-
},
|
|
51
|
-
instanceId: {
|
|
52
|
-
attr: "data-component-id",
|
|
53
|
-
sourceProp: "id",
|
|
54
|
-
description: "Sourced from the id prop."
|
|
55
|
-
}
|
|
56
|
-
}
|
|
57
|
-
};
|
|
58
|
-
export {
|
|
59
|
-
s
|
|
60
|
-
};
|
|
61
|
-
//# sourceMappingURL=stepper-progress.agent-q9InWca4.js.map
|
|
@@ -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":"streaming-text-BgjCTVOw.js","sources":["../../src/components/streaming-text/streaming-text.tsx"],"sourcesContent":["import {\n forwardRef,\n Fragment,\n useEffect,\n useState,\n type HTMLAttributes,\n type ReactNode,\n} from 'react';\nimport { cva, type VariantProps } from 'class-variance-authority';\n\nconst containerVariants = cva(\n 'type-body ds:block ds:whitespace-pre-wrap ds:break-words',\n {\n variants: {\n // Family, weight, tracking, line-height all come from `.type-body` on the base.\n // Size variants override --type-body-size to shift the ramp step.\n size: {\n sm: 'ds:[--type-body-size:var(--font-size-sm)]',\n md: '',\n lg: 'ds:[--type-body-size:var(--font-size-lg)]',\n },\n density: {\n default: '',\n compact: 'ds:[--type-body-size:var(--font-size-sm)] ds:leading-snug',\n },\n },\n defaultVariants: { size: 'md', density: 'default' },\n },\n);\n\ntype NativeProps = Omit<HTMLAttributes<HTMLSpanElement>, 'children' | 'aria-busy' | 'aria-live'>;\n\nexport interface StreamingTextProps\n extends NativeProps,\n VariantProps<typeof containerVariants> {\n /** Accumulated plain-text content. Parent appends tokens as they arrive. */\n content: string;\n /** While true the blinking cursor is shown and aria-busy is set. */\n isStreaming: boolean;\n /** When true, parse a small, safe subset of markdown (bold, inline code, line-breaks).\n * No HTML passes through; no dangerouslySetInnerHTML is ever used. */\n renderMarkdown?: boolean;\n /** Announce updates more aggressively when the streamed content is primary\n * (not wrapped by a higher-level log region). Defaults to 'polite'; never\n * set to 'assertive' for streamed output. */\n ariaLive?: 'polite' | 'off';\n}\n\n/* ------------------------------------------------------------------ */\n/* Safe, dependency-free markdown-ish renderer. */\n/* Handles **bold**, `inline code`, and newlines. Anything that looks */\n/* like HTML stays as text — no dangerouslySetInnerHTML. */\n/* ------------------------------------------------------------------ */\n\ntype Token =\n | { type: 'text'; value: string }\n | { type: 'bold'; value: string }\n | { type: 'code'; value: string }\n | { type: 'br' };\n\nfunction tokenize(input: string): Token[] {\n const tokens: Token[] = [];\n let remaining = input;\n // Alternation: bold | code | newline | text.\n const pattern = /\\*\\*([^*]+)\\*\\*|`([^`]+)`|\\n/;\n while (remaining.length > 0) {\n const match = pattern.exec(remaining);\n if (!match) {\n tokens.push({ type: 'text', value: remaining });\n break;\n }\n if (match.index > 0) {\n tokens.push({ type: 'text', value: remaining.slice(0, match.index) });\n }\n if (match[1] !== undefined) {\n tokens.push({ type: 'bold', value: match[1] });\n } else if (match[2] !== undefined) {\n tokens.push({ type: 'code', value: match[2] });\n } else {\n tokens.push({ type: 'br' });\n }\n remaining = remaining.slice(match.index + match[0].length);\n }\n return tokens;\n}\n\nfunction renderTokens(input: string): ReactNode {\n return tokenize(input).map((tok, i) => {\n if (tok.type === 'bold') return <strong key={i}>{tok.value}</strong>;\n if (tok.type === 'code') {\n return (\n <code\n key={i}\n dir=\"ltr\"\n className=\"ds:rounded-[var(--radius-sm)] ds:bg-muted/20 ds:ps-[var(--spacing-xs)] ds:pe-[var(--spacing-xs)] ds:font-[family-name:var(--font-mono)] ds:text-[length:0.95em]\"\n >\n {tok.value}\n </code>\n );\n }\n if (tok.type === 'br') return <br key={i} />;\n return <Fragment key={i}>{tok.value}</Fragment>;\n });\n}\n\nexport const StreamingText = forwardRef<HTMLSpanElement, StreamingTextProps>(\n (\n {\n content,\n isStreaming,\n renderMarkdown = false,\n ariaLive = 'polite',\n size = 'md',\n density = 'default',\n className,\n ...rest\n },\n ref,\n ) => {\n // Throttle visible content to at most ~10 updates per second so assistive\n // tech doesn't receive one announcement per token. We keep the full text in\n // a ref and push it to state on a timer.\n const [visible, setVisible] = useState<string>(content);\n\n useEffect(() => {\n if (!isStreaming) {\n // Streaming ended — flush immediately.\n setVisible(content);\n return;\n }\n // Global `setTimeout` works in both Node and browsers — avoid the\n // `window.` prefix so SSR (Next.js App Router, Remix) doesn't throw.\n const handle = setTimeout(() => setVisible(content), 100);\n return () => clearTimeout(handle);\n }, [content, isStreaming]);\n\n const body = renderMarkdown ? renderTokens(visible) : visible;\n\n return (\n <span\n ref={ref}\n aria-live={ariaLive}\n aria-busy={isStreaming || undefined}\n data-component=\"streaming-text\"\n className={containerVariants({ size, density, className })}\n {...rest}\n >\n {body}\n {isStreaming ? (\n <span\n aria-hidden=\"true\"\n className={[\n 'ds:inline-block ds:align-baseline',\n 'ds:text-[color:var(--primary)]',\n 'ds:motion-safe:animate-[streaming-cursor-blink_1s_step-end_infinite]',\n 'ds:motion-reduce:opacity-100',\n 'ds:[.theme-accessible_&]:animate-none',\n 'ds:forced-colors:text-[CanvasText]',\n 'ds:ms-[1px]',\n ].join(' ')}\n >\n {'\\u258D'}\n </span>\n ) : null}\n </span>\n );\n },\n);\n\nStreamingText.displayName = 'StreamingText';\n"],"names":["containerVariants","cva","tokenize","input","tokens","remaining","pattern","match","renderTokens","tok","i","jsx","Fragment","StreamingText","forwardRef","content","isStreaming","renderMarkdown","ariaLive","size","density","className","rest","ref","visible","setVisible","useState","useEffect","handle","body","jsxs"],"mappings":"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"}
|
|
@@ -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":"suggestion-chip.agent-6sNWFj7m.js","sources":["../../src/components/suggestion-chip/suggestion-chip.agent.ts"],"sourcesContent":["/* -------------------------------------------------------------------- */\n/* Agent adapter — SuggestionChip. */\n/* */\n/* A single chip is a one-shot button. The DS exposes a handle so an */\n/* automation can `select` or `dismiss` the focused chip. Parents that */\n/* render many chips (via SuggestionChipGroup) ship the item hook */\n/* themselves; this adapter declares only the root hook. */\n/* -------------------------------------------------------------------- */\n\nimport type { AgentAdapter } from '../../agent/types';\nimport type { SuggestionChipHandle } from './suggestion-chip';\n\nexport const suggestionChipAgent: AgentAdapter<SuggestionChipHandle> = {\n id: 'suggestion-chip',\n capabilities: ['pick', 'dismiss'],\n state: {\n value: {\n type: 'string',\n descriptionKey: 'ui.agent.suggestionChip.state.value',\n description: 'The chip\\'s emitted value (its `value` prop or string child).',\n read: (handle) => handle.getValue(),\n },\n },\n actions: {\n select: {\n safety: 'write',\n descriptionKey: 'ui.agent.suggestionChip.actions.select',\n description: 'Activate the chip — fires onSelect and (by default) self-removes.',\n invoke: (handle) => {\n handle.select();\n },\n },\n dismiss: {\n safety: 'destructive',\n descriptionKey: 'ui.agent.suggestionChip.actions.dismiss',\n description: 'Remove the chip without activating it.',\n invoke: (handle) => {\n handle.dismiss();\n },\n },\n },\n domHooks: {\n root: {\n attr: 'data-component',\n value: 'suggestion-chip',\n description: 'Marks the chip button. Per chip — a parent rendering many chips ships its own item hook.',\n },\n instanceId: {\n attr: 'data-component-id',\n sourceProp: 'id',\n description: 'Sourced from the id prop.',\n },\n },\n};\n"],"names":["suggestionChipAgent","handle"],"mappings":"AAYO,MAAMA,IAA0D;AAAA,EACrE,IAAI;AAAA,EACJ,cAAc,CAAC,QAAQ,SAAS;AAAA,EAChC,OAAO;AAAA,IACL,OAAO;AAAA,MACL,MAAM;AAAA,MACN,gBAAgB;AAAA,MAChB,aAAa;AAAA,MACb,MAAM,CAACC,MAAWA,EAAO,SAAA;AAAA,IAAS;AAAA,EACpC;AAAA,EAEF,SAAS;AAAA,IACP,QAAQ;AAAA,MACN,QAAQ;AAAA,MACR,gBAAgB;AAAA,MAChB,aAAa;AAAA,MACb,QAAQ,CAACA,MAAW;AAClB,QAAAA,EAAO,OAAA;AAAA,MACT;AAAA,IAAA;AAAA,IAEF,SAAS;AAAA,MACP,QAAQ;AAAA,MACR,gBAAgB;AAAA,MAChB,aAAa;AAAA,MACb,QAAQ,CAACA,MAAW;AAClB,QAAAA,EAAO,QAAA;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":"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":";;;;;;;;;;;AA6BO,MAAMA,IAAmBC;AAAA,EAC9B;AAAA,EACA;AAAA,IACE,UAAU;AAAA,MACR,SAAS;AAAA;AAAA,QAEP,SAAS;AAAA;AAAA,QAET,YAAY;AAAA;AAAA,QAEZ,OAAO;AAAA,MAAA;AAAA,MAET,aAAa;AAAA,QACX,YAAY;AAAA,QACZ,UAAU;AAAA,MAAA;AAAA,IACZ;AAAA,IAEF,iBAAiB;AAAA,MACf,SAAS;AAAA,MACT,aAAa;AAAA,IAAA;AAAA,EACf;AAEJ,GAEaC,IAAsBD;AAAA,EACjC;AAAA,IACE;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EAAA,EACA,KAAK,GAAG;AAAA,EACV;AAAA,IACE,UAAU;AAAA,MACR,SAAS;AAAA,QACP,SAAS;AAAA,UACP;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,QAAA,EACA,KAAK,GAAG;AAAA,QACV,YAAY;AAAA,UACV;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,QAAA,EACA,KAAK,GAAG;AAAA,QACV,OAAO;AAAA,UACL;AAAA,UACA;AAAA,UACA;AAAA,QAAA,EACA,KAAK,GAAG;AAAA,MAAA;AAAA,MAEZ,MAAM;AAAA,QACJ,IAAI;AAAA,QACJ,IAAI;AAAA,QACJ,IAAI;AAAA,MAAA;AAAA,MAEN,aAAa;AAAA,QACX,YAAY;AAAA,QACZ,UAAU;AAAA,MAAA;AAAA,IACZ;AAAA,IAEF,iBAAiB;AAAA,MACf,SAAS;AAAA,MACT,MAAM;AAAA,MACN,aAAa;AAAA,IAAA;AAAA,EACf;AAEJ,GAiBME,IAAcC,EAAgC;AAAA,EAClD,SAAS;AAAA,EACT,MAAM;AAAA,EACN,aAAa;AAAA,EACb,UAAU;AAAA,EACV,OAAO;AAAA,EACP,UAAU,MAAM;AAAA,EAAC;AACnB,CAAC,GA8DKC,IAAWC;AAAA,EACf,CACE;AAAA,IACE,SAAAC,IAAU;AAAA,IACV,MAAAC,IAAO;AAAA,IACP,aAAAC,IAAc;AAAA,IACd,UAAAC,IAAW;AAAA,IACX,WAAAC;AAAA,IACA,UAAAC;AAAA,IACA,OAAOC;AAAA,IACP,cAAAC;AAAA,IACA,eAAAC;AAAA,IACA,IAAAC;AAAA,IACA,GAAGC;AAAA,EAAA,GAELC,MACG;AACH,UAAMC,IAAUC,EAAuB,IAAI,GACrCC,IAAcC,EAAYJ,GAAKC,CAAO,GACtCI,IAAMC,EAAaL,CAAO,GAQ1BM,IAAeZ,MAAc,QAC7B,CAACa,GAAeC,CAAgB,IAAIC,EAAiBd,KAAgB,EAAE,GACvEe,IAAQJ,IAAgBZ,KAAa,KAAMa,GAC3CI,IAAWC;AAAA,MACf,CAACC,MAAiB;AAChB,QAAKP,KAAcE,EAAiBK,CAAI,GACxCjB,KAAA,QAAAA,EAAgBiB;AAAA,MAClB;AAAA,MACA,CAACP,GAAcV,CAAa;AAAA,IAAA,GAGxBkB,IAAWC;AAAA,MACf,OAAO,EAAE,SAAA3B,GAAS,MAAAC,GAAM,aAAAC,GAAa,UAAAC,GAAU,OAAAmB,GAAO,UAAAC;MACtD,CAACvB,GAASC,GAAMC,GAAaC,GAAUmB,GAAOC,CAAQ;AAAA,IAAA;AAGxD,WACE,gBAAAK,EAAChC,EAAY,UAAZ,EAAqB,OAAO8B,GAC3B,UAAA,gBAAAE;AAAA,MAACC,EAAc;AAAA,MAAd;AAAA,QACC,KAAKf;AAAA,QACL,aAAAZ;AAAA,QACA,KAAAc;AAAA,QAIA,OAAAM;AAAA,QACA,eAAeC;AAAA,QACf,IAAAd;AAAA,QACA,kBAAe;AAAA,QACf,qBAAmBA;AAAA,QACnB,WAAWqB;AAAA,UACT;AAAA,UACA5B,MAAgB,aAAa,2CAA2C;AAAA,UACxEE;AAAA,QAAA;AAAA,QAED,GAAGM;AAAA,QAEH,UAAAL;AAAA,MAAA;AAAA,IAAA,GAEL;AAAA,EAEJ;AACF;AACAP,EAAS,cAAc;AAMvB,MAAMiC,IAAWhC;AAAA,EACf,CAAC,EAAE,WAAAK,GAAW,UAAAC,GAAU,cAAc2B,GAAW,GAAGtB,EAAA,GAASC,MAAQ;AACnE,UAAM,EAAE,SAAAX,GAAS,MAAAC,GAAM,aAAAC,GAAa,UAAAC,GAAU,OAAAmB,GAAO,UAAAC,EAAA,IAAaU,EAAWrC,CAAW,GAClF,EAAE,GAAAsC,EAAA,IAAMC,EAAe,IAAI,GAE3BC,IAAUvB,EAAuB,IAAI,GACrC,CAACwB,GAAcC,CAAe,IAAIjB,EAA6C,CAAA,CAAE,GACjFkB,IAAerC,MAAgB,cAM/BsC,IAAqBrC,MAAa,cAAcoC;AAEtD,IAAAE,EAAU,MAAM;AACd,UAAI,CAACD,GAAoB;AACvB,QAAAF,EAAgB,CAAA,CAAE;AAClB;AAAA,MACF;AACA,YAAMI,IAAKN,EAAQ;AACnB,UAAI,CAACM,EAAI;AAET,YAAMC,IAAiB,MAAM;AAC3B,cAAMC,IAAiBF,EAAG,sBAAA,EAAwB,OAC5CG,IAA6C,CAAA;AACnD,QAAAH,EAAG,iBAAoC,cAAc,EAAE,QAAQ,CAACI,MAAQ;;AAEtE,cADaA,EAAI,sBAAA,EACR,QAAQF,IAAiB,GAAG;AACnC,kBAAMtB,IAAQwB,EAAI,aAAa,YAAY,KAAKA,EAAI,QAAQ,SAAY,IAClEC,MAAQC,IAAAF,EAAI,gBAAJ,gBAAAE,EAAiB,WAAU1B;AACzC,YAAAuB,EAAO,KAAK,EAAE,OAAAvB,GAAO,OAAAyB,GAAO;AAAA,UAC9B;AAAA,QACF,CAAC,GACDT,EAAgBO,CAAM;AAAA,MACxB,GAEMI,IAAK,IAAI,eAAeN,CAAc;AAC5C,aAAAM,EAAG,QAAQP,CAAE,GACbC,EAAA,GACO,MAAMM,EAAG,WAAA;AAAA,IAClB,GAAG,CAACT,GAAoBnC,CAAQ,CAAC;AAEjC,UAAM6C,IAAc,CAACC,MAAgC;AAClD,MAAAf,EAAoD,UAAUe,GAC3D,OAAOxC,KAAQ,aAAYA,EAAIwC,CAAI,IAC9BxC,MAAMA,EAAgD,UAAUwC;AAAA,IAC3E,GAMMC,IAAgBzB,EAAgC,MAChDxB,MAAa,WAAiB,CAAA,IAC3BkD,EAAS,QAAQhD,CAAQ,EAC7B,OAAO,CAACiD,MAAmDC,EAAeD,CAAK,CAAC,EAChF,OAAO,CAACA,MAAU,OAAOA,EAAM,MAAM,SAAU,YAAYA,EAAM,MAAM,MAAM,SAAS,CAAC,EACvF,IAAI,CAACA,MAAU;AACd,YAAME,IAAeF,EAAM,MAAM,OAC3BG,IAAaH,EAAM,MAAM,UACzBP,IACJ,OAAOU,KAAe,WAClBA,IACA,OAAOA,KAAe,WACpB,OAAOA,CAAU,IACjBD;AACR,aAAO,EAAE,OAAOA,GAAc,OAAAT,EAAA;AAAA,IAChC,CAAC,GACF,CAAC1C,GAAUF,CAAQ,CAAC;AAEvB,WAAIA,MAAa,YAAYoC,IAQzB,gBAAAmB,EAAC,OAAA,EAAI,WAAU,4CAEb,UAAA;AAAA,MAAA,gBAAA9B,EAAC,OAAA,EAAI,WAAU,+BACb,UAAA,gBAAAA;AAAA,QAAC+B;AAAA,QAAA;AAAA,UACC,SAASP;AAAA,UACT,OAAA9B;AAAA,UACA,eAAe,CAACG,MAAS;AACvB,YAAI,OAAOA,KAAS,YAAYA,EAAK,SAAS,OAAYA,CAAI;AAAA,UAChE;AAAA,UACA,MAAAxB;AAAA,UACA,cAAY+B,KAAaE,EAAE,kBAAkB;AAAA,QAAA;AAAA,MAAA,GAEjD;AAAA,MAEA,gBAAAN,EAAC,OAAA,EAAI,WAAU,0DACb,UAAA,gBAAAA;AAAA,QAACC,EAAc;AAAA,QAAd;AAAA,UACC,KAAKqB;AAAA,UACL,cAAYlB;AAAA,UACZ,WAAWvC,EAAiB,EAAE,SAAAO,GAAS,aAAAE,GAAa,WAAAE,GAAW;AAAA,UAC9D,GAAGM;AAAA,UAEH,UAAAL;AAAA,QAAA;AAAA,MAAA,EACH,CACF;AAAA,IAAA,GACF,IAKF,gBAAAqD,EAAC,OAAA,EAAI,WAAU,uCACb,UAAA;AAAA,MAAA,gBAAA9B;AAAA,QAACC,EAAc;AAAA,QAAd;AAAA,UACC,KAAKqB;AAAA,UACL,cAAYlB;AAAA,UACZ,WAAWvC,EAAiB,EAAE,SAAAO,GAAS,aAAAE,GAAa,WAAAE,GAAW;AAAA,UAC9D,GAAGM;AAAA,UAEH,UAAAL;AAAA,QAAA;AAAA,MAAA;AAAA,MAGFmC,KAAsBH,EAAa,SAAS,KAC3C,gBAAAT,EAACgC,IAAA,EAAa,MAAMvB,GAAc,OAAOH,EAAE,eAAe,GAAG,MAAAjC,EAAA,CAAY;AAAA,IAAA,GAE7E;AAAA,EAEJ;AACF;AACA8B,EAAS,cAAc;AAYvB,SAAS6B,GAAa,EAAE,MAAAC,GAAM,OAAAd,GAAO,MAAA9C,KAA2B;AAC9D,QAAM,EAAE,SAAAD,EAAA,IAAYiC,EAAWrC,CAAW;AAE1C,SACE,gBAAA8D,EAACI,EAAsB,MAAtB,EACC,UAAA;AAAA,IAAA,gBAAAJ;AAAA,MAACI,EAAsB;AAAA,MAAtB;AAAA,QACC,WAAWhC;AAAA,UACTnC,EAAoB,EAAE,SAAAK,GAAS,MAAAC,GAAM,aAAa,cAAc;AAAA,UAChE;AAAA,QAAA;AAAA,QAEF,cAAY8C;AAAA,QAEX,UAAA;AAAA,UAAAA;AAAA,UACD,gBAAAnB,EAACmC,IAAA,EAAY,eAAY,QAAO,WAAU,YAAA,CAAY;AAAA,QAAA;AAAA,MAAA;AAAA,IAAA;AAAA,IAExD,gBAAAnC,EAACkC,EAAsB,QAAtB,EACC,UAAA,gBAAAlC;AAAA,MAACkC,EAAsB;AAAA,MAAtB;AAAA,QACC,YAAY;AAAA,QACZ,WAAWhC;AAAA,UACT;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,QAAA;AAAA,QAGD,YAAK,IAAI,CAAC,EAAE,OAAAR,GAAO,OAAO0C,QACzB,gBAAApC;AAAA,UAACkC,EAAsB;AAAA,UAAtB;AAAA,YAEC,WAAWhC;AAAA,cACT;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,YAAA;AAAA,YAEF,UAAU,MAAM;AACd,oBAAMgB,IAAM,SAAS;AAAA,gBACnB,4BAA4B,IAAI,OAAOxB,CAAK,CAAC;AAAA,cAAA;AAE/C,cAAAwB,KAAA,QAAAA,EAAK,SACLA,KAAA,QAAAA,EAAK,eAAe,EAAE,QAAQ,UAAA;AAAA,YAChC;AAAA,YAEC,UAAAkB;AAAA,UAAA;AAAA,UAhBI1C;AAAA,QAAA,CAkBR;AAAA,MAAA;AAAA,IAAA,EACH,CACF;AAAA,EAAA,GACF;AAEJ;AAMA,MAAM2C,IAAclE;AAAA,EAClB,CACE;AAAA,IACE,SAASmE;AAAA,IACT,MAAMC;AAAA,IACN,aAAaC;AAAA,IACb,MAAAC;AAAA,IACA,OAAAC;AAAA,IACA,aAAAC,IAAc;AAAA,IACd,WAAAC;AAAA,IACA,WAAApE;AAAA,IACA,UAAAC;AAAA,IACA,OAAAiB;AAAA,IACA,WAAAmD;AAAA,IACA,GAAG/D;AAAA,EAAA,GAELC,MACG;AACH,UAAM+D,IAAMzC,EAAWrC,CAAW,GAC5BI,IAAUkE,KAAeQ,EAAI,SAC7BzE,IAAOkE,KAAYO,EAAI,MACvBxE,IAAckE,KAAmBM,EAAI,aAErCC,IAAgB,CAACC,MAA8C;AAGnE,MAAIL,MAAgBK,EAAE,QAAQ,YAAYA,EAAE,QAAQ,iBAClDA,EAAE,eAAA,GACFJ,KAAA,QAAAA,MAEFC,KAAA,QAAAA,EAAYG;AAAA,IACd;AAEA,WACE,gBAAAlB;AAAA,MAAC7B,EAAc;AAAA,MAAd;AAAA,QACC,KAAAlB;AAAA,QACA,OAAAW;AAAA,QACA,cAAYA;AAAA,QACZ,WAAW3B,EAAoB,EAAE,SAAAK,GAAS,MAAAC,GAAM,aAAAC,GAAa,WAAAE,GAAW;AAAA,QACxE,WAAWuE;AAAA,QACV,GAAGjE;AAAA,QAEH,UAAA;AAAA,UAAA2D,uBAAS,QAAA,EAAK,eAAY,QAAO,WAAU,yBAAyB,UAAAA,GAAK;AAAA,UACzEhE;AAAA,UACAiE,KAAS,gBAAA1C,EAAC,QAAA,EAAK,WAAU,eAAe,UAAA0C,GAAM;AAAA,UAC9CC;AAAA;AAAA,UAGC,gBAAA3C;AAAA,YAAC;AAAA,YAAA;AAAA,cACC,eAAY;AAAA,cACZ,WAAWE;AAAA,gBACT;AAAA,gBACA;AAAA,gBACA;AAAA,cAAA;AAAA,cAEF,eAAe,CAAC8C,MAAM;AACpB,gBAAAA,EAAE,gBAAA,GACFA,EAAE,eAAA,GACFJ,KAAA,QAAAA;AAAA,cACF;AAAA,cAEA,UAAA,gBAAA5C,EAACiD,IAAA,EAAE,WAAU,cAAA,CAAc;AAAA,YAAA;AAAA,UAAA;AAAA,QAC7B;AAAA,MAAA;AAAA,IAAA;AAAA,EAIR;AACF;AACAZ,EAAY,cAAc;AAM1B,MAAMa,IAAc/E;AAAA,EAClB,CAAC,EAAE,WAAAK,GAAW,UAAAC,GAAU,GAAGK,EAAA,GAASC,MAClC,gBAAAiB;AAAA,IAACC,EAAc;AAAA,IAAd;AAAA,MACC,KAAAlB;AAAA,MACA,WAAWmB;AAAA,QACT;AAAA,QACA;AAAA,QACA;AAAA,QACA1B;AAAA,MAAA;AAAA,MAED,GAAGM;AAAA,MAEH,UAAAL;AAAA,IAAA;AAAA,EAAA;AAGP;AACAyE,EAAY,cAAc;AAMnB,MAAMC,KAAO,OAAO,OAAOjF,GAAU;AAAA,EAC1C,MAAMA;AAAA,EACN,MAAMiC;AAAA,EACN,SAASkC;AAAA,EACT,SAASa;AACX,CAAC,GC3iBYE,KAAsC;AAAA,EACjD,IAAI;AAAA,EACJ,cAAc,CAAC,iBAAiB,UAAU;AAAA,EAC1C,OAAO;AAAA,IACL,WAAW;AAAA,MACT,MAAM;AAAA,MACN,aAAa;AAAA,MACb,MAAM,CAACC,MAAWA,EAAO,aAAA;AAAA,IAAa;AAAA,EACxC;AAAA,EAEF,SAAS;AAAA,IACP,YAAY;AAAA,MACV,QAAQ;AAAA,MACR,UAAU;AAAA,MACV,aAAa;AAAA,MACb,QAAQ,CAACA,GAAQC,MAA4B;AAC3C,QAAAD,EAAO,UAAUC,EAAK,KAAK;AAAA,MAC7B;AAAA,IAAA;AAAA,EACF;AAAA,EAEF,UAAU;AAAA,IACR,MAAM,EAAE,MAAM,kBAAkB,OAAO,OAAA;AAAA,IACvC,YAAY;AAAA,MACV,MAAM;AAAA,MACN,YAAY;AAAA,MACZ,aAAa;AAAA,IAAA;AAAA,IAEf,MAAM;AAAA,MACJ,MAAM;AAAA,MACN,aAAa;AAAA,IAAA;AAAA,EACf;AAEJ;"}
|
|
@@ -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-card.agent-CUPKYd7w.js","sources":["../../src/components/task-card/task-card.agent.ts"],"sourcesContent":["/* -------------------------------------------------------------------- */\n/* Agent adapter — TaskCard. */\n/* */\n/* Single-task surface. Lifecycle (dismiss, toggle-done) is owned by */\n/* the consumer / host tray; the card emits a DOM hook so a future MCP */\n/* UI bridge can address one rendered card by its task id. */\n/* -------------------------------------------------------------------- */\n\nimport type { AgentAdapter } from '../../agent/types';\n\nexport const taskCardAgent: AgentAdapter = {\n id: 'task-card',\n capabilities: ['dismiss'],\n state: {},\n actions: {},\n domHooks: {\n root: {\n attr: 'data-component',\n value: 'task-card',\n description:\n 'Marks the element as a kit TaskCard. The card root also emits data-component-id sourced from item.id and data-status with the current lifecycle.',\n },\n instanceId: {\n attr: 'data-component-id',\n sourceProp: 'item.id',\n description: 'Sourced from item.id — the stable task identifier.',\n },\n },\n};\n"],"names":["taskCardAgent"],"mappings":"AAUO,MAAMA,IAA8B;AAAA,EACzC,IAAI;AAAA,EACJ,cAAc,CAAC,SAAS;AAAA,EACxB,OAAO,CAAA;AAAA,EACP,SAAS,CAAA;AAAA,EACT,UAAU;AAAA,IACR,MAAM;AAAA,MACJ,MAAM;AAAA,MACN,OAAO;AAAA,MACP,aACE;AAAA,IAAA;AAAA,IAEJ,YAAY;AAAA,MACV,MAAM;AAAA,MACN,YAAY;AAAA,MACZ,aAAa;AAAA,IAAA;AAAA,EACf;AAEJ;"}
|
|
@@ -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":"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","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-root-DDb0TJjd.js","sources":["../../src/components/theme-root/theme-root.tsx"],"sourcesContent":["/* -------------------------------------------------------------------- */\n/* ThemeRoot — declarative wrapper that activates a DS theme. */\n/* */\n/* DS themes are composed from two orthogonal axes (see 04-theming.mdx): */\n/* base: `theme-light` | `theme-dark` */\n/* modifier: `theme-accessible` (AAA contrast, larger target size, */\n/* 0ms animations, 18px base font) */\n/* */\n/* `<ThemeRoot>` owns the class combination so consuming apps don't */\n/* hand-assemble it (and get it wrong under `accessible + dark`, where */\n/* the selector is `.theme-dark.theme-accessible`, not a separate class).*/\n/* */\n/* Rendered as a `<div>` by default. Pass `asChild` to merge the theme */\n/* classes onto a caller-supplied element via Radix `<Slot>` — preserves */\n/* the child's props and correctly forwards refs. Used when the theme */\n/* root is <html> or <body> in a server-rendered layout. */\n/* -------------------------------------------------------------------- */\n\nimport { forwardRef, type HTMLAttributes } from 'react';\nimport { Slot } from '@radix-ui/react-slot';\n\nexport type ThemeBase = 'light' | 'dark';\n\nexport interface ThemeRootProps extends HTMLAttributes<HTMLDivElement> {\n /** Which colour-scheme base to activate. Default: `light`. */\n theme?: ThemeBase;\n /** Layer the AAA `theme-accessible` modifier on top of the base. */\n accessible?: boolean;\n /**\n * When true, merges the theme classes onto the single child element\n * instead of rendering a wrapping `<div>`. Useful when the theme root\n * is `<html>` or `<body>` in an app shell. Refs forward to the child.\n */\n asChild?: boolean;\n}\n\nfunction composeClassName(\n theme: ThemeBase,\n accessible: boolean,\n extra?: string,\n): string {\n const parts = [theme === 'dark' ? 'theme-dark' : 'theme-light'];\n if (accessible) parts.push('theme-accessible');\n if (extra) parts.push(extra);\n return parts.join(' ');\n}\n\nexport const ThemeRoot = forwardRef<HTMLDivElement, ThemeRootProps>(\n (\n { theme = 'light', accessible = false, asChild = false, className, children, ...rest },\n ref,\n ) => {\n const merged = composeClassName(theme, accessible, className);\n const Comp = asChild ? Slot : 'div';\n return (\n <Comp ref={ref} className={merged} data-component=\"theme-root\" {...rest}>\n {children}\n </Comp>\n );\n },\n);\nThemeRoot.displayName = 'ThemeRoot';\n"],"names":["composeClassName","theme","accessible","extra","parts","ThemeRoot","forwardRef","asChild","className","children","rest","ref","merged","jsx","Slot"],"mappings":";;;AAoCA,SAASA,EACPC,GACAC,GACAC,GACQ;AACR,QAAMC,IAAQ,CAACH,MAAU,SAAS,eAAe,aAAa;AAC9D,SAAIC,KAAYE,EAAM,KAAK,kBAAkB,GACzCD,KAAOC,EAAM,KAAKD,CAAK,GACpBC,EAAM,KAAK,GAAG;AACvB;AAEO,MAAMC,IAAYC;AAAA,EACvB,CACE,EAAE,OAAAL,IAAQ,SAAS,YAAAC,IAAa,IAAO,SAAAK,IAAU,IAAO,WAAAC,GAAW,UAAAC,GAAU,GAAGC,EAAA,GAChFC,MACG;AACH,UAAMC,IAASZ,EAAiBC,GAAOC,GAAYM,CAAS;AAE5D,WACE,gBAAAK,EAFWN,IAAUO,IAAO,SAEtB,KAAAH,GAAU,WAAWC,GAAQ,kBAAe,cAAc,GAAGF,GAChE,UAAAD,EAAA,CACH;AAAA,EAEJ;AACF;AACAJ,EAAU,cAAc;"}
|