@alfadocs/ui-kit-debug 0.73.0 → 0.75.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/_chunks/actions-cell-renderer-DLrcSTK_.js +1546 -0
- package/dist/_chunks/actions-cell-renderer-DLrcSTK_.js.map +1 -0
- package/dist/_chunks/{ai-prompt-input-DFm58UjY.js → ai-prompt-input-DziJCGLe.js} +2 -2
- package/dist/_chunks/{ai-prompt-input-DFm58UjY.js.map → ai-prompt-input-DziJCGLe.js.map} +1 -1
- package/dist/_chunks/{audio-recorder-CjAY0GAc.js → audio-recorder-Cc3KuL9y.js} +2 -2
- package/dist/_chunks/{audio-recorder-CjAY0GAc.js.map → audio-recorder-Cc3KuL9y.js.map} +1 -1
- package/dist/_chunks/{bishop-score-Bs6t6Zv1.js → bishop-score-DDW5-gb9.js} +2 -2
- package/dist/_chunks/{bishop-score-Bs6t6Zv1.js.map → bishop-score-DDW5-gb9.js.map} +1 -1
- package/dist/_chunks/{booking-CWnZhZ5g.js → booking-B1Qkcl3c.js} +2 -2
- package/dist/_chunks/{booking-CWnZhZ5g.js.map → booking-B1Qkcl3c.js.map} +1 -1
- package/dist/_chunks/{care-plan-card-CfIP3Vc1.js → care-plan-card-BrwhyIJI.js} +2 -2
- package/dist/_chunks/{care-plan-card-CfIP3Vc1.js.map → care-plan-card-BrwhyIJI.js.map} +1 -1
- package/dist/_chunks/{care-plan-entry-card-CRbS-G00.js → care-plan-entry-card-DWEdCQM3.js} +2 -2
- package/dist/_chunks/{care-plan-entry-card-CRbS-G00.js.map → care-plan-entry-card-DWEdCQM3.js.map} +1 -1
- package/dist/_chunks/data-table-tabs-BEUXiRlu.js +710 -0
- package/dist/_chunks/data-table-tabs-BEUXiRlu.js.map +1 -0
- package/dist/_chunks/document-preview-CGSM_au9.js +181 -0
- package/dist/_chunks/document-preview-CGSM_au9.js.map +1 -0
- package/dist/_chunks/{document-scanner-BE6Jz4Ob.js → document-scanner-B6h1Ir56.js} +2 -2
- package/dist/_chunks/{document-scanner-BE6Jz4Ob.js.map → document-scanner-B6h1Ir56.js.map} +1 -1
- package/dist/_chunks/{field-value-DCXJXKab.js → field-value-DHG6gEKS.js} +2 -2
- package/dist/_chunks/{field-value-DCXJXKab.js.map → field-value-DHG6gEKS.js.map} +1 -1
- package/dist/_chunks/file-Cwe9VC1A.js +40 -0
- package/dist/_chunks/file-Cwe9VC1A.js.map +1 -0
- package/dist/_chunks/file-manager-UF8dkQF1.js +1776 -0
- package/dist/_chunks/file-manager-UF8dkQF1.js.map +1 -0
- package/dist/_chunks/{file-upload-B2SXhRiN.js → file-upload-DENvuhfs.js} +98 -129
- package/dist/_chunks/file-upload-DENvuhfs.js.map +1 -0
- package/dist/_chunks/{gestational-age-calculator-C9Dfis4I.js → gestational-age-calculator-BpYw-WF-.js} +2 -2
- package/dist/_chunks/{gestational-age-calculator-C9Dfis4I.js.map → gestational-age-calculator-BpYw-WF-.js.map} +1 -1
- package/dist/_chunks/{header-settings-CRQDCYgr.js → header-settings-4cwQzeFc.js} +2 -2
- package/dist/_chunks/{header-settings-CRQDCYgr.js.map → header-settings-4cwQzeFc.js.map} +1 -1
- package/dist/_chunks/{icon-picker-BePK27S-.js → icon-picker-CM9ubkew.js} +2 -2
- package/dist/_chunks/{icon-picker-BePK27S-.js.map → icon-picker-CM9ubkew.js.map} +1 -1
- package/dist/_chunks/link-cell-renderer-BQGUs45d.js +711 -0
- package/dist/_chunks/link-cell-renderer-BQGUs45d.js.map +1 -0
- package/dist/_chunks/{locale-picker-Cbfqc0_N.js → locale-picker-GNF3lo8K.js} +2 -2
- package/dist/_chunks/{locale-picker-Cbfqc0_N.js.map → locale-picker-GNF3lo8K.js.map} +1 -1
- package/dist/_chunks/{marketplace-app-shell-Dm6S-hun.js → marketplace-app-shell-D_1tF4La.js} +3 -3
- package/dist/_chunks/{marketplace-app-shell-Dm6S-hun.js.map → marketplace-app-shell-D_1tF4La.js.map} +1 -1
- package/dist/_chunks/{muscle-scheme-B9MIkuj0.js → muscle-scheme-CFBE2dme.js} +6 -14
- package/dist/_chunks/{muscle-scheme-B9MIkuj0.js.map → muscle-scheme-CFBE2dme.js.map} +1 -1
- package/dist/_chunks/{notes-panel-B_8-Mebz.js → notes-panel-Cvdp818a.js} +2 -2
- package/dist/_chunks/{notes-panel-B_8-Mebz.js.map → notes-panel-Cvdp818a.js.map} +1 -1
- package/dist/_chunks/{optical-prescription-BQ75_kf6.js → optical-prescription-BEjYQjiO.js} +2 -2
- package/dist/_chunks/{optical-prescription-BQ75_kf6.js.map → optical-prescription-BEjYQjiO.js.map} +1 -1
- package/dist/_chunks/{patient-details-JkOI3Ijd.js → patient-details-DP4wKyq4.js} +3 -3
- package/dist/_chunks/{patient-details-JkOI3Ijd.js.map → patient-details-DP4wKyq4.js.map} +1 -1
- package/dist/_chunks/{patient-summary-card-CQOLMH3E.js → patient-summary-card-D6kgdTNn.js} +2 -2
- package/dist/_chunks/{patient-summary-card-CQOLMH3E.js.map → patient-summary-card-D6kgdTNn.js.map} +1 -1
- package/dist/_chunks/{patient-table-B_mOe-ZT.js → patient-table-DweKjiXg.js} +122 -118
- package/dist/_chunks/patient-table-DweKjiXg.js.map +1 -0
- package/dist/_chunks/periodontal-chart-D8hOFmde.js +1173 -0
- package/dist/_chunks/periodontal-chart-D8hOFmde.js.map +1 -0
- package/dist/_chunks/periodontal-diagnosis-cco40xTa.js +345 -0
- package/dist/_chunks/periodontal-diagnosis-cco40xTa.js.map +1 -0
- package/dist/_chunks/periodontal-risk-chart-bUGkMwDg.js +334 -0
- package/dist/_chunks/periodontal-risk-chart-bUGkMwDg.js.map +1 -0
- package/dist/_chunks/{popover-DGTKfLWh.js → popover-Cc0a69sw.js} +31 -28
- package/dist/_chunks/{popover-DGTKfLWh.js.map → popover-Cc0a69sw.js.map} +1 -1
- package/dist/_chunks/{pregnancy-dating-IsDVfqJX.js → pregnancy-dating-msMl_6wz.js} +2 -2
- package/dist/_chunks/{pregnancy-dating-IsDVfqJX.js.map → pregnancy-dating-msMl_6wz.js.map} +1 -1
- package/dist/_chunks/{radiograph-panel.agent-e488ooH8.js → radiograph-panel.agent-CxF9pVxd.js} +2 -2
- package/dist/_chunks/{radiograph-panel.agent-e488ooH8.js.map → radiograph-panel.agent-CxF9pVxd.js.map} +1 -1
- package/dist/_chunks/{rich-text-editor-CgA2bYwi.js → rich-text-editor-CCWjNkbx.js} +186 -177
- package/dist/_chunks/rich-text-editor-CCWjNkbx.js.map +1 -0
- package/dist/_chunks/{select-BmCbJMJS.js → select-BW5ecXlX.js} +13 -13
- package/dist/_chunks/{select-BmCbJMJS.js.map → select-BW5ecXlX.js.map} +1 -1
- package/dist/_chunks/{sidebar-CtU35PIX.js → sidebar-C0PbwJBc.js} +357 -320
- package/dist/_chunks/sidebar-C0PbwJBc.js.map +1 -0
- package/dist/_chunks/signature-request-C-mskXwi.js +318 -0
- package/dist/_chunks/signature-request-C-mskXwi.js.map +1 -0
- package/dist/_chunks/{tabs-DVQ941Sj.js → tabs-CVTukWRD.js} +2 -2
- package/dist/_chunks/{tabs-DVQ941Sj.js.map → tabs-CVTukWRD.js.map} +1 -1
- package/dist/_chunks/{tasks-panel-LCK5ZXvU.js → tasks-panel-CjGAhIN8.js} +2 -2
- package/dist/_chunks/{tasks-panel-LCK5ZXvU.js.map → tasks-panel-CjGAhIN8.js.map} +1 -1
- package/dist/_chunks/tooth-data-BwuoKFf4.js +660 -0
- package/dist/_chunks/tooth-data-BwuoKFf4.js.map +1 -0
- package/dist/_chunks/tooth-scheme-BzJ6rcte.js +1483 -0
- package/dist/_chunks/tooth-scheme-BzJ6rcte.js.map +1 -0
- package/dist/_chunks/{unit-converter-3uL_tMCm.js → unit-converter-CSLWFDQh.js} +2 -2
- package/dist/_chunks/{unit-converter-3uL_tMCm.js.map → unit-converter-CSLWFDQh.js.map} +1 -1
- package/dist/agent-catalog.json +1282 -213
- package/dist/agent-i18n/en.json +84 -5
- package/dist/components/_shared/entity-card/entity-card.d.ts +1 -1
- package/dist/components/ai-prompt-input/index.js +1 -1
- package/dist/components/anamnesis-card/anamnesis-card.d.ts +1 -1
- package/dist/components/appointment-card/appointment-card.d.ts +1 -1
- package/dist/components/audio-recorder/index.js +1 -1
- package/dist/components/bishop-score/index.js +1 -1
- package/dist/components/booking/index.js +1 -1
- package/dist/components/card/card.d.ts +1 -1
- package/dist/components/care-plan-card/index.js +1 -1
- package/dist/components/care-plan-entry-card/index.js +1 -1
- package/dist/components/clinical-note-card/clinical-note-card.d.ts +1 -1
- package/dist/components/contact-profile-card/contact-profile-card.d.ts +1 -1
- package/dist/components/data-table/data-table.d.ts.map +1 -1
- package/dist/components/data-table/filters/number-filter.d.ts.map +1 -1
- package/dist/components/data-table/index.js +35 -34
- package/dist/components/data-table/index.js.map +1 -1
- package/dist/components/data-table/toolbar.d.ts +1 -1
- package/dist/components/data-table/toolbar.d.ts.map +1 -1
- package/dist/components/data-table-tabs/data-table-tabs.agent.d.ts +4 -0
- package/dist/components/data-table-tabs/data-table-tabs.agent.d.ts.map +1 -0
- package/dist/components/data-table-tabs/data-table-tabs.d.ts +93 -0
- package/dist/components/data-table-tabs/data-table-tabs.d.ts.map +1 -0
- package/dist/components/data-table-tabs/index.d.ts +5 -0
- package/dist/components/data-table-tabs/index.d.ts.map +1 -0
- package/dist/components/data-table-tabs/index.js +8 -0
- package/dist/components/data-table-tabs/index.js.map +1 -0
- package/dist/components/data-table-tabs/use-data-table-filter-tabs.d.ts +63 -0
- package/dist/components/data-table-tabs/use-data-table-filter-tabs.d.ts.map +1 -0
- package/dist/components/document-preview/document-preview.agent.d.ts +4 -0
- package/dist/components/document-preview/document-preview.agent.d.ts.map +1 -0
- package/dist/components/document-preview/document-preview.d.ts +41 -0
- package/dist/components/document-preview/document-preview.d.ts.map +1 -0
- package/dist/components/document-preview/index.d.ts +4 -0
- package/dist/components/document-preview/index.d.ts.map +1 -0
- package/dist/components/document-preview/index.js +6 -0
- package/dist/components/document-preview/index.js.map +1 -0
- package/dist/components/document-scanner/index.js +1 -1
- package/dist/components/file-manager/dialogs.d.ts +48 -0
- package/dist/components/file-manager/dialogs.d.ts.map +1 -0
- package/dist/components/file-manager/file-manager.agent.d.ts +4 -0
- package/dist/components/file-manager/file-manager.agent.d.ts.map +1 -0
- package/dist/components/file-manager/file-manager.d.ts +82 -0
- package/dist/components/file-manager/file-manager.d.ts.map +1 -0
- package/dist/components/file-manager/folder-tree.d.ts +12 -0
- package/dist/components/file-manager/folder-tree.d.ts.map +1 -0
- package/dist/components/file-manager/index.d.ts +5 -0
- package/dist/components/file-manager/index.d.ts.map +1 -0
- package/dist/components/file-manager/index.js +6 -0
- package/dist/components/file-manager/index.js.map +1 -0
- package/dist/components/file-manager/list-view.d.ts +49 -0
- package/dist/components/file-manager/list-view.d.ts.map +1 -0
- package/dist/components/file-manager/toolbar.d.ts +15 -0
- package/dist/components/file-manager/toolbar.d.ts.map +1 -0
- package/dist/components/file-manager/types.d.ts +167 -0
- package/dist/components/file-manager/types.d.ts.map +1 -0
- package/dist/components/file-manager/utils.d.ts +34 -0
- package/dist/components/file-manager/utils.d.ts.map +1 -0
- package/dist/components/file-upload/index.js +1 -1
- package/dist/components/gestational-age-calculator/index.js +1 -1
- package/dist/components/header-settings/index.js +1 -1
- package/dist/components/icon-picker/index.js +1 -1
- package/dist/components/index.d.ts +7 -0
- package/dist/components/index.d.ts.map +1 -1
- package/dist/components/locale-picker/index.js +1 -1
- package/dist/components/message-card/message-card.d.ts +1 -1
- package/dist/components/muscle-scheme/index.js +1 -1
- package/dist/components/muscle-scheme/muscle-scheme.d.ts.map +1 -1
- package/dist/components/notes-panel/index.js +1 -1
- package/dist/components/notification-card/notification-card.d.ts +1 -1
- package/dist/components/operator-hero/operator-hero.d.ts +1 -1
- package/dist/components/optical-prescription/index.js +1 -1
- package/dist/components/patient-details/index.js +1 -1
- package/dist/components/patient-summary-card/index.js +1 -1
- package/dist/components/patient-summary-card/patient-summary-card.d.ts +1 -1
- package/dist/components/patient-table/columns.d.ts.map +1 -1
- package/dist/components/patient-table/index.js +1 -1
- package/dist/components/payment-card/payment-card.d.ts +1 -1
- package/dist/components/payment-card/payment-request-card.d.ts +1 -1
- package/dist/components/periodontal-chart/index.d.ts +6 -0
- package/dist/components/periodontal-chart/index.d.ts.map +1 -0
- package/dist/components/periodontal-chart/index.js +22 -0
- package/dist/components/periodontal-chart/index.js.map +1 -0
- package/dist/components/periodontal-chart/periodontal-chart-data.d.ts +119 -0
- package/dist/components/periodontal-chart/periodontal-chart-data.d.ts.map +1 -0
- package/dist/components/periodontal-chart/periodontal-chart.agent.d.ts +4 -0
- package/dist/components/periodontal-chart/periodontal-chart.agent.d.ts.map +1 -0
- package/dist/components/periodontal-chart/periodontal-chart.d.ts +69 -0
- package/dist/components/periodontal-chart/periodontal-chart.d.ts.map +1 -0
- package/dist/components/periodontal-chart-card/periodontal-chart-card.d.ts +1 -1
- package/dist/components/periodontal-diagnosis/index.d.ts +6 -0
- package/dist/components/periodontal-diagnosis/index.d.ts.map +1 -0
- package/dist/components/periodontal-diagnosis/index.js +13 -0
- package/dist/components/periodontal-diagnosis/index.js.map +1 -0
- package/dist/components/periodontal-diagnosis/periodontal-diagnosis-data.d.ts +30 -0
- package/dist/components/periodontal-diagnosis/periodontal-diagnosis-data.d.ts.map +1 -0
- package/dist/components/periodontal-diagnosis/periodontal-diagnosis.agent.d.ts +4 -0
- package/dist/components/periodontal-diagnosis/periodontal-diagnosis.agent.d.ts.map +1 -0
- package/dist/components/periodontal-diagnosis/periodontal-diagnosis.d.ts +44 -0
- package/dist/components/periodontal-diagnosis/periodontal-diagnosis.d.ts.map +1 -0
- package/dist/components/periodontal-risk-chart/index.d.ts +6 -0
- package/dist/components/periodontal-risk-chart/index.d.ts.map +1 -0
- package/dist/components/periodontal-risk-chart/index.js +9 -0
- package/dist/components/periodontal-risk-chart/index.js.map +1 -0
- package/dist/components/periodontal-risk-chart/periodontal-risk-chart.agent.d.ts +4 -0
- package/dist/components/periodontal-risk-chart/periodontal-risk-chart.agent.d.ts.map +1 -0
- package/dist/components/periodontal-risk-chart/periodontal-risk-chart.d.ts +28 -0
- package/dist/components/periodontal-risk-chart/periodontal-risk-chart.d.ts.map +1 -0
- package/dist/components/periodontal-risk-chart/periodontal-risk-data.d.ts +47 -0
- package/dist/components/periodontal-risk-chart/periodontal-risk-data.d.ts.map +1 -0
- package/dist/components/popover/index.js +1 -1
- package/dist/components/popover/popover.d.ts +1 -0
- package/dist/components/popover/popover.d.ts.map +1 -1
- package/dist/components/pregnancy-dating/index.js +1 -1
- package/dist/components/product-hub-tray/product-hub-panel.d.ts +1 -1
- package/dist/components/radiograph-panel/index.js +1 -1
- package/dist/components/rich-text-editor/index.js +1 -1
- package/dist/components/select/index.js +1 -1
- package/dist/components/select/select.d.ts.map +1 -1
- package/dist/components/sidebar/index.js +1 -1
- package/dist/components/sidebar/sidebar.d.ts +9 -0
- package/dist/components/sidebar/sidebar.d.ts.map +1 -1
- package/dist/components/skeleton-scheme/index.js +5 -13
- package/dist/components/skeleton-scheme/index.js.map +1 -1
- package/dist/components/stat/stat.d.ts +1 -1
- package/dist/components/tabs/index.js +1 -1
- package/dist/components/tasks-panel/index.js +1 -1
- package/dist/components/tooth-scheme/index.js +29 -28
- package/dist/components/tooth-scheme/index.js.map +1 -1
- package/dist/components/unit-converter/index.js +1 -1
- package/dist/i18n/locales/ar.d.ts +320 -0
- package/dist/i18n/locales/ar.d.ts.map +1 -1
- package/dist/i18n/locales/ar.js +320 -0
- package/dist/i18n/locales/ar.js.map +1 -1
- package/dist/i18n/locales/de.d.ts +320 -0
- package/dist/i18n/locales/de.d.ts.map +1 -1
- package/dist/i18n/locales/de.js +320 -0
- package/dist/i18n/locales/de.js.map +1 -1
- package/dist/i18n/locales/el.d.ts +320 -0
- package/dist/i18n/locales/el.d.ts.map +1 -1
- package/dist/i18n/locales/el.js +320 -0
- package/dist/i18n/locales/el.js.map +1 -1
- package/dist/i18n/locales/en.d.ts +320 -0
- package/dist/i18n/locales/en.d.ts.map +1 -1
- package/dist/i18n/locales/en.js +320 -0
- package/dist/i18n/locales/en.js.map +1 -1
- package/dist/i18n/locales/es.d.ts +320 -0
- package/dist/i18n/locales/es.d.ts.map +1 -1
- package/dist/i18n/locales/es.js +320 -0
- package/dist/i18n/locales/es.js.map +1 -1
- package/dist/i18n/locales/fr.d.ts +320 -0
- package/dist/i18n/locales/fr.d.ts.map +1 -1
- package/dist/i18n/locales/fr.js +320 -0
- package/dist/i18n/locales/fr.js.map +1 -1
- package/dist/i18n/locales/hi.d.ts +320 -0
- package/dist/i18n/locales/hi.d.ts.map +1 -1
- package/dist/i18n/locales/hi.js +320 -0
- package/dist/i18n/locales/hi.js.map +1 -1
- package/dist/i18n/locales/it.d.ts +320 -0
- package/dist/i18n/locales/it.d.ts.map +1 -1
- package/dist/i18n/locales/it.js +320 -0
- package/dist/i18n/locales/it.js.map +1 -1
- package/dist/i18n/locales/ja.d.ts +320 -0
- package/dist/i18n/locales/ja.d.ts.map +1 -1
- package/dist/i18n/locales/ja.js +320 -0
- package/dist/i18n/locales/ja.js.map +1 -1
- package/dist/i18n/locales/nl.d.ts +320 -0
- package/dist/i18n/locales/nl.d.ts.map +1 -1
- package/dist/i18n/locales/nl.js +320 -0
- package/dist/i18n/locales/nl.js.map +1 -1
- package/dist/i18n/locales/pl.d.ts +320 -0
- package/dist/i18n/locales/pl.d.ts.map +1 -1
- package/dist/i18n/locales/pl.js +320 -0
- package/dist/i18n/locales/pl.js.map +1 -1
- package/dist/i18n/locales/pt.d.ts +320 -0
- package/dist/i18n/locales/pt.d.ts.map +1 -1
- package/dist/i18n/locales/pt.js +320 -0
- package/dist/i18n/locales/pt.js.map +1 -1
- package/dist/i18n/locales/ro.d.ts +320 -0
- package/dist/i18n/locales/ro.d.ts.map +1 -1
- package/dist/i18n/locales/ro.js +320 -0
- package/dist/i18n/locales/ro.js.map +1 -1
- package/dist/i18n/locales/ru.d.ts +320 -0
- package/dist/i18n/locales/ru.d.ts.map +1 -1
- package/dist/i18n/locales/ru.js +320 -0
- package/dist/i18n/locales/ru.js.map +1 -1
- package/dist/i18n/locales/sq.d.ts +320 -0
- package/dist/i18n/locales/sq.d.ts.map +1 -1
- package/dist/i18n/locales/sq.js +320 -0
- package/dist/i18n/locales/sq.js.map +1 -1
- package/dist/i18n/locales/sv.d.ts +320 -0
- package/dist/i18n/locales/sv.d.ts.map +1 -1
- package/dist/i18n/locales/sv.js +320 -0
- package/dist/i18n/locales/sv.js.map +1 -1
- package/dist/i18n/locales/tr.d.ts +320 -0
- package/dist/i18n/locales/tr.d.ts.map +1 -1
- package/dist/i18n/locales/tr.js +320 -0
- package/dist/i18n/locales/tr.js.map +1 -1
- package/dist/i18n/locales/zh.d.ts +320 -0
- package/dist/i18n/locales/zh.d.ts.map +1 -1
- package/dist/i18n/locales/zh.js +320 -0
- package/dist/i18n/locales/zh.js.map +1 -1
- package/dist/index.js +832 -782
- package/dist/index.js.map +1 -1
- package/dist/locales/ar.json +320 -0
- package/dist/locales/de.json +320 -0
- package/dist/locales/el.json +320 -0
- package/dist/locales/en.json +320 -0
- package/dist/locales/es.json +320 -0
- package/dist/locales/fr.json +320 -0
- package/dist/locales/hi.json +320 -0
- package/dist/locales/it.json +320 -0
- package/dist/locales/ja.json +320 -0
- package/dist/locales/nl.json +320 -0
- package/dist/locales/pl.json +320 -0
- package/dist/locales/pt.json +320 -0
- package/dist/locales/ro.json +320 -0
- package/dist/locales/ru.json +320 -0
- package/dist/locales/sq.json +320 -0
- package/dist/locales/sv.json +320 -0
- package/dist/locales/tr.json +320 -0
- package/dist/locales/zh.json +320 -0
- package/dist/patterns/marketplace-app-shell/index.js +1 -1
- package/dist/patterns/signature-request/index.d.ts +3 -0
- package/dist/patterns/signature-request/index.d.ts.map +1 -0
- package/dist/patterns/signature-request/index.js +5 -0
- package/dist/patterns/signature-request/index.js.map +1 -0
- package/dist/patterns/signature-request/signature-request.d.ts +81 -0
- package/dist/patterns/signature-request/signature-request.d.ts.map +1 -0
- package/dist/tokens.css +1 -1
- package/package.json +29 -1
- package/dist/_chunks/columns-2-8lq4-b8e.js +0 -15
- package/dist/_chunks/columns-2-8lq4-b8e.js.map +0 -1
- package/dist/_chunks/file-upload-B2SXhRiN.js.map +0 -1
- package/dist/_chunks/link-cell-renderer-CLI7sBkX.js +0 -2210
- package/dist/_chunks/link-cell-renderer-CLI7sBkX.js.map +0 -1
- package/dist/_chunks/patient-table-B_mOe-ZT.js.map +0 -1
- package/dist/_chunks/rich-text-editor-CgA2bYwi.js.map +0 -1
- package/dist/_chunks/sidebar-CtU35PIX.js.map +0 -1
- package/dist/_chunks/tooth-scheme-CX49GycY.js +0 -2133
- package/dist/_chunks/tooth-scheme-CX49GycY.js.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"actions-cell-renderer-DLrcSTK_.js","sources":["../../node_modules/lucide-react/dist/esm/icons/columns-3-cog.mjs","../../src/components/data-table/toolbar.tsx","../../src/components/data-table/filters/text-filter.tsx","../../src/components/data-table/data-table.agent.ts","../../src/components/data-table/data-table.tsx","../../src/components/data-table/cell-renderers/actions-cell-renderer.tsx"],"sourcesContent":["/**\n * @license lucide-react v1.22.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.mjs';\n\nconst __iconNode = [\n [\"path\", { d: \"M10.5 21H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h14a2 2 0 0 1 2 2v5.5\", key: \"1g2yzs\" }],\n [\"path\", { d: \"m14.3 19.6 1-.4\", key: \"11sv9r\" }],\n [\"path\", { d: \"M15 3v7.5\", key: \"7lm50a\" }],\n [\"path\", { d: \"m15.2 16.9-.9-.3\", key: \"1t7mvx\" }],\n [\"path\", { d: \"m16.6 21.7.3-.9\", key: \"1j67ps\" }],\n [\"path\", { d: \"m16.8 15.3-.4-1\", key: \"1ei7r6\" }],\n [\"path\", { d: \"m19.1 15.2.3-.9\", key: \"18r7jp\" }],\n [\"path\", { d: \"m19.6 21.7-.4-1\", key: \"z2vh2\" }],\n [\"path\", { d: \"m20.7 16.8 1-.4\", key: \"19m87a\" }],\n [\"path\", { d: \"m21.7 19.4-.9-.3\", key: \"1qgwi9\" }],\n [\"path\", { d: \"M9 3v18\", key: \"fh3hqa\" }],\n [\"circle\", { cx: \"18\", cy: \"18\", r: \"3\", key: \"1xkwt0\" }]\n];\nconst Columns3Cog = createLucideIcon(\"columns-3-cog\", __iconNode);\n\nexport { __iconNode, Columns3Cog as default };\n//# sourceMappingURL=columns-3-cog.mjs.map\n","import {\n cloneElement,\n createContext,\n forwardRef,\n isValidElement,\n useCallback,\n useContext,\n useEffect,\n useMemo,\n useRef,\n useState,\n type HTMLAttributes,\n type ReactNode,\n} from 'react';\nimport { useTranslation } from 'react-i18next';\nimport {\n Columns3Cog,\n Download,\n FileSpreadsheet,\n FileText,\n GripVertical,\n Printer,\n RefreshCw,\n Search,\n X,\n} from 'lucide-react';\nimport type { FilterChangedEvent, GridApi } from 'ag-grid-community';\nimport { Button, type ButtonProps } from '../button/button';\nimport { IconButton, type IconButtonProps } from '../button/icon-button';\nimport { Popover } from '../popover/popover';\nimport { Checkbox } from '../checkbox/checkbox';\nimport { TextInput } from '../text-input';\nimport { Tag } from '../tag';\nimport { DropdownMenu } from '../dropdown-menu';\n\n// Lucide icons default to 24×24 regardless of the wrapping span size, so\n// Button's `startIcon` slot (size-4 span) can't shrink them. Coerce icon\n// nodes to the `sm` button's 16px rendered size before handing them off.\nfunction sizeIcon(node: ReactNode): ReactNode {\n if (!isValidElement(node)) return node;\n const element = node as React.ReactElement<{\n className?: string;\n size?: number;\n }>;\n const existingClass = element.props.className ?? '';\n const className = /\\bsize-|\\bw-|\\bh-/.test(existingClass)\n ? existingClass\n : `${existingClass} ds:size-4`.trim();\n return cloneElement(element, { className, size: element.props.size ?? 16 });\n}\n\n/* ------------------------------------------------------------------ */\n/* Context */\n/* ------------------------------------------------------------------ */\n\ninterface ToolbarContextValue {\n /** Accessor to the live AG Grid API. Returns `undefined` until mount. */\n getApi: () => GridApi | undefined;\n /** Number of rows currently selected (re-renders on selection change). */\n selectionCount: number;\n /** Trigger the browser print dialog for the grid. */\n onPrint: () => void;\n}\n\nconst ToolbarContext = createContext<ToolbarContextValue | null>(null);\n\nfunction useToolbarContext(caller: string): ToolbarContextValue {\n const ctx = useContext(ToolbarContext);\n if (!ctx) {\n throw new Error(\n `${caller} must be rendered inside <DataTable.Toolbar> as a descendant of <DataTable>.`,\n );\n }\n return ctx;\n}\n\nexport interface ToolbarProviderProps {\n getApi: () => GridApi | undefined;\n selectionCount: number;\n onPrint: () => void;\n children: ReactNode;\n}\n\nexport function ToolbarProvider({\n getApi,\n selectionCount,\n onPrint,\n children,\n}: ToolbarProviderProps) {\n const value = useMemo(\n () => ({ getApi, selectionCount, onPrint }),\n [getApi, selectionCount, onPrint],\n );\n return (\n <ToolbarContext.Provider value={value}>{children}</ToolbarContext.Provider>\n );\n}\n\n/* ------------------------------------------------------------------ */\n/* Toolbar root */\n/* ------------------------------------------------------------------ */\n\nconst TOOLBAR_BASE = [\n 'data-table-toolbar',\n // Mobile (<sm) keeps `flex-wrap` so a wide QuickSearch can flow above the\n // Actions cluster on narrow screens. From `sm` (≥640px) we switch to\n // `flex-nowrap` + `min-w-0` so the row stays single-line at every common\n // desktop width (1024 / 1280 / 1440) — the QuickSearch slot shrinks via\n // its own `min-w-0` instead of pushing the trailing Actions to a new row.\n 'ds:flex ds:flex-wrap ds:items-center ds:gap-[var(--spacing-sm)]',\n 'ds:sm:flex-nowrap ds:min-w-0',\n // No card surface: the toolbar sits directly on the page background,\n // matching the header-tools layout the Patients / Care Plan List\n // patterns established (the old bg-card + border + shadow bar is gone).\n].join(' ');\n\nexport type ToolbarRootProps = HTMLAttributes<HTMLDivElement>;\n\nconst ToolbarRoot = forwardRef<HTMLDivElement, ToolbarRootProps>(\n ({ className, children, ...props }, ref) => (\n <div\n ref={ref}\n role=\"toolbar\"\n className={[TOOLBAR_BASE, className ?? ''].join(' ').trim()}\n {...props}\n >\n {children}\n </div>\n ),\n);\nToolbarRoot.displayName = 'DataTable.Toolbar';\n\n/* ------------------------------------------------------------------ */\n/* FilterBar slot — free-form */\n/* ------------------------------------------------------------------ */\n\nconst FilterBar = forwardRef<HTMLDivElement, HTMLAttributes<HTMLDivElement>>(\n ({ className, children, ...props }, ref) => (\n <div\n ref={ref}\n className={[\n 'ds:flex ds:flex-wrap ds:items-center ds:gap-[var(--spacing-sm)]',\n // `grow` lets FilterBar absorb the free space; `min-w-0` lets the\n // QuickSearch slot inside shrink below its intrinsic width when the\n // toolbar runs `flex-nowrap` at `sm` and above, so the trailing\n // Actions cluster stays pinned on a single row.\n 'ds:grow ds:min-w-0',\n className ?? '',\n ]\n .join(' ')\n .trim()}\n {...props}\n >\n {children}\n </div>\n ),\n);\nFilterBar.displayName = 'DataTable.Toolbar.FilterBar';\n\n/* ------------------------------------------------------------------ */\n/* Actions slot — right-aligned via ms-auto */\n/* ------------------------------------------------------------------ */\n\nconst Actions = forwardRef<HTMLDivElement, HTMLAttributes<HTMLDivElement>>(\n ({ className, children, ...props }, ref) => (\n <div\n ref={ref}\n className={[\n 'ds:flex ds:items-center ds:gap-[var(--spacing-xs)]',\n 'ds:ms-auto',\n className ?? '',\n ]\n .join(' ')\n .trim()}\n {...props}\n >\n {children}\n </div>\n ),\n);\nActions.displayName = 'DataTable.Toolbar.Actions';\n\n/* ------------------------------------------------------------------ */\n/* ExportCsv, ExportPdf, Print — icon-only buttons with tooltip labels */\n/* ------------------------------------------------------------------ */\n/* These three share the same shape: a single lucide icon, a localized\n * tooltip that doubles as the accessible label, and either a built-in\n * action (CSV / print) or a consumer-supplied handler (PDF). Rendered\n * as IconButton so a toolbar with several of them reads as a compact\n * icon group rather than three full-width labeled buttons. */\n\ntype ToolbarIconButtonProps = Omit<\n IconButtonProps,\n 'icon' | 'aria-label' | 'tooltip' | 'onClick'\n> & {\n /** Accessible label — becomes the tooltip text and `aria-label`. */\n label?: string;\n};\n\nexport interface ExportCsvProps extends ToolbarIconButtonProps {\n /** Optional override — receives the live AG Grid API. */\n onExport?: (api: GridApi) => void;\n}\n\nconst ExportCsv = forwardRef<HTMLButtonElement, ExportCsvProps>(\n ({ label, onExport, intent = 'outline', ...rest }, ref) => {\n const { t } = useTranslation();\n const { getApi } = useToolbarContext('DataTable.Toolbar.ExportCsv');\n const handleClick = useCallback(() => {\n const api = getApi();\n if (!api) return;\n if (onExport) onExport(api);\n else api.exportDataAsCsv();\n }, [getApi, onExport]);\n\n return (\n <IconButton\n ref={ref}\n type=\"button\"\n intent={intent}\n icon={<Download aria-hidden />}\n tooltip={label ?? t('dataTable.exportCsv')}\n onClick={handleClick}\n {...rest}\n />\n );\n },\n);\nExportCsv.displayName = 'DataTable.Toolbar.ExportCsv';\n\nexport interface ExportPdfProps extends ToolbarIconButtonProps {\n /**\n * Optional override for the default PDF generation. When omitted, clicking\n * the button calls the built-in handler (`defaultExportPdf`) which\n * dynamic-imports `jspdf` + `jspdf-autotable` and produces a paged PDF\n * of the current sort/filter state. Supply your own to plug in a\n * server-side PDF generator or a custom layout.\n */\n onClick?: (api: GridApi | undefined) => void;\n /** Filename for the generated PDF (default `data-table-export.pdf`). */\n fileName?: string;\n}\n\n/* ------------------------------------------------------------------ */\n/* Default PDF handler — dynamic-imported so jspdf doesn't ship in */\n/* main bundle unless the user clicks Export PDF */\n/* ------------------------------------------------------------------ */\n\n// Resolve a DS HSL token to an `[r, g, b]` tuple by letting the browser do\n// the work. `--card` etc. are stored as raw `H S% L%` triplets — wrap in\n// `hsl(...)` and read back from a temp element's computed color. The\n// imperative `.style.*` mutation here is on a transient probe element\n// (never attached to JSX), permitted per src/docs/23-constraints.mdx\n// §Runtime-computed dimensions.\nfunction resolveTokenToRgb(\n varName: string,\n fallback: [number, number, number] = [30, 30, 30],\n): [number, number, number] {\n // SSR or unparseable computed color: return a neutral foreground RGB by\n // default so the PDF is at least legible — `[255, 255, 255]` would\n // produce white-on-white. Callers can override per-token (e.g. fill\n // tokens pass a light fallback, text tokens pass a dark one).\n if (typeof document === 'undefined') return fallback;\n const probe = document.createElement('span');\n probe.style.color = `hsl(var(${varName}))`;\n probe.style.position = 'absolute';\n probe.style.visibility = 'hidden';\n document.body.appendChild(probe);\n const computed = getComputedStyle(probe).color;\n document.body.removeChild(probe);\n const match = computed.match(/rgba?\\(\\s*(\\d+)[,\\s]+(\\d+)[,\\s]+(\\d+)/i);\n if (!match) return fallback;\n return [Number(match[1]), Number(match[2]), Number(match[3])];\n}\n\ninterface DefaultExportPdfOptions {\n fileName: string;\n}\n\n/**\n * Default Export PDF handler. Exported for tests and for consumers who want\n * to call it from a custom `onClick` (e.g. to add a logo or signature).\n */\nexport async function defaultExportPdf(\n api: GridApi | undefined,\n options: DefaultExportPdfOptions,\n): Promise<void> {\n if (!api) return;\n // Dynamic-imported so jspdf + jspdf-autotable stay out of consumers'\n // main bundles unless the user actually clicks Export PDF.\n const [{ jsPDF }, { default: autoTable }] = await Promise.all([\n import('jspdf'),\n import('jspdf-autotable'),\n ]);\n\n const columns = api.getColumns() ?? [];\n const visibleColumns = columns.filter((col) => col.isVisible());\n\n const head = [\n visibleColumns.map((col) => api.getDisplayNameForColumn(col, null) ?? ''),\n ];\n\n // Pull rows in current sort + filter order. AG Grid Community supports\n // forEachNodeAfterFilterAndSort on the client-side row model — the only\n // model this wrapper exposes.\n const body: string[][] = [];\n api.forEachNodeAfterFilterAndSort((node) => {\n if (!node.data) return;\n const cells = visibleColumns.map((col) => {\n const value = api.getCellValue({\n rowNode: node,\n colKey: col,\n useFormatter: true,\n });\n return value == null ? '' : String(value);\n });\n body.push(cells);\n });\n\n // Map DS tokens → RGB at handler runtime. `--card` backs the cell\n // background; `--muted` backs the header fill; `--card-foreground`\n // backs the body text and `--foreground` the header text. Per-token\n // fallbacks default fill tokens to a light grey and text tokens to a\n // dark grey, so SSR / token-resolution failure still produces a\n // legible PDF rather than white-on-white.\n const headerFill = resolveTokenToRgb('--muted', [240, 240, 240]);\n const headerText = resolveTokenToRgb('--foreground', [30, 30, 30]);\n const bodyText = resolveTokenToRgb('--card-foreground', [30, 30, 30]);\n const alternateFill = resolveTokenToRgb('--card', [250, 250, 250]);\n\n const doc = new jsPDF({ orientation: 'landscape' });\n autoTable(doc, {\n head,\n body,\n headStyles: { fillColor: headerFill, textColor: headerText },\n bodyStyles: { textColor: bodyText },\n alternateRowStyles: { fillColor: alternateFill },\n styles: {\n font: 'helvetica',\n fontSize: 10,\n cellPadding: 4,\n },\n });\n doc.save(options.fileName);\n}\n\nconst ExportPdf = forwardRef<HTMLButtonElement, ExportPdfProps>(\n ({ label, onClick, fileName, intent = 'outline', ...rest }, ref) => {\n const { t } = useTranslation();\n const { getApi } = useToolbarContext('DataTable.Toolbar.ExportPdf');\n const handleClick = useCallback(() => {\n const api = getApi();\n if (onClick) {\n onClick(api);\n return;\n }\n // Fire-and-forget — errors bubble to the console for now; consumers\n // who need to surface them should supply their own `onClick`.\n void defaultExportPdf(api, {\n fileName: fileName ?? 'data-table-export.pdf',\n });\n }, [getApi, onClick, fileName]);\n return (\n <IconButton\n ref={ref}\n type=\"button\"\n intent={intent}\n icon={<FileText aria-hidden />}\n tooltip={label ?? t('dataTable.exportPdf')}\n onClick={handleClick}\n {...rest}\n />\n );\n },\n);\nExportPdf.displayName = 'DataTable.Toolbar.ExportPdf';\n\nexport type PrintProps = ToolbarIconButtonProps;\n\nconst Print = forwardRef<HTMLButtonElement, PrintProps>(\n ({ label, intent = 'outline', ...rest }, ref) => {\n const { t } = useTranslation();\n const { onPrint } = useToolbarContext('DataTable.Toolbar.Print');\n return (\n <IconButton\n ref={ref}\n type=\"button\"\n intent={intent}\n icon={<Printer aria-hidden />}\n tooltip={label ?? t('dataTable.print')}\n onClick={onPrint}\n {...rest}\n />\n );\n },\n);\nPrint.displayName = 'DataTable.Toolbar.Print';\n\n/* ------------------------------------------------------------------ */\n/* QuickSearch — `<TextInput size=\"sm\">` wired to AG Grid quickFilterText */\n/* ------------------------------------------------------------------ */\n\nexport interface QuickSearchProps {\n /** Placeholder text. Falls back to `t('dataTable.quickSearch.placeholder')`. */\n placeholder?: string;\n /** Debounce ms before pushing to AG Grid. Defaults to 150 ms. */\n debounceMs?: number;\n}\n\nconst QuickSearch = ({ placeholder, debounceMs = 150 }: QuickSearchProps) => {\n const { t } = useTranslation();\n const { getApi } = useToolbarContext('DataTable.Toolbar.QuickSearch');\n const [value, setValue] = useState('');\n const timerRef = useRef<number | undefined>(undefined);\n\n useEffect(() => {\n if (timerRef.current) window.clearTimeout(timerRef.current);\n timerRef.current = window.setTimeout(() => {\n const api = getApi();\n if (!api) return;\n // `setGridOption` is the public path in AG Grid v33+ for changing\n // any grid option after init.\n api.setGridOption('quickFilterText', value);\n }, debounceMs);\n return () => {\n if (timerRef.current) window.clearTimeout(timerRef.current);\n };\n }, [value, debounceMs, getApi]);\n\n return (\n // Slot wrapper caps the search at a sensible legible width on desktop —\n // without this, TextInput's `w-full` lets the QuickSearch absorb the\n // entire FilterBar row and push trailing Actions onto a second line at\n // 1024 / 1280 / 1440. `min-w-0` lets the slot shrink below `24rem` when\n // the toolbar is squeezed on narrow viewports. There is no\n // `--toolbar-search-max` token in the kit yet — see this component's\n // summary for a follow-up note recommending we add one.\n <div className=\"ds:w-full ds:max-w-[24rem] ds:min-w-0\">\n <TextInput\n type=\"search\"\n size=\"sm\"\n value={value}\n onChange={(e) => setValue(e.target.value)}\n placeholder={\n placeholder ?? t('dataTable.quickSearch.placeholder', 'Search…')\n }\n startAdornment={<Search aria-hidden className=\"ds:size-4\" />}\n clearable\n onClear={() => setValue('')}\n aria-label={t('dataTable.quickSearch.label', 'Quick search')}\n />\n </div>\n );\n};\nQuickSearch.displayName = 'DataTable.Toolbar.QuickSearch';\n\n/* ------------------------------------------------------------------ */\n/* Refresh — IconButton with a refresh glyph */\n/* ------------------------------------------------------------------ */\n\nexport interface RefreshButtonProps extends Omit<\n IconButtonProps,\n 'icon' | 'aria-label' | 'tooltip' | 'onClick'\n> {\n /** Called when the user clicks Refresh. */\n onRefresh: () => void;\n /** Accessible label. Falls back to `t('dataTable.refresh')`. */\n label?: string;\n}\n\nconst Refresh = forwardRef<HTMLButtonElement, RefreshButtonProps>(\n ({ onRefresh, label, intent = 'outline', ...rest }, ref) => {\n const { t } = useTranslation();\n return (\n <IconButton\n ref={ref}\n type=\"button\"\n intent={intent}\n icon={<RefreshCw aria-hidden />}\n tooltip={label ?? t('dataTable.refresh', 'Refresh')}\n onClick={onRefresh}\n {...rest}\n />\n );\n },\n);\nRefresh.displayName = 'DataTable.Toolbar.Refresh';\n\n/* ------------------------------------------------------------------ */\n/* FilterChips — chips for every active filter + clear-all */\n/* ------------------------------------------------------------------ */\n\ninterface ActiveFilterChip {\n colId: string;\n headerName: string;\n text: string;\n}\n\nfunction describeFilterModel(model: unknown): string {\n if (!model || typeof model !== 'object') return '';\n const m = model as Record<string, unknown>;\n // Text filter shape: { type, filter, filterTo, filterType }\n if (typeof m.filter === 'string' || typeof m.filter === 'number') {\n const type = typeof m.type === 'string' ? m.type : '';\n const filterTo =\n typeof m.filterTo === 'string' || typeof m.filterTo === 'number'\n ? String(m.filterTo)\n : '';\n if (type === 'inRange' && filterTo) {\n return `${m.filter} – ${filterTo}`;\n }\n return type ? `${type} ${m.filter}` : String(m.filter);\n }\n // Date filter shape: { type, dateFrom, dateTo }\n if (typeof m.dateFrom === 'string') {\n if (typeof m.dateTo === 'string' && m.dateTo) {\n return `${m.dateFrom} – ${m.dateTo}`;\n }\n return String(m.dateFrom);\n }\n // Set filter shape: { values: [...] }\n if (Array.isArray((m as { values?: unknown[] }).values)) {\n const values = (m as { values: unknown[] }).values;\n return values.map(String).join(', ');\n }\n return '';\n}\n\nconst FilterChips = () => {\n const { t } = useTranslation();\n const { getApi } = useToolbarContext('DataTable.Toolbar.FilterChips');\n const [chips, setChips] = useState<ActiveFilterChip[]>([]);\n const [quickFilter, setQuickFilter] = useState<string>('');\n\n const refresh = useCallback(() => {\n const api = getApi();\n if (!api) {\n setChips([]);\n setQuickFilter('');\n return;\n }\n const model = api.getFilterModel() ?? {};\n const cols = api.getColumns() ?? [];\n const next: ActiveFilterChip[] = [];\n for (const colId of Object.keys(model)) {\n const col = cols.find((c) => c.getColId() === colId);\n const headerName = api.getDisplayNameForColumn(col!, null) ?? colId;\n next.push({\n colId,\n headerName,\n text: describeFilterModel(model[colId]),\n });\n }\n setChips(next);\n const qf = api.getGridOption('quickFilterText');\n setQuickFilter(typeof qf === 'string' ? qf : '');\n }, [getApi]);\n\n // Subscribe to AG Grid filter-changed events. Use `addEventListener`\n // for the public subscription path (v33+ keeps this stable).\n //\n // `getApi` is a stable accessor that returns `undefined` until the grid is\n // ready — and FilterChips often mounts (as a toolbar child) BEFORE the grid\n // emits grid-ready, so a one-shot `if (!api) return` would bail permanently\n // and never wire the listener (the chips would then stay empty even after a\n // view / programmatic `setFilterModel` applies a filter). Poll on a short\n // interval until the api resolves, then subscribe + do the initial refresh.\n useEffect(() => {\n let cleanup: (() => void) | undefined;\n const handler = (_event: FilterChangedEvent) => refresh();\n const subscribe = (api: GridApi): void => {\n api.addEventListener('filterChanged', handler);\n refresh();\n cleanup = () => api.removeEventListener('filterChanged', handler);\n };\n const ready = getApi();\n if (ready) {\n subscribe(ready);\n } else {\n const timer = window.setInterval(() => {\n const api = getApi();\n if (!api) return;\n window.clearInterval(timer);\n subscribe(api);\n }, 50);\n cleanup = () => window.clearInterval(timer);\n }\n return () => cleanup?.();\n }, [getApi, refresh]);\n\n const total = chips.length + (quickFilter ? 1 : 0);\n if (total === 0) return null;\n\n function clearOne(colId: string) {\n const api = getApi();\n if (!api) return;\n api.destroyFilter(colId);\n }\n\n function clearAll() {\n const api = getApi();\n if (!api) return;\n api.setFilterModel(null);\n api.setGridOption('quickFilterText', '');\n setQuickFilter('');\n }\n\n return (\n <div\n role=\"group\"\n aria-label={t('dataTable.filterChips.label', 'Active filters')}\n className=\"ds:flex ds:flex-wrap ds:items-center ds:gap-[var(--spacing-xs)]\"\n >\n {quickFilter && (\n <Tag\n label={`${t('dataTable.quickSearch.label', 'Quick search')}: ${quickFilter}`}\n size=\"sm\"\n fill=\"outline\"\n onRemove={() => {\n const api = getApi();\n api?.setGridOption('quickFilterText', '');\n setQuickFilter('');\n }}\n />\n )}\n {chips.map((c) => (\n <Tag\n key={c.colId}\n label={c.text ? `${c.headerName}: ${c.text}` : c.headerName}\n size=\"sm\"\n fill=\"outline\"\n onRemove={() => clearOne(c.colId)}\n />\n ))}\n <Button\n type=\"button\"\n intent=\"ghost\"\n size=\"sm\"\n onClick={clearAll}\n startIcon={<X aria-hidden className=\"ds:size-4\" />}\n >\n {t('dataTable.filterChips.clearAll', 'Clear all')}\n </Button>\n </div>\n );\n};\nFilterChips.displayName = 'DataTable.Toolbar.FilterChips';\n\n/* ------------------------------------------------------------------ */\n/* FacetFilter — pill-row column-scoped filter */\n/* ------------------------------------------------------------------ */\n\nexport interface FacetFilterOption<TValue = string> {\n value: TValue | null;\n label: string;\n}\n\nexport interface FacetFilterProps<TValue = string> {\n /** Column field to filter on. */\n field: string;\n /** Options shown as pills. `value: null` clears the filter. */\n options: FacetFilterOption<TValue>[];\n /** Accessible label for the pill group. */\n label?: string;\n}\n\nconst FacetFilter = <TValue extends string | number | boolean = string>({\n field,\n options,\n label,\n}: FacetFilterProps<TValue>) => {\n const { t } = useTranslation();\n const { getApi } = useToolbarContext('DataTable.Toolbar.FacetFilter');\n const [active, setActive] = useState<TValue | null>(null);\n\n function apply(value: TValue | null) {\n setActive(value);\n const api = getApi();\n if (!api) return;\n if (value === null) {\n api.destroyFilter(field);\n return;\n }\n // Use the column filter API directly — AG Grid Community supports\n // setColumnFilterModel for the built-in filter on a column.\n api.setColumnFilterModel(field, {\n type: 'equals',\n filter: value,\n });\n api.onFilterChanged();\n }\n\n return (\n <div\n role=\"group\"\n aria-label={label ?? t('dataTable.facetFilter.label', 'Filter')}\n className=\"ds:flex ds:items-center ds:gap-[var(--spacing-xs)]\"\n >\n {options.map((opt) => {\n const isActive = active === opt.value;\n return (\n <Button\n key={String(opt.value)}\n type=\"button\"\n size=\"sm\"\n intent={isActive ? 'primary' : 'secondary'}\n aria-pressed={isActive}\n onClick={() => apply(opt.value)}\n >\n {opt.label}\n </Button>\n );\n })}\n </div>\n );\n};\n(FacetFilter as { displayName?: string }).displayName =\n 'DataTable.Toolbar.FacetFilter';\n\n/* ------------------------------------------------------------------ */\n/* ExportMenu — compound: CSV (always), Excel (xlsx), PDF, custom */\n/* ------------------------------------------------------------------ */\n\nexport type ExportFormat = 'csv' | 'xlsx' | 'pdf' | 'custom';\n\nexport interface ExportMenuItemProps {\n /** Built-in format or `custom` for consumer-supplied handler. */\n format: ExportFormat;\n /** Label override. Built-in formats default to `t('dataTable.export.{format}')`. */\n label?: string;\n /** Consumer handler — required for `format: 'custom'`. */\n onClick?: (api: GridApi | undefined) => void;\n /** File-name override (only used by built-in formats). */\n fileName?: string;\n}\n\nconst DEFAULT_EXPORT_ITEMS: ExportFormat[] = ['csv', 'xlsx', 'pdf'];\n\nasync function defaultExportXlsx(\n api: GridApi | undefined,\n options: { fileName: string },\n): Promise<void> {\n if (!api) return;\n // Dynamic-imported so exceljs stays out of consumers' main bundles\n // unless the user actually clicks Excel export.\n const ExcelJS = await import('exceljs');\n const workbook = new ExcelJS.Workbook();\n const sheet = workbook.addWorksheet('Sheet1');\n\n const columns = api.getColumns() ?? [];\n const visibleColumns = columns.filter((col) => col.isVisible());\n\n sheet.addRow(\n visibleColumns.map(\n (col) => api.getDisplayNameForColumn(col, null) ?? col.getColId(),\n ),\n );\n\n api.forEachNodeAfterFilterAndSort((node) => {\n if (!node.data) return;\n sheet.addRow(\n visibleColumns.map((col) => {\n const value = api.getCellValue({\n rowNode: node,\n colKey: col,\n useFormatter: true,\n });\n return value == null ? '' : value;\n }),\n );\n });\n\n // Header row uses DS tokens resolved at runtime — same approach as\n // defaultExportPdf above.\n const headerFill = resolveTokenToRgb('--muted', [240, 240, 240]);\n const headerText = resolveTokenToRgb('--foreground', [30, 30, 30]);\n const headerRow = sheet.getRow(1);\n const hex = ([r, g, b]: [number, number, number]) =>\n `${r.toString(16).padStart(2, '0')}${g.toString(16).padStart(2, '0')}${b\n .toString(16)\n .padStart(2, '0')}`.toUpperCase();\n headerRow.eachCell((cell: import('exceljs').Cell) => {\n cell.font = { bold: true, color: { argb: `FF${hex(headerText)}` } };\n cell.fill = {\n type: 'pattern',\n pattern: 'solid',\n fgColor: { argb: `FF${hex(headerFill)}` },\n };\n });\n\n const buffer = await workbook.xlsx.writeBuffer();\n const blob = new Blob([buffer], {\n type: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',\n });\n const url = URL.createObjectURL(blob);\n const link = document.createElement('a');\n link.href = url;\n link.download = options.fileName;\n document.body.appendChild(link);\n link.click();\n document.body.removeChild(link);\n URL.revokeObjectURL(url);\n}\n\ninterface ExportMenuContextValue {\n /** AG Grid API resolver (forwarded to each item). */\n getApi: () => GridApi | undefined;\n}\n\nconst ExportMenuContext = createContext<ExportMenuContextValue | null>(null);\n\nfunction useExportMenuContext(): ExportMenuContextValue {\n const ctx = useContext(ExportMenuContext);\n if (!ctx) {\n throw new Error(\n 'DataTable.Toolbar.ExportMenu.Item must be rendered inside DataTable.Toolbar.ExportMenu.',\n );\n }\n return ctx;\n}\n\nexport interface ExportMenuProps extends Omit<\n IconButtonProps,\n 'icon' | 'aria-label' | 'tooltip' | 'onClick' | 'children'\n> {\n /** Custom menu items. When omitted, renders the default CSV+Excel+PDF trio. */\n children?: ReactNode;\n /** Accessible label for the trigger. */\n label?: string;\n}\n\n// forwardRef + rest-spread so the trigger IconButton receives the props an\n// IconButtonGroup clones onto its children (ref, tabIndex, onFocus, intent)\n// — required for the group's roving tabindex to reach this control.\nconst ExportMenu = forwardRef<HTMLButtonElement, ExportMenuProps>(\n ({ children, label, intent = 'outline', ...rest }, ref) => {\n const { t } = useTranslation();\n const { getApi } = useToolbarContext('DataTable.Toolbar.ExportMenu');\n const value = useMemo(() => ({ getApi }), [getApi]);\n const itemsContent =\n children ??\n DEFAULT_EXPORT_ITEMS.map((f) => <ExportMenuItem key={f} format={f} />);\n return (\n <ExportMenuContext.Provider value={value}>\n <DropdownMenu.Root>\n <DropdownMenu.Trigger asChild>\n <IconButton\n ref={ref}\n type=\"button\"\n intent={intent}\n icon={<Download aria-hidden />}\n tooltip={label ?? t('dataTable.export.menu', 'Export')}\n aria-label={label ?? t('dataTable.export.menu', 'Export')}\n aria-haspopup=\"menu\"\n {...rest}\n />\n </DropdownMenu.Trigger>\n <DropdownMenu.Content align=\"end\" sideOffset={4}>\n {itemsContent}\n </DropdownMenu.Content>\n </DropdownMenu.Root>\n </ExportMenuContext.Provider>\n );\n },\n);\nExportMenu.displayName = 'DataTable.Toolbar.ExportMenu';\n\nfunction defaultLabel(\n t: (key: string, fallback: string) => string,\n format: ExportFormat,\n): string {\n if (format === 'csv') return t('dataTable.export.csv', 'Export CSV');\n if (format === 'xlsx') return t('dataTable.export.xlsx', 'Export Excel');\n if (format === 'pdf') return t('dataTable.export.pdf', 'Export PDF');\n return t('dataTable.export.custom', 'Export');\n}\n\nfunction defaultIcon(format: ExportFormat): ReactNode {\n if (format === 'csv') return <Download aria-hidden className=\"ds:size-4\" />;\n if (format === 'xlsx')\n return <FileSpreadsheet aria-hidden className=\"ds:size-4\" />;\n if (format === 'pdf') return <FileText aria-hidden className=\"ds:size-4\" />;\n return <Download aria-hidden className=\"ds:size-4\" />;\n}\n\nconst ExportMenuItem = ({\n format,\n label,\n onClick,\n fileName,\n}: ExportMenuItemProps) => {\n const { t } = useTranslation();\n const { getApi } = useExportMenuContext();\n const handleClick = useCallback(() => {\n const api = getApi();\n if (format === 'csv') {\n api?.exportDataAsCsv();\n return;\n }\n if (format === 'pdf') {\n void defaultExportPdf(api, {\n fileName: fileName ?? 'data-table-export.pdf',\n });\n return;\n }\n if (format === 'xlsx') {\n void defaultExportXlsx(api, {\n fileName: fileName ?? 'data-table-export.xlsx',\n });\n return;\n }\n // custom — consumer is required to handle.\n onClick?.(api);\n }, [format, fileName, onClick, getApi]);\n\n return (\n <DropdownMenu.Item onSelect={handleClick}>\n <span className=\"ds:inline-flex ds:items-center ds:gap-[var(--spacing-sm)]\">\n {defaultIcon(format)}\n <span>{label ?? defaultLabel(t, format)}</span>\n </span>\n </DropdownMenu.Item>\n );\n};\nExportMenuItem.displayName = 'DataTable.Toolbar.ExportMenu.Item';\n\n/* ------------------------------------------------------------------ */\n/* ColumnToggle — popover with a checkbox per column */\n/* ------------------------------------------------------------------ */\n\ninterface ColumnEntry {\n colId: string;\n displayName: string;\n visible: boolean;\n}\n\nfunction readColumnEntries(api: GridApi | undefined): ColumnEntry[] {\n if (!api) return [];\n // getAllGridColumns() reflects the live/displayed order (incl. a persisted\n // reorder); getColumns() returns columnDefs order, leaving the popover out\n // of sync with the grid after a reload.\n const columns = api.getAllGridColumns() ?? [];\n return columns\n .map((col) => {\n const def = col.getColDef();\n if (def.hide === undefined && col.getColId().startsWith('ag-Grid-'))\n return null;\n return {\n colId: col.getColId(),\n displayName: api.getDisplayNameForColumn(col, null) || col.getColId(),\n visible: col.isVisible(),\n };\n })\n .filter((c): c is ColumnEntry => c !== null);\n}\n\nexport interface ColumnToggleProps extends Omit<\n IconButtonProps,\n 'icon' | 'aria-label' | 'tooltip' | 'onClick' | 'children'\n> {\n label?: string;\n /** Override the trigger glyph (defaults to the Columns3Cog icon). */\n icon?: ReactNode;\n /** Extra content rendered below the column list (e.g. a settings switch). */\n footer?: ReactNode;\n /** Extra content rendered above the column list, directly under the title\n * (e.g. a grouping switch). */\n header?: ReactNode;\n}\n\n// forwardRef + rest-spread for the same IconButtonGroup roving-tabindex\n// contract as ExportMenu above.\nconst ColumnToggle = forwardRef<HTMLButtonElement, ColumnToggleProps>(\n function ColumnToggle(\n { label, icon, footer, header, intent = 'outline', ...rest },\n ref,\n ) {\n const { t } = useTranslation();\n const { getApi } = useToolbarContext('DataTable.Toolbar.ColumnToggle');\n const [open, setOpen] = useState(false);\n const [columns, setColumns] = useState<ColumnEntry[]>([]);\n const [draggingColId, setDraggingColId] = useState<string | null>(null);\n const [dragOverColId, setDragOverColId] = useState<string | null>(null);\n\n // Refresh the column list whenever the popover opens — picks up\n // columns that were added/removed/renamed since last open.\n useEffect(() => {\n if (!open) return;\n setColumns(readColumnEntries(getApi()));\n }, [open, getApi]);\n\n const toggleColumn = useCallback(\n (colId: string, nextVisible: boolean) => {\n const api = getApi();\n if (!api) return;\n api.setColumnsVisible([colId], nextVisible);\n setColumns((prev) =>\n prev.map((c) =>\n c.colId === colId ? { ...c, visible: nextVisible } : c,\n ),\n );\n },\n [getApi],\n );\n\n // Reorder local list AND forward the move to AG Grid so the grid's\n // column order tracks the popover. `api.moveColumns([id], toIndex)`\n // does both the data move and the display refresh in v33+.\n const moveColumn = useCallback(\n (fromColId: string, toColId: string) => {\n if (fromColId === toColId) return;\n const api = getApi();\n if (!api) return;\n setColumns((prev) => {\n const fromIdx = prev.findIndex((c) => c.colId === fromColId);\n const toIdx = prev.findIndex((c) => c.colId === toColId);\n if (fromIdx < 0 || toIdx < 0) return prev;\n const next = [...prev];\n const [moved] = next.splice(fromIdx, 1);\n next.splice(toIdx, 0, moved);\n return next;\n });\n const toIdx = columns.findIndex((c) => c.colId === toColId);\n if (toIdx >= 0) api.moveColumns([fromColId], toIdx);\n },\n [getApi, columns],\n );\n\n const labelText = label ?? t('dataTable.columnToggle');\n\n return (\n <Popover.Root open={open} onOpenChange={setOpen}>\n <Popover.Trigger asChild>\n <IconButton\n ref={ref}\n type=\"button\"\n intent={intent}\n icon={icon ?? <Columns3Cog aria-hidden />}\n tooltip={labelText}\n aria-label={labelText}\n aria-haspopup=\"dialog\"\n {...rest}\n />\n </Popover.Trigger>\n <Popover.Content size=\"sm\" align=\"end\">\n <Popover.Heading>{labelText}</Popover.Heading>\n {header ? (\n <div className=\"ds:mb-[var(--spacing-xs)] ds:border-b ds:border-[color:var(--border)] ds:pb-[var(--spacing-sm)]\">\n {header}\n </div>\n ) : null}\n <ul\n className=\"ds:flex ds:flex-col ds:gap-[var(--spacing-xs)]\"\n aria-label={labelText}\n >\n {columns.map((c) => {\n const isDragging = draggingColId === c.colId;\n const isDragOver =\n dragOverColId === c.colId && draggingColId !== c.colId;\n return (\n <li\n key={c.colId}\n draggable\n onDragStart={(e) => {\n setDraggingColId(c.colId);\n e.dataTransfer.effectAllowed = 'move';\n e.dataTransfer.setData('text/plain', c.colId);\n }}\n onDragOver={(e) => {\n e.preventDefault();\n e.dataTransfer.dropEffect = 'move';\n setDragOverColId(c.colId);\n }}\n onDragLeave={() => {\n setDragOverColId((prev) =>\n prev === c.colId ? null : prev,\n );\n }}\n onDrop={(e) => {\n e.preventDefault();\n const fromColId = e.dataTransfer.getData('text/plain');\n if (fromColId) moveColumn(fromColId, c.colId);\n setDraggingColId(null);\n setDragOverColId(null);\n }}\n onDragEnd={() => {\n setDraggingColId(null);\n setDragOverColId(null);\n }}\n className={[\n 'ds:flex ds:items-center ds:gap-[var(--spacing-xs)] ds:rounded-[var(--radius-sm)] ds:px-[var(--spacing-xs)] ds:py-[var(--spacing-2xs,var(--spacing-xs))] ds:transition-colors',\n isDragging ? 'ds:opacity-50' : '',\n isDragOver\n ? 'ds:bg-[color:color-mix(in_srgb,var(--primary)_8%,transparent)]'\n : '',\n ]\n .filter(Boolean)\n .join(' ')}\n >\n <span\n aria-hidden=\"true\"\n className=\"ds:cursor-grab ds:text-[color:var(--muted-foreground)] ds:active:cursor-grabbing\"\n >\n <GripVertical className=\"ds:size-4\" />\n </span>\n <Checkbox\n label={c.displayName}\n checked={c.visible}\n onCheckedChange={(checked) =>\n toggleColumn(c.colId, checked === true)\n }\n />\n </li>\n );\n })}\n </ul>\n {footer ? (\n <div className=\"ds:mt-[var(--spacing-xs)] ds:border-t ds:border-[color:var(--border)] ds:pt-[var(--spacing-sm)]\">\n {footer}\n </div>\n ) : null}\n </Popover.Content>\n </Popover.Root>\n );\n },\n);\nColumnToggle.displayName = 'DataTable.Toolbar.ColumnToggle';\n\n/* ------------------------------------------------------------------ */\n/* BulkAction — hidden when no rows are selected */\n/* ------------------------------------------------------------------ */\n\nexport interface BulkActionProps extends Omit<\n ButtonProps,\n 'onClick' | 'children' | 'startIcon' | 'intent'\n> {\n label: string;\n icon?: ReactNode;\n onClick: (api: GridApi | undefined) => void;\n variant?: 'default' | 'destructive';\n}\n\nconst BulkAction = forwardRef<HTMLButtonElement, BulkActionProps>(\n (\n { label, icon, onClick, variant = 'default', size = 'sm', ...rest },\n ref,\n ) => {\n const { t } = useTranslation();\n const { getApi, selectionCount } = useToolbarContext(\n 'DataTable.Toolbar.BulkAction',\n );\n if (selectionCount === 0) return null;\n\n const resolvedIntent =\n variant === 'destructive' ? 'destructive' : 'secondary';\n\n return (\n <Button\n ref={ref}\n type=\"button\"\n intent={resolvedIntent}\n size={size}\n startIcon={sizeIcon(icon)}\n onClick={() => onClick(getApi())}\n aria-label={`${label} (${t('dataTable.bulkAction', { count: selectionCount })})`}\n {...rest}\n >\n <span>{label}</span>\n <span\n aria-hidden=\"true\"\n className=\"ds:ms-[var(--spacing-xs)] ds:opacity-80\"\n >\n {t('dataTable.bulkAction', { count: selectionCount })}\n </span>\n </Button>\n );\n },\n);\nBulkAction.displayName = 'DataTable.Toolbar.BulkAction';\n\n/* ------------------------------------------------------------------ */\n/* Assembled namespace — mounted on DataTable.Toolbar downstream */\n/* ------------------------------------------------------------------ */\n\n// These leaves render a single DS <IconButton> trigger, so IconButtonGroup\n// accepts them as direct children (see its rendersIconButton DEV check).\nfor (const leaf of [\n ExportCsv,\n ExportPdf,\n Print,\n Refresh,\n ExportMenu,\n ColumnToggle,\n]) {\n (leaf as { rendersIconButton?: boolean }).rendersIconButton = true;\n}\n\nconst ExportMenuNamespace = Object.assign(ExportMenu, {\n Item: ExportMenuItem,\n});\n\nexport const Toolbar = Object.assign(ToolbarRoot, {\n FilterBar,\n Actions,\n /** @deprecated Use `Toolbar.ExportMenu` with a `csv` item. */\n ExportCsv,\n /** @deprecated Use `Toolbar.ExportMenu` with a `pdf` item. */\n ExportPdf,\n Print,\n ColumnToggle,\n BulkAction,\n QuickSearch,\n Refresh,\n FilterChips,\n FacetFilter,\n ExportMenu: ExportMenuNamespace,\n});\n","import { useEffect, useMemo, useState } from 'react';\nimport type {\n CustomFilterProps,\n CustomFloatingFilterProps,\n} from 'ag-grid-react';\nimport { useGridFilter } from 'ag-grid-react';\nimport type { IFilter } from 'ag-grid-community';\nimport { useTranslation } from 'react-i18next';\nimport i18next from 'i18next';\nimport { Search, X } from 'lucide-react';\nimport { TextInput } from '../../text-input';\nimport { Select, type SelectOption } from '../../select';\nimport { Button } from '../../button';\n\n/**\n * Custom AG Grid filter component — text-comparison filter.\n *\n * Fills the gap left by `agTextColumnFilter`'s stock browser-skinned\n * input by wrapping the kit's `<TextInput>` and `<Select>` so the\n * column-header menu (`TextFilter`) and the inline floating row\n * (`TextFloatingFilter`) match the DS form language.\n *\n * Wire on a colDef:\n * ```tsx\n * {\n * field: 'description',\n * filter: TextFilter,\n * floatingFilter: true,\n * floatingFilterComponent: TextFloatingFilter,\n * filterParams: { defaultOperator: 'contains' },\n * }\n * ```\n *\n * Model shape `{ type, filter }` mirrors AG Grid's `agTextColumnFilter`\n * text-operator vocabulary (`contains`, `equals`, `startsWith`,\n * `endsWith`, `notContains`) so server-side adapters that already\n * understand the stock filter can read this one identically.\n */\n\nexport type TextFilterOperator =\n | 'contains'\n | 'equals'\n | 'startsWith'\n | 'endsWith'\n | 'notContains';\n\nexport interface TextFilterModel {\n type: TextFilterOperator;\n filter: string;\n}\n\nexport interface TextFilterParams {\n placeholder?: string;\n defaultOperator?: TextFilterOperator;\n}\n\nconst OPERATORS: TextFilterOperator[] = [\n 'contains',\n 'equals',\n 'startsWith',\n 'endsWith',\n 'notContains',\n];\n\n// Accent-folded, case-insensitive comparison. Intl.Collator handles\n// locale-aware diacritic stripping (e.g. \"città\" ~ \"citta\") so users\n// don't need to type accented characters exactly to find rows.\nfunction makeMatcher(locale: string) {\n const collator = new Intl.Collator(locale, {\n sensitivity: 'base',\n usage: 'search',\n });\n\n // Intl.Collator.compare returns 0 only on full-string equality (under\n // sensitivity:base). For substring tests we slice and compare windows.\n function indexOf(haystack: string, needle: string): number {\n if (needle.length === 0) return 0;\n if (needle.length > haystack.length) return -1;\n for (let i = 0; i <= haystack.length - needle.length; i += 1) {\n if (\n collator.compare(haystack.slice(i, i + needle.length), needle) === 0\n ) {\n return i;\n }\n }\n return -1;\n }\n\n return {\n equals: (a: string, b: string) => collator.compare(a, b) === 0,\n contains: (haystack: string, needle: string) =>\n indexOf(haystack, needle) !== -1,\n startsWith: (haystack: string, needle: string) =>\n needle.length <= haystack.length &&\n collator.compare(haystack.slice(0, needle.length), needle) === 0,\n endsWith: (haystack: string, needle: string) =>\n needle.length <= haystack.length &&\n collator.compare(\n haystack.slice(haystack.length - needle.length),\n needle,\n ) === 0,\n };\n}\n\nfunction coerceToString(raw: unknown): string | null {\n if (raw === null || raw === undefined) return null;\n return typeof raw === 'string' ? raw : String(raw);\n}\n\nexport function TextFilter(\n props: CustomFilterProps<unknown, unknown, TextFilterModel> &\n TextFilterParams,\n) {\n const { model, onModelChange, getValue, placeholder, defaultOperator } =\n props;\n const { t } = useTranslation('ui');\n\n const initialOperator: TextFilterOperator =\n model?.type ?? defaultOperator ?? 'contains';\n const [operator, setOperator] = useState<TextFilterOperator>(initialOperator);\n const [draft, setDraft] = useState<string>(model?.filter ?? '');\n\n // Hydrate local state when AG Grid pushes an external model change\n // (e.g. consumer calls api.setFilterModel programmatically).\n useEffect(() => {\n setOperator(model?.type ?? defaultOperator ?? 'contains');\n setDraft(model?.filter ?? '');\n }, [model, defaultOperator]);\n\n const matcher = useMemo(() => makeMatcher(i18next.language), []);\n\n useGridFilter({\n doesFilterPass: (params) => {\n const active = model;\n if (!active || active.filter === '') return true;\n const value = coerceToString(getValue(params.node));\n if (value === null) return false;\n switch (active.type) {\n case 'equals':\n return matcher.equals(value, active.filter);\n case 'contains':\n return matcher.contains(value, active.filter);\n case 'startsWith':\n return matcher.startsWith(value, active.filter);\n case 'endsWith':\n return matcher.endsWith(value, active.filter);\n case 'notContains':\n return !matcher.contains(value, active.filter);\n default:\n return true;\n }\n },\n });\n\n function apply() {\n const trimmed = draft.trim();\n if (trimmed === '') {\n onModelChange(null);\n return;\n }\n onModelChange({ type: operator, filter: draft });\n }\n\n function clear() {\n setDraft('');\n setOperator(defaultOperator ?? 'contains');\n onModelChange(null);\n }\n\n const operatorOptions: SelectOption<TextFilterOperator>[] = OPERATORS.map(\n (op) => ({\n value: op,\n label: t(`dataTable.textFilter.operators.${op}`),\n }),\n );\n\n const placeholderLabel = placeholder ?? t('dataTable.textFilter.placeholder');\n\n return (\n <div\n data-component=\"text-filter\"\n className=\"ds:flex ds:flex-col ds:gap-[var(--spacing-sm)] ds:p-[var(--spacing-sm)] ds:min-w-[240px]\"\n >\n <Select<TextFilterOperator>\n size=\"sm\"\n options={operatorOptions}\n value={operator}\n onValueChange={(next) => {\n if (next === '') return;\n setOperator(next);\n }}\n aria-label={t('dataTable.textFilter.operators.contains')}\n />\n <TextInput\n size=\"sm\"\n value={draft}\n onChange={(event) => setDraft(event.target.value)}\n onKeyDown={(event) => {\n if (event.key === 'Enter') {\n event.preventDefault();\n apply();\n }\n }}\n placeholder={placeholderLabel}\n aria-label={placeholderLabel}\n startAdornment={<Search aria-hidden=\"true\" className=\"ds:size-4\" />}\n />\n <div className=\"ds:flex ds:items-center ds:justify-end ds:gap-[var(--spacing-xs)] ds:pt-[var(--spacing-xs)] ds:border-t ds:border-[var(--border)]\">\n <Button intent=\"ghost\" size=\"sm\" onClick={clear} type=\"button\">\n {t('dataTable.textFilter.clear')}\n </Button>\n <Button intent=\"primary\" size=\"sm\" onClick={apply} type=\"button\">\n {t('dataTable.textFilter.apply')}\n </Button>\n </div>\n </div>\n );\n}\n\n/**\n * Floating-filter companion for `TextFilter`.\n *\n * Renders a `<TextInput size=\"sm\">` directly as the inline floating\n * filter — leading search icon, optional trailing clear button, fixed\n * operator (the popover version owns operator selection so the inline\n * row stays compact).\n *\n * Commits debounce at 200ms; empty input commits `null` so the grid\n * stops filtering as soon as the field is blank.\n */\nexport function TextFloatingFilter(\n props: CustomFloatingFilterProps<IFilter, unknown, unknown, TextFilterModel>,\n) {\n const { model, onModelChange, column } = props;\n const { t } = useTranslation('ui');\n\n const filterParams =\n (column?.getColDef?.()?.filterParams as TextFilterParams | undefined) ?? {};\n const defaultOperator: TextFilterOperator =\n filterParams.defaultOperator ?? 'contains';\n const placeholderLabel =\n filterParams.placeholder ?? t('dataTable.textFilter.placeholder');\n\n const [draft, setDraft] = useState<string>(model?.filter ?? '');\n\n // Hydrate when the model changes externally (programmatic reset).\n useEffect(() => {\n setDraft(model?.filter ?? '');\n }, [model?.filter]);\n\n // Debounced commit. Avoids hammering AG Grid with a model push on\n // every keystroke; 200ms matches the kit's other deferred-input\n // patterns. A bare setTimeout + cleanup is sufficient — no third-party\n // debounce hook required.\n useEffect(() => {\n // Avoid spurious commits when the local draft already matches the\n // applied model (e.g. just-hydrated initial mount).\n if (draft === (model?.filter ?? '')) return;\n\n const timer = setTimeout(() => {\n if (draft === '') {\n if (model) onModelChange(null);\n return;\n }\n onModelChange({ type: defaultOperator, filter: draft });\n }, 200);\n\n return () => clearTimeout(timer);\n }, [draft, defaultOperator, model, onModelChange]);\n\n function clearImmediate() {\n setDraft('');\n if (model) onModelChange(null);\n }\n\n return (\n <div data-component=\"text-floating-filter\" className=\"ds:w-full\">\n <TextInput\n size=\"sm\"\n value={draft}\n onChange={(event) => setDraft(event.target.value)}\n placeholder={placeholderLabel}\n aria-label={placeholderLabel}\n startAdornment={<Search aria-hidden=\"true\" className=\"ds:size-4\" />}\n endAdornment={\n draft.length > 0 ? (\n <button\n type=\"button\"\n aria-label={t('dataTable.textFilter.clear')}\n onClick={clearImmediate}\n className=\"ds:pointer-events-auto ds:flex ds:items-center ds:text-[var(--muted-foreground)] ds:hover:text-[var(--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 ) : undefined\n }\n />\n </div>\n );\n}\n","/* -------------------------------------------------------------------- */\n/* Agent adapter — DataTable. */\n/* */\n/* Operations work against the curated `DataTableHandle`, never the raw */\n/* ag-grid `GridApi` (consumers needing the raw API call `getRawApi()`). */\n/* See `src/docs/26-agent-readiness.mdx` §15. */\n/* -------------------------------------------------------------------- */\n\nimport type { AgentAdapter } from '../../agent/types';\nimport type { DataTableHandle, DataTableSortEntry } from './data-table';\n\nexport const dataTableAgent: AgentAdapter<DataTableHandle> = {\n id: 'data-table',\n capabilities: [\n 'select_single',\n 'select_multiple',\n 'range_pick',\n 'filter',\n 'sort',\n 'paginate',\n ],\n state: {\n selection: {\n type: 'string[]',\n descriptionKey: 'ui.agent.dataTable.state.selection',\n description: 'Row ids of currently-selected rows.',\n read: (handle) => handle.getSelection(),\n },\n filter: {\n type: 'object',\n descriptionKey: 'ui.agent.dataTable.state.filter',\n description: 'Current ag-grid filter model, keyed by column id.',\n read: (handle) => handle.getFilter(),\n },\n sort: {\n type: 'Array<{ colId, sort }>',\n descriptionKey: 'ui.agent.dataTable.state.sort',\n description: 'Active sort, in priority order.',\n read: (handle) => handle.getSort(),\n },\n currentPage: {\n type: 'number',\n descriptionKey: 'ui.agent.dataTable.state.currentPage',\n description: 'Zero-indexed page number.',\n read: (handle) => handle.getCurrentPage(),\n },\n },\n actions: {\n select_rows: {\n // Transient grid selection (data-table convention) — stays read.\n safety: 'read',\n argsType: '{ ids: string[] }',\n argsSchema: {\n type: 'object',\n properties: {\n ids: {\n type: 'array',\n items: { type: 'string' },\n description: 'Row ids to select (replaces the current selection).',\n },\n },\n required: ['ids'],\n },\n idempotent: true,\n descriptionKey: 'ui.agent.dataTable.actions.selectRows',\n description: 'Replace the current selection with the given row ids.',\n examples: [\n { args: { ids: ['r-1', 'r-2'] }, note: 'Select the first two rows.' },\n ],\n invoke: (handle, args: { ids: string[] }) => {\n handle.setSelection(args.ids);\n },\n },\n select_range: {\n safety: 'read',\n argsType: '{ fromId: string, toId: string }',\n argsSchema: {\n type: 'object',\n properties: {\n fromId: { type: 'string', description: 'Start row id (inclusive).' },\n toId: { type: 'string', description: 'End row id (inclusive).' },\n },\n required: ['fromId', 'toId'],\n },\n idempotent: true,\n descriptionKey: 'ui.agent.dataTable.actions.selectRange',\n description:\n 'Select every row between fromId and toId, inclusive, in current sort order.',\n invoke: (handle, args: { fromId: string; toId: string }) => {\n handle.selectRange(args.fromId, args.toId);\n },\n },\n clear_selection: {\n safety: 'read',\n idempotent: true,\n descriptionKey: 'ui.agent.dataTable.actions.clearSelection',\n description: 'Deselect all rows.',\n invoke: (handle) => {\n handle.clearSelection();\n },\n },\n get_selection: {\n safety: 'read',\n returns: 'string[]',\n returnsSchema: { type: 'array', items: { type: 'string' } },\n idempotent: true,\n descriptionKey: 'ui.agent.dataTable.actions.getSelection',\n description: 'Return the row ids of the currently-selected rows.',\n invoke: (handle) => handle.getSelection(),\n },\n apply_filter: {\n safety: 'read',\n argsType: '{ model: Record<string, unknown> }',\n argsSchema: {\n type: 'object',\n properties: {\n model: {\n type: 'object',\n description:\n 'ag-grid filter model keyed by column id. Opaque per-column filter shapes; replaces the current model.',\n additionalProperties: true,\n },\n },\n required: ['model'],\n },\n idempotent: true,\n descriptionKey: 'ui.agent.dataTable.actions.applyFilter',\n description: 'Replace the filter model with the given object.',\n invoke: (handle, args: { model: Record<string, unknown> }) => {\n handle.setFilter(args.model);\n },\n },\n sort_by: {\n safety: 'read',\n argsType: '{ model: DataTableSortEntry[] }',\n argsSchema: {\n type: 'object',\n properties: {\n model: {\n type: 'array',\n description: 'Sort entries in priority order.',\n items: {\n type: 'object',\n properties: {\n colId: { type: 'string', description: 'Column id to sort by.' },\n sort: { enum: ['asc', 'desc'], description: 'Sort direction.' },\n },\n required: ['colId', 'sort'],\n },\n },\n },\n required: ['model'],\n },\n idempotent: true,\n descriptionKey: 'ui.agent.dataTable.actions.sortBy',\n description:\n 'Replace the active sort with the given list (priority order).',\n examples: [\n {\n args: { model: [{ colId: 'name', sort: 'asc' }] },\n note: 'Sort by name ascending.',\n },\n ],\n invoke: (handle, args: { model: DataTableSortEntry[] }) => {\n handle.setSort(args.model);\n },\n },\n go_to_page: {\n safety: 'read',\n argsType: '{ page: number }',\n argsSchema: {\n type: 'object',\n properties: {\n page: {\n type: 'integer',\n minimum: 0,\n description: 'Zero-indexed page number.',\n },\n },\n required: ['page'],\n },\n idempotent: true,\n descriptionKey: 'ui.agent.dataTable.actions.goToPage',\n description: 'Navigate to the given zero-indexed page.',\n invoke: (handle, args: { page: number }) => {\n handle.goToPage(args.page);\n },\n },\n },\n domHooks: {\n root: {\n attr: 'data-component',\n value: 'data-table',\n description: 'Marks the DataTable wrapper.',\n },\n instanceId: {\n attr: 'data-component-id',\n sourceProp: 'gridId',\n description:\n 'Sourced from the gridId prop. Required to address a specific table from the agent.',\n },\n item: {\n attr: 'row-id',\n description:\n 'Native ag-grid row-id attribute on each rendered row. Selection is performed via the curated handle, not by DOM mutation.',\n },\n },\n};\n","import 'ag-grid-community/styles/ag-grid.css';\n// Font-only — `@font-face { agGridQuartz }` for the icon glyphs. We\n// deliberately do NOT import `ag-theme-quartz.css`: that file scopes ~90\n// CSS variables to `.ag-theme-quartz` and hardcodes colors / IBM Plex Sans\n// / 8px grid, which fight the design-system tokens. `ag-grid-theme.css`\n// below is a standalone bridge that defines every var AG Grid references,\n// mapped to DS tokens.\nimport 'ag-grid-community/styles/agGridQuartzFont.css';\nimport '../../tokens/ag-grid-theme.css';\n\nimport {\n forwardRef,\n useCallback,\n useEffect,\n useImperativeHandle,\n useMemo,\n useRef,\n useState,\n type ComponentType,\n type ReactNode,\n} from 'react';\nimport { Skeleton } from '../skeleton';\nimport { EmptyState } from '../empty-state';\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport { useTranslation } from 'react-i18next';\nimport { AgGridReact } from 'ag-grid-react';\nimport {\n AllCommunityModule,\n ModuleRegistry,\n type ColDef,\n type ColGroupDef,\n type ColumnMovedEvent,\n type ColumnPinnedEvent,\n type ColumnResizedEvent,\n type ColumnState,\n type FilterChangedEvent,\n type GridApi,\n type GridOptions,\n type RowClassParams,\n type SortChangedEvent,\n} from 'ag-grid-community';\nimport { IconButtonGroup } from '../icon-button-group';\nimport { Toolbar, ToolbarProvider } from './toolbar';\nimport { TextFilter, TextFloatingFilter } from './filters/text-filter';\nimport { useAgentRegistration } from '../../agent';\nimport { usePrefersReducedMotion, useTheme } from '../../hooks';\nimport { dataTableAgent } from './data-table.agent';\n\n// AG Grid v33+ requires module registration before any grid renders.\nModuleRegistry.registerModules([AllCommunityModule]);\n\n/* ------------------------------------------------------------------ */\n/* CVA */\n/* ------------------------------------------------------------------ */\n\nconst dataTableVariants = cva('ag-theme-alfadocs ds:w-full', {\n variants: {\n density: {\n default: '',\n compact: 'data-table-compact',\n expanded: 'data-table-expanded',\n },\n bordered: {\n true: '',\n false: 'ds:[--ag-borders:none]',\n },\n },\n defaultVariants: {\n density: 'default',\n bordered: true,\n },\n});\n\n/* ------------------------------------------------------------------ */\n/* Curated imperative handle — agent-readiness contract */\n/* ------------------------------------------------------------------ */\n\nexport interface DataTableSortEntry {\n colId: string;\n sort: 'asc' | 'desc';\n}\n\n/**\n * Curated handle exposed via `forwardRef`. Replaces the legacy raw `GridApi`\n * forwarding — see `src/docs/26-agent-readiness.mdx` §15. Consumers needing\n * the unwrapped ag-grid API call `getRawApi()`.\n */\nexport interface DataTableHandle<TData = unknown> {\n getSelection: () => string[];\n setSelection: (ids: string[]) => void;\n selectRange: (fromId: string, toId: string) => void;\n clearSelection: () => void;\n getFilter: () => Record<string, unknown>;\n setFilter: (model: Record<string, unknown>) => void;\n getSort: () => DataTableSortEntry[];\n setSort: (model: DataTableSortEntry[]) => void;\n getCurrentPage: () => number;\n goToPage: (page: number) => void;\n getRawApi: () => GridApi<TData> | undefined;\n}\n\n/* ------------------------------------------------------------------ */\n/* Props */\n/* ------------------------------------------------------------------ */\n\nexport interface DataTableProps<TData = unknown> extends Omit<\n VariantProps<typeof dataTableVariants>,\n 'density'\n> {\n /**\n * Column definitions — accepts a mix of leaf `ColDef`s and header\n * `ColGroupDef`s (for two-row grouped headers via `children: [...]`).\n */\n columnDefs: (ColDef<TData> | ColGroupDef<TData>)[];\n rowData?: TData[];\n rowSelection?: 'single' | 'multiple';\n pagination?: boolean;\n paginationPageSize?: number;\n /**\n * Page-size dropdown options shown in the AG Grid pagination panel.\n * Pass `false` to hide the dropdown entirely. Default: `[10, 25, 50, 100]`.\n */\n paginationPageSizeSelector?: number[] | false;\n gridId?: string;\n onSelectionChanged?: (rows: TData[]) => void;\n onSortChanged?: (event: SortChangedEvent<TData>) => void;\n onFilterChanged?: (event: FilterChangedEvent<TData>) => void;\n noRowsOverlay?: ComponentType;\n loadingOverlay?: ComponentType;\n gridOptions?: GridOptions<TData>;\n /** Grid height as a Tailwind height class, e.g. `\"h-[500px]\"` or `\"h-[var(--data-table-height)]\"` */\n heightClass?: string;\n className?: string;\n\n /** Row height preset. `expanded` adds headroom for complex cells (balances, tag lists). */\n density?: 'compact' | 'default' | 'expanded';\n\n /** Map row → class name. Use together with `data-table-row-success/warning/error` for tinted rows. */\n getRowClass?: (params: RowClassParams<TData>) => string | undefined;\n /** Rows pinned at the bottom of the grid. Use `useTotalRow()` to compute a totals row. */\n pinnedBottomRowData?: TData[];\n\n /** Print-optimised mode — hides toolbar, disables pagination, renders every row. */\n printMode?: boolean;\n\n /** Composable toolbar — renders `<DataTable.Toolbar>…</DataTable.Toolbar>` above the grid. */\n children?: ReactNode;\n}\n\n/* ------------------------------------------------------------------ */\n/* Locale text builder */\n/* ------------------------------------------------------------------ */\n\nfunction useAgLocaleText() {\n const { t } = useTranslation();\n return useMemo(\n () => ({\n // Filter strings\n contains: t('dataTable.agGrid.contains'),\n notContains: t('dataTable.agGrid.notContains'),\n equals: t('dataTable.agGrid.equals'),\n notEqual: t('dataTable.agGrid.notEqual'),\n startsWith: t('dataTable.agGrid.startsWith'),\n endsWith: t('dataTable.agGrid.endsWith'),\n lessThan: t('dataTable.agGrid.lessThan'),\n greaterThan: t('dataTable.agGrid.greaterThan'),\n inRange: t('dataTable.agGrid.inRange'),\n blank: t('dataTable.agGrid.blank'),\n notBlank: t('dataTable.agGrid.notBlank'),\n filterOoo: t('dataTable.agGrid.filterOoo'),\n applyFilter: t('dataTable.agGrid.applyFilter'),\n resetFilter: t('dataTable.agGrid.resetFilter'),\n noRowsToShow: t('dataTable.agGrid.noRowsToShow'),\n selectAll: t('dataTable.agGrid.selectAll'),\n // Pagination\n page: t('dataTable.page'),\n of: t('dataTable.of'),\n to: t('dataTable.to'),\n nextPage: t('dataTable.nextPage'),\n previousPage: t('dataTable.previousPage'),\n firstPage: t('dataTable.firstPage'),\n lastPage: t('dataTable.lastPage'),\n pageSize: t('dataTable.pageSize'),\n }),\n\n [t],\n );\n}\n\n/* ------------------------------------------------------------------ */\n/* Loading overlay */\n/* ------------------------------------------------------------------ */\n\nfunction DefaultLoadingOverlay() {\n return (\n <div\n role=\"status\"\n aria-live=\"polite\"\n className=\"ds:flex ds:w-full ds:flex-col ds:gap-[var(--spacing-sm)] ds:p-[var(--spacing-md)]\"\n >\n {Array.from({ length: 5 }).map((_, i) => (\n <Skeleton\n key={i}\n variant=\"rectangular\"\n className=\"ds:h-[var(--min-target-size)] ds:w-full\"\n />\n ))}\n </div>\n );\n}\n\n/* ------------------------------------------------------------------ */\n/* No-rows overlay — wired to the DS EmptyState component */\n/* ------------------------------------------------------------------ */\n\nfunction DefaultNoRowsOverlay() {\n const { t } = useTranslation();\n return (\n <EmptyState\n variant=\"no-results\"\n size=\"sm\"\n title={t('dataTable.noRows')}\n description={t('dataTable.noRowsDescription')}\n />\n );\n}\n\n/* ------------------------------------------------------------------ */\n/* Column persistence helpers */\n/* ------------------------------------------------------------------ */\n\n/* Persistence covers order / width only. `hide` and `pinned` are stripped on\n * both save and load: visibility is runtime state (ColumnToggle, responsive\n * hook) and pinning is a design decision declared in the columnDefs (often\n * derived from text direction) — a snapshot taken at one viewport/direction\n * must never override another mount's defaults. */\nfunction sanitizeColumnState(state: ColumnState[]): ColumnState[] {\n return state.map(({ hide: _hide, pinned: _pinned, ...rest }) => rest);\n}\n\nfunction loadColumnState(gridId: string): ColumnState[] | null {\n try {\n const raw = localStorage.getItem(`data-table-col-state:${gridId}`);\n if (!raw) return null;\n const parsed: unknown = JSON.parse(raw);\n return Array.isArray(parsed)\n ? sanitizeColumnState(parsed as ColumnState[])\n : null;\n } catch {\n return null;\n }\n}\n\nfunction saveColumnState(gridId: string, api: GridApi) {\n try {\n localStorage.setItem(\n `data-table-col-state:${gridId}`,\n JSON.stringify(sanitizeColumnState(api.getColumnState())),\n );\n } catch {\n // localStorage may be unavailable in some environments\n }\n}\n\n/* Column events fired by layout/code rather than a user gesture — flex\n * re-layout, autosize, API calls (incl. the responsive hook). These must not\n * write to the persisted state or every mount would snapshot itself. */\nconst PROGRAMMATIC_COLUMN_SOURCES = new Set<string>([\n 'api',\n 'flex',\n 'gridInitializing',\n 'gridOptionsChanged',\n 'autosizeColumns',\n 'sizeColumnsToFit',\n]);\n\n/* ------------------------------------------------------------------ */\n/* DataTable */\n/* ------------------------------------------------------------------ */\n\nfunction DataTableInner<TData = unknown>(\n props: DataTableProps<TData>,\n ref: React.ForwardedRef<DataTableHandle<TData>>,\n) {\n const {\n columnDefs,\n rowData,\n rowSelection,\n pagination = false,\n paginationPageSize = 25,\n paginationPageSizeSelector = [10, 25, 50, 100],\n gridId,\n onSelectionChanged,\n onSortChanged,\n onFilterChanged,\n noRowsOverlay,\n loadingOverlay,\n gridOptions,\n density,\n bordered,\n heightClass = 'ds:h-[500px]',\n className,\n getRowClass,\n pinnedBottomRowData,\n printMode = false,\n children,\n } = props;\n\n const { t, i18n } = useTranslation();\n const agGridRef = useRef<AgGridReact<TData>>(null);\n const [selectionCount, setSelectionCount] = useState(0);\n const [sortAnnouncement, setSortAnnouncement] = useState('');\n const localeText = useAgLocaleText();\n\n // Curated imperative handle — see DataTableHandle above.\n const handle = useMemo<DataTableHandle<TData>>(\n () => ({\n getSelection: () => {\n const api = agGridRef.current?.api;\n if (!api) return [];\n const ids: string[] = [];\n for (const node of api.getSelectedNodes()) {\n if (node.id != null) ids.push(node.id);\n }\n return ids;\n },\n setSelection: (ids) => {\n const api = agGridRef.current?.api;\n if (!api) return;\n const want = new Set(ids);\n api.forEachNode((node) => {\n if (node.id != null) node.setSelected(want.has(node.id));\n });\n },\n selectRange: (fromId, toId) => {\n const api = agGridRef.current?.api;\n if (!api) return;\n const ordered: string[] = [];\n api.forEachNodeAfterFilterAndSort((node) => {\n if (node.id != null) ordered.push(node.id);\n });\n const a = ordered.indexOf(fromId);\n const b = ordered.indexOf(toId);\n if (a < 0 || b < 0) return;\n const [lo, hi] = a <= b ? [a, b] : [b, a];\n const want = new Set(ordered.slice(lo, hi + 1));\n api.forEachNode((node) => {\n if (node.id != null) node.setSelected(want.has(node.id));\n });\n },\n clearSelection: () => {\n agGridRef.current?.api?.deselectAll();\n },\n getFilter: () => agGridRef.current?.api?.getFilterModel() ?? {},\n setFilter: (model) => {\n agGridRef.current?.api?.setFilterModel(model);\n },\n getSort: () => {\n const api = agGridRef.current?.api;\n if (!api) return [];\n return api\n .getColumnState()\n .filter((c) => c.sort === 'asc' || c.sort === 'desc')\n .map((c) => ({ colId: c.colId, sort: c.sort as 'asc' | 'desc' }));\n },\n setSort: (model) => {\n const api = agGridRef.current?.api;\n if (!api) return;\n const next = api.getColumnState().map((c) => {\n const target = model.find((m) => m.colId === c.colId);\n return { ...c, sort: target ? target.sort : null };\n });\n api.applyColumnState({ state: next, defaultState: { sort: null } });\n },\n getCurrentPage: () =>\n agGridRef.current?.api?.paginationGetCurrentPage() ?? 0,\n goToPage: (page) => {\n agGridRef.current?.api?.paginationGoToPage(page);\n },\n getRawApi: () => agGridRef.current?.api,\n }),\n [],\n );\n\n useImperativeHandle(ref, () => handle, [handle]);\n // Agent adapter is keyed on the row-agnostic DataTableHandle; cast here\n // because TData isn't observable from the agent surface.\n useAgentRegistration(dataTableAgent, handle as DataTableHandle, gridId);\n\n const isRtl = i18n.dir() === 'rtl';\n const isLoading = rowData === undefined;\n\n // Reactive — re-renders when the OS preference or theme toggles mid-session.\n const prefersReducedMotion = usePrefersReducedMotion();\n const { resolvedTheme } = useTheme();\n // Suppress compact density in accessible theme — 32px rows violate min-target-size.\n const isAccessible =\n resolvedTheme === 'light-accessible' || resolvedTheme === 'dark-accessible';\n const effectiveDensity =\n isAccessible && density === 'compact' ? 'default' : density;\n\n // Map logical 'single' | 'multiple' → AG Grid v35 object form\n const rowSelectionOption = useMemo(() => {\n if (!rowSelection) return undefined;\n if (rowSelection === 'single') return { mode: 'singleRow' as const };\n return {\n mode: 'multiRow' as const,\n headerCheckbox: true,\n checkboxes: true,\n };\n }, [rowSelection]);\n\n // Column persistence — restore on mount\n const handleGridReady = useCallback(() => {\n if (!gridId || !agGridRef.current?.api) return;\n const saved = loadColumnState(gridId);\n if (saved) {\n agGridRef.current.api.applyColumnState({\n state: saved,\n applyOrder: true,\n });\n }\n }, [gridId]);\n\n const handleColumnStateChange = useCallback(\n (\n event:\n | ColumnMovedEvent<TData>\n | ColumnResizedEvent<TData>\n | ColumnPinnedEvent<TData>,\n ) => {\n if (event.source && PROGRAMMATIC_COLUMN_SOURCES.has(event.source)) {\n return;\n }\n if (gridId && agGridRef.current?.api) {\n saveColumnState(gridId, agGridRef.current.api);\n }\n },\n [gridId],\n );\n\n // `defaultColDef` is pre-merged into the explicit prop below (kit defaults +\n // the consumer's overrides). Strip it from the forwarded gridOptions so the\n // catch-all spread can't re-clobber that merge with the raw value — which\n // would silently drop `floatingFilter` / `filter` / `sortable` for every\n // column the moment a consumer sets a single `defaultColDef` key.\n const forwardedGridOptions = useMemo(() => {\n if (!gridOptions) return undefined;\n const next = { ...(gridOptions as GridOptions<TData>) };\n delete next.defaultColDef;\n return next;\n }, [gridOptions]);\n\n const handleSelectionChanged = useCallback(() => {\n const api = agGridRef.current?.api;\n if (!api) return;\n const rows = api.getSelectedRows();\n setSelectionCount(rows.length);\n onSelectionChanged?.(rows);\n }, [onSelectionChanged]);\n\n const handleSortChanged = useCallback(\n (event: SortChangedEvent<TData>) => {\n const api = agGridRef.current?.api;\n if (api) {\n const colState = api.getColumnState();\n const sortedCol = colState.find((c) => c.sort);\n if (sortedCol) {\n const colId = sortedCol.colId;\n // Use the live AG Grid API so grouped headers and runtime column\n // mutations (visibility toggles, dynamic re-order) resolve correctly.\n const colDef = api.getColumnDef(colId);\n const colName = (colDef?.headerName as string) ?? colId;\n const dirKey =\n sortedCol.sort === 'asc'\n ? 'dataTable.sortAscending'\n : 'dataTable.sortDescending';\n setSortAnnouncement(\n t('dataTable.sortAnnounce', {\n column: colName,\n direction: t(dirKey),\n }),\n );\n } else {\n setSortAnnouncement('');\n }\n }\n onSortChanged?.(event);\n },\n [onSortChanged, t],\n );\n\n const handleFilterChanged = useCallback(\n (event: FilterChangedEvent<TData>) => {\n onFilterChanged?.(event);\n },\n [onFilterChanged],\n );\n\n // Clear sort announcement after screen readers have had time to read it\n useEffect(() => {\n if (!sortAnnouncement) return;\n const id = setTimeout(() => setSortAnnouncement(''), 3000);\n return () => clearTimeout(id);\n }, [sortAnnouncement]);\n\n const NoRowsComponent = noRowsOverlay ?? DefaultNoRowsOverlay;\n const LoadingComponent = loadingOverlay ?? DefaultLoadingOverlay;\n\n const getApi = useCallback(\n () => agGridRef.current?.api as GridApi | undefined,\n [],\n );\n\n const handlePrint = useCallback(() => {\n if (typeof window !== 'undefined') {\n window.print();\n }\n }, []);\n\n const wrapperClass = dataTableVariants({\n density: effectiveDensity,\n bordered,\n className,\n });\n\n // Toolbar composition — consumer-provided children win; otherwise render\n // the standard table-tools cluster (Export / Print / Columns) as one\n // connected icon group, end-aligned on the page background — the same\n // layout the Patients / Care Plan List patterns established. Excel + PDF\n // export deps are dynamic-imported by their item handlers. The\n // `data-table-toolbar` class is the print-suppression marker.\n const toolbarContent = children ?? (\n <div className=\"data-table-toolbar ds:flex ds:justify-end\">\n <IconButtonGroup\n role=\"toolbar\"\n aria-label={t('dataTable.tableActions')}\n className=\"ds:bg-[var(--background)]\"\n >\n <Toolbar.ExportMenu />\n <Toolbar.Print />\n <Toolbar.ColumnToggle />\n </IconButtonGroup>\n </div>\n );\n\n // Pagination is auto-disabled in print mode so every row prints.\n const paginationEnabled = printMode ? false : pagination;\n\n return (\n <div\n className=\"ds:flex ds:w-full ds:min-h-0 ds:flex-1 ds:flex-col ds:gap-[var(--spacing-sm)]\"\n aria-busy={isLoading ? 'true' : undefined}\n data-component=\"data-table\"\n data-component-id={gridId}\n data-print-mode={printMode ? 'true' : undefined}\n >\n {!printMode && (\n <ToolbarProvider\n getApi={getApi}\n selectionCount={selectionCount}\n onPrint={handlePrint}\n >\n {toolbarContent}\n </ToolbarProvider>\n )}\n\n {/* Grid */}\n <div\n className={[wrapperClass, printMode ? '' : heightClass]\n .join(' ')\n .trim()}\n >\n <AgGridReact<TData>\n ref={agGridRef}\n // Opt into v32 CSS-file theming so the `.ag-theme-alfadocs` bridge\n // (src/tokens/ag-grid-theme.css) wins. Without this, AG Grid v33+\n // defaults to the JS Theming API (themeQuartz) which overrides our\n // tokens at runtime — including --ag-font-family.\n theme=\"legacy\"\n columnDefs={columnDefs}\n rowData={rowData}\n /* §11a — every column gets sort + filter + resize + floating\n filter by default. Consumers opt-out per column via\n `sortable: false` / `filter: false`. The spread at the end\n lets `gridOptions.defaultColDef` override individual keys\n without losing the rest.\n\n Note: the column-menu button (`menuTabs` /\n `suppressHeaderMenuButton`) requires `ColumnMenuModule`,\n which is Enterprise in v33+. The floating-filter row is the\n Community-friendly equivalent and covers the primary use\n case — sort + filter without an extra popup. */\n defaultColDef={{\n sortable: true,\n // Default filter = DS-styled text filter so untyped columns\n // (no explicit `filter:` override) inherit the kit's form\n // language instead of AG Grid's stock browser-skinned input.\n // Number / date / select columns opt into their dedicated\n // wrapper per-column.\n filter: TextFilter,\n floatingFilterComponent: TextFloatingFilter,\n resizable: true,\n floatingFilter: true,\n // §13d — faint sort icon advertises which columns are\n // sortable. v33+ moved this from grid-level to defaultColDef.\n unSortIcon: true,\n ...(gridOptions as GridOptions<TData> | undefined)?.defaultColDef,\n }}\n rowSelection={rowSelectionOption}\n pagination={paginationEnabled}\n paginationPageSize={paginationPageSize}\n paginationPageSizeSelector={paginationPageSizeSelector}\n /* §13k — locale-aware pagination chrome (\"1 a 25 di 1.287\" in\n Italian). AG Grid's default renders raw integers. */\n paginationNumberFormatter={(params) =>\n new Intl.NumberFormat(i18n.language).format(params.value)\n }\n animateRows={!prefersReducedMotion}\n enableRtl={isRtl}\n ensureDomOrder\n /* Enable CellSpanModule globally — gate prop required for any\n colDef using `spanRows: true` (Community). Zero runtime cost\n when no column opts in. */\n enableCellSpan\n /* §13a — selecting cell text with the mouse should just work\n (copy a patient ID, an invoice number). AG Grid defaults this\n to false; that breaks user expectation on web tables. */\n enableCellTextSelection\n /* §13b — when a user copies a range, include column headers in\n the clipboard so a paste into Excel/Sheets keeps context. */\n copyHeadersToClipboard\n /* §13c — locale-aware sort (Intl.Collator). \"à\" sorts next to\n \"a\", \"ñ\" next to \"n\". Italian-first matters. */\n accentedSort\n /* §13d unSortIcon — moved to defaultColDef above per v33+\n deprecation. */\n /* §13e — Ctrl/⌘ for multi-column sort. Accounting + clinical\n staff who live in these grids appreciate this. */\n multiSortKey=\"ctrl\"\n /* §13f — dragging a column header outside the grid no longer\n hides the column. Surprising default, easy to trigger by\n accident, hard to recover from without ColumnToggle. */\n suppressDragLeaveHidesColumns\n /* §13g — when row selection is enabled, require explicit\n checkbox/modifier-key selection. Don't fight the primary\n row action (open / edit / navigate) with click-anywhere\n selection. No-op when rowSelection is unset. */\n suppressRowClickSelection={rowSelection ? true : undefined}\n /* §13h — tooltip ergonomics: 500 ms show matches OS, 5 s hide\n gives time to read long content, hover keeps it visible. */\n tooltipShowDelay={500}\n tooltipHideDelay={5000}\n tooltipInteraction\n /* §13i — commit-on-blur contract for inline editing. No-op\n until any column declares `editable: true`. */\n stopEditingWhenCellsLoseFocus\n /* §13j — preserve user column reorder across columnDefs\n prop changes; pairs with the localStorage persistence below. */\n maintainColumnOrder\n /* §13l — Ctrl/⌘+Z for inline edits. No-op until editable\n columns appear. */\n undoRedoCellEditing\n undoRedoCellEditingLimit={20}\n suppressCellFocus={false}\n rowBuffer={10}\n localeText={localeText}\n noRowsOverlayComponent={NoRowsComponent}\n loadingOverlayComponent={LoadingComponent}\n getRowClass={getRowClass}\n pinnedBottomRowData={pinnedBottomRowData}\n domLayout={printMode ? 'autoHeight' : undefined}\n onGridReady={handleGridReady}\n onColumnMoved={handleColumnStateChange}\n onColumnResized={handleColumnStateChange}\n onColumnPinned={handleColumnStateChange}\n onSortChanged={handleSortChanged}\n onFilterChanged={handleFilterChanged}\n onSelectionChanged={handleSelectionChanged}\n {...forwardedGridOptions}\n />\n </div>\n\n {/* Footer */}\n {!printMode && (\n <div className=\"ds:flex ds:items-center ds:justify-between type-body-sm ds:text-[color:var(--muted-foreground)]\">\n {selectionCount > 0 ? (\n <span>{t('dataTable.selected', { count: selectionCount })}</span>\n ) : (\n <span />\n )}\n </div>\n )}\n\n {/* Aria-live region for sort announcements */}\n <span role=\"status\" aria-live=\"polite\" className=\"ds:sr-only\">\n {sortAnnouncement}\n </span>\n </div>\n );\n}\n\nconst DataTableBase = forwardRef(DataTableInner) as <TData = unknown>(\n props: DataTableProps<TData> & { ref?: React.Ref<DataTableHandle<TData>> },\n) => React.ReactElement;\n\n(DataTableBase as { displayName?: string }).displayName = 'DataTable';\n\nexport const DataTable = Object.assign(DataTableBase, {\n Toolbar,\n});\n","import { cloneElement, isValidElement, type ReactNode } from 'react';\nimport type { CustomCellRendererProps } from 'ag-grid-react';\nimport { useTranslation } from 'react-i18next';\nimport { MoreHorizontal } from 'lucide-react';\nimport { IconButton } from '../../button/icon-button';\nimport { IconButtonGroup } from '../../icon-button-group';\nimport { DropdownMenu } from '../../dropdown-menu';\n\n// Lucide icons render at their intrinsic 24×24 unless given a `size` prop or\n// `size-*` class. The IconButton's wrapping span is only `size-4` (16px), so a\n// bare `<Trash2 />` overflows and, inside AG Grid's `overflow: hidden` cells,\n// gets clipped into horizontal slivers. Coerce icon nodes to the expected size.\nfunction sizeIcon(node: ReactNode): ReactNode {\n if (!isValidElement(node)) return node;\n const element = node as React.ReactElement<{\n className?: string;\n size?: number;\n }>;\n const existingClass = element.props.className ?? '';\n const className = /\\bsize-|\\bw-|\\bh-/.test(existingClass)\n ? existingClass\n : `${existingClass} size-4`.trim();\n return cloneElement(element, { className, size: element.props.size ?? 16 });\n}\n\nexport interface ActionDef<TData = unknown> {\n /** Lucide-style icon node. */\n icon: ReactNode;\n /** Accessible label — also used as the tooltip. */\n label: string;\n /** Invoked with the row data. */\n onClick: (data: TData) => void;\n /** Disable the action. Pass a predicate for per-row disablement. */\n disabled?: boolean | ((data: TData) => boolean);\n /** Human-readable reason shown in the tooltip when disabled. */\n disabledReason?: string;\n /** `destructive` swaps the button intent. */\n variant?: 'default' | 'destructive';\n /** Hide the action entirely. Pass a predicate for per-row hiding. */\n hidden?: boolean | ((data: TData) => boolean);\n}\n\nexport interface ActionsCellRendererParams<TData = unknown> {\n actions: ActionDef<TData>[];\n /** Intent of the inline buttons / the collapsed trigger (default `ghost`). */\n intent?: 'ghost' | 'outline';\n /**\n * Render the inline buttons as a connected `IconButtonGroup` (a segmented\n * control) rather than a loose row. Requires `label` for the group name.\n */\n group?: boolean;\n /** Accessible name for the group and the collapsed overflow trigger. */\n label?: string;\n /**\n * Collapse the actions into a single \"…\" overflow menu instead of inline\n * buttons. Pass a getter to flip it at runtime — call\n * `api.refreshCells({ force: true })` after the underlying value changes so\n * the cells re-read it (this preserves column state, unlike rebuilding defs).\n */\n collapsed?: boolean | (() => boolean);\n}\n\n/**\n * Pixel width an actions column needs so `count` inline `sm` IconButtons (32px\n * each — whether segmented via `group` or loose) plus the data-table cell's\n * inline padding never clip. AG Grid gives a column ONE width for every row, so\n * pass the TOTAL number of actions (the worst case where a single row shows them\n * all) — not the per-row visible count, which varies with `hidden` predicates.\n *\n * Use it as the column `width` so a fully-actioned row can't overflow:\n *\n * {\n * colId: 'actions',\n * cellRenderer: ActionsCellRenderer,\n * cellRendererParams: { actions, group: true },\n * width: actionsColumnWidth(actions.length),\n * // minWidth stays at the collapsed footprint when `collapsed` is used.\n * }\n */\nexport function actionsColumnWidth(count: number): number {\n const SM_BUTTON = 32; // sm IconButton (`w-8`)\n // Segmented-group border + the data-table cell's inline padding, with a little\n // breathing room so the group never sits flush against the clip edge.\n const CELL_INSET = 26;\n return Math.max(1, count) * SM_BUTTON + CELL_INSET;\n}\n\nfunction resolve<T>(\n flag: boolean | ((data: T) => boolean) | undefined,\n data: T,\n): boolean {\n if (typeof flag === 'function') return flag(data);\n return Boolean(flag);\n}\n\nconst destructiveInline =\n 'ds:text-[color:var(--destructive)] ds:hover:text-[color:var(--destructive-hover)]';\n\nexport function ActionsCellRenderer<TData = unknown>(\n props: CustomCellRendererProps<TData> & ActionsCellRendererParams<TData>,\n) {\n const { data, actions, intent = 'ghost', group, label, collapsed } = props;\n const { t } = useTranslation();\n if (!data) return null;\n\n const visible = actions.filter((action) => !resolve(action.hidden, data));\n const isCollapsed =\n typeof collapsed === 'function' ? collapsed() : Boolean(collapsed);\n\n // Collapsed: one \"…\" trigger opening a DropdownMenu of the actions. Disabled\n // actions stay in the menu but inert (the per-action `disabledReason` is an\n // inline-only affordance — a menu row has no tooltip surface).\n if (isCollapsed) {\n return (\n <DropdownMenu.Root>\n <DropdownMenu.Trigger asChild>\n <IconButton\n size=\"sm\"\n intent={intent}\n icon={<MoreHorizontal aria-hidden />}\n aria-label={label ?? t('dataTable.actions', 'Actions')}\n />\n </DropdownMenu.Trigger>\n <DropdownMenu.Content align=\"end\">\n {visible.map((action, index) => (\n <DropdownMenu.Item\n // Action defs are referentially stable; index is safe as actions\n // do not reorder within a row.\n key={index}\n startIcon={sizeIcon(action.icon)}\n disabled={resolve(action.disabled, data)}\n onSelect={() => action.onClick(data)}\n className={\n action.variant === 'destructive'\n ? 'ds:text-[color:var(--destructive)]'\n : undefined\n }\n >\n {action.label}\n </DropdownMenu.Item>\n ))}\n </DropdownMenu.Content>\n </DropdownMenu.Root>\n );\n }\n\n const buttons = visible.map((action, index) => {\n const isDisabled = resolve(action.disabled, data);\n const tooltip =\n isDisabled && action.disabledReason\n ? action.disabledReason\n : action.label;\n return (\n <IconButton\n // See note above on index keys.\n key={index}\n size=\"sm\"\n intent={intent}\n icon={sizeIcon(action.icon)}\n tooltip={tooltip}\n aria-label={action.label}\n disabled={isDisabled}\n onClick={(event) => {\n event.stopPropagation();\n action.onClick(data);\n }}\n className={\n action.variant === 'destructive' ? destructiveInline : undefined\n }\n />\n );\n });\n\n return group ? (\n <IconButtonGroup\n aria-label={label ?? t('dataTable.actions', 'Actions')}\n size=\"sm\"\n >\n {buttons}\n </IconButtonGroup>\n ) : (\n <span className=\"ds:inline-flex ds:items-center ds:gap-[var(--spacing-xs)]\">\n {buttons}\n </span>\n );\n}\n"],"names":["__iconNode","Columns3Cog","createLucideIcon","sizeIcon","node","isValidElement","element","existingClass","className","cloneElement","ToolbarContext","createContext","useToolbarContext","caller","ctx","useContext","ToolbarProvider","getApi","selectionCount","onPrint","children","value","useMemo","jsx","TOOLBAR_BASE","ToolbarRoot","forwardRef","props","ref","FilterBar","Actions","ExportCsv","label","onExport","intent","rest","t","useTranslation","handleClick","useCallback","api","IconButton","Download","resolveTokenToRgb","varName","fallback","probe","computed","match","defaultExportPdf","options","jsPDF","autoTable","n","visibleColumns","col","head","body","cells","headerFill","headerText","bodyText","alternateFill","doc","ExportPdf","onClick","fileName","FileText","Print","Printer","QuickSearch","placeholder","debounceMs","setValue","useState","timerRef","useRef","useEffect","TextInput","e","Search","Refresh","onRefresh","RefreshCw","describeFilterModel","model","m","type","filterTo","FilterChips","chips","setChips","quickFilter","setQuickFilter","refresh","cols","next","colId","c","headerName","qf","cleanup","handler","_event","subscribe","ready","timer","clearOne","clearAll","jsxs","Tag","Button","X","FacetFilter","field","active","setActive","apply","opt","isActive","DEFAULT_EXPORT_ITEMS","defaultExportXlsx","ExcelJS","workbook","sheet","headerRow","hex","r","g","b","cell","buffer","blob","url","link","ExportMenuContext","useExportMenuContext","ExportMenu","itemsContent","f","ExportMenuItem","DropdownMenu","defaultLabel","format","defaultIcon","FileSpreadsheet","readColumnEntries","ColumnToggle","icon","footer","header","open","setOpen","columns","setColumns","draggingColId","setDraggingColId","dragOverColId","setDragOverColId","toggleColumn","nextVisible","prev","moveColumn","fromColId","toColId","fromIdx","toIdx","moved","labelText","Popover","isDragging","isDragOver","GripVertical","Checkbox","checked","BulkAction","variant","size","leaf","ExportMenuNamespace","Toolbar","OPERATORS","makeMatcher","locale","collator","indexOf","haystack","needle","i","a","coerceToString","raw","TextFilter","onModelChange","getValue","defaultOperator","initialOperator","operator","setOperator","draft","setDraft","matcher","i18next","useGridFilter","params","clear","operatorOptions","op","placeholderLabel","Select","event","TextFloatingFilter","column","filterParams","_b","_a","clearImmediate","dataTableAgent","handle","args","ModuleRegistry","AllCommunityModule","dataTableVariants","cva","useAgLocaleText","DefaultLoadingOverlay","_","Skeleton","DefaultNoRowsOverlay","EmptyState","sanitizeColumnState","state","_hide","_pinned","loadColumnState","gridId","parsed","saveColumnState","PROGRAMMATIC_COLUMN_SOURCES","DataTableInner","columnDefs","rowData","rowSelection","pagination","paginationPageSize","paginationPageSizeSelector","onSelectionChanged","onSortChanged","onFilterChanged","noRowsOverlay","loadingOverlay","gridOptions","density","bordered","heightClass","getRowClass","pinnedBottomRowData","printMode","i18n","agGridRef","setSelectionCount","sortAnnouncement","setSortAnnouncement","localeText","ids","want","fromId","toId","ordered","lo","hi","target","page","useImperativeHandle","useAgentRegistration","isRtl","isLoading","prefersReducedMotion","usePrefersReducedMotion","resolvedTheme","useTheme","effectiveDensity","rowSelectionOption","handleGridReady","saved","handleColumnStateChange","forwardedGridOptions","handleSelectionChanged","rows","handleSortChanged","sortedCol","colDef","colName","dirKey","handleFilterChanged","id","NoRowsComponent","LoadingComponent","handlePrint","wrapperClass","toolbarContent","IconButtonGroup","paginationEnabled","AgGridReact","DataTableBase","DataTable","actionsColumnWidth","count","resolve","flag","data","destructiveInline","ActionsCellRenderer","actions","group","collapsed","visible","action","MoreHorizontal","index","buttons","isDisabled","tooltip"],"mappings":"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","x_google_ignoreList":[0]}
|
|
@@ -8,7 +8,7 @@ import { u as Re } from "./registry-DvAUVLHh.js";
|
|
|
8
8
|
import { _ as g } from "./index-4xgbg-sn.js";
|
|
9
9
|
import { u as De } from "./index-BcMWc8W2.js";
|
|
10
10
|
import { I as te } from "./icon-button-C_kbcd7I.js";
|
|
11
|
-
import { S as We } from "./select-
|
|
11
|
+
import { S as We } from "./select-BW5ecXlX.js";
|
|
12
12
|
import { S as _e } from "./send-C5kDJ-Mz.js";
|
|
13
13
|
import { X as Ae } from "./x-B5YnXwCz.js";
|
|
14
14
|
const Le = {
|
|
@@ -497,4 +497,4 @@ export {
|
|
|
497
497
|
Ze as A,
|
|
498
498
|
Le as a
|
|
499
499
|
};
|
|
500
|
-
//# sourceMappingURL=ai-prompt-input-
|
|
500
|
+
//# sourceMappingURL=ai-prompt-input-DziJCGLe.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ai-prompt-input-DFm58UjY.js","sources":["../../src/components/ai-prompt-input/ai-prompt-input.agent.ts","../../src/components/ai-prompt-input/ai-prompt-input.tsx"],"sourcesContent":["/* -------------------------------------------------------------------- */\n/* Agent adapter — AIPromptInput. */\n/* -------------------------------------------------------------------- */\n\nimport type { AgentAdapter } from '../../agent/types';\nimport type { AIPromptInputHandle } from './ai-prompt-input';\n\nexport const aiPromptInputAgent: AgentAdapter<AIPromptInputHandle> = {\n id: 'ai-prompt-input',\n capabilities: ['edit_inline', 'submit'],\n state: {\n value: {\n type: 'string',\n descriptionKey: 'ui.agent.aiPromptInput.state.value',\n description: 'Current text in the composer (no PHI processing).',\n read: (handle) => handle.getValue(),\n },\n isEmpty: {\n type: 'boolean',\n descriptionKey: 'ui.agent.aiPromptInput.state.isEmpty',\n description: 'True when the composer has no text and no attachments.',\n read: (handle) => handle.isEmpty(),\n },\n isSubmitting: {\n type: 'boolean',\n descriptionKey: 'ui.agent.aiPromptInput.state.isSubmitting',\n description:\n 'True while an onSubmit invocation is in flight (best-effort).',\n read: (handle) => handle.isSubmitting(),\n },\n },\n actions: {\n set_value: {\n // Sets a form/input value — reversible via the same UI.\n safety: 'write',\n argsType: '{ value: string }',\n argsSchema: {\n type: 'object',\n properties: { value: { type: 'string' } },\n required: ['value'],\n },\n idempotent: true,\n descriptionKey: 'ui.agent.aiPromptInput.actions.setValue',\n description: 'Replace the composer text with the given value.',\n examples: [\n {\n args: { value: 'Summarise the last visit' },\n note: 'Replace composer text.',\n },\n ],\n invoke: (handle, args: { value: string }) => {\n handle.setValue(args.value);\n },\n },\n clear: {\n // Loses the user's (potentially long) draft — irreversible from this UI.\n safety: 'destructive',\n idempotent: true,\n descriptionKey: 'ui.agent.aiPromptInput.actions.clear',\n description: 'Clear text and attachments. Irreversible from the same UI.',\n invoke: (handle) => {\n handle.clear();\n },\n },\n submit: {\n // Hands the composer state to onSubmit, which dispatches to an external\n // AI/host system — openWorld.\n safety: 'write',\n openWorld: true,\n descriptionKey: 'ui.agent.aiPromptInput.actions.submit',\n description: 'Submit the current composer state via onSubmit.',\n invoke: (handle) => {\n handle.submit();\n },\n },\n focus: {\n // Pure ephemeral focus state.\n safety: 'read',\n descriptionKey: 'ui.agent.aiPromptInput.actions.focus',\n description: 'Move keyboard focus into the textarea.',\n invoke: (handle) => {\n handle.focus();\n },\n },\n },\n domHooks: {\n root: {\n attr: 'data-component',\n value: 'ai-prompt-input',\n description: 'Marks the AIPromptInput wrapper.',\n },\n instanceId: {\n attr: 'data-component-id',\n sourceProp: 'id',\n description:\n 'Sourced from the id prop; addresses a specific composer instance.',\n },\n },\n};\n","import {\n forwardRef,\n useCallback,\n useId,\n useImperativeHandle,\n useMemo,\n useRef,\n useState,\n type ChangeEvent,\n type ClipboardEvent,\n type CompositionEvent,\n type KeyboardEvent,\n type ReactNode,\n type TextareaHTMLAttributes,\n} from 'react';\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport { useTranslation } from 'react-i18next';\nimport { useControllableState } from '../../hooks/use-controllable-state';\nimport { useIsomorphicLayoutEffect } from '../../hooks/use-isomorphic-layout-effect';\nimport { useAgentRegistration } from '../../agent/registry';\nimport { aiPromptInputAgent } from './ai-prompt-input.agent';\nimport { Command } from 'cmdk';\nimport { useDropzone } from 'react-dropzone';\nimport { Send, X } from 'lucide-react';\nimport { IconButton } from '../button';\nimport { Select, type SelectOption } from '../select/select';\n\n/* ------------------------------------------------------------------ */\n/* Types */\n/* ------------------------------------------------------------------ */\n\nexport interface AIPromptCommand {\n id: string;\n label: string;\n description?: string;\n}\n\nexport interface AIPromptModel {\n id: string;\n label: string;\n}\n\nexport interface AIPromptAttachment {\n id: string;\n file: File;\n}\n\nexport interface AIPromptSubmitPayload {\n text: string;\n command?: string;\n attachments: AIPromptAttachment[];\n modelId?: string;\n}\n\ntype NativeTextareaProps = Omit<\n TextareaHTMLAttributes<HTMLTextAreaElement>,\n 'size' | 'onSubmit' | 'children'\n>;\n\nconst rootVariants = cva(\n [\n 'ds:flex ds:flex-col ds:gap-[var(--spacing-xs)] ds:w-full',\n 'ds:rounded-[var(--radius-md)] ds:border ds:border-border ds:bg-input',\n 'ds:shadow-[var(--shadow-input)]',\n 'ds:transition-[border-color,box-shadow] ds:duration-[var(--animation-duration)]',\n 'ds:focus-within:border-[color:var(--primary)]',\n 'ds:motion-reduce:transition-none',\n ].join(' '),\n {\n variants: {\n size: {\n sm: 'ds:text-[length:var(--font-size-sm)]',\n md: 'ds:text-[length:var(--font-size-base)]',\n lg: 'ds:text-[length:var(--font-size-lg)]',\n },\n },\n defaultVariants: { size: 'md' },\n },\n);\n\n/** Curated imperative handle for agent / external automation. */\nexport interface AIPromptInputHandle {\n /** Current composer text. */\n getValue: () => string;\n /** True when text is empty and no attachments are pending. */\n isEmpty: () => boolean;\n /** True while a submit is in flight. */\n isSubmitting: () => boolean;\n /** Replace the composer text. */\n setValue: (value: string) => void;\n /** Clear text and attachments. */\n clear: () => void;\n /** Programmatically submit. */\n submit: () => void;\n /** Move keyboard focus into the textarea. */\n focus: () => void;\n}\n\nexport interface AIPromptInputProps\n extends NativeTextareaProps, VariantProps<typeof rootVariants> {\n /** Slash-command catalog. The DS owns the menu; apps own the commands. */\n commands?: AIPromptCommand[];\n /** Model catalog rendered as a Radix Select in the footer. */\n models?: AIPromptModel[];\n defaultModelId?: string;\n modelId?: string;\n onModelChange?: (id: string) => void;\n /** Maximum attachment size in bytes. */\n maxSize?: number;\n /** `accept` forwarded to react-dropzone. */\n accept?: Record<string, string[]>;\n /** Optional active context pill — dismissible via Backspace when focused. */\n context?: string;\n onContextDismiss?: () => void;\n onSubmit?: (payload: AIPromptSubmitPayload) => void;\n onAttach?: (files: File[]) => void;\n onAttachmentRejected?: (reason: string) => void;\n minRows?: number;\n maxRows?: number;\n}\n\n/* ------------------------------------------------------------------ */\n/* Component */\n/* ------------------------------------------------------------------ */\n\nexport const AIPromptInput = forwardRef<HTMLDivElement, AIPromptInputProps>(\n (\n {\n commands = [],\n models,\n defaultModelId,\n modelId,\n onModelChange,\n maxSize,\n accept,\n context,\n onContextDismiss,\n onSubmit,\n onAttach,\n onAttachmentRejected,\n minRows = 2,\n maxRows = 8,\n value,\n defaultValue,\n size = 'md',\n disabled,\n className,\n placeholder,\n onChange,\n onKeyDown,\n onCompositionStart,\n onCompositionEnd,\n onPaste,\n id,\n ...rest\n },\n ref,\n ) => {\n const { t } = useTranslation();\n const textareaId = useId();\n const innerRef = useRef<HTMLTextAreaElement | null>(null);\n const composingRef = useRef(false);\n const slashMenuRef = useRef<HTMLDivElement | null>(null);\n\n const setRefs = useCallback((node: HTMLTextAreaElement | null) => {\n innerRef.current = node;\n }, []);\n\n const [currentValueRaw, setPromptValue] = useControllableState<string>({\n value: value === undefined ? undefined : String(value),\n defaultValue: String(defaultValue ?? ''),\n });\n const currentValue = currentValueRaw ?? '';\n\n const [attachments, setAttachments] = useState<AIPromptAttachment[]>([]);\n const [slashOpen, setSlashOpen] = useState(false);\n const [slashQuery, setSlashQuery] = useState('');\n\n const [currentModelRaw, setPromptModel] = useControllableState<string>({\n value: modelId,\n defaultValue: defaultModelId ?? models?.[0]?.id ?? '',\n onChange: onModelChange,\n });\n const currentModel = currentModelRaw ?? '';\n\n /* ── Auto-grow ── */\n const resize = useCallback(() => {\n const el = innerRef.current;\n if (!el) return;\n const styles = window.getComputedStyle(el);\n const lineHeight = parseFloat(styles.lineHeight) || 24;\n const padTop = parseFloat(styles.paddingTop) || 0;\n const padBot = parseFloat(styles.paddingBottom) || 0;\n const borderTop = parseFloat(styles.borderTopWidth) || 0;\n const borderBot = parseFloat(styles.borderBottomWidth) || 0;\n const chrome = padTop + padBot + borderTop + borderBot;\n const minH = lineHeight * minRows + chrome;\n const maxH = lineHeight * maxRows + chrome;\n el.style.height = 'auto';\n const next = Math.max(minH, Math.min(el.scrollHeight, maxH));\n el.style.height = `${next}px`;\n el.style.overflowY = el.scrollHeight > maxH ? 'auto' : 'hidden';\n }, [minRows, maxRows]);\n\n useIsomorphicLayoutEffect(() => {\n resize();\n }, [resize, currentValue]);\n\n /* ── Slash detection ── */\n const detectSlash = useCallback((text: string, caretPos: number) => {\n // Find the start of the current line.\n const before = text.slice(0, caretPos);\n const lineStart = before.lastIndexOf('\\n') + 1;\n const lineText = text.slice(lineStart, caretPos);\n if (lineText.startsWith('/')) {\n const afterSlash = lineText.slice(1);\n // Only open if the characters after '/' contain no whitespace.\n if (!/\\s/.test(afterSlash)) {\n setSlashOpen(true);\n setSlashQuery(afterSlash);\n return;\n }\n }\n setSlashOpen(false);\n setSlashQuery('');\n }, []);\n\n const handleChange = (e: ChangeEvent<HTMLTextAreaElement>) => {\n setPromptValue(e.target.value);\n if (composingRef.current) return;\n onChange?.(e);\n const caret = e.target.selectionStart ?? e.target.value.length;\n detectSlash(e.target.value, caret);\n };\n\n const handleCompositionStart = (\n e: CompositionEvent<HTMLTextAreaElement>,\n ) => {\n composingRef.current = true;\n onCompositionStart?.(e);\n };\n const handleCompositionEnd = (e: CompositionEvent<HTMLTextAreaElement>) => {\n composingRef.current = false;\n onCompositionEnd?.(e);\n };\n\n const isIMEKey = (e: KeyboardEvent<HTMLTextAreaElement>) =>\n e.nativeEvent.isComposing || e.keyCode === 229 || composingRef.current;\n\n const handleSubmit = useCallback(() => {\n const text = currentValue.trim();\n if (!text && attachments.length === 0) return;\n // Extract any leading command token.\n let command: string | undefined;\n let body = currentValue;\n const m = currentValue.match(/^\\/(\\S+)\\s?/);\n if (m) {\n command = m[1];\n body = currentValue.slice(m[0].length);\n }\n onSubmit?.({\n text: body,\n command,\n attachments,\n modelId: currentModel || undefined,\n });\n setPromptValue('');\n setAttachments([]);\n }, [currentValue, attachments, onSubmit, currentModel, setPromptValue]);\n\n const rootRef = useRef<HTMLDivElement>(null);\n useImperativeHandle(ref, () => rootRef.current as HTMLDivElement, []);\n\n const agentHandle = useMemo<AIPromptInputHandle>(\n () => ({\n getValue: () => currentValue,\n isEmpty: () => !currentValue.trim() && attachments.length === 0,\n isSubmitting: () => false,\n setValue: (next: string) => {\n setPromptValue(next);\n },\n clear: () => {\n setPromptValue('');\n setAttachments([]);\n },\n submit: () => {\n handleSubmit();\n },\n focus: () => {\n innerRef.current?.focus();\n },\n }),\n [currentValue, attachments, setPromptValue, handleSubmit],\n );\n useAgentRegistration(aiPromptInputAgent, agentHandle, id);\n\n const handleKeyDown = (e: KeyboardEvent<HTMLTextAreaElement>) => {\n onKeyDown?.(e);\n if (e.defaultPrevented) return;\n if (isIMEKey(e)) return;\n\n // Slash menu open — Escape closes; ArrowDown/ArrowUp/Enter handled by cmdk.\n if (slashOpen) {\n if (e.key === 'Escape') {\n e.preventDefault();\n setSlashOpen(false);\n return;\n }\n }\n\n if (e.key === 'Enter' && (e.metaKey || e.ctrlKey)) {\n e.preventDefault();\n handleSubmit();\n }\n };\n\n const insertCommand = (cmd: AIPromptCommand) => {\n const el = innerRef.current;\n if (!el) return;\n const caret = el.selectionStart ?? currentValue.length;\n const before = currentValue.slice(0, caret);\n const lineStart = before.lastIndexOf('\\n') + 1;\n // Extend past any non-whitespace characters that follow the caret so\n // we replace the ENTIRE slash token (\"/fi|xBug more\" → \"/fixBug more\"),\n // not just the part before the caret (which would garble the tail).\n let endOfSlashToken = caret;\n while (\n endOfSlashToken < currentValue.length &&\n !/\\s/.test(currentValue[endOfSlashToken])\n ) {\n endOfSlashToken += 1;\n }\n const afterSlash = currentValue.slice(endOfSlashToken);\n const nextValue =\n currentValue.slice(0, lineStart) + `/${cmd.id} ` + afterSlash;\n setPromptValue(nextValue);\n // External consumers mirror the same synthetic event pattern other\n // text inputs in the system use — the native `onChange` fires via React.\n setSlashOpen(false);\n setSlashQuery('');\n queueMicrotask(() => el.focus());\n };\n\n /* ── Clipboard paste: strip rich HTML to plaintext, hand files to onAttach ── */\n const handlePaste = (e: ClipboardEvent<HTMLTextAreaElement>) => {\n onPaste?.(e);\n if (e.defaultPrevented) return;\n const { clipboardData } = e;\n if (!clipboardData) return;\n const files: File[] = [];\n for (let i = 0; i < clipboardData.items.length; i += 1) {\n const item = clipboardData.items[i];\n if (item.kind === 'file') {\n const f = item.getAsFile();\n if (f) files.push(f);\n }\n }\n if (files.length > 0) {\n e.preventDefault();\n acceptFiles(files);\n }\n };\n\n /* ── Dropzone ── */\n const acceptFiles = useCallback(\n (files: File[]) => {\n const next: AIPromptAttachment[] = [];\n for (const f of files) {\n if (typeof maxSize === 'number' && f.size > maxSize) {\n onAttachmentRejected?.(\n t('chat.attachment.rejected', { reason: 'size' }),\n );\n continue;\n }\n next.push({\n id: crypto.randomUUID?.() ?? `att-${Math.random()}`,\n file: f,\n });\n }\n if (next.length > 0) {\n setAttachments((prev) => [...prev, ...next]);\n onAttach?.(next.map((a) => a.file));\n }\n },\n [maxSize, onAttach, onAttachmentRejected, t],\n );\n\n const { getRootProps, getInputProps, isDragActive } = useDropzone({\n onDrop: acceptFiles,\n maxSize,\n accept,\n noClick: true,\n noKeyboard: true,\n });\n\n const removeAttachment = (id: string) => {\n setAttachments((prev) => prev.filter((a) => a.id !== id));\n };\n\n const effectiveId = id ?? textareaId;\n const labelId = `${effectiveId}-label`;\n const slashListId = `${effectiveId}-slash-list`;\n\n const modelOptions: SelectOption<string>[] =\n models?.map((m) => ({ value: m.id, label: m.label })) ?? [];\n\n return (\n <div\n ref={rootRef}\n {...getRootProps({\n className: [\n rootVariants({ size, className }),\n isDragActive\n ? 'ds:outline ds:outline-dashed ds:outline-[color:var(--primary)] ds:outline-offset-2 ds:bg-[color:var(--primary)]/5'\n : '',\n ].join(' '),\n })}\n aria-label={t('chat.attachmentZone')}\n data-component=\"ai-prompt-input\"\n data-component-id={id}\n >\n {/* Hidden file input owned by react-dropzone. The aria-label\n covers axe's `label` rule (the input is visually-hidden but\n still reachable programmatically). */}\n <input aria-label={t('chat.attachmentZone')} {...getInputProps()} />\n\n {context ? (\n <div className=\"ds:ps-[var(--spacing-sm)] ds:pe-[var(--spacing-xs)] ds:pt-[var(--spacing-xs)]\">\n {/* Native <button> — not a span with role=\"button\" — per\n 05-accessibility \"Interactive elements use the right tag\".\n Enter/Space dispatch naturally via the native button;\n Backspace/Delete also dismiss (pill convention). */}\n <button\n type=\"button\"\n aria-label={t('chat.contextActive', { name: context })}\n onClick={onContextDismiss}\n onKeyDown={(e) => {\n if (e.key === 'Backspace' || e.key === 'Delete') {\n e.preventDefault();\n onContextDismiss?.();\n }\n }}\n className={[\n 'ds:inline-flex ds:items-center ds:gap-[var(--spacing-xs)]',\n 'ds:rounded-[var(--radius-full)] ds:border ds:border-[color:var(--accent)]/30',\n 'ds:bg-[color:var(--accent)]/10 ds:text-[color:var(--foreground)]',\n 'ds:ps-[var(--spacing-sm)] ds:pe-[var(--spacing-sm)] ds:pt-[var(--spacing-xs)] ds:pb-[var(--spacing-xs)]',\n 'ds:min-h-[var(--min-target-size)]',\n 'type-body-sm',\n 'ds:focus-visible:outline-[length:var(--focus-ring-width)] ds:focus-visible:outline-solid ds:focus-visible:outline-[color:var(--ring)]',\n 'ds:forced-colors:focus-visible:outline-[CanvasText]',\n ].join(' ')}\n >\n {t('chat.contextActive', { name: context })}\n </button>\n </div>\n ) : null}\n\n <label id={labelId} htmlFor={effectiveId} className=\"ds:sr-only\">\n {t('chat.prompt')}\n </label>\n\n <div className=\"ds:relative\">\n {/* The textarea takes on a combobox role only while the slash\n popup is open. ARIA 1.2 permits `role=\"combobox\"` on a\n textarea — that's what makes `aria-expanded` / `aria-controls`\n valid here. When the popup is closed the textarea reverts to\n its plain implicit role so we don't add the aria attrs at all. */}\n <textarea\n ref={setRefs}\n id={effectiveId}\n rows={minRows}\n value={currentValue}\n disabled={disabled}\n placeholder={placeholder ?? t('chat.input.placeholder')}\n aria-labelledby={labelId}\n role={slashOpen ? 'combobox' : undefined}\n aria-controls={slashOpen ? slashListId : undefined}\n aria-expanded={slashOpen ? true : undefined}\n onChange={handleChange}\n onKeyDown={handleKeyDown}\n onPaste={handlePaste}\n onCompositionStart={handleCompositionStart}\n onCompositionEnd={handleCompositionEnd}\n className={[\n 'ds:w-full ds:resize-none ds:bg-transparent ds:outline-none',\n 'ds:ps-[var(--spacing-md)] ds:pe-[var(--spacing-md)] ds:pt-[var(--spacing-sm)] ds:pb-[var(--spacing-xs)]',\n 'ds:placeholder:text-[color:var(--muted-foreground)]',\n 'ds:leading-[var(--line-height-base)]',\n 'ds:disabled:opacity-50 ds:disabled:cursor-not-allowed',\n ].join(' ')}\n {...rest}\n />\n\n {slashOpen ? (\n <div\n ref={slashMenuRef}\n className={[\n 'ds:absolute ds:start-[var(--spacing-md)] ds:top-full ds:z-50',\n 'ds:mt-[var(--spacing-xs)]',\n 'ds:min-w-[240px] ds:rounded-[var(--radius-md)] ds:border ds:border-border',\n 'ds:bg-[color:var(--popover)] ds:text-[color:var(--popover-foreground)]',\n 'ds:shadow-[var(--shadow-md)]',\n // Match the Dialog / DropdownMenu open pattern: fade + scale\n // in from 95%. Origin set to the block-start so the menu\n // appears to expand from the textarea it sits beneath.\n 'ds:origin-top ds:motion-safe:animate-in ds:motion-safe:fade-in-0 ds:motion-safe:zoom-in-95',\n 'ds:duration-[var(--animation-duration)] ds:ease-[var(--ease-out)]',\n ].join(' ')}\n id={slashListId}\n >\n <Command label={t('chat.slashMenu.label')} loop>\n <Command.Input\n value={slashQuery}\n onValueChange={setSlashQuery}\n className=\"ds:sr-only\"\n />\n <Command.List className=\"ds:max-h-60 ds:overflow-y-auto ds:pt-[var(--spacing-xs)] ds:pb-[var(--spacing-xs)]\">\n <Command.Empty className=\"type-body-sm ds:text-[color:var(--muted-foreground)] ds:ps-[var(--spacing-md)] ds:pe-[var(--spacing-md)] ds:pt-[var(--spacing-sm)] ds:pb-[var(--spacing-sm)]\">\n {t('chat.slashMenu.empty')}\n </Command.Empty>\n {commands.map((cmd) => (\n <Command.Item\n key={cmd.id}\n value={cmd.id}\n onSelect={() => insertCommand(cmd)}\n className={[\n 'ds:flex ds:flex-col ds:gap-[2px]',\n 'ds:ps-[var(--spacing-md)] ds:pe-[var(--spacing-md)]',\n 'ds:pt-[var(--spacing-xs)] ds:pb-[var(--spacing-xs)]',\n 'type-body-sm ds:cursor-pointer',\n 'ds:aria-selected:bg-muted/20',\n 'ds:data-[selected=true]:bg-muted/20',\n ].join(' ')}\n >\n <span className=\"ds:font-medium\">/{cmd.id}</span>\n {cmd.description ? (\n <span className=\"type-meta ds:text-[color:var(--muted-foreground)]\">\n {cmd.description}\n </span>\n ) : null}\n </Command.Item>\n ))}\n </Command.List>\n </Command>\n </div>\n ) : null}\n </div>\n\n {attachments.length > 0 ? (\n <div\n role=\"group\"\n aria-label={t('chat.attachmentZone')}\n className=\"ds:flex ds:flex-wrap ds:gap-[var(--spacing-xs)] ds:ps-[var(--spacing-sm)] ds:pe-[var(--spacing-sm)]\"\n >\n {attachments.map((att) => (\n <AttachmentChip\n key={att.id}\n file={att.file}\n onRemove={() => removeAttachment(att.id)}\n />\n ))}\n </div>\n ) : null}\n\n <div className=\"ds:flex ds:items-center ds:gap-[var(--spacing-xs)] ds:ps-[var(--spacing-xs)] ds:pe-[var(--spacing-xs)] ds:pb-[var(--spacing-xs)]\">\n {models && models.length > 0 ? (\n <div className=\"ds:me-auto ds:min-w-[140px]\">\n <Select\n aria-label={t('chat.model.select')}\n options={modelOptions}\n value={currentModel || ''}\n onValueChange={(v) => {\n setPromptModel(v);\n }}\n size=\"sm\"\n />\n </div>\n ) : (\n <div className=\"ds:me-auto\" />\n )}\n <span className=\"ds:sr-only\">{t('chat.input.sendHint')}</span>\n <IconButton\n icon={<Send />}\n aria-label={t('chat.send')}\n intent=\"primary\"\n size=\"sm\"\n disabled={\n disabled || (!currentValue.trim() && attachments.length === 0)\n }\n onClick={handleSubmit}\n aria-keyshortcuts=\"Meta+Enter Control+Enter\"\n />\n </div>\n </div>\n );\n },\n);\n\nAIPromptInput.displayName = 'AIPromptInput';\n\n/* ------------------------------------------------------------------ */\n/* Attachment chip */\n/* ------------------------------------------------------------------ */\n\nfunction formatSize(bytes: number): string {\n if (bytes < 1024) return `${bytes} B`;\n if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(1)} KB`;\n return `${(bytes / (1024 * 1024)).toFixed(1)} MB`;\n}\n\nfunction AttachmentChip({\n file,\n onRemove,\n}: {\n file: File;\n onRemove: () => void;\n}): ReactNode {\n const { t } = useTranslation();\n return (\n <span\n className={[\n 'ds:inline-flex ds:items-center ds:gap-[var(--spacing-xs)]',\n 'ds:rounded-[var(--radius-full)] ds:bg-muted/30',\n 'ds:ps-[var(--spacing-sm)] ds:pe-[var(--spacing-xs)]',\n 'ds:pt-[var(--spacing-xs)] ds:pb-[var(--spacing-xs)]',\n 'type-meta',\n // Entrance when a file is attached via drop / paste / picker.\n 'ds:motion-safe:animate-in ds:motion-safe:fade-in-0 ds:motion-safe:slide-in-from-bottom-1',\n 'ds:duration-[var(--animation-duration)] ds:ease-[var(--ease-out)]',\n ].join(' ')}\n >\n <span className=\"ds:truncate ds:max-w-[16ch]\">{file.name}</span>\n <span className=\"ds:text-[color:var(--muted-foreground)] ds:tabular-nums\">\n {formatSize(file.size)}\n </span>\n <IconButton\n icon={<X />}\n aria-label={t('chat.attachment.remove', { name: file.name })}\n intent=\"ghost\"\n size=\"sm\"\n onClick={onRemove}\n />\n </span>\n );\n}\n"],"names":["aiPromptInputAgent","handle","args","rootVariants","cva","AIPromptInput","forwardRef","commands","models","defaultModelId","modelId","onModelChange","maxSize","accept","context","onContextDismiss","onSubmit","onAttach","onAttachmentRejected","minRows","maxRows","value","defaultValue","size","disabled","className","placeholder","onChange","onKeyDown","onCompositionStart","onCompositionEnd","onPaste","id","rest","ref","t","useTranslation","textareaId","useId","innerRef","useRef","composingRef","slashMenuRef","setRefs","useCallback","node","currentValueRaw","setPromptValue","useControllableState","currentValue","attachments","setAttachments","useState","slashOpen","setSlashOpen","slashQuery","setSlashQuery","currentModelRaw","setPromptModel","_a","currentModel","resize","el","styles","lineHeight","padTop","padBot","borderTop","borderBot","chrome","minH","maxH","next","useIsomorphicLayoutEffect","detectSlash","text","caretPos","lineStart","lineText","afterSlash","handleChange","caret","handleCompositionStart","handleCompositionEnd","isIMEKey","handleSubmit","command","body","m","rootRef","useImperativeHandle","agentHandle","useMemo","useAgentRegistration","handleKeyDown","insertCommand","cmd","endOfSlashToken","nextValue","handlePaste","clipboardData","files","i","item","f","acceptFiles","prev","a","getRootProps","getInputProps","isDragActive","useDropzone","removeAttachment","effectiveId","labelId","slashListId","modelOptions","jsxs","jsx","Command","att","AttachmentChip","Select","v","IconButton","Send","formatSize","bytes","file","onRemove","X"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"ai-prompt-input-DziJCGLe.js","sources":["../../src/components/ai-prompt-input/ai-prompt-input.agent.ts","../../src/components/ai-prompt-input/ai-prompt-input.tsx"],"sourcesContent":["/* -------------------------------------------------------------------- */\n/* Agent adapter — AIPromptInput. */\n/* -------------------------------------------------------------------- */\n\nimport type { AgentAdapter } from '../../agent/types';\nimport type { AIPromptInputHandle } from './ai-prompt-input';\n\nexport const aiPromptInputAgent: AgentAdapter<AIPromptInputHandle> = {\n id: 'ai-prompt-input',\n capabilities: ['edit_inline', 'submit'],\n state: {\n value: {\n type: 'string',\n descriptionKey: 'ui.agent.aiPromptInput.state.value',\n description: 'Current text in the composer (no PHI processing).',\n read: (handle) => handle.getValue(),\n },\n isEmpty: {\n type: 'boolean',\n descriptionKey: 'ui.agent.aiPromptInput.state.isEmpty',\n description: 'True when the composer has no text and no attachments.',\n read: (handle) => handle.isEmpty(),\n },\n isSubmitting: {\n type: 'boolean',\n descriptionKey: 'ui.agent.aiPromptInput.state.isSubmitting',\n description:\n 'True while an onSubmit invocation is in flight (best-effort).',\n read: (handle) => handle.isSubmitting(),\n },\n },\n actions: {\n set_value: {\n // Sets a form/input value — reversible via the same UI.\n safety: 'write',\n argsType: '{ value: string }',\n argsSchema: {\n type: 'object',\n properties: { value: { type: 'string' } },\n required: ['value'],\n },\n idempotent: true,\n descriptionKey: 'ui.agent.aiPromptInput.actions.setValue',\n description: 'Replace the composer text with the given value.',\n examples: [\n {\n args: { value: 'Summarise the last visit' },\n note: 'Replace composer text.',\n },\n ],\n invoke: (handle, args: { value: string }) => {\n handle.setValue(args.value);\n },\n },\n clear: {\n // Loses the user's (potentially long) draft — irreversible from this UI.\n safety: 'destructive',\n idempotent: true,\n descriptionKey: 'ui.agent.aiPromptInput.actions.clear',\n description: 'Clear text and attachments. Irreversible from the same UI.',\n invoke: (handle) => {\n handle.clear();\n },\n },\n submit: {\n // Hands the composer state to onSubmit, which dispatches to an external\n // AI/host system — openWorld.\n safety: 'write',\n openWorld: true,\n descriptionKey: 'ui.agent.aiPromptInput.actions.submit',\n description: 'Submit the current composer state via onSubmit.',\n invoke: (handle) => {\n handle.submit();\n },\n },\n focus: {\n // Pure ephemeral focus state.\n safety: 'read',\n descriptionKey: 'ui.agent.aiPromptInput.actions.focus',\n description: 'Move keyboard focus into the textarea.',\n invoke: (handle) => {\n handle.focus();\n },\n },\n },\n domHooks: {\n root: {\n attr: 'data-component',\n value: 'ai-prompt-input',\n description: 'Marks the AIPromptInput wrapper.',\n },\n instanceId: {\n attr: 'data-component-id',\n sourceProp: 'id',\n description:\n 'Sourced from the id prop; addresses a specific composer instance.',\n },\n },\n};\n","import {\n forwardRef,\n useCallback,\n useId,\n useImperativeHandle,\n useMemo,\n useRef,\n useState,\n type ChangeEvent,\n type ClipboardEvent,\n type CompositionEvent,\n type KeyboardEvent,\n type ReactNode,\n type TextareaHTMLAttributes,\n} from 'react';\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport { useTranslation } from 'react-i18next';\nimport { useControllableState } from '../../hooks/use-controllable-state';\nimport { useIsomorphicLayoutEffect } from '../../hooks/use-isomorphic-layout-effect';\nimport { useAgentRegistration } from '../../agent/registry';\nimport { aiPromptInputAgent } from './ai-prompt-input.agent';\nimport { Command } from 'cmdk';\nimport { useDropzone } from 'react-dropzone';\nimport { Send, X } from 'lucide-react';\nimport { IconButton } from '../button';\nimport { Select, type SelectOption } from '../select/select';\n\n/* ------------------------------------------------------------------ */\n/* Types */\n/* ------------------------------------------------------------------ */\n\nexport interface AIPromptCommand {\n id: string;\n label: string;\n description?: string;\n}\n\nexport interface AIPromptModel {\n id: string;\n label: string;\n}\n\nexport interface AIPromptAttachment {\n id: string;\n file: File;\n}\n\nexport interface AIPromptSubmitPayload {\n text: string;\n command?: string;\n attachments: AIPromptAttachment[];\n modelId?: string;\n}\n\ntype NativeTextareaProps = Omit<\n TextareaHTMLAttributes<HTMLTextAreaElement>,\n 'size' | 'onSubmit' | 'children'\n>;\n\nconst rootVariants = cva(\n [\n 'ds:flex ds:flex-col ds:gap-[var(--spacing-xs)] ds:w-full',\n 'ds:rounded-[var(--radius-md)] ds:border ds:border-border ds:bg-input',\n 'ds:shadow-[var(--shadow-input)]',\n 'ds:transition-[border-color,box-shadow] ds:duration-[var(--animation-duration)]',\n 'ds:focus-within:border-[color:var(--primary)]',\n 'ds:motion-reduce:transition-none',\n ].join(' '),\n {\n variants: {\n size: {\n sm: 'ds:text-[length:var(--font-size-sm)]',\n md: 'ds:text-[length:var(--font-size-base)]',\n lg: 'ds:text-[length:var(--font-size-lg)]',\n },\n },\n defaultVariants: { size: 'md' },\n },\n);\n\n/** Curated imperative handle for agent / external automation. */\nexport interface AIPromptInputHandle {\n /** Current composer text. */\n getValue: () => string;\n /** True when text is empty and no attachments are pending. */\n isEmpty: () => boolean;\n /** True while a submit is in flight. */\n isSubmitting: () => boolean;\n /** Replace the composer text. */\n setValue: (value: string) => void;\n /** Clear text and attachments. */\n clear: () => void;\n /** Programmatically submit. */\n submit: () => void;\n /** Move keyboard focus into the textarea. */\n focus: () => void;\n}\n\nexport interface AIPromptInputProps\n extends NativeTextareaProps, VariantProps<typeof rootVariants> {\n /** Slash-command catalog. The DS owns the menu; apps own the commands. */\n commands?: AIPromptCommand[];\n /** Model catalog rendered as a Radix Select in the footer. */\n models?: AIPromptModel[];\n defaultModelId?: string;\n modelId?: string;\n onModelChange?: (id: string) => void;\n /** Maximum attachment size in bytes. */\n maxSize?: number;\n /** `accept` forwarded to react-dropzone. */\n accept?: Record<string, string[]>;\n /** Optional active context pill — dismissible via Backspace when focused. */\n context?: string;\n onContextDismiss?: () => void;\n onSubmit?: (payload: AIPromptSubmitPayload) => void;\n onAttach?: (files: File[]) => void;\n onAttachmentRejected?: (reason: string) => void;\n minRows?: number;\n maxRows?: number;\n}\n\n/* ------------------------------------------------------------------ */\n/* Component */\n/* ------------------------------------------------------------------ */\n\nexport const AIPromptInput = forwardRef<HTMLDivElement, AIPromptInputProps>(\n (\n {\n commands = [],\n models,\n defaultModelId,\n modelId,\n onModelChange,\n maxSize,\n accept,\n context,\n onContextDismiss,\n onSubmit,\n onAttach,\n onAttachmentRejected,\n minRows = 2,\n maxRows = 8,\n value,\n defaultValue,\n size = 'md',\n disabled,\n className,\n placeholder,\n onChange,\n onKeyDown,\n onCompositionStart,\n onCompositionEnd,\n onPaste,\n id,\n ...rest\n },\n ref,\n ) => {\n const { t } = useTranslation();\n const textareaId = useId();\n const innerRef = useRef<HTMLTextAreaElement | null>(null);\n const composingRef = useRef(false);\n const slashMenuRef = useRef<HTMLDivElement | null>(null);\n\n const setRefs = useCallback((node: HTMLTextAreaElement | null) => {\n innerRef.current = node;\n }, []);\n\n const [currentValueRaw, setPromptValue] = useControllableState<string>({\n value: value === undefined ? undefined : String(value),\n defaultValue: String(defaultValue ?? ''),\n });\n const currentValue = currentValueRaw ?? '';\n\n const [attachments, setAttachments] = useState<AIPromptAttachment[]>([]);\n const [slashOpen, setSlashOpen] = useState(false);\n const [slashQuery, setSlashQuery] = useState('');\n\n const [currentModelRaw, setPromptModel] = useControllableState<string>({\n value: modelId,\n defaultValue: defaultModelId ?? models?.[0]?.id ?? '',\n onChange: onModelChange,\n });\n const currentModel = currentModelRaw ?? '';\n\n /* ── Auto-grow ── */\n const resize = useCallback(() => {\n const el = innerRef.current;\n if (!el) return;\n const styles = window.getComputedStyle(el);\n const lineHeight = parseFloat(styles.lineHeight) || 24;\n const padTop = parseFloat(styles.paddingTop) || 0;\n const padBot = parseFloat(styles.paddingBottom) || 0;\n const borderTop = parseFloat(styles.borderTopWidth) || 0;\n const borderBot = parseFloat(styles.borderBottomWidth) || 0;\n const chrome = padTop + padBot + borderTop + borderBot;\n const minH = lineHeight * minRows + chrome;\n const maxH = lineHeight * maxRows + chrome;\n el.style.height = 'auto';\n const next = Math.max(minH, Math.min(el.scrollHeight, maxH));\n el.style.height = `${next}px`;\n el.style.overflowY = el.scrollHeight > maxH ? 'auto' : 'hidden';\n }, [minRows, maxRows]);\n\n useIsomorphicLayoutEffect(() => {\n resize();\n }, [resize, currentValue]);\n\n /* ── Slash detection ── */\n const detectSlash = useCallback((text: string, caretPos: number) => {\n // Find the start of the current line.\n const before = text.slice(0, caretPos);\n const lineStart = before.lastIndexOf('\\n') + 1;\n const lineText = text.slice(lineStart, caretPos);\n if (lineText.startsWith('/')) {\n const afterSlash = lineText.slice(1);\n // Only open if the characters after '/' contain no whitespace.\n if (!/\\s/.test(afterSlash)) {\n setSlashOpen(true);\n setSlashQuery(afterSlash);\n return;\n }\n }\n setSlashOpen(false);\n setSlashQuery('');\n }, []);\n\n const handleChange = (e: ChangeEvent<HTMLTextAreaElement>) => {\n setPromptValue(e.target.value);\n if (composingRef.current) return;\n onChange?.(e);\n const caret = e.target.selectionStart ?? e.target.value.length;\n detectSlash(e.target.value, caret);\n };\n\n const handleCompositionStart = (\n e: CompositionEvent<HTMLTextAreaElement>,\n ) => {\n composingRef.current = true;\n onCompositionStart?.(e);\n };\n const handleCompositionEnd = (e: CompositionEvent<HTMLTextAreaElement>) => {\n composingRef.current = false;\n onCompositionEnd?.(e);\n };\n\n const isIMEKey = (e: KeyboardEvent<HTMLTextAreaElement>) =>\n e.nativeEvent.isComposing || e.keyCode === 229 || composingRef.current;\n\n const handleSubmit = useCallback(() => {\n const text = currentValue.trim();\n if (!text && attachments.length === 0) return;\n // Extract any leading command token.\n let command: string | undefined;\n let body = currentValue;\n const m = currentValue.match(/^\\/(\\S+)\\s?/);\n if (m) {\n command = m[1];\n body = currentValue.slice(m[0].length);\n }\n onSubmit?.({\n text: body,\n command,\n attachments,\n modelId: currentModel || undefined,\n });\n setPromptValue('');\n setAttachments([]);\n }, [currentValue, attachments, onSubmit, currentModel, setPromptValue]);\n\n const rootRef = useRef<HTMLDivElement>(null);\n useImperativeHandle(ref, () => rootRef.current as HTMLDivElement, []);\n\n const agentHandle = useMemo<AIPromptInputHandle>(\n () => ({\n getValue: () => currentValue,\n isEmpty: () => !currentValue.trim() && attachments.length === 0,\n isSubmitting: () => false,\n setValue: (next: string) => {\n setPromptValue(next);\n },\n clear: () => {\n setPromptValue('');\n setAttachments([]);\n },\n submit: () => {\n handleSubmit();\n },\n focus: () => {\n innerRef.current?.focus();\n },\n }),\n [currentValue, attachments, setPromptValue, handleSubmit],\n );\n useAgentRegistration(aiPromptInputAgent, agentHandle, id);\n\n const handleKeyDown = (e: KeyboardEvent<HTMLTextAreaElement>) => {\n onKeyDown?.(e);\n if (e.defaultPrevented) return;\n if (isIMEKey(e)) return;\n\n // Slash menu open — Escape closes; ArrowDown/ArrowUp/Enter handled by cmdk.\n if (slashOpen) {\n if (e.key === 'Escape') {\n e.preventDefault();\n setSlashOpen(false);\n return;\n }\n }\n\n if (e.key === 'Enter' && (e.metaKey || e.ctrlKey)) {\n e.preventDefault();\n handleSubmit();\n }\n };\n\n const insertCommand = (cmd: AIPromptCommand) => {\n const el = innerRef.current;\n if (!el) return;\n const caret = el.selectionStart ?? currentValue.length;\n const before = currentValue.slice(0, caret);\n const lineStart = before.lastIndexOf('\\n') + 1;\n // Extend past any non-whitespace characters that follow the caret so\n // we replace the ENTIRE slash token (\"/fi|xBug more\" → \"/fixBug more\"),\n // not just the part before the caret (which would garble the tail).\n let endOfSlashToken = caret;\n while (\n endOfSlashToken < currentValue.length &&\n !/\\s/.test(currentValue[endOfSlashToken])\n ) {\n endOfSlashToken += 1;\n }\n const afterSlash = currentValue.slice(endOfSlashToken);\n const nextValue =\n currentValue.slice(0, lineStart) + `/${cmd.id} ` + afterSlash;\n setPromptValue(nextValue);\n // External consumers mirror the same synthetic event pattern other\n // text inputs in the system use — the native `onChange` fires via React.\n setSlashOpen(false);\n setSlashQuery('');\n queueMicrotask(() => el.focus());\n };\n\n /* ── Clipboard paste: strip rich HTML to plaintext, hand files to onAttach ── */\n const handlePaste = (e: ClipboardEvent<HTMLTextAreaElement>) => {\n onPaste?.(e);\n if (e.defaultPrevented) return;\n const { clipboardData } = e;\n if (!clipboardData) return;\n const files: File[] = [];\n for (let i = 0; i < clipboardData.items.length; i += 1) {\n const item = clipboardData.items[i];\n if (item.kind === 'file') {\n const f = item.getAsFile();\n if (f) files.push(f);\n }\n }\n if (files.length > 0) {\n e.preventDefault();\n acceptFiles(files);\n }\n };\n\n /* ── Dropzone ── */\n const acceptFiles = useCallback(\n (files: File[]) => {\n const next: AIPromptAttachment[] = [];\n for (const f of files) {\n if (typeof maxSize === 'number' && f.size > maxSize) {\n onAttachmentRejected?.(\n t('chat.attachment.rejected', { reason: 'size' }),\n );\n continue;\n }\n next.push({\n id: crypto.randomUUID?.() ?? `att-${Math.random()}`,\n file: f,\n });\n }\n if (next.length > 0) {\n setAttachments((prev) => [...prev, ...next]);\n onAttach?.(next.map((a) => a.file));\n }\n },\n [maxSize, onAttach, onAttachmentRejected, t],\n );\n\n const { getRootProps, getInputProps, isDragActive } = useDropzone({\n onDrop: acceptFiles,\n maxSize,\n accept,\n noClick: true,\n noKeyboard: true,\n });\n\n const removeAttachment = (id: string) => {\n setAttachments((prev) => prev.filter((a) => a.id !== id));\n };\n\n const effectiveId = id ?? textareaId;\n const labelId = `${effectiveId}-label`;\n const slashListId = `${effectiveId}-slash-list`;\n\n const modelOptions: SelectOption<string>[] =\n models?.map((m) => ({ value: m.id, label: m.label })) ?? [];\n\n return (\n <div\n ref={rootRef}\n {...getRootProps({\n className: [\n rootVariants({ size, className }),\n isDragActive\n ? 'ds:outline ds:outline-dashed ds:outline-[color:var(--primary)] ds:outline-offset-2 ds:bg-[color:var(--primary)]/5'\n : '',\n ].join(' '),\n })}\n aria-label={t('chat.attachmentZone')}\n data-component=\"ai-prompt-input\"\n data-component-id={id}\n >\n {/* Hidden file input owned by react-dropzone. The aria-label\n covers axe's `label` rule (the input is visually-hidden but\n still reachable programmatically). */}\n <input aria-label={t('chat.attachmentZone')} {...getInputProps()} />\n\n {context ? (\n <div className=\"ds:ps-[var(--spacing-sm)] ds:pe-[var(--spacing-xs)] ds:pt-[var(--spacing-xs)]\">\n {/* Native <button> — not a span with role=\"button\" — per\n 05-accessibility \"Interactive elements use the right tag\".\n Enter/Space dispatch naturally via the native button;\n Backspace/Delete also dismiss (pill convention). */}\n <button\n type=\"button\"\n aria-label={t('chat.contextActive', { name: context })}\n onClick={onContextDismiss}\n onKeyDown={(e) => {\n if (e.key === 'Backspace' || e.key === 'Delete') {\n e.preventDefault();\n onContextDismiss?.();\n }\n }}\n className={[\n 'ds:inline-flex ds:items-center ds:gap-[var(--spacing-xs)]',\n 'ds:rounded-[var(--radius-full)] ds:border ds:border-[color:var(--accent)]/30',\n 'ds:bg-[color:var(--accent)]/10 ds:text-[color:var(--foreground)]',\n 'ds:ps-[var(--spacing-sm)] ds:pe-[var(--spacing-sm)] ds:pt-[var(--spacing-xs)] ds:pb-[var(--spacing-xs)]',\n 'ds:min-h-[var(--min-target-size)]',\n 'type-body-sm',\n 'ds:focus-visible:outline-[length:var(--focus-ring-width)] ds:focus-visible:outline-solid ds:focus-visible:outline-[color:var(--ring)]',\n 'ds:forced-colors:focus-visible:outline-[CanvasText]',\n ].join(' ')}\n >\n {t('chat.contextActive', { name: context })}\n </button>\n </div>\n ) : null}\n\n <label id={labelId} htmlFor={effectiveId} className=\"ds:sr-only\">\n {t('chat.prompt')}\n </label>\n\n <div className=\"ds:relative\">\n {/* The textarea takes on a combobox role only while the slash\n popup is open. ARIA 1.2 permits `role=\"combobox\"` on a\n textarea — that's what makes `aria-expanded` / `aria-controls`\n valid here. When the popup is closed the textarea reverts to\n its plain implicit role so we don't add the aria attrs at all. */}\n <textarea\n ref={setRefs}\n id={effectiveId}\n rows={minRows}\n value={currentValue}\n disabled={disabled}\n placeholder={placeholder ?? t('chat.input.placeholder')}\n aria-labelledby={labelId}\n role={slashOpen ? 'combobox' : undefined}\n aria-controls={slashOpen ? slashListId : undefined}\n aria-expanded={slashOpen ? true : undefined}\n onChange={handleChange}\n onKeyDown={handleKeyDown}\n onPaste={handlePaste}\n onCompositionStart={handleCompositionStart}\n onCompositionEnd={handleCompositionEnd}\n className={[\n 'ds:w-full ds:resize-none ds:bg-transparent ds:outline-none',\n 'ds:ps-[var(--spacing-md)] ds:pe-[var(--spacing-md)] ds:pt-[var(--spacing-sm)] ds:pb-[var(--spacing-xs)]',\n 'ds:placeholder:text-[color:var(--muted-foreground)]',\n 'ds:leading-[var(--line-height-base)]',\n 'ds:disabled:opacity-50 ds:disabled:cursor-not-allowed',\n ].join(' ')}\n {...rest}\n />\n\n {slashOpen ? (\n <div\n ref={slashMenuRef}\n className={[\n 'ds:absolute ds:start-[var(--spacing-md)] ds:top-full ds:z-50',\n 'ds:mt-[var(--spacing-xs)]',\n 'ds:min-w-[240px] ds:rounded-[var(--radius-md)] ds:border ds:border-border',\n 'ds:bg-[color:var(--popover)] ds:text-[color:var(--popover-foreground)]',\n 'ds:shadow-[var(--shadow-md)]',\n // Match the Dialog / DropdownMenu open pattern: fade + scale\n // in from 95%. Origin set to the block-start so the menu\n // appears to expand from the textarea it sits beneath.\n 'ds:origin-top ds:motion-safe:animate-in ds:motion-safe:fade-in-0 ds:motion-safe:zoom-in-95',\n 'ds:duration-[var(--animation-duration)] ds:ease-[var(--ease-out)]',\n ].join(' ')}\n id={slashListId}\n >\n <Command label={t('chat.slashMenu.label')} loop>\n <Command.Input\n value={slashQuery}\n onValueChange={setSlashQuery}\n className=\"ds:sr-only\"\n />\n <Command.List className=\"ds:max-h-60 ds:overflow-y-auto ds:pt-[var(--spacing-xs)] ds:pb-[var(--spacing-xs)]\">\n <Command.Empty className=\"type-body-sm ds:text-[color:var(--muted-foreground)] ds:ps-[var(--spacing-md)] ds:pe-[var(--spacing-md)] ds:pt-[var(--spacing-sm)] ds:pb-[var(--spacing-sm)]\">\n {t('chat.slashMenu.empty')}\n </Command.Empty>\n {commands.map((cmd) => (\n <Command.Item\n key={cmd.id}\n value={cmd.id}\n onSelect={() => insertCommand(cmd)}\n className={[\n 'ds:flex ds:flex-col ds:gap-[2px]',\n 'ds:ps-[var(--spacing-md)] ds:pe-[var(--spacing-md)]',\n 'ds:pt-[var(--spacing-xs)] ds:pb-[var(--spacing-xs)]',\n 'type-body-sm ds:cursor-pointer',\n 'ds:aria-selected:bg-muted/20',\n 'ds:data-[selected=true]:bg-muted/20',\n ].join(' ')}\n >\n <span className=\"ds:font-medium\">/{cmd.id}</span>\n {cmd.description ? (\n <span className=\"type-meta ds:text-[color:var(--muted-foreground)]\">\n {cmd.description}\n </span>\n ) : null}\n </Command.Item>\n ))}\n </Command.List>\n </Command>\n </div>\n ) : null}\n </div>\n\n {attachments.length > 0 ? (\n <div\n role=\"group\"\n aria-label={t('chat.attachmentZone')}\n className=\"ds:flex ds:flex-wrap ds:gap-[var(--spacing-xs)] ds:ps-[var(--spacing-sm)] ds:pe-[var(--spacing-sm)]\"\n >\n {attachments.map((att) => (\n <AttachmentChip\n key={att.id}\n file={att.file}\n onRemove={() => removeAttachment(att.id)}\n />\n ))}\n </div>\n ) : null}\n\n <div className=\"ds:flex ds:items-center ds:gap-[var(--spacing-xs)] ds:ps-[var(--spacing-xs)] ds:pe-[var(--spacing-xs)] ds:pb-[var(--spacing-xs)]\">\n {models && models.length > 0 ? (\n <div className=\"ds:me-auto ds:min-w-[140px]\">\n <Select\n aria-label={t('chat.model.select')}\n options={modelOptions}\n value={currentModel || ''}\n onValueChange={(v) => {\n setPromptModel(v);\n }}\n size=\"sm\"\n />\n </div>\n ) : (\n <div className=\"ds:me-auto\" />\n )}\n <span className=\"ds:sr-only\">{t('chat.input.sendHint')}</span>\n <IconButton\n icon={<Send />}\n aria-label={t('chat.send')}\n intent=\"primary\"\n size=\"sm\"\n disabled={\n disabled || (!currentValue.trim() && attachments.length === 0)\n }\n onClick={handleSubmit}\n aria-keyshortcuts=\"Meta+Enter Control+Enter\"\n />\n </div>\n </div>\n );\n },\n);\n\nAIPromptInput.displayName = 'AIPromptInput';\n\n/* ------------------------------------------------------------------ */\n/* Attachment chip */\n/* ------------------------------------------------------------------ */\n\nfunction formatSize(bytes: number): string {\n if (bytes < 1024) return `${bytes} B`;\n if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(1)} KB`;\n return `${(bytes / (1024 * 1024)).toFixed(1)} MB`;\n}\n\nfunction AttachmentChip({\n file,\n onRemove,\n}: {\n file: File;\n onRemove: () => void;\n}): ReactNode {\n const { t } = useTranslation();\n return (\n <span\n className={[\n 'ds:inline-flex ds:items-center ds:gap-[var(--spacing-xs)]',\n 'ds:rounded-[var(--radius-full)] ds:bg-muted/30',\n 'ds:ps-[var(--spacing-sm)] ds:pe-[var(--spacing-xs)]',\n 'ds:pt-[var(--spacing-xs)] ds:pb-[var(--spacing-xs)]',\n 'type-meta',\n // Entrance when a file is attached via drop / paste / picker.\n 'ds:motion-safe:animate-in ds:motion-safe:fade-in-0 ds:motion-safe:slide-in-from-bottom-1',\n 'ds:duration-[var(--animation-duration)] ds:ease-[var(--ease-out)]',\n ].join(' ')}\n >\n <span className=\"ds:truncate ds:max-w-[16ch]\">{file.name}</span>\n <span className=\"ds:text-[color:var(--muted-foreground)] ds:tabular-nums\">\n {formatSize(file.size)}\n </span>\n <IconButton\n icon={<X />}\n aria-label={t('chat.attachment.remove', { name: file.name })}\n intent=\"ghost\"\n size=\"sm\"\n onClick={onRemove}\n />\n </span>\n );\n}\n"],"names":["aiPromptInputAgent","handle","args","rootVariants","cva","AIPromptInput","forwardRef","commands","models","defaultModelId","modelId","onModelChange","maxSize","accept","context","onContextDismiss","onSubmit","onAttach","onAttachmentRejected","minRows","maxRows","value","defaultValue","size","disabled","className","placeholder","onChange","onKeyDown","onCompositionStart","onCompositionEnd","onPaste","id","rest","ref","t","useTranslation","textareaId","useId","innerRef","useRef","composingRef","slashMenuRef","setRefs","useCallback","node","currentValueRaw","setPromptValue","useControllableState","currentValue","attachments","setAttachments","useState","slashOpen","setSlashOpen","slashQuery","setSlashQuery","currentModelRaw","setPromptModel","_a","currentModel","resize","el","styles","lineHeight","padTop","padBot","borderTop","borderBot","chrome","minH","maxH","next","useIsomorphicLayoutEffect","detectSlash","text","caretPos","lineStart","lineText","afterSlash","handleChange","caret","handleCompositionStart","handleCompositionEnd","isIMEKey","handleSubmit","command","body","m","rootRef","useImperativeHandle","agentHandle","useMemo","useAgentRegistration","handleKeyDown","insertCommand","cmd","endOfSlashToken","nextValue","handlePaste","clipboardData","files","i","item","f","acceptFiles","prev","a","getRootProps","getInputProps","isDragActive","useDropzone","removeAttachment","effectiveId","labelId","slashListId","modelOptions","jsxs","jsx","Command","att","AttachmentChip","Select","v","IconButton","Send","formatSize","bytes","file","onRemove","X"],"mappings":"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"}
|