@parallelworks/ui 0.44.0 → 0.46.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.
Files changed (637) hide show
  1. package/README.md +348 -25
  2. package/dist/ai/agent/diff.d.ts +2 -1
  3. package/dist/ai/agent/diff.js +4 -12
  4. package/dist/ai/agent/diffHighlight.d.ts +1 -1
  5. package/dist/ai/agent/diffHighlight.js +4 -3
  6. package/dist/ai/agent/index.d.ts +2 -1
  7. package/dist/ai/agent/permissions.d.ts +1 -1
  8. package/dist/ai/agent/permissions.js +1 -1
  9. package/dist/ai/agent/toolStrings.d.ts +37 -0
  10. package/dist/ai/agent/toolStrings.js +35 -0
  11. package/dist/ai/agent/toolfmt.d.ts +8 -3
  12. package/dist/ai/agent/toolfmt.js +50 -65
  13. package/dist/ai/ai.css +22 -35
  14. package/dist/ai/components/AllocationSelector.js +2 -2
  15. package/dist/ai/components/AttachmentManager.js +28 -29
  16. package/dist/ai/components/AttachmentUpload.js +25 -30
  17. package/dist/ai/components/BlockedGroupBanner.js +2 -2
  18. package/dist/ai/components/BranchNavigator.js +3 -4
  19. package/dist/ai/components/ChatEmptyState.js +8 -7
  20. package/dist/ai/components/ChatInput.js +10 -12
  21. package/dist/ai/components/ChatLayout.js +3 -3
  22. package/dist/ai/components/ChatMessage.js +49 -61
  23. package/dist/ai/components/ChatMessageList.js +46 -42
  24. package/dist/ai/components/ChatSidebar.js +26 -34
  25. package/dist/ai/components/ChatStage.d.ts +1 -1
  26. package/dist/ai/components/ChatStage.js +2 -2
  27. package/dist/ai/components/ComposerChrome.js +3 -4
  28. package/dist/ai/components/DragOverlay.js +6 -4
  29. package/dist/ai/components/ModelSelector.js +14 -15
  30. package/dist/ai/components/PastedText.js +18 -14
  31. package/dist/ai/components/ProviderIssueBanner.js +3 -4
  32. package/dist/ai/components/Reasoning.d.ts +12 -6
  33. package/dist/ai/components/Reasoning.js +31 -18
  34. package/dist/ai/components/ShareDialog.js +25 -28
  35. package/dist/ai/components/SlashMenu.js +3 -3
  36. package/dist/ai/components/agent/ActivityLine.d.ts +0 -5
  37. package/dist/ai/components/agent/ActivityLine.js +17 -54
  38. package/dist/ai/components/agent/AgentMessageParts.js +139 -149
  39. package/dist/ai/components/conversationActions.js +16 -16
  40. package/dist/ai/core/ChatProvider.d.ts +2 -4
  41. package/dist/ai/core/ChatProvider.js +25 -38
  42. package/dist/ai/core/exportConversation.js +4 -4
  43. package/dist/ai/core/pasteLanguage.d.ts +1 -1
  44. package/dist/ai/core/pasteLanguage.js +1 -1
  45. package/dist/ai/core/sidebarState.d.ts +8 -6
  46. package/dist/ai/core/sidebarState.js +21 -28
  47. package/dist/ai/core/useKeyboardShortcuts.js +14 -5
  48. package/dist/ai/index.d.ts +4 -5
  49. package/dist/ai/index.js +7 -7
  50. package/dist/ai/strings.d.ts +14 -31
  51. package/dist/ai/strings.js +19 -39
  52. package/dist/ai/types.d.ts +0 -5
  53. package/dist/ai/ui/ConversationSidebar.d.ts +12 -9
  54. package/dist/ai/ui/ConversationSidebar.js +43 -87
  55. package/dist/ai/ui/Markdown.d.ts +3 -6
  56. package/dist/ai/ui/Markdown.js +6 -73
  57. package/dist/ai/ui/Notice.js +10 -12
  58. package/dist/ai/ui/chip.d.ts +2 -2
  59. package/dist/ai/ui/chip.js +1 -1
  60. package/dist/ai/ui/sidebar.d.ts +4 -20
  61. package/dist/ai/ui/sidebar.js +30 -67
  62. package/dist/ai/utils.d.ts +0 -1
  63. package/dist/ai/utils.js +1 -14
  64. package/dist/brandIcons.d.ts +51 -0
  65. package/dist/brandIcons.js +75 -0
  66. package/dist/components/Avatar.d.ts +3 -1
  67. package/dist/components/Avatar.js +34 -28
  68. package/dist/components/Button.d.ts +12 -7
  69. package/dist/components/Button.js +39 -44
  70. package/dist/components/Callout.js +18 -12
  71. package/dist/components/Card.d.ts +18 -8
  72. package/dist/components/Card.js +17 -6
  73. package/dist/components/Checkbox.d.ts +9 -0
  74. package/dist/components/Checkbox.js +30 -0
  75. package/dist/components/Combobox.d.ts +9 -1
  76. package/dist/components/Combobox.js +71 -44
  77. package/dist/components/ConfirmModal.js +11 -11
  78. package/dist/components/ContextMenu.d.ts +2 -8
  79. package/dist/components/ContextMenu.js +2 -29
  80. package/dist/components/CopyToClipboard.js +17 -36
  81. package/dist/components/CreateModal.d.ts +3 -24
  82. package/dist/components/CreateModal.js +46 -113
  83. package/dist/components/DatePicker.d.ts +31 -0
  84. package/dist/components/DatePicker.js +191 -0
  85. package/dist/components/DescriptionList.js +4 -4
  86. package/dist/components/Disclosure.d.ts +34 -0
  87. package/dist/components/Disclosure.js +46 -0
  88. package/dist/components/Drawer.d.ts +47 -0
  89. package/dist/components/Drawer.js +120 -0
  90. package/dist/components/EmptyState.d.ts +15 -10
  91. package/dist/components/EmptyState.js +13 -8
  92. package/dist/components/ExternalLink.d.ts +8 -0
  93. package/dist/components/ExternalLink.js +29 -0
  94. package/dist/components/Field.d.ts +70 -0
  95. package/dist/components/Field.js +159 -0
  96. package/dist/components/HoverCard.js +11 -14
  97. package/dist/components/IconButton.d.ts +16 -13
  98. package/dist/components/IconButton.js +27 -18
  99. package/dist/components/InfoTip.js +16 -23
  100. package/dist/components/Input.d.ts +10 -9
  101. package/dist/components/Input.js +54 -96
  102. package/dist/components/LetterBadge.js +2 -2
  103. package/dist/components/Loader.d.ts +15 -8
  104. package/dist/components/Loader.js +29 -19
  105. package/dist/components/Markdown.d.ts +7 -1
  106. package/dist/components/Markdown.js +2 -0
  107. package/dist/components/MarkdownImpl.d.ts +1 -1
  108. package/dist/components/MarkdownImpl.js +55 -14
  109. package/dist/components/Menu.js +13 -15
  110. package/dist/components/MenuEntries.js +11 -16
  111. package/dist/components/Meter.d.ts +48 -0
  112. package/dist/components/Meter.js +94 -0
  113. package/dist/components/Modal.js +11 -14
  114. package/dist/components/NumberInput.d.ts +25 -0
  115. package/dist/components/NumberInput.js +55 -0
  116. package/dist/components/Overview.js +12 -10
  117. package/dist/components/PageHeader.d.ts +2 -3
  118. package/dist/components/PageHeader.js +30 -21
  119. package/dist/components/Pagination.d.ts +27 -14
  120. package/dist/components/Pagination.js +86 -25
  121. package/dist/components/Popover.d.ts +47 -0
  122. package/dist/components/Popover.js +63 -0
  123. package/dist/components/Provider.d.ts +200 -83
  124. package/dist/components/Provider.js +203 -121
  125. package/dist/components/Radio.d.ts +1 -1
  126. package/dist/components/Radio.js +4 -4
  127. package/dist/components/RefreshButton.d.ts +15 -0
  128. package/dist/components/RefreshButton.js +53 -0
  129. package/dist/components/RunStatusIcon.d.ts +12 -0
  130. package/dist/components/RunStatusIcon.js +84 -0
  131. package/dist/components/SearchInput.d.ts +16 -0
  132. package/dist/components/SearchInput.js +52 -0
  133. package/dist/components/Section.d.ts +28 -0
  134. package/dist/components/Section.js +76 -0
  135. package/dist/components/SegmentedControl.d.ts +7 -11
  136. package/dist/components/SegmentedControl.js +25 -56
  137. package/dist/components/Select.d.ts +5 -1
  138. package/dist/components/Select.js +43 -44
  139. package/dist/components/SettingModeOption.d.ts +3 -5
  140. package/dist/components/SettingModeOption.js +5 -6
  141. package/dist/components/SettingsCard.d.ts +32 -19
  142. package/dist/components/SettingsCard.js +40 -13
  143. package/dist/components/Skeleton.d.ts +22 -0
  144. package/dist/components/Skeleton.js +34 -0
  145. package/dist/components/Slider.d.ts +16 -0
  146. package/dist/components/Slider.js +30 -0
  147. package/dist/components/Sort.js +4 -6
  148. package/dist/components/StatusBadge.d.ts +5 -3
  149. package/dist/components/StatusBadge.js +10 -33
  150. package/dist/components/StatusIcons.d.ts +0 -4
  151. package/dist/components/StatusIcons.js +5 -13
  152. package/dist/components/Switch.d.ts +5 -1
  153. package/dist/components/Switch.js +23 -6
  154. package/dist/components/Table.js +13 -20
  155. package/dist/components/Tabs.d.ts +52 -0
  156. package/dist/components/Tabs.js +75 -0
  157. package/dist/components/ThemeEditor.d.ts +29 -0
  158. package/dist/components/ThemeEditor.js +397 -0
  159. package/dist/components/Toast.d.ts +57 -0
  160. package/dist/components/Toast.js +203 -0
  161. package/dist/components/Tooltip.js +12 -15
  162. package/dist/components/buttonClasses.d.ts +18 -0
  163. package/dist/components/buttonClasses.js +31 -0
  164. package/dist/components/codeTheme.d.ts +5 -0
  165. package/dist/components/codeTheme.js +93 -0
  166. package/dist/components/comboboxItems.d.ts +1 -1
  167. package/dist/components/fieldBox.d.ts +14 -0
  168. package/dist/components/fieldBox.js +29 -0
  169. package/dist/components/floating.d.ts +26 -5
  170. package/dist/components/floating.js +31 -9
  171. package/dist/{ai/ui/codeBreaks.js → components/markdownCodeBreaks.js} +1 -1
  172. package/dist/components/persistedState.d.ts +2 -0
  173. package/dist/components/persistedState.js +63 -0
  174. package/dist/components/relativeTime.d.ts +36 -8
  175. package/dist/components/relativeTime.js +106 -23
  176. package/dist/components/segmented.d.ts +17 -0
  177. package/dist/components/segmented.js +27 -0
  178. package/dist/components/shortcutKey.d.ts +4 -0
  179. package/dist/components/shortcutKey.js +27 -0
  180. package/dist/components/splitter.d.ts +26 -0
  181. package/dist/components/splitter.js +69 -0
  182. package/dist/components/tone.d.ts +9 -0
  183. package/dist/components/tone.js +30 -0
  184. package/dist/components/useCopy.d.ts +14 -0
  185. package/dist/components/useCopy.js +31 -0
  186. package/dist/components/useCssIsDark.d.ts +2 -0
  187. package/dist/components/useCssIsDark.js +2 -1
  188. package/dist/components/useTheme.d.ts +10 -0
  189. package/dist/components/useTheme.js +40 -0
  190. package/dist/cx.d.ts +5 -0
  191. package/dist/cx.js +11 -0
  192. package/dist/editing.d.ts +1 -1
  193. package/dist/editor/Editor.js +2 -2
  194. package/dist/editor/EditorField.js +7 -10
  195. package/dist/editor/FormCodePanel.js +10 -23
  196. package/dist/editor/Monaco.js +7 -4
  197. package/dist/editor/index.d.ts +1 -1
  198. package/dist/editor/index.js +2 -2
  199. package/dist/editor/themes.d.ts +4 -0
  200. package/dist/editor/themes.js +75 -76
  201. package/dist/file-explorer/FileExplorer.js +180 -187
  202. package/dist/file-explorer/FileExplorerContext.js +45 -67
  203. package/dist/file-explorer/FilePreview/CodePreviewEditor.js +2 -1
  204. package/dist/file-explorer/FilePreview/Inline.js +9 -7
  205. package/dist/file-explorer/FilePreview/StreamedBadge.js +2 -2
  206. package/dist/file-explorer/FilePreview/Viewer.js +32 -34
  207. package/dist/file-explorer/FilePreview/index.js +60 -92
  208. package/dist/file-explorer/FilePreview/useObjectBlobUrl.js +4 -4
  209. package/dist/file-explorer/FilePreview/useObjectText.js +4 -4
  210. package/dist/file-explorer/FilePreview/usePresignedUrl.js +4 -4
  211. package/dist/file-explorer/FileRow.js +10 -15
  212. package/dist/file-explorer/FileRowsWindow.js +2 -6
  213. package/dist/file-explorer/FileTable.js +2 -2
  214. package/dist/file-explorer/FileTableHeaders.js +8 -11
  215. package/dist/file-explorer/LoadMoreRow.js +8 -9
  216. package/dist/file-explorer/TreeView.js +16 -16
  217. package/dist/file-explorer/helpers.d.ts +1 -4
  218. package/dist/file-explorer/helpers.js +101 -114
  219. package/dist/file-explorer/lib/types.d.ts +2 -2
  220. package/dist/file-explorer/lib/utils.d.ts +0 -2
  221. package/dist/file-explorer/lib/utils.js +1 -25
  222. package/dist/file-explorer/toasts.js +109 -190
  223. package/dist/form/Fields/BooleanField.js +12 -14
  224. package/dist/form/Fields/CheckboxGroupField.d.ts +1 -1
  225. package/dist/form/Fields/CheckboxGroupField.js +16 -18
  226. package/dist/form/Fields/ColorField.js +11 -11
  227. package/dist/form/Fields/DropdownField.d.ts +1 -1
  228. package/dist/form/Fields/DropdownField.js +20 -36
  229. package/dist/form/Fields/DurationField.d.ts +1 -1
  230. package/dist/form/Fields/DurationField.js +36 -50
  231. package/dist/form/Fields/LabelField.js +2 -2
  232. package/dist/form/Fields/MultiDropdownField.d.ts +1 -1
  233. package/dist/form/Fields/MultiDropdownField.js +9 -14
  234. package/dist/form/Fields/NumberField.d.ts +1 -1
  235. package/dist/form/Fields/NumberField.js +13 -48
  236. package/dist/form/Fields/ObjectField.js +3 -3
  237. package/dist/form/Fields/RadioField.d.ts +1 -1
  238. package/dist/form/Fields/RadioField.js +15 -18
  239. package/dist/form/Fields/RangeField.js +34 -35
  240. package/dist/form/Fields/StringField.d.ts +1 -1
  241. package/dist/form/Fields/StringField.js +15 -25
  242. package/dist/form/Fields/TextAreaField.js +10 -15
  243. package/dist/form/Form.d.ts +7 -2
  244. package/dist/form/Form.js +144 -49
  245. package/dist/form/FormLayout.js +18 -12
  246. package/dist/form/Wizard/WizardContainer.js +44 -18
  247. package/dist/form/Wizard/WizardNavigation.d.ts +1 -1
  248. package/dist/form/Wizard/WizardNavigation.js +31 -56
  249. package/dist/form/Wizard/WizardStepIndicator.d.ts +3 -0
  250. package/dist/form/Wizard/WizardStepIndicator.js +98 -114
  251. package/dist/form/Wizard/types.d.ts +2 -2
  252. package/dist/form/fieldFrame.d.ts +7 -0
  253. package/dist/form/fieldFrame.js +19 -0
  254. package/dist/form/index.d.ts +5 -5
  255. package/dist/form/index.js +4 -6
  256. package/dist/form/layoutCSS.js +5 -4
  257. package/dist/form/types/fieldComponentTypes.d.ts +5 -3
  258. package/dist/form/useChoiceField.js +2 -3
  259. package/dist/form/useFieldValue.d.ts +3 -0
  260. package/dist/form/useFieldValue.js +24 -7
  261. package/dist/form/utils/duration.d.ts +2 -2
  262. package/dist/form/utils/duration.js +3 -3
  263. package/dist/form/utils/fieldItems.d.ts +1 -1
  264. package/dist/form/utils/fieldPath.d.ts +5 -3
  265. package/dist/form/utils/fieldPath.js +18 -3
  266. package/dist/form/utils/secondaryField.d.ts +0 -7
  267. package/dist/form/utils/secondaryField.js +1 -12
  268. package/dist/form/validation.d.ts +29 -0
  269. package/dist/form/validation.js +14 -0
  270. package/dist/format.d.ts +28 -0
  271. package/dist/format.js +64 -0
  272. package/dist/graph/AnnotationBanner.js +20 -31
  273. package/dist/graph/Connectors.js +1 -1
  274. package/dist/graph/DependencyGraph.js +51 -65
  275. package/dist/graph/GraphEditor.js +24 -28
  276. package/dist/graph/GraphEditorDialogs.js +239 -245
  277. package/dist/graph/InputDialog.js +93 -112
  278. package/dist/graph/InputsEditor.js +83 -84
  279. package/dist/graph/JobSummary.js +10 -11
  280. package/dist/graph/MatrixGroup.js +3 -3
  281. package/dist/graph/ProblemsButton.js +9 -10
  282. package/dist/graph/ShortcutsButton.js +12 -17
  283. package/dist/graph/SuggestionInput.d.ts +2 -3
  284. package/dist/graph/SuggestionInput.js +2 -4
  285. package/dist/graph/TreeView.js +47 -45
  286. package/dist/graph/WorkflowSettingsDialog.js +97 -102
  287. package/dist/graph/editorChrome.js +10 -12
  288. package/dist/graph/editorFields.d.ts +19 -16
  289. package/dist/graph/editorFields.js +97 -135
  290. package/dist/graph/editorPrimitives.d.ts +2 -2
  291. package/dist/graph/editorPrimitives.js +3 -3
  292. package/dist/graph/editorRows.js +22 -25
  293. package/dist/graph/editorStrings.d.ts +18 -21
  294. package/dist/graph/editorStrings.js +15 -27
  295. package/dist/graph/fieldProblems.js +2 -2
  296. package/dist/graph/graphEditorState.d.ts +4 -4
  297. package/dist/graph/inputRefs.d.ts +0 -13
  298. package/dist/graph/inputRefs.js +122 -160
  299. package/dist/graph/settingsViews.js +5 -3
  300. package/dist/graph/stepWith.js +100 -100
  301. package/dist/graph/toolbarPanel.d.ts +8 -0
  302. package/dist/graph/toolbarPanel.js +11 -0
  303. package/dist/icons.d.ts +234 -23
  304. package/dist/icons.js +249 -264
  305. package/dist/index.d.ts +38 -21
  306. package/dist/index.js +42 -21
  307. package/dist/list/ActionToolbar.d.ts +1 -5
  308. package/dist/list/ActionToolbar.js +21 -20
  309. package/dist/list/ListPage.js +7 -7
  310. package/dist/list/ListTable.d.ts +3 -2
  311. package/dist/list/ListTable.js +33 -29
  312. package/dist/list/ListViewControls.d.ts +0 -17
  313. package/dist/list/ListViewControls.js +50 -118
  314. package/dist/list/UserHoverCard.js +24 -32
  315. package/dist/list/index.d.ts +2 -4
  316. package/dist/list/index.js +3 -5
  317. package/dist/list/listSearch.d.ts +1 -1
  318. package/dist/list/listSearch.js +19 -14
  319. package/dist/list/rowMenu.js +20 -26
  320. package/dist/logviewer/LogViewer.js +268 -382
  321. package/dist/logviewer/logviewer.css +53 -41
  322. package/dist/logviewer/segments.d.ts +1 -1
  323. package/dist/logviewer/segments.js +1 -1
  324. package/dist/styles/base.css +16 -40
  325. package/dist/styles/theme.css +75 -106
  326. package/dist/styles.css +1 -1
  327. package/dist/theme/color.d.ts +40 -0
  328. package/dist/theme/color.js +228 -0
  329. package/dist/theme/contrast.d.ts +42 -0
  330. package/dist/theme/contrast.js +145 -0
  331. package/dist/theme/derive.d.ts +25 -0
  332. package/dist/theme/derive.js +475 -0
  333. package/dist/theme/fit.d.ts +35 -0
  334. package/dist/theme/fit.js +185 -0
  335. package/dist/theme/index.d.ts +14 -29
  336. package/dist/theme/index.js +20 -279
  337. package/dist/theme/model.d.ts +64 -0
  338. package/dist/theme/model.js +219 -0
  339. package/package.json +9 -5
  340. package/dist/ai/ui/Avatar.d.ts +0 -7
  341. package/dist/ai/ui/Avatar.js +0 -24
  342. package/dist/components/Filter.d.ts +0 -15
  343. package/dist/components/Filter.js +0 -32
  344. package/dist/components/FilterPill.d.ts +0 -7
  345. package/dist/components/FilterPill.js +0 -14
  346. package/dist/components/Indicator.d.ts +0 -4
  347. package/dist/components/Indicator.js +0 -44
  348. package/dist/components/SectionHeader.d.ts +0 -8
  349. package/dist/components/SectionHeader.js +0 -11
  350. package/dist/components/SettingRow.d.ts +0 -18
  351. package/dist/components/SettingRow.js +0 -35
  352. package/dist/components/SettingsGroup.d.ts +0 -8
  353. package/dist/components/SettingsGroup.js +0 -17
  354. package/dist/components/ghostButton.d.ts +0 -4
  355. package/dist/components/ghostButton.js +0 -7
  356. package/dist/components/inputClasses.d.ts +0 -1
  357. package/dist/components/inputClasses.js +0 -4
  358. package/dist/duration.d.ts +0 -3
  359. package/dist/duration.js +0 -17
  360. package/dist/form/FieldGroup.d.ts +0 -11
  361. package/dist/form/FieldGroup.js +0 -36
  362. package/dist/form/FieldWrapper.d.ts +0 -16
  363. package/dist/form/FieldWrapper.js +0 -55
  364. package/dist/form/fieldContext.d.ts +0 -19
  365. package/dist/form/fieldContext.js +0 -26
  366. package/dist/graph/Collapse.d.ts +0 -7
  367. package/dist/graph/Collapse.js +0 -15
  368. package/dist/graph/ToolbarPopover.d.ts +0 -13
  369. package/dist/graph/ToolbarPopover.js +0 -39
  370. package/dist/icons/ai/AiOutlineRollback.js +0 -16
  371. package/dist/icons/bi/BiBell.js +0 -16
  372. package/dist/icons/bi/BiBellOff.js +0 -16
  373. package/dist/icons/bi/BiBuildings.js +0 -20
  374. package/dist/icons/bi/BiError.js +0 -20
  375. package/dist/icons/bi/BiExpandVertical.js +0 -16
  376. package/dist/icons/bi/BiPause.js +0 -16
  377. package/dist/icons/bi/BiPlay.js +0 -16
  378. package/dist/icons/bi/BiRedo.js +0 -16
  379. package/dist/icons/bi/BiSolidCheckShield.js +0 -16
  380. package/dist/icons/bi/BiSolidTrashAlt.js +0 -16
  381. package/dist/icons/bi/BiStop.js +0 -16
  382. package/dist/icons/bi/BiUndo.js +0 -16
  383. package/dist/icons/bs/BsArrowsCollapse.js +0 -22
  384. package/dist/icons/bs/BsBank2.js +0 -19
  385. package/dist/icons/bs/BsBriefcase.js +0 -19
  386. package/dist/icons/bs/BsBucket.js +0 -19
  387. package/dist/icons/bs/BsCalendarX.js +0 -23
  388. package/dist/icons/bs/BsChatLeft.js +0 -19
  389. package/dist/icons/bs/BsChevronDoubleDown.js +0 -29
  390. package/dist/icons/bs/BsChevronDoubleUp.js +0 -29
  391. package/dist/icons/bs/BsClipboardCheck.js +0 -34
  392. package/dist/icons/bs/BsCurrencyDollar.js +0 -19
  393. package/dist/icons/bs/BsDash.js +0 -19
  394. package/dist/icons/bs/BsFileEarmarkZip.js +0 -23
  395. package/dist/icons/bs/BsFiles.js +0 -19
  396. package/dist/icons/bs/BsGeoAlt.js +0 -23
  397. package/dist/icons/bs/BsGrid.js +0 -19
  398. package/dist/icons/bs/BsLayers.js +0 -19
  399. package/dist/icons/bs/BsLayoutThreeColumns.js +0 -19
  400. package/dist/icons/bs/BsListUl.js +0 -22
  401. package/dist/icons/bs/BsMortarboard.js +0 -23
  402. package/dist/icons/bs/BsMusicNoteBeamed.js +0 -34
  403. package/dist/icons/bs/BsOpenai.js +0 -19
  404. package/dist/icons/bs/BsPersonPlus.js +0 -26
  405. package/dist/icons/bs/BsSearch.js +0 -19
  406. package/dist/icons/bs/BsSend.js +0 -19
  407. package/dist/icons/bs/BsShieldSlash.js +0 -22
  408. package/dist/icons/bs/BsStar.js +0 -19
  409. package/dist/icons/bs/BsStarFill.js +0 -19
  410. package/dist/icons/bs/BsStopCircle.js +0 -23
  411. package/dist/icons/bs/BsTag.js +0 -23
  412. package/dist/icons/bs/BsTelephone.js +0 -19
  413. package/dist/icons/bs/BsTerminal.js +0 -23
  414. package/dist/icons/bs/BsTerminalFill.js +0 -19
  415. package/dist/icons/bs/BsThreeDots.js +0 -19
  416. package/dist/icons/bs/BsThreeDotsVertical.js +0 -19
  417. package/dist/icons/bs/BsZoomIn.js +0 -37
  418. package/dist/icons/fa/FaAmazon.js +0 -16
  419. package/dist/icons/fa/FaAngleDown.js +0 -16
  420. package/dist/icons/fa/FaAngleLeft.js +0 -16
  421. package/dist/icons/fa/FaAngleRight.js +0 -16
  422. package/dist/icons/fa/FaAngleUp.js +0 -16
  423. package/dist/icons/fa/FaArrowDown.js +0 -16
  424. package/dist/icons/fa/FaArrowLeft.js +0 -16
  425. package/dist/icons/fa/FaArrowRight.js +0 -16
  426. package/dist/icons/fa/FaArrowUp.js +0 -16
  427. package/dist/icons/fa/FaBalanceScale.js +0 -16
  428. package/dist/icons/fa/FaCaretDown.js +0 -16
  429. package/dist/icons/fa/FaCentos.js +0 -16
  430. package/dist/icons/fa/FaChartLine.js +0 -16
  431. package/dist/icons/fa/FaChartPie.js +0 -16
  432. package/dist/icons/fa/FaCheck.js +0 -16
  433. package/dist/icons/fa/FaChevronDown.js +0 -16
  434. package/dist/icons/fa/FaChevronUp.js +0 -16
  435. package/dist/icons/fa/FaChrome.js +0 -16
  436. package/dist/icons/fa/FaCircleNotch.js +0 -16
  437. package/dist/icons/fa/FaCloud.js +0 -16
  438. package/dist/icons/fa/FaCloudDownloadAlt.js +0 -16
  439. package/dist/icons/fa/FaCog.js +0 -16
  440. package/dist/icons/fa/FaCogs.js +0 -16
  441. package/dist/icons/fa/FaComments.js +0 -16
  442. package/dist/icons/fa/FaCompress.js +0 -16
  443. package/dist/icons/fa/FaDesktop.js +0 -16
  444. package/dist/icons/fa/FaDocker.js +0 -16
  445. package/dist/icons/fa/FaDollarSign.js +0 -16
  446. package/dist/icons/fa/FaEdge.js +0 -16
  447. package/dist/icons/fa/FaEdit.js +0 -16
  448. package/dist/icons/fa/FaExclamationTriangle.js +0 -16
  449. package/dist/icons/fa/FaExpand.js +0 -16
  450. package/dist/icons/fa/FaEye.js +0 -16
  451. package/dist/icons/fa/FaEyeSlash.js +0 -16
  452. package/dist/icons/fa/FaFile.js +0 -16
  453. package/dist/icons/fa/FaFilePdf.js +0 -16
  454. package/dist/icons/fa/FaFilter.js +0 -16
  455. package/dist/icons/fa/FaFirefoxBrowser.js +0 -16
  456. package/dist/icons/fa/FaFlask.js +0 -16
  457. package/dist/icons/fa/FaFolder.js +0 -16
  458. package/dist/icons/fa/FaGithub.js +0 -16
  459. package/dist/icons/fa/FaGitlab.js +0 -16
  460. package/dist/icons/fa/FaGlobe.js +0 -16
  461. package/dist/icons/fa/FaGlobeAmericas.js +0 -16
  462. package/dist/icons/fa/FaImage.js +0 -16
  463. package/dist/icons/fa/FaInfoCircle.js +0 -16
  464. package/dist/icons/fa/FaKey.js +0 -16
  465. package/dist/icons/fa/FaLayerGroup.js +0 -16
  466. package/dist/icons/fa/FaLink.js +0 -16
  467. package/dist/icons/fa/FaLinkedin.js +0 -16
  468. package/dist/icons/fa/FaLinux.js +0 -16
  469. package/dist/icons/fa/FaList.js +0 -16
  470. package/dist/icons/fa/FaLock.js +0 -16
  471. package/dist/icons/fa/FaOpenid.js +0 -16
  472. package/dist/icons/fa/FaOpera.js +0 -16
  473. package/dist/icons/fa/FaPaperclip.js +0 -16
  474. package/dist/icons/fa/FaPlus.js +0 -16
  475. package/dist/icons/fa/FaPowerOff.js +0 -16
  476. package/dist/icons/fa/FaPrint.js +0 -16
  477. package/dist/icons/fa/FaQrcode.js +0 -16
  478. package/dist/icons/fa/FaQuestionCircle.js +0 -16
  479. package/dist/icons/fa/FaRedhat.js +0 -16
  480. package/dist/icons/fa/FaRegCircle.js +0 -16
  481. package/dist/icons/fa/FaRegFileImage.js +0 -16
  482. package/dist/icons/fa/FaRegFolder.js +0 -16
  483. package/dist/icons/fa/FaRobot.js +0 -16
  484. package/dist/icons/fa/FaRocket.js +0 -16
  485. package/dist/icons/fa/FaRunning.js +0 -16
  486. package/dist/icons/fa/FaSafari.js +0 -16
  487. package/dist/icons/fa/FaSave.js +0 -16
  488. package/dist/icons/fa/FaSearch.js +0 -16
  489. package/dist/icons/fa/FaShieldAlt.js +0 -16
  490. package/dist/icons/fa/FaSlack.js +0 -16
  491. package/dist/icons/fa/FaStar.js +0 -16
  492. package/dist/icons/fa/FaStop.js +0 -16
  493. package/dist/icons/fa/FaSuse.js +0 -16
  494. package/dist/icons/fa/FaTerminal.js +0 -16
  495. package/dist/icons/fa/FaTimes.js +0 -16
  496. package/dist/icons/fa/FaUbuntu.js +0 -16
  497. package/dist/icons/fa/FaUndoAlt.js +0 -16
  498. package/dist/icons/fa/FaUnlink.js +0 -16
  499. package/dist/icons/fa/FaUser.js +0 -16
  500. package/dist/icons/fa/FaUsers.js +0 -16
  501. package/dist/icons/fa/FaWindows.js +0 -16
  502. package/dist/icons/fa6/FaApple.js +0 -16
  503. package/dist/icons/fa6/FaArrowsRotate.js +0 -16
  504. package/dist/icons/fa6/FaDebian.js +0 -16
  505. package/dist/icons/fa6/FaFilterCircleXmark.js +0 -16
  506. package/dist/icons/fa6/FaInbox.js +0 -16
  507. package/dist/icons/fa6/FaLocationDot.js +0 -16
  508. package/dist/icons/fa6/FaRegFilePdf.js +0 -16
  509. package/dist/icons/fa6/FaRegFolderOpen.js +0 -16
  510. package/dist/icons/fa6/FaUpRightFromSquare.js +0 -16
  511. package/dist/icons/fa6/FaWandMagicSparkles.js +0 -16
  512. package/dist/icons/fa6/FaXTwitter.js +0 -16
  513. package/dist/icons/fi/FiActivity.js +0 -23
  514. package/dist/icons/fi/FiAlertCircle.js +0 -49
  515. package/dist/icons/fi/FiChevronDown.js +0 -23
  516. package/dist/icons/fi/FiClock.js +0 -31
  517. package/dist/icons/fi/FiCopy.js +0 -34
  518. package/dist/icons/fi/FiDownload.js +0 -40
  519. package/dist/icons/fi/FiFile.js +0 -27
  520. package/dist/icons/fi/FiFileText.js +0 -55
  521. package/dist/icons/fi/FiHardDrive.js +0 -55
  522. package/dist/icons/fi/FiRotateCcw.js +0 -27
  523. package/dist/icons/fi/FiUpload.js +0 -40
  524. package/dist/icons/fi/FiX.js +0 -37
  525. package/dist/icons/fi/FiZap.js +0 -23
  526. package/dist/icons/gi/GiSpy.js +0 -16
  527. package/dist/icons/go/GoGitCommit.js +0 -16
  528. package/dist/icons/go/GoGitPullRequest.js +0 -20
  529. package/dist/icons/go/GoIssueOpened.js +0 -16
  530. package/dist/icons/go/GoPlus.js +0 -16
  531. package/dist/icons/go/GoRepoForked.js +0 -28
  532. package/dist/icons/go/GoSignOut.js +0 -16
  533. package/dist/icons/go/GoSkip.js +0 -20
  534. package/dist/icons/go/GoVideo.js +0 -20
  535. package/dist/icons/gr/GrCloudComputer.js +0 -20
  536. package/dist/icons/gr/GrInbox.js +0 -20
  537. package/dist/icons/gr/GrServerCluster.js +0 -20
  538. package/dist/icons/gr/GrStorage.js +0 -20
  539. package/dist/icons/gr/GrTasks.js +0 -20
  540. package/dist/icons/hi/HiCog.js +0 -24
  541. package/dist/icons/hi/HiDuplicate.js +0 -24
  542. package/dist/icons/hi/HiOutlineArchive.js +0 -26
  543. package/dist/icons/hi/HiOutlineClipboardCopy.js +0 -26
  544. package/dist/icons/hi/HiOutlineHome.js +0 -26
  545. package/dist/icons/hi/HiQuestionMarkCircle.js +0 -24
  546. package/dist/icons/hi/HiServer.js +0 -24
  547. package/dist/icons/hi2/HiMiniCheckCircle.js +0 -24
  548. package/dist/icons/hi2/HiMiniLanguage.js +0 -28
  549. package/dist/icons/hi2/HiMiniMinusCircle.js +0 -24
  550. package/dist/icons/hi2/HiMiniXCircle.js +0 -24
  551. package/dist/icons/hi2/HiSparkles.js +0 -24
  552. package/dist/icons/im/ImSpinner5.js +0 -19
  553. package/dist/icons/io/IoIosNotifications.js +0 -16
  554. package/dist/icons/io/IoMdBuild.js +0 -16
  555. package/dist/icons/io/IoMdClose.js +0 -16
  556. package/dist/icons/io5/IoCloudUploadOutline.js +0 -32
  557. package/dist/icons/io5/IoDocumentTextOutline.js +0 -31
  558. package/dist/icons/io5/IoFileTrayFullOutline.js +0 -31
  559. package/dist/icons/io5/IoHeart.js +0 -16
  560. package/dist/icons/io5/IoHeartDislike.js +0 -16
  561. package/dist/icons/io5/IoHeartOutline.js +0 -22
  562. package/dist/icons/io5/IoInformationCircleOutline.js +0 -50
  563. package/dist/icons/io5/IoSettingsOutline.js +0 -22
  564. package/dist/icons/io5/IoWarningOutline.js +0 -40
  565. package/dist/icons/lu/LuArrowRight.js +0 -27
  566. package/dist/icons/lu/LuBadgeCheck.js +0 -27
  567. package/dist/icons/lu/LuBraces.js +0 -27
  568. package/dist/icons/lu/LuBrainCircuit.js +0 -101
  569. package/dist/icons/lu/LuCalendar.js +0 -46
  570. package/dist/icons/lu/LuCheck.js +0 -23
  571. package/dist/icons/lu/LuChevronLeft.js +0 -23
  572. package/dist/icons/lu/LuChevronRight.js +0 -23
  573. package/dist/icons/lu/LuCode.js +0 -27
  574. package/dist/icons/lu/LuExternalLink.js +0 -35
  575. package/dist/icons/lu/LuEye.js +0 -31
  576. package/dist/icons/lu/LuEyeOff.js +0 -40
  577. package/dist/icons/lu/LuFolderTree.js +0 -40
  578. package/dist/icons/lu/LuIdCard.js +0 -55
  579. package/dist/icons/lu/LuKeyboard.js +0 -71
  580. package/dist/icons/lu/LuLogs.js +0 -65
  581. package/dist/icons/lu/LuMail.js +0 -33
  582. package/dist/icons/lu/LuMegaphone.js +0 -27
  583. package/dist/icons/lu/LuMoon.js +0 -23
  584. package/dist/icons/lu/LuNetwork.js +0 -63
  585. package/dist/icons/lu/LuPartyPopper.js +0 -65
  586. package/dist/icons/lu/LuSettings2.js +0 -48
  587. package/dist/icons/lu/LuSheet.js +0 -72
  588. package/dist/icons/lu/LuShield.js +0 -23
  589. package/dist/icons/lu/LuSun.js +0 -69
  590. package/dist/icons/lu/LuTextCursorInput.js +0 -45
  591. package/dist/icons/lu/LuX.js +0 -27
  592. package/dist/icons/lu/LuZoomIn.js +0 -59
  593. package/dist/icons/lu/LuZoomOut.js +0 -49
  594. package/dist/icons/md/MdClear.js +0 -23
  595. package/dist/icons/md/MdDragHandle.js +0 -23
  596. package/dist/icons/md/MdInstallDesktop.js +0 -31
  597. package/dist/icons/md/MdOutlineAttachMoney.js +0 -23
  598. package/dist/icons/md/MdOutlineMoneyOff.js +0 -23
  599. package/dist/icons/md/MdPieChart.js +0 -23
  600. package/dist/icons/md/MdRefresh.js +0 -23
  601. package/dist/icons/md/MdReplay.js +0 -23
  602. package/dist/icons/md/MdSmartphone.js +0 -23
  603. package/dist/icons/pi/PiArrowBendUpRightBold.js +0 -19
  604. package/dist/icons/pi/PiPlugsConnectedFill.js +0 -19
  605. package/dist/icons/pi/PiRectangleDashed.js +0 -19
  606. package/dist/icons/pi/PiShareBold.js +0 -19
  607. package/dist/icons/si/SiAnthropic.js +0 -19
  608. package/dist/icons/si/SiHelm.js +0 -19
  609. package/dist/icons/si/SiKubernetes.js +0 -19
  610. package/dist/icons/tb/TbAlertTriangle.js +0 -35
  611. package/dist/icons/tb/TbAlertTriangleFilled.js +0 -19
  612. package/dist/icons/tb/TbApi.js +0 -40
  613. package/dist/icons/tb/TbBrain.js +0 -50
  614. package/dist/icons/tb/TbBuildingTunnel.js +0 -65
  615. package/dist/icons/tb/TbEdit.js +0 -35
  616. package/dist/icons/tb/TbLayoutSidebar.js +0 -27
  617. package/dist/icons/tb/TbLayoutSidebarLeftCollapse.js +0 -35
  618. package/dist/icons/tb/TbLayoutSidebarRightCollapse.js +0 -35
  619. package/dist/icons/tb/TbUser.js +0 -27
  620. package/dist/icons/tb/TbUserOff.js +0 -35
  621. package/dist/icons/tb/TbWorldShare.js +0 -55
  622. package/dist/icons/tb/TbWorldWww.js +0 -65
  623. package/dist/icons/ti/TiArrowSortedDown.js +0 -20
  624. package/dist/icons/ti/TiArrowSortedUp.js +0 -20
  625. package/dist/icons/ti/TiArrowUnsorted.js +0 -20
  626. package/dist/icons/ti/TiCancel.js +0 -20
  627. package/dist/icons/vsc/VscChromeMinimize.js +0 -19
  628. package/dist/icons/vsc/VscJson.js +0 -19
  629. package/dist/icons/vsc/VscLayoutSidebarLeft.js +0 -19
  630. package/dist/icons/vsc/VscPass.js +0 -27
  631. package/dist/icons/vsc/VscSplitHorizontal.js +0 -19
  632. package/dist/icons/vsc/VscTerminalPowershell.js +0 -19
  633. package/dist/list/ListPager.d.ts +0 -14
  634. package/dist/list/ListPager.js +0 -62
  635. package/dist/list/textEntry.d.ts +0 -2
  636. package/dist/list/textEntry.js +0 -10
  637. /package/dist/{ai/ui/codeBreaks.d.ts → components/markdownCodeBreaks.d.ts} +0 -0
@@ -1,21 +1,22 @@
1
- import { FaCheck } from "../../icons/fa/FaCheck.js";
2
- import { FiClock } from "../../icons/fi/FiClock.js";
3
- import { durationToAbsHumanDuration } from "../../duration.js";
1
+ import { cx } from "../../cx.js";
2
+ import { CheckIcon, ClockIcon } from "../../icons.js";
3
+ import { useStrings } from "../../components/Provider.js";
4
+ import { formatDuration } from "../../format.js";
5
+ import { useElapsed } from "../../components/relativeTime.js";
4
6
  import { useChatConfig } from "../core/config.js";
5
7
  import { useChat } from "../core/ChatProvider.js";
6
8
  import Markdown from "../ui/Markdown.js";
7
- import { ReasoningBody, ReasoningToggle } from "./Reasoning.js";
9
+ import { Reasoning, ReasoningBody } from "./Reasoning.js";
8
10
  import AgentMessageParts from "./agent/AgentMessageParts.js";
9
11
  import ChatMessage_default from "./ChatMessage.js";
10
- import { clsx } from "clsx";
11
12
  import { Fragment, jsx, jsxs } from "react/jsx-runtime";
12
13
  import { useCallback, useEffect, useLayoutEffect, useMemo, useRef, useState } from "react";
13
- import { Duration } from "luxon";
14
14
  //#region src/ai/components/ChatMessageList.tsx
15
15
  function ChatMessageList({ messages, allMessages, streamingMessage, queuedMessages, onRemoveQueued, canRemoveQueued, queueDelivery = "afterReply", editingMessageId, showAuthor, currentUsername, onNavigateBranch, onEditMessage, onSaveEdit, onCancelEdit, onRegenerateMessage, onRetryMessage, onOpenReasoning, onApprovalAnswer, inputElement, isStreaming: isStreamingProp, flush, label, footer, workingIndicator = true }) {
16
16
  const { adapter, isStreaming: providerStreaming, isThinking, streamingReasoning, streamingParts, thinkingStartTime } = useChat();
17
17
  const isStreaming = isStreamingProp ?? providerStreaming;
18
18
  const { strings } = useChatConfig();
19
+ const { common } = useStrings();
19
20
  const tThinking = strings.thinking;
20
21
  const attachmentDownloadUrl = useMemo(() => {
21
22
  const attachments = adapter.attachments;
@@ -38,7 +39,6 @@ function ChatMessageList({ messages, allMessages, streamingMessage, queuedMessag
38
39
  const messageCount = messages.length;
39
40
  const streamingContent = streamingMessage?.content;
40
41
  const streamingMessageParts = streamingMessage?.parts;
41
- const [elapsedTime, setElapsedTime] = useState(0);
42
42
  const [finalThinkingDuration, setFinalThinkingDuration] = useState(null);
43
43
  const [reasoningOpen, setReasoningOpen] = useState(false);
44
44
  const wasThinkingRef = useRef(false);
@@ -58,16 +58,6 @@ function ChatMessageList({ messages, allMessages, streamingMessage, queuedMessag
58
58
  setReasoningOpen(false);
59
59
  }
60
60
  }, [isStreaming]);
61
- useEffect(() => {
62
- if (!thinkingStartTime || !isThinking) {
63
- setElapsedTime(0);
64
- return;
65
- }
66
- const interval = setInterval(() => {
67
- setElapsedTime(Math.floor((Date.now() - thinkingStartTime) / 1e3));
68
- }, 1e3);
69
- return () => clearInterval(interval);
70
- }, [thinkingStartTime, isThinking]);
71
61
  useEffect(() => {
72
62
  if (reasoningScrollRef.current && isThinking) reasoningScrollRef.current.scrollTop = reasoningScrollRef.current.scrollHeight;
73
63
  }, [streamingReasoning, isThinking]);
@@ -151,7 +141,7 @@ function ChatMessageList({ messages, allMessages, streamingMessage, queuedMessag
151
141
  children: [
152
142
  /* @__PURE__ */ jsx("div", { className: "flex-1" }),
153
143
  footer && /* @__PURE__ */ jsx("div", {
154
- className: clsx("w-full max-w-[var(--chat-column,50rem)] mx-auto", !flush && "px-4"),
144
+ className: cx("w-full max-w-[var(--chat-column,50rem)] mx-auto", !flush && "px-4"),
155
145
  children: footer
156
146
  }),
157
147
  inputElement && /* @__PURE__ */ jsx("div", {
@@ -201,31 +191,37 @@ function ChatMessageList({ messages, allMessages, streamingMessage, queuedMessag
201
191
  }),
202
192
  isStreaming && streamingReasoning && /* @__PURE__ */ jsx("div", {
203
193
  className: "animate-chat-enter",
204
- children: /* @__PURE__ */ jsxs("div", {
205
- className: clsx("pt-3", !flush && "px-4"),
206
- children: [/* @__PURE__ */ jsx(ReasoningToggle, {
207
- open: reasoningOpen,
194
+ children: /* @__PURE__ */ jsx("div", {
195
+ className: cx("pt-3", !flush && "px-4"),
196
+ children: /* @__PURE__ */ jsx(Reasoning, {
197
+ label: /* @__PURE__ */ jsx(ThinkingLabel, {
198
+ startedAt: isThinking ? thinkingStartTime : void 0,
199
+ finalDuration: finalThinkingDuration
200
+ }),
208
201
  shimmer: isThinking,
209
- onToggle: () => onOpenReasoning ? onOpenReasoning(streamingReasoning, finalThinkingDuration) : setReasoningOpen((o) => !o),
210
- children: isThinking ? elapsedTime > 0 ? `${tThinking.label} (${elapsedTime}s)` : tThinking.ellipsis : tThinking.thoughtFor(finalThinkingDuration ? durationToAbsHumanDuration(Duration.fromMillis(finalThinkingDuration)) : `${elapsedTime}s`)
211
- }), reasoningOpen ? /* @__PURE__ */ jsx(ReasoningBody, { children: /* @__PURE__ */ jsx(Markdown, {
212
- isStreaming: isThinking,
213
- children: streamingReasoning
214
- }) }) : isThinking && /* @__PURE__ */ jsx(ReasoningBody, {
215
- className: "chat-reasoning-tail",
216
- children: /* @__PURE__ */ jsx("div", {
217
- ref: reasoningScrollRef,
218
- className: "max-h-20 overflow-y-hidden",
219
- children: /* @__PURE__ */ jsx(Markdown, {
220
- isStreaming: true,
221
- children: streamingReasoning
202
+ open: reasoningOpen,
203
+ onOpenChange: setReasoningOpen,
204
+ onOpenPanel: onOpenReasoning && (() => onOpenReasoning(streamingReasoning, finalThinkingDuration)),
205
+ preview: isThinking && /* @__PURE__ */ jsx(ReasoningBody, {
206
+ className: "chat-reasoning-tail",
207
+ children: /* @__PURE__ */ jsx("div", {
208
+ ref: reasoningScrollRef,
209
+ className: "max-h-20 overflow-y-hidden",
210
+ children: /* @__PURE__ */ jsx(Markdown, {
211
+ isStreaming: true,
212
+ children: streamingReasoning
213
+ })
222
214
  })
215
+ }),
216
+ children: /* @__PURE__ */ jsx(Markdown, {
217
+ isStreaming: isThinking,
218
+ children: streamingReasoning
223
219
  })
224
- })]
220
+ })
225
221
  })
226
222
  }, "thinking"),
227
223
  isStreaming && streamingParts.length > 0 && /* @__PURE__ */ jsx("div", {
228
- className: clsx("animate-chat-enter py-1", !flush && "px-4"),
224
+ className: cx("animate-chat-enter py-1", !flush && "px-4"),
229
225
  children: /* @__PURE__ */ jsx(AgentMessageParts, {
230
226
  message: {
231
227
  id: "streaming-parts",
@@ -238,7 +234,7 @@ function ChatMessageList({ messages, allMessages, streamingMessage, queuedMessag
238
234
  showWorkingIndicator && /* @__PURE__ */ jsx("div", {
239
235
  className: "animate-chat-enter",
240
236
  children: /* @__PURE__ */ jsx("div", {
241
- className: clsx("py-3", !flush && "px-4"),
237
+ className: cx("py-3", !flush && "px-4"),
242
238
  children: /* @__PURE__ */ jsx("div", {
243
239
  className: "animate-shimmer text-shimmer text-sm",
244
240
  children: tThinking.ellipsis
@@ -261,7 +257,7 @@ function ChatMessageList({ messages, allMessages, streamingMessage, queuedMessag
261
257
  const removable = canRemoveQueued?.(msg.id) ?? true;
262
258
  const status = !removable ? strings.queue.handedOver : queueDelivery === "nextStep" ? strings.queue.waitingNextStep : strings.queue.waiting;
263
259
  return /* @__PURE__ */ jsxs("div", {
264
- className: clsx("animate-chat-enter", removable && "chat-queued"),
260
+ className: cx("animate-chat-enter", removable && "chat-queued"),
265
261
  children: [/* @__PURE__ */ jsx(ChatMessage_default, {
266
262
  message: msg,
267
263
  allMessages,
@@ -270,9 +266,9 @@ function ChatMessageList({ messages, allMessages, streamingMessage, queuedMessag
270
266
  onOpenAttachment
271
267
  }), /* @__PURE__ */ jsxs("div", {
272
268
  "data-testid": "queued-status",
273
- className: clsx("-mt-4 mb-2 flex items-center justify-end gap-2 text-xs theme-muted-text", !flush && "px-4"),
269
+ className: cx("-mt-4 mb-2 flex items-center justify-end gap-2 text-xs theme-muted-text", !flush && "px-4"),
274
270
  children: [
275
- removable ? /* @__PURE__ */ jsx(FiClock, { className: "h-3 w-3" }) : /* @__PURE__ */ jsx(FaCheck, { className: "h-3 w-3" }),
271
+ removable ? /* @__PURE__ */ jsx(ClockIcon, { className: "h-3 w-3" }) : /* @__PURE__ */ jsx(CheckIcon, { className: "h-3 w-3" }),
276
272
  /* @__PURE__ */ jsx("span", { children: status }),
277
273
  onRemoveQueued && removable && /* @__PURE__ */ jsxs(Fragment, { children: [/* @__PURE__ */ jsx("span", {
278
274
  "aria-hidden": "true",
@@ -282,7 +278,7 @@ function ChatMessageList({ messages, allMessages, streamingMessage, queuedMessag
282
278
  "aria-label": strings.queue.remove,
283
279
  onClick: () => onRemoveQueued(msg.id),
284
280
  className: "rounded font-medium underline-offset-2 hover:theme-text hover:underline",
285
- children: strings.queue.removeShort
281
+ children: common.remove
286
282
  })] })
287
283
  ]
288
284
  })]
@@ -311,5 +307,13 @@ function ChatMessageList({ messages, allMessages, streamingMessage, queuedMessag
311
307
  ]
312
308
  });
313
309
  }
310
+ /** "Thinking (12s)" while it thinks, then how long it took. Its own component,
311
+ * so the clock re-renders only this label, not the list. */
312
+ function ThinkingLabel({ startedAt, finalDuration }) {
313
+ const t = useChatConfig().strings.thinking;
314
+ const elapsed = useElapsed(startedAt);
315
+ if (startedAt) return elapsed ? `${t.label} (${formatDuration(elapsed)})` : t.ellipsis;
316
+ return t.thoughtFor(formatDuration(finalDuration ?? 0));
317
+ }
314
318
  //#endregion
315
319
  export { ChatMessageList as default };
@@ -1,20 +1,19 @@
1
- import { FaRegFileImage } from "../../icons/fa/FaRegFileImage.js";
2
- import { FaSearch } from "../../icons/fa/FaSearch.js";
3
- import { FaUsers } from "../../icons/fa/FaUsers.js";
4
- import { TbEdit } from "../../icons/tb/TbEdit.js";
5
- import { useRelativeTime } from "../../components/relativeTime.js";
1
+ import { cx } from "../../cx.js";
2
+ import { ImageIcon, NewChatIcon, UsersIcon } from "../../icons.js";
3
+ import { EmptyState } from "../../components/EmptyState.js";
4
+ import { RelativeTime } from "../../components/relativeTime.js";
5
+ import { SearchInput } from "../../components/SearchInput.js";
6
6
  import { useChatConfig } from "../core/config.js";
7
7
  import { useChat } from "../core/ChatProvider.js";
8
8
  import { ManageProvidersLink } from "./ComposerChrome.js";
9
9
  import { FOCUS_SIDEBAR_SEARCH_EVENT } from "../core/events.js";
10
- import { SidebarPlaceholder, SidebarRow, SidebarRowTitle } from "../ui/sidebar.js";
10
+ import { SidebarRow, SidebarRowTitle } from "../ui/sidebar.js";
11
11
  import { ConversationSidebar } from "../ui/ConversationSidebar.js";
12
12
  import { groupConversationsByDate, useConversationActions } from "./conversationActions.js";
13
- import { clsx } from "clsx";
14
13
  import { Fragment, jsx, jsxs } from "react/jsx-runtime";
15
14
  import { useEffect, useMemo, useRef, useState } from "react";
16
15
  //#region src/ai/components/ChatSidebar.tsx
17
- function ConversationRow({ conv, isCurrent, updated, menuItems, openMenu, onOpen }) {
16
+ function ConversationRow({ conv, isCurrent, menuItems, openMenu, onOpen }) {
18
17
  const { LinkComponent, strings } = useChatConfig();
19
18
  const t = strings.sidebar;
20
19
  return /* @__PURE__ */ jsx(SidebarRow, {
@@ -28,11 +27,14 @@ function ConversationRow({ conv, isCurrent, updated, menuItems, openMenu, onOpen
28
27
  },
29
28
  className: "flex min-w-0 flex-1 items-center gap-1.5 py-1 text-left",
30
29
  onClick: onOpen,
31
- children: [conv.isOwner === false && /* @__PURE__ */ jsx(FaUsers, {
30
+ children: [conv.isOwner === false && /* @__PURE__ */ jsx(UsersIcon, {
32
31
  className: "h-3 w-3 shrink-0 theme-muted-text",
33
32
  title: t.sharedWithYou
34
33
  }), /* @__PURE__ */ jsx(SidebarRowTitle, {
35
- time: updated,
34
+ time: /* @__PURE__ */ jsx(RelativeTime, {
35
+ value: conv.updatedAt ?? conv.createdAt,
36
+ format: "compact"
37
+ }),
36
38
  children: conv.title || t.untitled
37
39
  })]
38
40
  })
@@ -44,7 +46,6 @@ function ChatSidebar({ actions = true, top }) {
44
46
  const { adapter, navigation, activeConversationId, conversations, sidebar, sidebarPresentation, drawerOpen, setSidebar, setDrawerOpen, toggleSidebar, isLoading, loadConversations, clearCurrentConversation } = useChat();
45
47
  const attachmentsAvailable = !!adapter.attachments;
46
48
  const { menuItems, openMenu, overlays } = useConversationActions();
47
- const { compact } = useRelativeTime();
48
49
  const drawer = sidebarPresentation === "drawer";
49
50
  const sidebarCollapsed = !drawer && sidebar !== "expanded";
50
51
  const closeDrawer = () => setDrawerOpen(false);
@@ -107,13 +108,15 @@ function ChatSidebar({ actions = true, top }) {
107
108
  renderRow: (conv) => /* @__PURE__ */ jsx(ConversationRow, {
108
109
  conv,
109
110
  isCurrent: activeConversationId === conv.id,
110
- updated: compact(conv.updatedAt ?? conv.createdAt),
111
111
  menuItems: menuItems(conv),
112
112
  openMenu,
113
113
  onOpen: closeDrawer
114
114
  }),
115
115
  loading: isLoading,
116
- placeholder: /* @__PURE__ */ jsx(SidebarPlaceholder, { children: conversations.length === 0 ? tSidebar.noConversations : strings.chrome.noMatches }),
116
+ placeholder: /* @__PURE__ */ jsx(EmptyState, {
117
+ variant: "bare",
118
+ title: conversations.length === 0 ? tSidebar.noConversations : strings.chrome.noMatches
119
+ }),
117
120
  cycle: {
118
121
  current: filteredConversations.find((conv) => conv.id === activeConversationId),
119
122
  onSelect: (conv) => navigation.toConversation(conv.id)
@@ -125,8 +128,8 @@ function ChatSidebar({ actions = true, top }) {
125
128
  onClick: handleNewChat,
126
129
  className: "flex items-center h-9 px-2 gap-3 rounded-lg font-medium transition-colors hover:chat-tint",
127
130
  title: tSidebar.newChat,
128
- children: [/* @__PURE__ */ jsx(TbEdit, { className: clsx("flex-shrink-0", "w-4 h-4") }), /* @__PURE__ */ jsx("span", {
129
- className: clsx("text-sm transition-opacity duration-200", sidebarCollapsed ? "opacity-0 w-0 overflow-hidden" : "opacity-100"),
131
+ children: [/* @__PURE__ */ jsx(NewChatIcon, { className: cx("flex-shrink-0", "w-4 h-4") }), /* @__PURE__ */ jsx("span", {
132
+ className: cx("text-sm transition-opacity duration-200", sidebarCollapsed ? "opacity-0 w-0 overflow-hidden" : "opacity-100"),
130
133
  children: tSidebar.newChat
131
134
  })]
132
135
  }), attachmentsAvailable && /* @__PURE__ */ jsxs(LinkComponent, {
@@ -134,30 +137,19 @@ function ChatSidebar({ actions = true, top }) {
134
137
  className: "flex items-center h-9 px-2 gap-3 rounded-lg transition-colors hover:chat-tint",
135
138
  title: tSidebar.attachments,
136
139
  onClick: closeDrawer,
137
- children: [/* @__PURE__ */ jsx(FaRegFileImage, { className: "flex-shrink-0 w-4 h-4" }), /* @__PURE__ */ jsx("span", {
138
- className: clsx("text-sm transition-opacity duration-200", sidebarCollapsed ? "opacity-0 w-0 overflow-hidden" : "opacity-100"),
140
+ children: [/* @__PURE__ */ jsx(ImageIcon, { className: "flex-shrink-0 w-4 h-4" }), /* @__PURE__ */ jsx("span", {
141
+ className: cx("text-sm transition-opacity duration-200", sidebarCollapsed ? "opacity-0 w-0 overflow-hidden" : "opacity-100"),
139
142
  children: tSidebar.attachments
140
143
  })]
141
144
  })]
142
145
  }), !sidebarCollapsed && conversations.length > 0 && /* @__PURE__ */ jsx("div", {
143
146
  className: "px-2 pb-2",
144
- children: /* @__PURE__ */ jsxs("div", {
145
- className: "relative",
146
- children: [/* @__PURE__ */ jsx(FaSearch, { className: "absolute left-2.5 top-1/2 -translate-y-1/2 w-3.5 h-3.5 theme-muted-text pointer-events-none" }), /* @__PURE__ */ jsx("input", {
147
- ref: searchInputRef,
148
- type: "text",
149
- value: search,
150
- onChange: (e) => setSearch(e.target.value),
151
- onKeyDown: (e) => {
152
- if (e.key === "Escape" && search) {
153
- e.stopPropagation();
154
- setSearch("");
155
- }
156
- },
157
- placeholder: strings.chrome.searchPlaceholder,
158
- "aria-label": strings.chrome.searchLabel,
159
- className: "w-full h-9 pl-8 pr-2 text-sm rounded-lg border border-transparent chat-tint theme-text placeholder:theme-muted-text transition-colors focus:outline-none focus:border-(--theme-border) focus:bg-(--theme-panel-bg)"
160
- })]
147
+ children: /* @__PURE__ */ jsx(SearchInput, {
148
+ ref: searchInputRef,
149
+ value: search,
150
+ onValueChange: setSearch,
151
+ label: strings.chrome.searchLabel,
152
+ placeholder: strings.chrome.searchPlaceholder
161
153
  })
162
154
  })] })] }),
163
155
  footer: /* @__PURE__ */ jsx(ManageProvidersLink, {})
@@ -1,6 +1,6 @@
1
1
  import type { ReactNode } from 'react';
2
2
  /** Where a new conversation starts: the heading and the composer together, a
3
- * little above centre, with what the surface offers next under the box. The
3
+ * little above center, with what the surface offers next under the box. The
4
4
  * composer keeps its place however much is under it, so surfaces that share
5
5
  * the stage put it in the same spot; a long list scrolls instead. */
6
6
  export default function ChatStage({ heading, subheading, children, }: {
@@ -1,7 +1,7 @@
1
1
  import { jsx, jsxs } from "react/jsx-runtime";
2
2
  //#region src/ai/components/ChatStage.tsx
3
3
  /** Where a new conversation starts: the heading and the composer together, a
4
- * little above centre, with what the surface offers next under the box. The
4
+ * little above center, with what the surface offers next under the box. The
5
5
  * composer keeps its place however much is under it, so surfaces that share
6
6
  * the stage put it in the same spot; a long list scrolls instead. */
7
7
  function ChatStage({ heading, subheading, children }) {
@@ -12,7 +12,7 @@ function ChatStage({ heading, subheading, children }) {
12
12
  children: [heading && /* @__PURE__ */ jsxs("div", {
13
13
  className: "mx-auto mb-6 max-w-[var(--chat-column,50rem)] px-8 text-center",
14
14
  children: [/* @__PURE__ */ jsx("h1", {
15
- className: "text-[1.75rem] leading-tight font-medium tracking-[-0.02em] text-balance text-(--theme-panel)",
15
+ className: "text-[1.75rem] leading-tight font-medium tracking-[-0.02em] text-balance text-(--theme-app)",
16
16
  children: heading
17
17
  }), subheading && /* @__PURE__ */ jsx("p", {
18
18
  className: "mt-2 text-sm theme-muted-text",
@@ -1,5 +1,4 @@
1
- import { IoSettingsOutline } from "../../icons/io5/IoSettingsOutline.js";
2
- import { PiPlugsConnectedFill } from "../../icons/pi/PiPlugsConnectedFill.js";
1
+ import { ConnectIcon, SettingsIcon } from "../../icons.js";
3
2
  import { useChatConfig } from "../core/config.js";
4
3
  import AllocationSelector from "./AllocationSelector.js";
5
4
  import ModelSelector from "./ModelSelector.js";
@@ -55,7 +54,7 @@ function ManageProvidersLink() {
55
54
  },
56
55
  className: "flex min-w-0 items-center gap-2 rounded-md px-2 py-1.5 text-xs theme-muted-text transition-colors hover:chat-tint hover:theme-text",
57
56
  title: strings.sidebar.manageProviders,
58
- children: [/* @__PURE__ */ jsx(IoSettingsOutline, { className: "h-3.5 w-3.5 shrink-0" }), /* @__PURE__ */ jsx("span", {
57
+ children: [/* @__PURE__ */ jsx(SettingsIcon, { className: "h-3.5 w-3.5 shrink-0" }), /* @__PURE__ */ jsx("span", {
59
58
  className: "truncate",
60
59
  children: strings.sidebar.manageProviders
61
60
  })]
@@ -70,7 +69,7 @@ function ConnectToolsLink() {
70
69
  href: extraLinks.connectTools
71
70
  },
72
71
  className: "flex items-center gap-1 rounded-md px-1.5 py-0.5 text-[11px] theme-muted-text transition-colors hover:theme-muted-panel hover:theme-text",
73
- children: [/* @__PURE__ */ jsx(PiPlugsConnectedFill, { className: "h-3 w-3" }), strings.sidebar.connectTools]
72
+ children: [/* @__PURE__ */ jsx(ConnectIcon, { className: "h-3 w-3" }), strings.sidebar.connectTools]
74
73
  });
75
74
  }
76
75
  //#endregion
@@ -1,17 +1,19 @@
1
- import { clsx } from "clsx";
1
+ import { cx } from "../../cx.js";
2
+ import { useChatConfig } from "../core/config.js";
2
3
  import { jsx, jsxs } from "react/jsx-runtime";
3
4
  //#region src/ai/components/DragOverlay.tsx
4
5
  function DragOverlay({ className }) {
6
+ const t = useChatConfig().strings.attachmentUpload;
5
7
  return /* @__PURE__ */ jsx("div", {
6
- className: clsx("absolute inset-0 z-50 flex items-center justify-center bg-blue-500/10 border-2 border-dashed border-blue-500 backdrop-blur-sm pointer-events-none", className),
8
+ className: cx("absolute inset-0 z-50 flex items-center justify-center bg-blue-500/10 border-2 border-dashed border-blue-500 backdrop-blur-sm pointer-events-none", className),
7
9
  children: /* @__PURE__ */ jsxs("div", {
8
10
  className: "text-center",
9
11
  children: [/* @__PURE__ */ jsx("p", {
10
12
  className: "text-lg font-medium text-blue-600",
11
- children: "Drop files here"
13
+ children: t.dropFilesHere
12
14
  }), /* @__PURE__ */ jsx("p", {
13
15
  className: "text-sm text-blue-500/80",
14
- children: "Release to upload"
16
+ children: t.releaseToUpload
15
17
  })]
16
18
  })
17
19
  });
@@ -1,13 +1,11 @@
1
- import { FaChevronDown } from "../../icons/fa/FaChevronDown.js";
2
- import { FaCloud } from "../../icons/fa/FaCloud.js";
3
- import { FaExclamationTriangle } from "../../icons/fa/FaExclamationTriangle.js";
4
- import { FaUndoAlt } from "../../icons/fa/FaUndoAlt.js";
1
+ import { cx } from "../../cx.js";
2
+ import { ChevronDownIcon, CloudIcon, RetryIcon, WarningIcon } from "../../icons.js";
3
+ import { useStrings } from "../../components/Provider.js";
5
4
  import { Combobox } from "../../components/Combobox.js";
6
5
  import { useChatConfig } from "../core/config.js";
7
6
  import { issueDetail, issueLabel, providerIssueFor } from "../core/providerIssues.js";
8
7
  import { useChat } from "../core/ChatProvider.js";
9
8
  import { chipClassName } from "../ui/chip.js";
10
- import { clsx } from "clsx";
11
9
  import { Fragment, jsx, jsxs } from "react/jsx-runtime";
12
10
  import { useMemo } from "react";
13
11
  //#region src/ai/components/ModelSelector.tsx
@@ -23,7 +21,7 @@ function CspIcon({ cspKind, className }) {
23
21
  const { slots } = useChatConfig();
24
22
  const custom = slots.providerIcon?.(cspKind, className);
25
23
  if (custom) return /* @__PURE__ */ jsx(Fragment, { children: custom });
26
- return /* @__PURE__ */ jsx(FaCloud, { className: clsx("text-purple-500", className) });
24
+ return /* @__PURE__ */ jsx(CloudIcon, { className: cx("text-purple-500", className) });
27
25
  }
28
26
  function getProviderKeyFromModelId(modelId) {
29
27
  const idx = modelId.indexOf("/");
@@ -55,13 +53,14 @@ function groupModelsByProvider(models) {
55
53
  function ModelSelector({ targetSession }) {
56
54
  const { providers, models, unreachableSessions, providerIssues, selectedProvider, setSelectedProvider, isLoadingModels, hasLoadedModels, modelsError, refreshModels, currentUser } = useChat();
57
55
  const { strings } = useChatConfig();
56
+ const { common } = useStrings();
58
57
  const t = strings.modelPicker;
59
58
  const targetSessionFound = !!targetSession && models.some((m) => m.id.startsWith(`session:${targetSession}/`));
60
59
  const targetSessionStatus = !targetSession ? null : isLoadingModels ? "connecting" : hasLoadedModels && !targetSessionFound ? "offline" : null;
61
60
  const groups = useMemo(() => {
62
61
  const status = (label, description) => ({
63
62
  label,
64
- icon: /* @__PURE__ */ jsx(FaCloud, { className: "h-3 w-3 text-amber-500" }),
63
+ icon: /* @__PURE__ */ jsx(CloudIcon, { className: "h-3 w-3 text-amber-500" }),
65
64
  description,
66
65
  items: []
67
66
  });
@@ -106,20 +105,20 @@ function ModelSelector({ targetSession }) {
106
105
  t
107
106
  ]);
108
107
  if (isLoadingModels && models.length === 0 && !targetSession) return /* @__PURE__ */ jsx("span", {
109
- className: clsx(chipClassName, "cursor-default animate-pulse"),
108
+ className: cx(chipClassName, "cursor-default animate-pulse"),
110
109
  children: t.loading
111
110
  });
112
111
  if (modelsError && models.length === 0) return /* @__PURE__ */ jsxs("span", {
113
- className: clsx(chipClassName, "cursor-default text-(--theme-error)"),
112
+ className: cx(chipClassName, "cursor-default text-(--theme-error)"),
114
113
  children: [t.failed, /* @__PURE__ */ jsxs("button", {
115
114
  type: "button",
116
115
  onClick: () => refreshModels(),
117
- className: "flex items-center gap-1 text-xs text-(--theme-element) hover:underline",
118
- children: [/* @__PURE__ */ jsx(FaUndoAlt, { className: "h-2.5 w-2.5" }), t.retry]
116
+ className: "flex items-center gap-1 text-xs text-(--theme-accent) hover:underline",
117
+ children: [/* @__PURE__ */ jsx(RetryIcon, { className: "h-2.5 w-2.5" }), common.retry]
119
118
  })]
120
119
  });
121
120
  if (groups.length === 0 && hasLoadedModels) return /* @__PURE__ */ jsx("span", {
122
- className: clsx(chipClassName, "cursor-default"),
121
+ className: cx(chipClassName, "cursor-default"),
123
122
  children: t.none
124
123
  });
125
124
  const selected = models.find((m) => m.id === selectedProvider);
@@ -144,11 +143,11 @@ function ModelSelector({ targetSession }) {
144
143
  className: "max-w-[45%] shrink-0 truncate text-xs",
145
144
  children: selected.provider
146
145
  }),
147
- issue && /* @__PURE__ */ jsx(FaExclamationTriangle, { className: "h-3.5 w-3.5 shrink-0 text-amber-500" })
146
+ issue && /* @__PURE__ */ jsx(WarningIcon, { className: "h-3.5 w-3.5 shrink-0 text-amber-500" })
148
147
  ] }) : /* @__PURE__ */ jsx("span", {
149
- className: clsx("truncate", targetSessionStatus === "connecting" && "animate-pulse"),
148
+ className: cx("truncate", targetSessionStatus === "connecting" && "animate-pulse"),
150
149
  children: targetSessionStatus === "connecting" ? t.connecting : t.select
151
- }), /* @__PURE__ */ jsx(FaChevronDown, { className: "h-3 w-3 shrink-0" })]
150
+ }), /* @__PURE__ */ jsx(ChevronDownIcon, { className: "h-3 w-3 shrink-0" })]
152
151
  })
153
152
  });
154
153
  }
@@ -1,42 +1,46 @@
1
- import { FiFile } from "../../icons/fi/FiFile.js";
2
- import { FiX } from "../../icons/fi/FiX.js";
3
- import { ImSpinner5 } from "../../icons/im/ImSpinner5.js";
1
+ import { cx } from "../../cx.js";
2
+ import { FileIcon, RemoveIcon } from "../../icons.js";
3
+ import { Loader } from "../../components/Loader.js";
4
+ import { formatBytes } from "../../format.js";
4
5
  import { useChatConfig } from "../core/config.js";
5
- import { formatFileSize } from "../utils.js";
6
6
  import Markdown from "../ui/Markdown.js";
7
7
  import { fencePaste } from "../core/pasteLanguage.js";
8
8
  import { splitPastes } from "../core/pastes.js";
9
- import { clsx } from "clsx";
10
9
  import { Fragment, jsx, jsxs } from "react/jsx-runtime";
11
10
  import { Fragment as Fragment$1 } from "react";
12
11
  //#region src/ai/components/PastedText.tsx
13
12
  /** A paste sent, or about to be sent, as its saved file. */
14
13
  function PasteFileCard({ id, lines, bytes, saving = false, error, onRemove }) {
15
14
  const t = useChatConfig().strings.paste;
16
- const detail = error ?? (saving ? t.saving : `${t.lines(lines)} · ${formatFileSize(bytes)}`);
15
+ const detail = error ?? (saving ? t.saving : `${t.lines(lines)} · ${formatBytes(bytes)}`);
17
16
  return /* @__PURE__ */ jsxs("div", {
18
17
  "data-testid": "paste-file-card",
19
- className: clsx("inline-flex max-w-full items-center gap-2.5 rounded-xl px-3 py-2 align-top whitespace-normal", "bg-(--theme-panel-bg)", error ? "border border-red-500" : "chat-hairline"),
18
+ className: cx("inline-flex max-w-full items-center gap-2.5 rounded-xl px-3 py-2 align-top whitespace-normal", "bg-(--theme-panel-bg)", error ? "border border-red-500" : "chat-hairline"),
20
19
  children: [
21
- /* @__PURE__ */ jsx(FiFile, { className: "h-5 w-5 flex-shrink-0 theme-muted-text" }),
20
+ /* @__PURE__ */ jsx(FileIcon, { className: "h-5 w-5 flex-shrink-0 theme-muted-text" }),
22
21
  /* @__PURE__ */ jsxs("div", {
23
22
  className: "min-w-0 text-left leading-tight",
24
23
  children: [/* @__PURE__ */ jsx("div", {
25
24
  className: "truncate text-sm font-medium theme-text",
26
25
  children: id ? `paste-${id}.txt` : t.title
27
26
  }), /* @__PURE__ */ jsx("div", {
28
- className: clsx("truncate text-xs", error ? "text-red-500" : "theme-muted-text"),
27
+ className: cx("truncate text-xs", error ? "text-red-500" : "theme-muted-text"),
29
28
  children: detail
30
29
  })]
31
30
  }),
32
- saving && /* @__PURE__ */ jsx(ImSpinner5, { className: "h-3.5 w-3.5 flex-shrink-0 animate-spin theme-muted-text" }),
31
+ saving && /* @__PURE__ */ jsx(Loader, {
32
+ inline: true,
33
+ decorative: true,
34
+ size: 14,
35
+ color: "var(--theme-muted-text-color)"
36
+ }),
33
37
  onRemove && /* @__PURE__ */ jsx("button", {
34
38
  type: "button",
35
39
  onClick: onRemove,
36
40
  "aria-label": t.remove,
37
41
  title: t.remove,
38
42
  className: "flex-shrink-0 rounded p-0.5 theme-muted-text hover:theme-text",
39
- children: /* @__PURE__ */ jsx(FiX, { className: "h-3.5 w-3.5" })
43
+ children: /* @__PURE__ */ jsx(RemoveIcon, { className: "h-3.5 w-3.5" })
40
44
  })
41
45
  ]
42
46
  });
@@ -48,7 +52,7 @@ function UserMessageText({ content, pastes }) {
48
52
  if (!pastes?.length) return /* @__PURE__ */ jsx(Fragment, { children: content });
49
53
  const segments = splitPastes(content, pastes);
50
54
  const shows = (seg) => typeof seg !== "string" || seg.trim() !== "";
51
- const blockSpacing = (i) => clsx(segments.slice(0, i).some(shows) ? "mt-2.5" : "mt-0", segments.slice(i + 1).some(shows) ? "mb-2.5" : "mb-0");
55
+ const blockSpacing = (i) => cx(segments.slice(0, i).some(shows) ? "mt-2.5" : "mt-0", segments.slice(i + 1).some(shows) ? "mb-2.5" : "mb-0");
52
56
  return /* @__PURE__ */ jsx(Fragment, { children: segments.map((segment, i) => {
53
57
  if (typeof segment === "string") {
54
58
  let text = segment;
@@ -57,11 +61,11 @@ function UserMessageText({ content, pastes }) {
57
61
  return text ? /* @__PURE__ */ jsx(Fragment$1, { children: text }, i) : null;
58
62
  }
59
63
  if (segment.inline && segment.text !== void 0) return /* @__PURE__ */ jsx("span", {
60
- className: clsx("chat-paste-code block", blockSpacing(i)),
64
+ className: cx("chat-paste-code block", blockSpacing(i)),
61
65
  children: /* @__PURE__ */ jsx(Markdown, { children: fencePaste(segment.text) })
62
66
  }, i);
63
67
  return /* @__PURE__ */ jsx("span", {
64
- className: clsx("flex [&>*]:flex-1", blockSpacing(i)),
68
+ className: cx("flex [&>*]:flex-1", blockSpacing(i)),
65
69
  children: /* @__PURE__ */ jsx(PasteFileCard, {
66
70
  id: segment.id,
67
71
  lines: segment.lines,
@@ -1,5 +1,4 @@
1
- import { FaExclamationTriangle } from "../../icons/fa/FaExclamationTriangle.js";
2
- import { IoSettingsOutline } from "../../icons/io5/IoSettingsOutline.js";
1
+ import { SettingsIcon, WarningIcon } from "../../icons.js";
3
2
  import { useChatConfig } from "../core/config.js";
4
3
  import { issueDetail, providerIssueFor } from "../core/providerIssues.js";
5
4
  import { useChat } from "../core/ChatProvider.js";
@@ -22,7 +21,7 @@ function ProviderIssueBanner() {
22
21
  return /* @__PURE__ */ jsxs("div", {
23
22
  className: "mx-4 mt-2 flex items-start gap-3 p-3 rounded-lg bg-amber-500/10 border border-amber-500/20",
24
23
  children: [
25
- /* @__PURE__ */ jsx(FaExclamationTriangle, { className: "w-4 h-4 text-amber-500 shrink-0 mt-0.5" }),
24
+ /* @__PURE__ */ jsx(WarningIcon, { className: "w-4 h-4 text-amber-500 shrink-0 mt-0.5" }),
26
25
  /* @__PURE__ */ jsxs("div", {
27
26
  className: "flex-1 min-w-0",
28
27
  children: [/* @__PURE__ */ jsx("p", {
@@ -39,7 +38,7 @@ function ProviderIssueBanner() {
39
38
  href: settingsHref
40
39
  },
41
40
  className: "flex shrink-0 items-center gap-1 rounded-md px-2 py-1 text-xs font-medium text-amber-700 transition-colors hover:bg-amber-500/10",
42
- children: [/* @__PURE__ */ jsx(IoSettingsOutline, { className: "h-3.5 w-3.5" }), strings.modelPicker.manageProvider]
41
+ children: [/* @__PURE__ */ jsx(SettingsIcon, { className: "h-3.5 w-3.5" }), strings.modelPicker.manageProvider]
43
42
  })
44
43
  ]
45
44
  });
@@ -1,12 +1,18 @@
1
1
  import type { ReactNode } from 'react';
2
- /** The line a turn's reasoning folds under. It opens the reasoning in place,
3
- * above the answer it led to, rather than in a panel the eye has to cross
4
- * the page to read. */
5
- export declare function ReasoningToggle({ open, onToggle, shimmer, children, }: {
6
- open: boolean;
7
- onToggle: () => void;
2
+ /** A turn's reasoning, folded under a line such as "Thought for 5s". It opens
3
+ * in place, above the answer it led to, rather than in a panel the eye has to
4
+ * cross the page to read; with `onOpenPanel` the host shows it elsewhere
5
+ * instead. */
6
+ export declare function Reasoning({ label, shimmer, open, onOpenChange, onOpenPanel, preview, children, }: {
7
+ label: ReactNode;
8
8
  /** While the model is still thinking the label shimmers. */
9
9
  shimmer?: boolean;
10
+ open: boolean;
11
+ onOpenChange: (open: boolean) => void;
12
+ /** Shows the reasoning in the host's own panel in place of opening it here. */
13
+ onOpenPanel?: (() => void) | undefined;
14
+ /** Shown under the folded line, such as the latest lines while it streams. */
15
+ preview?: ReactNode;
10
16
  children: ReactNode;
11
17
  }): import("react").JSX.Element;
12
18
  /** The reasoning itself: smaller and quieter than the answer, hung off a