@parallelworks/ui 0.43.0 → 0.45.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 (622) 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/toolStrings.d.ts +37 -0
  8. package/dist/ai/agent/toolStrings.js +35 -0
  9. package/dist/ai/agent/toolfmt.d.ts +8 -3
  10. package/dist/ai/agent/toolfmt.js +50 -65
  11. package/dist/ai/ai.css +18 -31
  12. package/dist/ai/components/AllocationSelector.js +2 -2
  13. package/dist/ai/components/AttachmentManager.js +28 -29
  14. package/dist/ai/components/AttachmentUpload.js +25 -30
  15. package/dist/ai/components/BlockedGroupBanner.js +2 -2
  16. package/dist/ai/components/BranchNavigator.js +3 -4
  17. package/dist/ai/components/ChatEmptyState.js +8 -7
  18. package/dist/ai/components/ChatInput.js +10 -12
  19. package/dist/ai/components/ChatLayout.js +3 -3
  20. package/dist/ai/components/ChatMessage.js +49 -61
  21. package/dist/ai/components/ChatMessageList.js +46 -42
  22. package/dist/ai/components/ChatSidebar.js +26 -34
  23. package/dist/ai/components/ChatStage.js +1 -1
  24. package/dist/ai/components/ComposerChrome.js +3 -4
  25. package/dist/ai/components/DragOverlay.js +6 -4
  26. package/dist/ai/components/ModelSelector.js +14 -15
  27. package/dist/ai/components/PastedText.js +18 -14
  28. package/dist/ai/components/ProviderIssueBanner.js +3 -4
  29. package/dist/ai/components/Reasoning.d.ts +12 -6
  30. package/dist/ai/components/Reasoning.js +31 -18
  31. package/dist/ai/components/ShareDialog.js +25 -28
  32. package/dist/ai/components/SlashMenu.js +3 -3
  33. package/dist/ai/components/agent/ActivityLine.d.ts +0 -5
  34. package/dist/ai/components/agent/ActivityLine.js +17 -54
  35. package/dist/ai/components/agent/AgentMessageParts.js +139 -149
  36. package/dist/ai/components/conversationActions.js +16 -16
  37. package/dist/ai/core/ChatProvider.d.ts +2 -4
  38. package/dist/ai/core/ChatProvider.js +25 -38
  39. package/dist/ai/core/exportConversation.js +4 -4
  40. package/dist/ai/core/sidebarState.d.ts +8 -6
  41. package/dist/ai/core/sidebarState.js +21 -28
  42. package/dist/ai/core/useKeyboardShortcuts.js +14 -5
  43. package/dist/ai/index.d.ts +4 -5
  44. package/dist/ai/index.js +7 -7
  45. package/dist/ai/strings.d.ts +14 -31
  46. package/dist/ai/strings.js +19 -39
  47. package/dist/ai/types.d.ts +0 -5
  48. package/dist/ai/ui/ConversationSidebar.d.ts +12 -9
  49. package/dist/ai/ui/ConversationSidebar.js +43 -87
  50. package/dist/ai/ui/Markdown.d.ts +3 -6
  51. package/dist/ai/ui/Markdown.js +6 -73
  52. package/dist/ai/ui/Notice.js +10 -12
  53. package/dist/ai/ui/chip.d.ts +2 -2
  54. package/dist/ai/ui/chip.js +1 -1
  55. package/dist/ai/ui/sidebar.d.ts +4 -20
  56. package/dist/ai/ui/sidebar.js +30 -67
  57. package/dist/ai/utils.d.ts +0 -1
  58. package/dist/ai/utils.js +1 -14
  59. package/dist/brandIcons.d.ts +51 -0
  60. package/dist/brandIcons.js +75 -0
  61. package/dist/components/Avatar.d.ts +3 -1
  62. package/dist/components/Avatar.js +34 -28
  63. package/dist/components/Button.d.ts +12 -7
  64. package/dist/components/Button.js +39 -44
  65. package/dist/components/Callout.js +18 -12
  66. package/dist/components/Card.d.ts +18 -8
  67. package/dist/components/Card.js +17 -6
  68. package/dist/components/Checkbox.d.ts +9 -0
  69. package/dist/components/Checkbox.js +30 -0
  70. package/dist/components/Combobox.d.ts +9 -1
  71. package/dist/components/Combobox.js +71 -44
  72. package/dist/components/ConfirmModal.js +11 -11
  73. package/dist/components/ContextMenu.d.ts +2 -8
  74. package/dist/components/ContextMenu.js +2 -29
  75. package/dist/components/CopyToClipboard.js +17 -36
  76. package/dist/components/CreateModal.d.ts +3 -24
  77. package/dist/components/CreateModal.js +46 -113
  78. package/dist/components/DatePicker.d.ts +31 -0
  79. package/dist/components/DatePicker.js +191 -0
  80. package/dist/components/DescriptionList.js +4 -4
  81. package/dist/components/Disclosure.d.ts +34 -0
  82. package/dist/components/Disclosure.js +46 -0
  83. package/dist/components/Drawer.d.ts +47 -0
  84. package/dist/components/Drawer.js +120 -0
  85. package/dist/components/EmptyState.d.ts +15 -10
  86. package/dist/components/EmptyState.js +13 -8
  87. package/dist/components/ExternalLink.d.ts +8 -0
  88. package/dist/components/ExternalLink.js +29 -0
  89. package/dist/components/Field.d.ts +70 -0
  90. package/dist/components/Field.js +159 -0
  91. package/dist/components/HoverCard.js +11 -14
  92. package/dist/components/IconButton.d.ts +16 -13
  93. package/dist/components/IconButton.js +27 -18
  94. package/dist/components/InfoTip.js +16 -23
  95. package/dist/components/Input.d.ts +10 -9
  96. package/dist/components/Input.js +54 -96
  97. package/dist/components/LetterBadge.js +2 -2
  98. package/dist/components/Loader.d.ts +15 -8
  99. package/dist/components/Loader.js +29 -19
  100. package/dist/components/Markdown.d.ts +7 -1
  101. package/dist/components/Markdown.js +2 -0
  102. package/dist/components/MarkdownImpl.d.ts +1 -1
  103. package/dist/components/MarkdownImpl.js +55 -14
  104. package/dist/components/Menu.js +13 -15
  105. package/dist/components/MenuEntries.js +11 -16
  106. package/dist/components/Meter.d.ts +48 -0
  107. package/dist/components/Meter.js +94 -0
  108. package/dist/components/Modal.js +11 -14
  109. package/dist/components/NumberInput.d.ts +25 -0
  110. package/dist/components/NumberInput.js +55 -0
  111. package/dist/components/Overview.js +12 -10
  112. package/dist/components/PageHeader.d.ts +2 -3
  113. package/dist/components/PageHeader.js +30 -21
  114. package/dist/components/Pagination.d.ts +27 -14
  115. package/dist/components/Pagination.js +86 -25
  116. package/dist/components/Popover.d.ts +47 -0
  117. package/dist/components/Popover.js +63 -0
  118. package/dist/components/Provider.d.ts +197 -80
  119. package/dist/components/Provider.js +200 -118
  120. package/dist/components/Radio.d.ts +1 -1
  121. package/dist/components/Radio.js +4 -4
  122. package/dist/components/RefreshButton.d.ts +15 -0
  123. package/dist/components/RefreshButton.js +53 -0
  124. package/dist/components/RunStatusIcon.d.ts +12 -0
  125. package/dist/components/RunStatusIcon.js +84 -0
  126. package/dist/components/SearchInput.d.ts +16 -0
  127. package/dist/components/SearchInput.js +52 -0
  128. package/dist/components/Section.d.ts +28 -0
  129. package/dist/components/Section.js +76 -0
  130. package/dist/components/SegmentedControl.d.ts +7 -11
  131. package/dist/components/SegmentedControl.js +25 -56
  132. package/dist/components/Select.d.ts +8 -1
  133. package/dist/components/Select.js +47 -43
  134. package/dist/components/SettingModeOption.d.ts +3 -5
  135. package/dist/components/SettingModeOption.js +5 -6
  136. package/dist/components/SettingsCard.d.ts +32 -19
  137. package/dist/components/SettingsCard.js +40 -13
  138. package/dist/components/Skeleton.d.ts +22 -0
  139. package/dist/components/Skeleton.js +34 -0
  140. package/dist/components/Slider.d.ts +16 -0
  141. package/dist/components/Slider.js +30 -0
  142. package/dist/components/Sort.js +4 -6
  143. package/dist/components/StatusBadge.d.ts +3 -1
  144. package/dist/components/StatusBadge.js +9 -32
  145. package/dist/components/StatusIcons.d.ts +0 -4
  146. package/dist/components/StatusIcons.js +5 -13
  147. package/dist/components/Switch.d.ts +5 -1
  148. package/dist/components/Switch.js +23 -6
  149. package/dist/components/Table.js +13 -20
  150. package/dist/components/Tabs.d.ts +52 -0
  151. package/dist/components/Tabs.js +75 -0
  152. package/dist/components/ThemeEditor.d.ts +29 -0
  153. package/dist/components/ThemeEditor.js +397 -0
  154. package/dist/components/Toast.d.ts +57 -0
  155. package/dist/components/Toast.js +203 -0
  156. package/dist/components/Tooltip.js +12 -15
  157. package/dist/components/buttonClasses.d.ts +18 -0
  158. package/dist/components/buttonClasses.js +31 -0
  159. package/dist/components/codeTheme.d.ts +5 -0
  160. package/dist/components/codeTheme.js +93 -0
  161. package/dist/components/fieldBox.d.ts +14 -0
  162. package/dist/components/fieldBox.js +29 -0
  163. package/dist/components/floating.d.ts +26 -5
  164. package/dist/components/floating.js +31 -9
  165. package/dist/{ai/ui/codeBreaks.js → components/markdownCodeBreaks.js} +1 -1
  166. package/dist/components/persistedState.d.ts +2 -0
  167. package/dist/components/persistedState.js +63 -0
  168. package/dist/components/relativeTime.d.ts +36 -8
  169. package/dist/components/relativeTime.js +106 -23
  170. package/dist/components/segmented.d.ts +17 -0
  171. package/dist/components/segmented.js +27 -0
  172. package/dist/components/shortcutKey.d.ts +4 -0
  173. package/dist/components/shortcutKey.js +27 -0
  174. package/dist/components/splitter.d.ts +26 -0
  175. package/dist/components/splitter.js +69 -0
  176. package/dist/components/tone.d.ts +9 -0
  177. package/dist/components/tone.js +30 -0
  178. package/dist/components/useCopy.d.ts +14 -0
  179. package/dist/components/useCopy.js +31 -0
  180. package/dist/components/useCssIsDark.d.ts +2 -0
  181. package/dist/components/useCssIsDark.js +2 -1
  182. package/dist/components/useTheme.d.ts +10 -0
  183. package/dist/components/useTheme.js +40 -0
  184. package/dist/cx.d.ts +5 -0
  185. package/dist/cx.js +11 -0
  186. package/dist/editor/Editor.js +2 -2
  187. package/dist/editor/EditorField.js +7 -10
  188. package/dist/editor/FormCodePanel.js +10 -23
  189. package/dist/editor/Monaco.js +7 -4
  190. package/dist/editor/index.d.ts +1 -1
  191. package/dist/editor/index.js +2 -2
  192. package/dist/editor/themes.d.ts +4 -0
  193. package/dist/editor/themes.js +75 -76
  194. package/dist/file-explorer/FileExplorer.js +180 -187
  195. package/dist/file-explorer/FileExplorerContext.js +36 -58
  196. package/dist/file-explorer/FilePreview/CodePreviewEditor.js +2 -1
  197. package/dist/file-explorer/FilePreview/Inline.js +9 -7
  198. package/dist/file-explorer/FilePreview/StreamedBadge.js +2 -2
  199. package/dist/file-explorer/FilePreview/Viewer.js +32 -34
  200. package/dist/file-explorer/FilePreview/index.js +60 -92
  201. package/dist/file-explorer/FileRow.js +10 -15
  202. package/dist/file-explorer/FileRowsWindow.js +2 -6
  203. package/dist/file-explorer/FileTable.js +2 -2
  204. package/dist/file-explorer/FileTableHeaders.js +8 -11
  205. package/dist/file-explorer/LoadMoreRow.js +8 -9
  206. package/dist/file-explorer/TreeView.js +16 -16
  207. package/dist/file-explorer/helpers.d.ts +1 -4
  208. package/dist/file-explorer/helpers.js +101 -114
  209. package/dist/file-explorer/lib/utils.d.ts +0 -2
  210. package/dist/file-explorer/lib/utils.js +1 -25
  211. package/dist/file-explorer/toasts.js +104 -185
  212. package/dist/form/Fields/BooleanField.js +12 -14
  213. package/dist/form/Fields/CheckboxGroupField.d.ts +1 -1
  214. package/dist/form/Fields/CheckboxGroupField.js +16 -18
  215. package/dist/form/Fields/ColorField.js +11 -11
  216. package/dist/form/Fields/DropdownField.d.ts +1 -1
  217. package/dist/form/Fields/DropdownField.js +20 -36
  218. package/dist/form/Fields/DurationField.d.ts +1 -1
  219. package/dist/form/Fields/DurationField.js +36 -50
  220. package/dist/form/Fields/LabelField.js +2 -2
  221. package/dist/form/Fields/MultiDropdownField.d.ts +1 -1
  222. package/dist/form/Fields/MultiDropdownField.js +9 -14
  223. package/dist/form/Fields/NumberField.d.ts +1 -1
  224. package/dist/form/Fields/NumberField.js +13 -48
  225. package/dist/form/Fields/ObjectField.js +3 -3
  226. package/dist/form/Fields/RadioField.d.ts +1 -1
  227. package/dist/form/Fields/RadioField.js +15 -18
  228. package/dist/form/Fields/RangeField.js +34 -35
  229. package/dist/form/Fields/StringField.d.ts +1 -1
  230. package/dist/form/Fields/StringField.js +15 -25
  231. package/dist/form/Fields/TextAreaField.js +10 -15
  232. package/dist/form/Form.d.ts +7 -2
  233. package/dist/form/Form.js +144 -49
  234. package/dist/form/FormLayout.js +18 -12
  235. package/dist/form/Wizard/WizardContainer.js +44 -18
  236. package/dist/form/Wizard/WizardNavigation.d.ts +1 -1
  237. package/dist/form/Wizard/WizardNavigation.js +31 -56
  238. package/dist/form/Wizard/WizardStepIndicator.d.ts +3 -0
  239. package/dist/form/Wizard/WizardStepIndicator.js +98 -114
  240. package/dist/form/Wizard/types.d.ts +2 -2
  241. package/dist/form/fieldFrame.d.ts +7 -0
  242. package/dist/form/fieldFrame.js +19 -0
  243. package/dist/form/index.d.ts +5 -5
  244. package/dist/form/index.js +4 -6
  245. package/dist/form/layoutCSS.js +5 -4
  246. package/dist/form/types/fieldComponentTypes.d.ts +5 -3
  247. package/dist/form/useChoiceField.js +2 -3
  248. package/dist/form/useFieldValue.d.ts +3 -0
  249. package/dist/form/useFieldValue.js +24 -7
  250. package/dist/form/utils/duration.d.ts +2 -2
  251. package/dist/form/utils/duration.js +3 -3
  252. package/dist/form/utils/fieldPath.d.ts +5 -3
  253. package/dist/form/utils/fieldPath.js +18 -3
  254. package/dist/form/utils/secondaryField.d.ts +0 -7
  255. package/dist/form/utils/secondaryField.js +1 -12
  256. package/dist/form/validation.d.ts +29 -0
  257. package/dist/form/validation.js +14 -0
  258. package/dist/format.d.ts +28 -0
  259. package/dist/format.js +64 -0
  260. package/dist/graph/AnnotationBanner.js +20 -31
  261. package/dist/graph/Connectors.js +1 -1
  262. package/dist/graph/DependencyGraph.js +51 -65
  263. package/dist/graph/GraphEditor.js +24 -28
  264. package/dist/graph/GraphEditorDialogs.js +239 -245
  265. package/dist/graph/InputDialog.js +93 -112
  266. package/dist/graph/InputsEditor.js +83 -84
  267. package/dist/graph/JobSummary.js +10 -11
  268. package/dist/graph/MatrixGroup.js +3 -3
  269. package/dist/graph/ProblemsButton.js +9 -10
  270. package/dist/graph/ShortcutsButton.js +12 -17
  271. package/dist/graph/SuggestionInput.d.ts +1 -2
  272. package/dist/graph/SuggestionInput.js +1 -3
  273. package/dist/graph/TreeView.js +47 -45
  274. package/dist/graph/WorkflowSettingsDialog.js +97 -102
  275. package/dist/graph/editorChrome.js +10 -12
  276. package/dist/graph/editorFields.d.ts +19 -16
  277. package/dist/graph/editorFields.js +97 -135
  278. package/dist/graph/editorPrimitives.js +2 -2
  279. package/dist/graph/editorRows.js +22 -25
  280. package/dist/graph/editorStrings.d.ts +16 -19
  281. package/dist/graph/editorStrings.js +11 -23
  282. package/dist/graph/fieldProblems.js +2 -2
  283. package/dist/graph/graphEditorState.d.ts +4 -4
  284. package/dist/graph/inputRefs.d.ts +0 -13
  285. package/dist/graph/inputRefs.js +121 -159
  286. package/dist/graph/settingsViews.js +5 -3
  287. package/dist/graph/stepWith.js +100 -100
  288. package/dist/graph/toolbarPanel.d.ts +8 -0
  289. package/dist/graph/toolbarPanel.js +11 -0
  290. package/dist/icons.d.ts +234 -23
  291. package/dist/icons.js +249 -264
  292. package/dist/index.d.ts +38 -21
  293. package/dist/index.js +42 -21
  294. package/dist/list/ActionToolbar.d.ts +1 -5
  295. package/dist/list/ActionToolbar.js +21 -20
  296. package/dist/list/ListPage.js +7 -7
  297. package/dist/list/ListTable.d.ts +3 -2
  298. package/dist/list/ListTable.js +33 -29
  299. package/dist/list/ListViewControls.d.ts +0 -17
  300. package/dist/list/ListViewControls.js +50 -118
  301. package/dist/list/UserHoverCard.js +24 -32
  302. package/dist/list/index.d.ts +2 -4
  303. package/dist/list/index.js +3 -5
  304. package/dist/list/listSearch.d.ts +1 -1
  305. package/dist/list/listSearch.js +19 -14
  306. package/dist/list/rowMenu.js +20 -26
  307. package/dist/logviewer/LogViewer.js +268 -382
  308. package/dist/logviewer/logviewer.css +53 -41
  309. package/dist/styles/base.css +16 -40
  310. package/dist/styles/theme.css +75 -106
  311. package/dist/styles.css +1 -1
  312. package/dist/theme/color.d.ts +40 -0
  313. package/dist/theme/color.js +228 -0
  314. package/dist/theme/contrast.d.ts +42 -0
  315. package/dist/theme/contrast.js +145 -0
  316. package/dist/theme/derive.d.ts +25 -0
  317. package/dist/theme/derive.js +475 -0
  318. package/dist/theme/fit.d.ts +35 -0
  319. package/dist/theme/fit.js +185 -0
  320. package/dist/theme/index.d.ts +14 -29
  321. package/dist/theme/index.js +20 -279
  322. package/dist/theme/model.d.ts +64 -0
  323. package/dist/theme/model.js +219 -0
  324. package/package.json +9 -5
  325. package/dist/ai/ui/Avatar.d.ts +0 -7
  326. package/dist/ai/ui/Avatar.js +0 -24
  327. package/dist/components/Filter.d.ts +0 -15
  328. package/dist/components/Filter.js +0 -32
  329. package/dist/components/FilterPill.d.ts +0 -7
  330. package/dist/components/FilterPill.js +0 -14
  331. package/dist/components/Indicator.d.ts +0 -4
  332. package/dist/components/Indicator.js +0 -44
  333. package/dist/components/SectionHeader.d.ts +0 -8
  334. package/dist/components/SectionHeader.js +0 -11
  335. package/dist/components/SettingRow.d.ts +0 -18
  336. package/dist/components/SettingRow.js +0 -35
  337. package/dist/components/SettingsGroup.d.ts +0 -8
  338. package/dist/components/SettingsGroup.js +0 -17
  339. package/dist/components/ghostButton.d.ts +0 -4
  340. package/dist/components/ghostButton.js +0 -7
  341. package/dist/components/inputClasses.d.ts +0 -1
  342. package/dist/components/inputClasses.js +0 -4
  343. package/dist/duration.d.ts +0 -3
  344. package/dist/duration.js +0 -17
  345. package/dist/form/FieldGroup.d.ts +0 -11
  346. package/dist/form/FieldGroup.js +0 -36
  347. package/dist/form/FieldWrapper.d.ts +0 -16
  348. package/dist/form/FieldWrapper.js +0 -55
  349. package/dist/form/fieldContext.d.ts +0 -19
  350. package/dist/form/fieldContext.js +0 -26
  351. package/dist/graph/Collapse.d.ts +0 -7
  352. package/dist/graph/Collapse.js +0 -15
  353. package/dist/graph/ToolbarPopover.d.ts +0 -13
  354. package/dist/graph/ToolbarPopover.js +0 -39
  355. package/dist/icons/ai/AiOutlineRollback.js +0 -16
  356. package/dist/icons/bi/BiBell.js +0 -16
  357. package/dist/icons/bi/BiBellOff.js +0 -16
  358. package/dist/icons/bi/BiBuildings.js +0 -20
  359. package/dist/icons/bi/BiError.js +0 -20
  360. package/dist/icons/bi/BiExpandVertical.js +0 -16
  361. package/dist/icons/bi/BiPause.js +0 -16
  362. package/dist/icons/bi/BiPlay.js +0 -16
  363. package/dist/icons/bi/BiRedo.js +0 -16
  364. package/dist/icons/bi/BiSolidCheckShield.js +0 -16
  365. package/dist/icons/bi/BiSolidTrashAlt.js +0 -16
  366. package/dist/icons/bi/BiStop.js +0 -16
  367. package/dist/icons/bi/BiUndo.js +0 -16
  368. package/dist/icons/bs/BsArrowsCollapse.js +0 -22
  369. package/dist/icons/bs/BsBank2.js +0 -19
  370. package/dist/icons/bs/BsBriefcase.js +0 -19
  371. package/dist/icons/bs/BsBucket.js +0 -19
  372. package/dist/icons/bs/BsCalendarX.js +0 -23
  373. package/dist/icons/bs/BsChatLeft.js +0 -19
  374. package/dist/icons/bs/BsChevronDoubleDown.js +0 -29
  375. package/dist/icons/bs/BsChevronDoubleUp.js +0 -29
  376. package/dist/icons/bs/BsClipboardCheck.js +0 -34
  377. package/dist/icons/bs/BsCurrencyDollar.js +0 -19
  378. package/dist/icons/bs/BsDash.js +0 -19
  379. package/dist/icons/bs/BsFileEarmarkZip.js +0 -23
  380. package/dist/icons/bs/BsFiles.js +0 -19
  381. package/dist/icons/bs/BsGeoAlt.js +0 -23
  382. package/dist/icons/bs/BsGrid.js +0 -19
  383. package/dist/icons/bs/BsLayers.js +0 -19
  384. package/dist/icons/bs/BsLayoutThreeColumns.js +0 -19
  385. package/dist/icons/bs/BsListUl.js +0 -22
  386. package/dist/icons/bs/BsMortarboard.js +0 -23
  387. package/dist/icons/bs/BsMusicNoteBeamed.js +0 -34
  388. package/dist/icons/bs/BsOpenai.js +0 -19
  389. package/dist/icons/bs/BsPersonPlus.js +0 -26
  390. package/dist/icons/bs/BsSearch.js +0 -19
  391. package/dist/icons/bs/BsSend.js +0 -19
  392. package/dist/icons/bs/BsShieldSlash.js +0 -22
  393. package/dist/icons/bs/BsStar.js +0 -19
  394. package/dist/icons/bs/BsStarFill.js +0 -19
  395. package/dist/icons/bs/BsStopCircle.js +0 -23
  396. package/dist/icons/bs/BsTag.js +0 -23
  397. package/dist/icons/bs/BsTelephone.js +0 -19
  398. package/dist/icons/bs/BsTerminal.js +0 -23
  399. package/dist/icons/bs/BsTerminalFill.js +0 -19
  400. package/dist/icons/bs/BsThreeDots.js +0 -19
  401. package/dist/icons/bs/BsThreeDotsVertical.js +0 -19
  402. package/dist/icons/bs/BsZoomIn.js +0 -37
  403. package/dist/icons/fa/FaAmazon.js +0 -16
  404. package/dist/icons/fa/FaAngleDown.js +0 -16
  405. package/dist/icons/fa/FaAngleLeft.js +0 -16
  406. package/dist/icons/fa/FaAngleRight.js +0 -16
  407. package/dist/icons/fa/FaAngleUp.js +0 -16
  408. package/dist/icons/fa/FaArrowDown.js +0 -16
  409. package/dist/icons/fa/FaArrowLeft.js +0 -16
  410. package/dist/icons/fa/FaArrowRight.js +0 -16
  411. package/dist/icons/fa/FaArrowUp.js +0 -16
  412. package/dist/icons/fa/FaBalanceScale.js +0 -16
  413. package/dist/icons/fa/FaCaretDown.js +0 -16
  414. package/dist/icons/fa/FaCentos.js +0 -16
  415. package/dist/icons/fa/FaChartLine.js +0 -16
  416. package/dist/icons/fa/FaChartPie.js +0 -16
  417. package/dist/icons/fa/FaCheck.js +0 -16
  418. package/dist/icons/fa/FaChevronDown.js +0 -16
  419. package/dist/icons/fa/FaChevronUp.js +0 -16
  420. package/dist/icons/fa/FaChrome.js +0 -16
  421. package/dist/icons/fa/FaCircleNotch.js +0 -16
  422. package/dist/icons/fa/FaCloud.js +0 -16
  423. package/dist/icons/fa/FaCloudDownloadAlt.js +0 -16
  424. package/dist/icons/fa/FaCog.js +0 -16
  425. package/dist/icons/fa/FaCogs.js +0 -16
  426. package/dist/icons/fa/FaComments.js +0 -16
  427. package/dist/icons/fa/FaCompress.js +0 -16
  428. package/dist/icons/fa/FaDesktop.js +0 -16
  429. package/dist/icons/fa/FaDocker.js +0 -16
  430. package/dist/icons/fa/FaDollarSign.js +0 -16
  431. package/dist/icons/fa/FaEdge.js +0 -16
  432. package/dist/icons/fa/FaEdit.js +0 -16
  433. package/dist/icons/fa/FaExclamationTriangle.js +0 -16
  434. package/dist/icons/fa/FaExpand.js +0 -16
  435. package/dist/icons/fa/FaEye.js +0 -16
  436. package/dist/icons/fa/FaEyeSlash.js +0 -16
  437. package/dist/icons/fa/FaFile.js +0 -16
  438. package/dist/icons/fa/FaFilePdf.js +0 -16
  439. package/dist/icons/fa/FaFilter.js +0 -16
  440. package/dist/icons/fa/FaFirefoxBrowser.js +0 -16
  441. package/dist/icons/fa/FaFlask.js +0 -16
  442. package/dist/icons/fa/FaFolder.js +0 -16
  443. package/dist/icons/fa/FaGithub.js +0 -16
  444. package/dist/icons/fa/FaGitlab.js +0 -16
  445. package/dist/icons/fa/FaGlobe.js +0 -16
  446. package/dist/icons/fa/FaGlobeAmericas.js +0 -16
  447. package/dist/icons/fa/FaImage.js +0 -16
  448. package/dist/icons/fa/FaInfoCircle.js +0 -16
  449. package/dist/icons/fa/FaKey.js +0 -16
  450. package/dist/icons/fa/FaLayerGroup.js +0 -16
  451. package/dist/icons/fa/FaLink.js +0 -16
  452. package/dist/icons/fa/FaLinkedin.js +0 -16
  453. package/dist/icons/fa/FaLinux.js +0 -16
  454. package/dist/icons/fa/FaList.js +0 -16
  455. package/dist/icons/fa/FaLock.js +0 -16
  456. package/dist/icons/fa/FaOpenid.js +0 -16
  457. package/dist/icons/fa/FaOpera.js +0 -16
  458. package/dist/icons/fa/FaPaperclip.js +0 -16
  459. package/dist/icons/fa/FaPlus.js +0 -16
  460. package/dist/icons/fa/FaPowerOff.js +0 -16
  461. package/dist/icons/fa/FaPrint.js +0 -16
  462. package/dist/icons/fa/FaQrcode.js +0 -16
  463. package/dist/icons/fa/FaQuestionCircle.js +0 -16
  464. package/dist/icons/fa/FaRedhat.js +0 -16
  465. package/dist/icons/fa/FaRegCircle.js +0 -16
  466. package/dist/icons/fa/FaRegFileImage.js +0 -16
  467. package/dist/icons/fa/FaRegFolder.js +0 -16
  468. package/dist/icons/fa/FaRobot.js +0 -16
  469. package/dist/icons/fa/FaRocket.js +0 -16
  470. package/dist/icons/fa/FaRunning.js +0 -16
  471. package/dist/icons/fa/FaSafari.js +0 -16
  472. package/dist/icons/fa/FaSave.js +0 -16
  473. package/dist/icons/fa/FaSearch.js +0 -16
  474. package/dist/icons/fa/FaShieldAlt.js +0 -16
  475. package/dist/icons/fa/FaSlack.js +0 -16
  476. package/dist/icons/fa/FaStar.js +0 -16
  477. package/dist/icons/fa/FaStop.js +0 -16
  478. package/dist/icons/fa/FaSuse.js +0 -16
  479. package/dist/icons/fa/FaTerminal.js +0 -16
  480. package/dist/icons/fa/FaTimes.js +0 -16
  481. package/dist/icons/fa/FaUbuntu.js +0 -16
  482. package/dist/icons/fa/FaUndoAlt.js +0 -16
  483. package/dist/icons/fa/FaUnlink.js +0 -16
  484. package/dist/icons/fa/FaUser.js +0 -16
  485. package/dist/icons/fa/FaUsers.js +0 -16
  486. package/dist/icons/fa/FaWindows.js +0 -16
  487. package/dist/icons/fa6/FaApple.js +0 -16
  488. package/dist/icons/fa6/FaArrowsRotate.js +0 -16
  489. package/dist/icons/fa6/FaDebian.js +0 -16
  490. package/dist/icons/fa6/FaFilterCircleXmark.js +0 -16
  491. package/dist/icons/fa6/FaInbox.js +0 -16
  492. package/dist/icons/fa6/FaLocationDot.js +0 -16
  493. package/dist/icons/fa6/FaRegFilePdf.js +0 -16
  494. package/dist/icons/fa6/FaRegFolderOpen.js +0 -16
  495. package/dist/icons/fa6/FaUpRightFromSquare.js +0 -16
  496. package/dist/icons/fa6/FaWandMagicSparkles.js +0 -16
  497. package/dist/icons/fa6/FaXTwitter.js +0 -16
  498. package/dist/icons/fi/FiActivity.js +0 -23
  499. package/dist/icons/fi/FiAlertCircle.js +0 -49
  500. package/dist/icons/fi/FiChevronDown.js +0 -23
  501. package/dist/icons/fi/FiClock.js +0 -31
  502. package/dist/icons/fi/FiCopy.js +0 -34
  503. package/dist/icons/fi/FiDownload.js +0 -40
  504. package/dist/icons/fi/FiFile.js +0 -27
  505. package/dist/icons/fi/FiFileText.js +0 -55
  506. package/dist/icons/fi/FiHardDrive.js +0 -55
  507. package/dist/icons/fi/FiRotateCcw.js +0 -27
  508. package/dist/icons/fi/FiUpload.js +0 -40
  509. package/dist/icons/fi/FiX.js +0 -37
  510. package/dist/icons/fi/FiZap.js +0 -23
  511. package/dist/icons/gi/GiSpy.js +0 -16
  512. package/dist/icons/go/GoGitCommit.js +0 -16
  513. package/dist/icons/go/GoGitPullRequest.js +0 -20
  514. package/dist/icons/go/GoIssueOpened.js +0 -16
  515. package/dist/icons/go/GoPlus.js +0 -16
  516. package/dist/icons/go/GoRepoForked.js +0 -28
  517. package/dist/icons/go/GoSignOut.js +0 -16
  518. package/dist/icons/go/GoSkip.js +0 -20
  519. package/dist/icons/go/GoVideo.js +0 -20
  520. package/dist/icons/gr/GrCloudComputer.js +0 -20
  521. package/dist/icons/gr/GrInbox.js +0 -20
  522. package/dist/icons/gr/GrServerCluster.js +0 -20
  523. package/dist/icons/gr/GrStorage.js +0 -20
  524. package/dist/icons/gr/GrTasks.js +0 -20
  525. package/dist/icons/hi/HiCog.js +0 -24
  526. package/dist/icons/hi/HiDuplicate.js +0 -24
  527. package/dist/icons/hi/HiOutlineArchive.js +0 -26
  528. package/dist/icons/hi/HiOutlineClipboardCopy.js +0 -26
  529. package/dist/icons/hi/HiOutlineHome.js +0 -26
  530. package/dist/icons/hi/HiQuestionMarkCircle.js +0 -24
  531. package/dist/icons/hi/HiServer.js +0 -24
  532. package/dist/icons/hi2/HiMiniCheckCircle.js +0 -24
  533. package/dist/icons/hi2/HiMiniLanguage.js +0 -28
  534. package/dist/icons/hi2/HiMiniMinusCircle.js +0 -24
  535. package/dist/icons/hi2/HiMiniXCircle.js +0 -24
  536. package/dist/icons/hi2/HiSparkles.js +0 -24
  537. package/dist/icons/im/ImSpinner5.js +0 -19
  538. package/dist/icons/io/IoIosNotifications.js +0 -16
  539. package/dist/icons/io/IoMdBuild.js +0 -16
  540. package/dist/icons/io/IoMdClose.js +0 -16
  541. package/dist/icons/io5/IoCloudUploadOutline.js +0 -32
  542. package/dist/icons/io5/IoDocumentTextOutline.js +0 -31
  543. package/dist/icons/io5/IoFileTrayFullOutline.js +0 -31
  544. package/dist/icons/io5/IoHeart.js +0 -16
  545. package/dist/icons/io5/IoHeartDislike.js +0 -16
  546. package/dist/icons/io5/IoHeartOutline.js +0 -22
  547. package/dist/icons/io5/IoInformationCircleOutline.js +0 -50
  548. package/dist/icons/io5/IoSettingsOutline.js +0 -22
  549. package/dist/icons/io5/IoWarningOutline.js +0 -40
  550. package/dist/icons/lu/LuArrowRight.js +0 -27
  551. package/dist/icons/lu/LuBadgeCheck.js +0 -27
  552. package/dist/icons/lu/LuBraces.js +0 -27
  553. package/dist/icons/lu/LuBrainCircuit.js +0 -101
  554. package/dist/icons/lu/LuCalendar.js +0 -46
  555. package/dist/icons/lu/LuCheck.js +0 -23
  556. package/dist/icons/lu/LuChevronLeft.js +0 -23
  557. package/dist/icons/lu/LuChevronRight.js +0 -23
  558. package/dist/icons/lu/LuCode.js +0 -27
  559. package/dist/icons/lu/LuExternalLink.js +0 -35
  560. package/dist/icons/lu/LuEye.js +0 -31
  561. package/dist/icons/lu/LuEyeOff.js +0 -40
  562. package/dist/icons/lu/LuFolderTree.js +0 -40
  563. package/dist/icons/lu/LuIdCard.js +0 -55
  564. package/dist/icons/lu/LuKeyboard.js +0 -71
  565. package/dist/icons/lu/LuLogs.js +0 -65
  566. package/dist/icons/lu/LuMail.js +0 -33
  567. package/dist/icons/lu/LuMegaphone.js +0 -27
  568. package/dist/icons/lu/LuMoon.js +0 -23
  569. package/dist/icons/lu/LuNetwork.js +0 -63
  570. package/dist/icons/lu/LuPartyPopper.js +0 -65
  571. package/dist/icons/lu/LuSettings2.js +0 -48
  572. package/dist/icons/lu/LuSheet.js +0 -72
  573. package/dist/icons/lu/LuShield.js +0 -23
  574. package/dist/icons/lu/LuSun.js +0 -69
  575. package/dist/icons/lu/LuTextCursorInput.js +0 -45
  576. package/dist/icons/lu/LuX.js +0 -27
  577. package/dist/icons/lu/LuZoomIn.js +0 -59
  578. package/dist/icons/lu/LuZoomOut.js +0 -49
  579. package/dist/icons/md/MdClear.js +0 -23
  580. package/dist/icons/md/MdDragHandle.js +0 -23
  581. package/dist/icons/md/MdInstallDesktop.js +0 -31
  582. package/dist/icons/md/MdOutlineAttachMoney.js +0 -23
  583. package/dist/icons/md/MdOutlineMoneyOff.js +0 -23
  584. package/dist/icons/md/MdPieChart.js +0 -23
  585. package/dist/icons/md/MdRefresh.js +0 -23
  586. package/dist/icons/md/MdReplay.js +0 -23
  587. package/dist/icons/md/MdSmartphone.js +0 -23
  588. package/dist/icons/pi/PiArrowBendUpRightBold.js +0 -19
  589. package/dist/icons/pi/PiPlugsConnectedFill.js +0 -19
  590. package/dist/icons/pi/PiRectangleDashed.js +0 -19
  591. package/dist/icons/pi/PiShareBold.js +0 -19
  592. package/dist/icons/si/SiAnthropic.js +0 -19
  593. package/dist/icons/si/SiHelm.js +0 -19
  594. package/dist/icons/si/SiKubernetes.js +0 -19
  595. package/dist/icons/tb/TbAlertTriangle.js +0 -35
  596. package/dist/icons/tb/TbAlertTriangleFilled.js +0 -19
  597. package/dist/icons/tb/TbApi.js +0 -40
  598. package/dist/icons/tb/TbBrain.js +0 -50
  599. package/dist/icons/tb/TbBuildingTunnel.js +0 -65
  600. package/dist/icons/tb/TbEdit.js +0 -35
  601. package/dist/icons/tb/TbLayoutSidebar.js +0 -27
  602. package/dist/icons/tb/TbLayoutSidebarLeftCollapse.js +0 -35
  603. package/dist/icons/tb/TbLayoutSidebarRightCollapse.js +0 -35
  604. package/dist/icons/tb/TbUser.js +0 -27
  605. package/dist/icons/tb/TbUserOff.js +0 -35
  606. package/dist/icons/tb/TbWorldShare.js +0 -55
  607. package/dist/icons/tb/TbWorldWww.js +0 -65
  608. package/dist/icons/ti/TiArrowSortedDown.js +0 -20
  609. package/dist/icons/ti/TiArrowSortedUp.js +0 -20
  610. package/dist/icons/ti/TiArrowUnsorted.js +0 -20
  611. package/dist/icons/ti/TiCancel.js +0 -20
  612. package/dist/icons/vsc/VscChromeMinimize.js +0 -19
  613. package/dist/icons/vsc/VscJson.js +0 -19
  614. package/dist/icons/vsc/VscLayoutSidebarLeft.js +0 -19
  615. package/dist/icons/vsc/VscPass.js +0 -27
  616. package/dist/icons/vsc/VscSplitHorizontal.js +0 -19
  617. package/dist/icons/vsc/VscTerminalPowershell.js +0 -19
  618. package/dist/list/ListPager.d.ts +0 -14
  619. package/dist/list/ListPager.js +0 -62
  620. package/dist/list/textEntry.d.ts +0 -2
  621. package/dist/list/textEntry.js +0 -10
  622. /package/dist/{ai/ui/codeBreaks.d.ts → components/markdownCodeBreaks.d.ts} +0 -0
@@ -1,25 +1,25 @@
1
- import { FaArrowDown } from "../icons/fa/FaArrowDown.js";
2
- import { FaArrowUp } from "../icons/fa/FaArrowUp.js";
3
- import { FaCheck } from "../icons/fa/FaCheck.js";
4
- import { FaChevronDown } from "../icons/fa/FaChevronDown.js";
5
- import { FaCloudDownloadAlt } from "../icons/fa/FaCloudDownloadAlt.js";
6
- import { FaCompress } from "../icons/fa/FaCompress.js";
7
- import { FaExpand } from "../icons/fa/FaExpand.js";
8
- import { FiClock } from "../icons/fi/FiClock.js";
9
- import { FiCopy } from "../icons/fi/FiCopy.js";
10
- import { FiX } from "../icons/fi/FiX.js";
11
- import { LuChevronRight } from "../icons/lu/LuChevronRight.js";
12
- import { useNotify, useOptionalWorkflowEngine, useStrings } from "../components/Provider.js";
1
+ import { cx } from "../cx.js";
2
+ import { ArrowDownIcon, ArrowUpIcon, CheckIcon, ChevronDownIcon, ChevronRightIcon, ClockIcon, CloseIcon, CopyIcon, DownloadIcon, ExpandIcon, ShrinkIcon } from "../icons.js";
3
+ import { buttonClasses } from "../components/buttonClasses.js";
4
+ import { Loader } from "../components/Loader.js";
5
+ import { useOptionalWorkflowEngine, useStrings } from "../components/Provider.js";
6
+ import { useCopy } from "../components/useCopy.js";
7
+ import { Button } from "../components/Button.js";
8
+ import { DatePicker } from "../components/DatePicker.js";
9
+ import { Popover } from "../components/Popover.js";
13
10
  import { InfoTip } from "../components/InfoTip.js";
11
+ import { IconButton } from "../components/IconButton.js";
12
+ import { SearchInput } from "../components/SearchInput.js";
14
13
  import { highlightSegments, parseAnsiSegments, plainSegments } from "./segments.js";
15
- import { clsx } from "clsx";
16
14
  import { Fragment, jsx, jsxs } from "react/jsx-runtime";
17
- import { Fragment as Fragment$1, memo, useCallback, useEffect, useLayoutEffect, useMemo, useRef, useState } from "react";
15
+ import { Fragment as Fragment$1, memo, useCallback, useEffect, useId, useLayoutEffect, useMemo, useRef, useState } from "react";
16
+ import { useVirtualizer } from "@tanstack/react-virtual";
18
17
  import { DateTime } from "luxon";
19
18
  //#region src/logviewer/LogViewer.tsx
19
+ var LINE_HEIGHT = 20;
20
20
  function LogSegments({ segments }) {
21
21
  return segments.map((segment, i) => segment.highlighted ? /* @__PURE__ */ jsx("mark", {
22
- className: clsx("search-highlight", segment.className),
22
+ className: cx("search-highlight", segment.className),
23
23
  children: segment.content
24
24
  }, i) : segment.className ? /* @__PURE__ */ jsx("span", {
25
25
  className: segment.className,
@@ -67,7 +67,7 @@ var LogLine = memo(function LogLine({ index, segments, lineNumbers, isSelected,
67
67
  return /* @__PURE__ */ jsxs("div", {
68
68
  "data-line-number": index + 1,
69
69
  ...groupToggleProps,
70
- className: clsx("flex items-start text-sm font-mono group", isSelected ? "bg-(--theme-link)/15" : "hover:bg-(--theme-hover)", "text-(--theme-app)", command?.type === "error" && "bg-red-500/10", command?.type === "warning" && "bg-yellow-500/10", command?.type === "notice" && "bg-blue-500/10", command?.type === "debug" && "opacity-60", command?.type === "group" && "bg-(--theme-hover) cursor-pointer"),
70
+ className: cx("flex items-start text-sm font-mono group", isSelected ? "bg-(--theme-link)/15" : "hover:bg-(--theme-hover)", "text-(--theme-app)", command?.type === "error" && "bg-red-500/10", command?.type === "warning" && "bg-yellow-500/10", command?.type === "notice" && "bg-blue-500/10", command?.type === "debug" && "opacity-60", command?.type === "group" && "bg-(--theme-hover) cursor-pointer"),
71
71
  style: {
72
72
  minHeight: `${lineHeight}px`,
73
73
  lineHeight: `${lineHeight}px`,
@@ -79,14 +79,14 @@ var LogLine = memo(function LogLine({ index, segments, lineNumbers, isSelected,
79
79
  e.stopPropagation();
80
80
  onLineClick(index + 1, e);
81
81
  },
82
- className: clsx("inline-flex items-center justify-end w-14 pr-3 shrink-0 cursor-pointer select-none", "hover:underline hover:text-(--theme-link) transition-colors", "text-(--theme-muted-text-color)", isSelected && "text-(--theme-link)"),
82
+ className: cx("inline-flex items-center justify-end w-14 pr-3 shrink-0 cursor-pointer select-none", "hover:underline hover:text-(--theme-link) transition-colors", "text-(--theme-muted-text-color)", isSelected && "text-(--theme-link)"),
83
83
  children: index + 1
84
84
  }), /* @__PURE__ */ jsxs("pre", {
85
- className: clsx("grow text-left whitespace-pre m-0 py-0.5 pr-2 flex items-center", lineNumbers && "pl-2 border-l border-(--theme-border)", command?.type === "error" && "border-l-red-500 border-l-2", command?.type === "warning" && "border-l-yellow-500 border-l-2", command?.type === "notice" && "border-l-blue-500 border-l-2", command?.type === "group" && "font-bold"),
85
+ className: cx("grow text-left whitespace-pre m-0 py-0.5 pr-2 flex items-center", lineNumbers && "pl-2 border-l border-(--theme-border)", command?.type === "error" && "border-l-red-500 border-l-2", command?.type === "warning" && "border-l-yellow-500 border-l-2", command?.type === "notice" && "border-l-blue-500 border-l-2", command?.type === "group" && "font-bold"),
86
86
  children: [
87
87
  command?.type === "group" && /* @__PURE__ */ jsx("span", {
88
88
  className: "mr-1 shrink-0 inline-flex items-center",
89
- children: isGroupCollapsed ? /* @__PURE__ */ jsx(LuChevronRight, { className: "w-3 h-3" }) : /* @__PURE__ */ jsx(FaChevronDown, { className: "w-3 h-3" })
89
+ children: isGroupCollapsed ? /* @__PURE__ */ jsx(ChevronRightIcon, { className: "w-3 h-3" }) : /* @__PURE__ */ jsx(ChevronDownIcon, { className: "w-3 h-3" })
90
90
  }),
91
91
  annotationLabel,
92
92
  /* @__PURE__ */ jsx("span", { children: /* @__PURE__ */ jsx(LogSegments, { segments: displaySegments }) })
@@ -106,30 +106,31 @@ function validateTimeRange(from, to) {
106
106
  }
107
107
  var TopPaginationBanner = memo(function TopPaginationBanner({ endOfLog, loadingTop, onLoadOlder }) {
108
108
  const { logviewer: t } = useStrings();
109
- const baseCx = clsx("flex items-center justify-center gap-2 h-7 text-xs font-mono select-none", "text-[var(--theme-muted-text-color)]", "border-b border-[var(--theme-border)]");
109
+ const baseCx = cx("flex items-center justify-center gap-2 h-7 text-xs font-mono select-none", "text-[var(--theme-muted-text-color)]", "border-b border-[var(--theme-border)]");
110
110
  if (endOfLog) return /* @__PURE__ */ jsx("div", {
111
- className: clsx(baseCx, "opacity-70"),
111
+ className: cx(baseCx, "opacity-70"),
112
112
  children: t.beginningOfLog
113
113
  });
114
114
  if (loadingTop) return /* @__PURE__ */ jsxs("div", {
115
115
  className: baseCx,
116
- children: [/* @__PURE__ */ jsx("span", {
117
- className: "w-3 h-3 rounded-full border-2 border-current border-t-transparent animate-spin",
118
- "aria-hidden": true
116
+ children: [/* @__PURE__ */ jsx(Loader, {
117
+ inline: true,
118
+ decorative: true,
119
+ size: 12,
120
+ color: "currentColor"
119
121
  }), /* @__PURE__ */ jsx("span", { children: t.loadingOlderEntries })]
120
122
  });
121
123
  return /* @__PURE__ */ jsx("button", {
122
124
  type: "button",
123
125
  onClick: onLoadOlder,
124
- className: clsx(baseCx, "w-full hover:text-[var(--theme-app)] hover:bg-[var(--theme-hover)] transition-colors"),
126
+ className: cx(baseCx, "w-full hover:text-[var(--theme-app)] hover:bg-[var(--theme-hover)] transition-colors"),
125
127
  children: t.loadOlderEntries
126
128
  });
127
129
  });
128
130
  function LogViewer({ log, height = "unset", width, roundedBottom = false, lineNumbers = true, additionalLeftBarComponents = null, additionalRightBarComponents = null, additionalBottomLeftBarComponents = null, additionalBottomRightBarComponents = null, hideExpand = false, inline = false, contentClassName, enableWorkflowCommands: workflowCommandsRequested = false, onReachTop, loadingTop = false, endOfLog = false, prependedSignal = 0, enableTimeRangeFilter = false, onTimeRangeChange, initialTimeRangeFrom = "", initialTimeRangeTo = "" }) {
129
131
  const engine = useOptionalWorkflowEngine(workflowCommandsRequested);
130
132
  const enableWorkflowCommands = workflowCommandsRequested && engine !== void 0;
131
- const notify = useNotify();
132
- const { common: tCommon, logviewer: t } = useStrings();
133
+ const { common, logviewer: t } = useStrings();
133
134
  const annotationLabels = useMemo(() => ({
134
135
  error: t.error,
135
136
  warning: t.warning,
@@ -152,7 +153,7 @@ function LogViewer({ log, height = "unset", width, roundedBottom = false, lineNu
152
153
  const [timeRangeFrom, setTimeRangeFrom] = useState(initialTimeRangeFrom);
153
154
  const [timeRangeTo, setTimeRangeTo] = useState(initialTimeRangeTo);
154
155
  const [timeRangeOpen, setTimeRangeOpen] = useState(false);
155
- const timeRangePopoverRef = useRef(null);
156
+ const timeRangeId = useId();
156
157
  const timeRangeError = validateTimeRange(timeRangeFrom, timeRangeTo);
157
158
  useEffect(() => {
158
159
  setTimeRangeFrom(initialTimeRangeFrom);
@@ -160,24 +161,19 @@ function LogViewer({ log, height = "unset", width, roundedBottom = false, lineNu
160
161
  useEffect(() => {
161
162
  setTimeRangeTo(initialTimeRangeTo);
162
163
  }, [initialTimeRangeTo]);
163
- const [visibleStart, setVisibleStart] = useState(0);
164
- const [visibleEnd, setVisibleEnd] = useState(0);
165
164
  const [selectedLines, setSelectedLines] = useState(/* @__PURE__ */ new Set());
166
165
  const [lastClickedLine, setLastClickedLine] = useState(null);
167
- const [copied, setCopied] = useState(false);
168
- const [highlightCopyPosition, setHighlightCopyPosition] = useState(null);
169
- const [highlightedText, setHighlightedText] = useState("");
166
+ const { copy, copied } = useCopy();
167
+ const [selection, setSelection] = useState(null);
170
168
  const logContainerRef = useRef(null);
169
+ const listRef = useRef(null);
171
170
  const ansiCache = useRef({});
172
- const scrollAnimationRef = useRef(null);
173
171
  const prevLogLengthRef = useRef(0);
174
172
  const userScrollUpRef = useRef(false);
175
173
  const reachTopFiredRef = useRef(false);
176
174
  const prevScrollHeightRef = useRef(0);
177
175
  const prevPrependedSignalRef = useRef(prependedSignal);
178
176
  const pendingPrependRef = useRef(false);
179
- const LINE_HEIGHT = 20;
180
- const OVERSCAN = 20;
181
177
  const handleLineClick = useCallback((lineNum, e) => {
182
178
  e.preventDefault();
183
179
  updateFollow(false);
@@ -199,94 +195,34 @@ function LogViewer({ log, height = "unset", width, roundedBottom = false, lineNu
199
195
  ]);
200
196
  const copyAllLogs = useCallback(async () => {
201
197
  const text = rawLines.join("\n");
202
- try {
203
- await navigator.clipboard.writeText(text);
204
- setCopied(true);
205
- setTimeout(() => setCopied(false), 2e3);
206
- } catch (_err) {
207
- notify.error("Failed to copy logs to clipboard");
208
- }
209
- }, [rawLines, notify]);
198
+ await copy(text, { quiet: true });
199
+ }, [rawLines, copy]);
210
200
  const handleTextMouseUp = useCallback((e) => {
211
- const selectedText = window.getSelection()?.toString().trim();
212
- if (selectedText && selectedText.length > 0) {
213
- setHighlightCopyPosition({
214
- x: e.clientX,
215
- y: e.clientY
216
- });
217
- setHighlightedText(selectedText);
218
- } else {
219
- setHighlightCopyPosition(null);
220
- setHighlightedText("");
221
- }
201
+ const text = window.getSelection()?.toString().trim();
202
+ const { clientX, clientY } = e;
203
+ setSelection(text ? {
204
+ text,
205
+ at: {
206
+ clientX,
207
+ clientY
208
+ }
209
+ } : null);
222
210
  }, []);
223
- const copyHighlightedText = useCallback(async () => {
224
- if (!highlightedText) return;
225
- try {
226
- await navigator.clipboard.writeText(highlightedText);
227
- notify.success("Text copied to clipboard");
211
+ const copySelection = useCallback(async () => {
212
+ if (!selection) return;
213
+ if (await copy(selection.text)) {
228
214
  window.getSelection()?.removeAllRanges();
229
- setHighlightCopyPosition(null);
230
- setHighlightedText("");
231
- } catch (_err) {
232
- notify.error("Failed to copy text to clipboard");
215
+ setSelection(null);
233
216
  }
234
- }, [highlightedText, notify]);
235
- useEffect(() => {
236
- const handleClickOutside = (e) => {
237
- if (e.target.closest("[data-highlight-copy-button]")) return;
238
- setTimeout(() => {
239
- setHighlightCopyPosition(null);
240
- setHighlightedText("");
241
- }, 100);
242
- };
243
- const handleKeyDown = (e) => {
244
- if (e.key === "Escape") {
245
- setHighlightCopyPosition(null);
246
- setHighlightedText("");
247
- }
248
- };
249
- if (highlightCopyPosition) {
250
- document.addEventListener("mousedown", handleClickOutside);
251
- document.addEventListener("keydown", handleKeyDown);
252
- }
253
- return () => {
254
- document.removeEventListener("mousedown", handleClickOutside);
255
- document.removeEventListener("keydown", handleKeyDown);
256
- };
257
- }, [highlightCopyPosition]);
258
- useEffect(() => {
259
- if (!timeRangeOpen) return;
260
- const handleClickOutside = (e) => {
261
- const target = e.target;
262
- if (timeRangePopoverRef.current?.contains(target)) return;
263
- if (target.closest("[data-time-range-trigger]")) return;
264
- setTimeRangeOpen(false);
265
- };
266
- const handleKey = (e) => {
267
- if (e.key === "Escape") setTimeRangeOpen(false);
268
- };
269
- document.addEventListener("mousedown", handleClickOutside);
270
- document.addEventListener("keydown", handleKey);
271
- return () => {
272
- document.removeEventListener("mousedown", handleClickOutside);
273
- document.removeEventListener("keydown", handleKey);
274
- };
275
- }, [timeRangeOpen]);
217
+ }, [selection, copy]);
276
218
  const copySelectedLines = useCallback(async () => {
277
219
  if (selectedLines.size === 0) return;
278
220
  const text = Array.from(selectedLines).sort((a, b) => a - b).map((ln) => rawLines[ln - 1] || "").join("\n");
279
- try {
280
- await navigator.clipboard.writeText(text);
281
- setCopied(true);
282
- setTimeout(() => setCopied(false), 2e3);
283
- } catch (_err) {
284
- notify.error("Failed to copy selected logs to clipboard");
285
- }
221
+ await copy(text, { quiet: true });
286
222
  }, [
287
223
  selectedLines,
288
224
  rawLines,
289
- notify
225
+ copy
290
226
  ]);
291
227
  const handleGroupToggle = useCallback((lineIndex) => {
292
228
  setCollapsedGroups((prev) => {
@@ -320,32 +256,21 @@ function LogViewer({ log, height = "unset", width, roundedBottom = false, lineNu
320
256
  showDebug,
321
257
  collapsedGroups
322
258
  ]);
323
- const smoothScrollToBottom = useCallback(() => {
324
- if (!logContainerRef.current) return;
325
- if (scrollAnimationRef.current) {
326
- cancelAnimationFrame(scrollAnimationRef.current);
327
- scrollAnimationRef.current = null;
328
- }
329
- const container = logContainerRef.current;
330
- const targetScroll = container.scrollHeight - container.clientHeight;
331
- const currentScroll = container.scrollTop;
332
- const distance = targetScroll - currentScroll;
333
- if (Math.abs(distance) < 5) {
334
- container.scrollTop = targetScroll;
335
- return;
336
- }
337
- const startTime = performance.now();
338
- const duration = 150;
339
- const animate = (currentTime) => {
340
- const elapsed = currentTime - startTime;
341
- const progress = Math.min(elapsed / duration, 1);
342
- const eased = 1 - (1 - progress) ** 3;
343
- container.scrollTop = currentScroll + distance * eased;
344
- if (progress < 1) scrollAnimationRef.current = requestAnimationFrame(animate);
345
- else scrollAnimationRef.current = null;
346
- };
347
- scrollAnimationRef.current = requestAnimationFrame(animate);
348
- }, []);
259
+ const virtualizer = useVirtualizer({
260
+ count: parsedLog.length,
261
+ getScrollElement: () => logContainerRef.current,
262
+ estimateSize: () => LINE_HEIGHT,
263
+ overscan: 20,
264
+ scrollMargin: listRef.current?.offsetTop ?? 0,
265
+ getItemKey: (i) => parsedLog[i]?.index ?? i,
266
+ enabled: !inline
267
+ });
268
+ const parsedLogLengthRef = useRef(parsedLog.length);
269
+ parsedLogLengthRef.current = parsedLog.length;
270
+ const scrollToEnd = useCallback(() => {
271
+ const last = parsedLogLengthRef.current - 1;
272
+ if (last >= 0) virtualizer.scrollToIndex(last, { align: "end" });
273
+ }, [virtualizer]);
349
274
  const scrollToTop = () => {
350
275
  logContainerRef.current?.scroll({
351
276
  top: 0,
@@ -358,17 +283,9 @@ function LogViewer({ log, height = "unset", width, roundedBottom = false, lineNu
358
283
  if (!container || inline) return;
359
284
  const onWheel = (e) => {
360
285
  if (e.deltaY < 0) userScrollUpRef.current = true;
361
- if (scrollAnimationRef.current) {
362
- cancelAnimationFrame(scrollAnimationRef.current);
363
- scrollAnimationRef.current = null;
364
- }
365
286
  };
366
287
  const onTouchStart = () => {
367
288
  userScrollUpRef.current = true;
368
- if (scrollAnimationRef.current) {
369
- cancelAnimationFrame(scrollAnimationRef.current);
370
- scrollAnimationRef.current = null;
371
- }
372
289
  };
373
290
  container.addEventListener("wheel", onWheel, { passive: true });
374
291
  container.addEventListener("touchstart", onTouchStart, { passive: true });
@@ -390,21 +307,10 @@ function LogViewer({ log, height = "unset", width, roundedBottom = false, lineNu
390
307
  ]);
391
308
  const handleLogScroll = (event) => {
392
309
  const { scrollTop, clientHeight, scrollHeight } = event.currentTarget;
393
- const isAnimating = scrollAnimationRef.current !== null;
394
- const atBottom = scrollHeight - clientHeight - scrollTop < 2;
395
- if (!isAnimating) {
396
- if (atBottom && !follow) updateFollow(true);
397
- else if (userScrollUpRef.current && follow) updateFollow(false);
398
- userScrollUpRef.current = false;
399
- }
310
+ if (scrollHeight - clientHeight - scrollTop < 2 && !follow) updateFollow(true);
311
+ else if (userScrollUpRef.current && follow) updateFollow(false);
312
+ userScrollUpRef.current = false;
400
313
  maybeFireReachTop(scrollTop);
401
- if (!followRef.current) {
402
- const visibleCount = Math.ceil(clientHeight / LINE_HEIGHT) + 40;
403
- const maxStart = Math.max(0, parsedLog.length - visibleCount);
404
- const startIndex = Math.min(maxStart, Math.max(0, Math.floor(scrollTop / LINE_HEIGHT) - OVERSCAN));
405
- setVisibleStart(startIndex);
406
- setVisibleEnd(startIndex + visibleCount);
407
- }
408
314
  };
409
315
  useEffect(() => {
410
316
  if (!log) return;
@@ -422,56 +328,26 @@ function LogViewer({ log, height = "unset", width, roundedBottom = false, lineNu
422
328
  });
423
329
  setFullParsedLog(processed);
424
330
  if (enableWorkflowCommands && engine) setProcessedLines(engine.processLogLines(processed, cleanedLines));
425
- if (followRef.current && logContainerRef.current) {
426
- setVisibleEnd((prev) => Math.max(prev, cleanedLines.length));
427
- if (isAppending) requestAnimationFrame(() => {
428
- requestAnimationFrame(() => {
429
- smoothScrollToBottom();
430
- });
431
- });
432
- }
331
+ if (followRef.current && isAppending) requestAnimationFrame(scrollToEnd);
433
332
  const file = new Blob([log], { type: "text/plaintext" });
434
333
  const url = URL.createObjectURL(file);
435
334
  setLogUrl(url);
436
- return () => {
437
- URL.revokeObjectURL(url);
438
- if (scrollAnimationRef.current) cancelAnimationFrame(scrollAnimationRef.current);
439
- };
335
+ return () => URL.revokeObjectURL(url);
440
336
  }, [
441
337
  log,
442
- smoothScrollToBottom,
338
+ scrollToEnd,
443
339
  enableWorkflowCommands,
444
340
  engine
445
341
  ]);
446
- const parsedLogLengthRef = useRef(parsedLog.length);
447
- parsedLogLengthRef.current = parsedLog.length;
448
342
  useEffect(() => {
449
- if (!logContainerRef.current) return;
343
+ const container = logContainerRef.current;
344
+ if (!container || inline) return;
450
345
  const observer = new ResizeObserver(() => {
451
- if (!logContainerRef.current) return;
452
- if (parsedLogLengthRef.current === 0) return;
453
- const container = logContainerRef.current;
454
- const clientHeight = container.clientHeight;
455
- const visibleCount = Math.ceil(clientHeight / LINE_HEIGHT) + 40;
456
- if (followRef.current) {
457
- const minStart = Math.max(0, parsedLogLengthRef.current - visibleCount);
458
- setVisibleStart((prev) => Math.min(prev, minStart));
459
- setVisibleEnd(parsedLogLengthRef.current);
460
- requestAnimationFrame(() => {
461
- requestAnimationFrame(() => {
462
- smoothScrollToBottom();
463
- });
464
- });
465
- } else {
466
- const maxStart = Math.max(0, parsedLogLengthRef.current - visibleCount);
467
- const startIndex = Math.min(maxStart, Math.max(0, Math.floor(container.scrollTop / LINE_HEIGHT) - OVERSCAN));
468
- setVisibleStart(startIndex);
469
- setVisibleEnd(startIndex + visibleCount);
470
- }
346
+ if (followRef.current) scrollToEnd();
471
347
  });
472
- observer.observe(logContainerRef.current);
348
+ observer.observe(container);
473
349
  return () => observer.disconnect();
474
- }, [smoothScrollToBottom]);
350
+ }, [inline, scrollToEnd]);
475
351
  useLayoutEffect(() => {
476
352
  if (prependedSignal > prevPrependedSignalRef.current) pendingPrependRef.current = true;
477
353
  else if (prependedSignal < prevPrependedSignalRef.current) pendingPrependRef.current = false;
@@ -483,210 +359,211 @@ function LogViewer({ log, height = "unset", width, roundedBottom = false, lineNu
483
359
  if (delta <= 0) return;
484
360
  pendingPrependRef.current = false;
485
361
  container.scrollTop += delta;
486
- if (!followRef.current) {
487
- const visibleCount = Math.ceil(container.clientHeight / LINE_HEIGHT) + 40;
488
- const maxStart = Math.max(0, parsedLog.length - visibleCount);
489
- const startIndex = Math.min(maxStart, Math.max(0, Math.floor(container.scrollTop / LINE_HEIGHT) - OVERSCAN));
490
- setVisibleStart(startIndex);
491
- setVisibleEnd(startIndex + visibleCount);
492
- }
493
362
  }, [prependedSignal, parsedLog.length]);
494
363
  useLayoutEffect(() => {
495
364
  if (logContainerRef.current) prevScrollHeightRef.current = logContainerRef.current.scrollHeight;
496
365
  });
497
- const handleFilterChange = (event) => {
498
- const newFilter = event.target.value;
366
+ const handleFilterChange = (newFilter) => {
499
367
  setFilter(newFilter);
500
368
  updateFollow(false);
501
- if (logContainerRef.current) {
502
- const clientHeight = logContainerRef.current.clientHeight;
503
- const visibleCount = Math.ceil(clientHeight / LINE_HEIGHT) + 40;
504
- setVisibleStart(0);
505
- setVisibleEnd(Math.min(parsedLog.length, visibleCount));
506
- scrollToTop();
507
- } else {
508
- setVisibleStart(0);
509
- setVisibleEnd(50);
510
- }
369
+ scrollToTop();
511
370
  };
512
- const ExpandButtonIcon = fullscreen ? FaCompress : FaExpand;
513
- const expandButtonText = fullscreen ? "Collapse" : "Expand";
514
- const paddingTop = visibleStart * LINE_HEIGHT;
515
- const paddingBottom = Math.max(0, parsedLog.length - visibleEnd) * LINE_HEIGHT;
516
- const visibleLogs = inline ? parsedLog : parsedLog.slice(visibleStart, Math.min(parsedLog.length, visibleEnd));
371
+ const ExpandButtonIcon = fullscreen ? ShrinkIcon : ExpandIcon;
372
+ const expandButtonText = fullscreen ? common.collapse : common.expand;
373
+ const rows = virtualizer.getVirtualItems();
374
+ const visibleLogs = inline ? parsedLog.map((item, index) => ({
375
+ item,
376
+ index
377
+ })) : rows.flatMap((row) => {
378
+ const item = parsedLog[row.index];
379
+ return item ? [{
380
+ item,
381
+ index: row.index
382
+ }] : [];
383
+ });
384
+ const offset = (rows[0]?.start ?? 0) - virtualizer.options.scrollMargin;
517
385
  return /* @__PURE__ */ jsxs("div", {
518
386
  "data-testid": "logviewer-container",
519
- className: clsx("flex flex-col grow", roundedBottom && "rounded-lg"),
520
- style: !fullscreen ? {
387
+ className: cx("flex flex-col grow", roundedBottom && "rounded-lg", fullscreen && "fixed inset-x-0 bottom-0 top-(--app-inset-top,0px) z-(--layer-overlay)"),
388
+ style: fullscreen ? void 0 : {
521
389
  height,
522
390
  width
523
- } : {
524
- height: "calc(100% - 50px)",
525
- width: "100%",
526
- position: "fixed",
527
- left: 0,
528
- top: 50,
529
- zIndex: 9999
530
391
  },
531
392
  children: [
532
393
  /* @__PURE__ */ jsxs("div", {
533
- className: clsx("flex select-none items-center gap-x-2 p-2", inline ? "bg-[var(--theme-panel-bg)] border-b border-[var(--theme-border)]" : "theme-panel"),
394
+ className: cx("flex select-none items-center gap-x-2 p-2", inline ? "bg-[var(--theme-panel-bg)] border-b border-[var(--theme-border)]" : "theme-panel"),
534
395
  children: [/* @__PURE__ */ jsxs("div", {
535
- className: clsx("w-full flex flex-row gap-x-2 items-center", hideExpand && "justify-between"),
396
+ className: cx("w-full flex flex-row gap-x-2 items-center", hideExpand && "justify-between"),
536
397
  children: [
537
398
  /* @__PURE__ */ jsxs("div", {
538
399
  className: "flex gap-x-2 w-full",
539
400
  children: [
540
- !inline && /* @__PURE__ */ jsxs(Fragment, { children: [/* @__PURE__ */ jsxs("button", {
541
- type: "button",
542
- className: "btn btn-neutral",
401
+ !inline && /* @__PURE__ */ jsxs(Fragment, { children: [/* @__PURE__ */ jsx(Button, {
402
+ variant: "secondary",
403
+ size: "sm",
404
+ icon: /* @__PURE__ */ jsx(ArrowUpIcon, {}),
543
405
  onClick: () => {
544
406
  scrollToTop();
545
407
  updateFollow(false);
546
408
  },
547
- children: [/* @__PURE__ */ jsx(FaArrowUp, {}), /* @__PURE__ */ jsx("span", { children: t.top })]
548
- }), /* @__PURE__ */ jsxs("button", {
549
- type: "button",
550
- className: "btn btn-neutral",
409
+ children: t.top
410
+ }), /* @__PURE__ */ jsx(Button, {
411
+ variant: "secondary",
412
+ size: "sm",
413
+ icon: /* @__PURE__ */ jsx(ArrowDownIcon, {}),
414
+ "aria-pressed": follow,
551
415
  onClick: () => {
552
416
  if (!follow) {
553
417
  updateFollow(true);
554
- setVisibleEnd((prev) => Math.max(prev, parsedLog.length));
555
- requestAnimationFrame(() => {
556
- smoothScrollToBottom();
557
- });
418
+ scrollToEnd();
558
419
  } else updateFollow(false);
559
420
  },
560
- children: [/* @__PURE__ */ jsx(FaArrowDown, {}), /* @__PURE__ */ jsx("span", { children: !follow ? "Follow" : "Following" })]
421
+ children: follow ? t.following : t.follow
561
422
  })] }),
562
423
  selectedLines.size > 0 ? /* @__PURE__ */ jsxs("div", {
563
424
  className: "relative flex items-center h-full",
564
- children: [/* @__PURE__ */ jsxs("button", {
565
- type: "button",
566
- className: "btn btn-neutral",
425
+ children: [/* @__PURE__ */ jsx(Button, {
426
+ variant: "secondary",
427
+ size: "sm",
428
+ icon: copied ? /* @__PURE__ */ jsx(CheckIcon, { className: "text-green-500" }) : /* @__PURE__ */ jsx(CopyIcon, {}),
567
429
  onClick: copySelectedLines,
568
- children: [copied ? /* @__PURE__ */ jsx(FaCheck, { className: "text-green-500" }) : /* @__PURE__ */ jsx(FiCopy, {}), /* @__PURE__ */ jsx("span", { children: copied ? tCommon.copied : t.copyLines(selectedLines.size) })]
569
- }), /* @__PURE__ */ jsx("button", {
570
- type: "button",
571
- "aria-label": t.clearSelection,
572
- className: "absolute -top-1.5 -right-1.5 btn-neutral rounded-full p-1 border transition-colors shadow-sm cursor-pointer z-10",
573
- onClick: () => setSelectedLines(/* @__PURE__ */ new Set()),
574
- title: t.clearSelection,
575
- children: /* @__PURE__ */ jsx(FiX, { className: "text-[10px]" })
430
+ children: copied ? common.copied : t.copyLines(selectedLines.size)
431
+ }), /* @__PURE__ */ jsx("span", {
432
+ className: "absolute -top-2 -right-2 z-10 rounded-md shadow-sm",
433
+ children: /* @__PURE__ */ jsx(IconButton, {
434
+ variant: "secondary",
435
+ size: "xs",
436
+ label: t.clearSelection,
437
+ icon: /* @__PURE__ */ jsx(CloseIcon, {}),
438
+ onClick: () => setSelectedLines(/* @__PURE__ */ new Set())
439
+ })
576
440
  })]
577
- }) : /* @__PURE__ */ jsxs("button", {
578
- type: "button",
579
- className: "btn btn-neutral",
441
+ }) : /* @__PURE__ */ jsx(Button, {
442
+ variant: "secondary",
443
+ size: "sm",
444
+ icon: copied ? /* @__PURE__ */ jsx(CheckIcon, { className: "text-green-500" }) : /* @__PURE__ */ jsx(CopyIcon, {}),
580
445
  onClick: copyAllLogs,
581
- children: [copied ? /* @__PURE__ */ jsx(FaCheck, { className: "text-green-500" }) : /* @__PURE__ */ jsx(FiCopy, {}), /* @__PURE__ */ jsx("span", { children: copied ? tCommon.copied : t.copyAll })]
446
+ children: copied ? common.copied : t.copyAll
582
447
  }),
583
448
  additionalLeftBarComponents,
584
- enableWorkflowCommands && /* @__PURE__ */ jsx("button", {
585
- type: "button",
586
- className: clsx("btn btn-neutral", showDebug && "btn-active"),
449
+ enableWorkflowCommands && /* @__PURE__ */ jsx(Button, {
450
+ variant: "secondary",
451
+ size: "sm",
452
+ "aria-pressed": showDebug,
587
453
  onClick: () => setShowDebug((prev) => !prev),
588
- children: /* @__PURE__ */ jsx("span", { children: showDebug ? t.hideDebug : t.showDebug })
454
+ children: showDebug ? t.hideDebug : t.showDebug
589
455
  }),
590
- enableTimeRangeFilter && /* @__PURE__ */ jsxs("div", {
591
- className: "relative",
592
- children: [/* @__PURE__ */ jsxs("button", {
456
+ enableTimeRangeFilter && /* @__PURE__ */ jsxs(Popover, {
457
+ open: timeRangeOpen,
458
+ onOpenChange: setTimeRangeOpen,
459
+ align: "start",
460
+ "aria-label": t.filterByTimeRange,
461
+ className: "flex w-80 flex-col gap-y-3",
462
+ trigger: /* @__PURE__ */ jsxs("button", {
593
463
  type: "button",
594
- "data-time-range-trigger": true,
595
- className: "btn btn-neutral",
596
- onClick: () => setTimeRangeOpen((o) => !o),
464
+ className: buttonClasses({
465
+ variant: "secondary",
466
+ size: "sm"
467
+ }),
597
468
  children: [
598
- /* @__PURE__ */ jsx(FiClock, {}),
469
+ /* @__PURE__ */ jsx(ClockIcon, {}),
599
470
  /* @__PURE__ */ jsx("span", { children: t.timeRange }),
600
471
  (timeRangeFrom !== "" || timeRangeTo !== "") && /* @__PURE__ */ jsx("span", {
601
472
  title: t.timeRangeActive,
602
- className: "ml-1 px-1.5 py-0.5 text-[10px] rounded-full bg-[var(--theme-element)]/15 text-[var(--theme-element)]",
473
+ className: "ml-1 px-1.5 py-0.5 text-[10px] rounded-full bg-[var(--theme-accent)]/15 text-[var(--theme-accent)]",
603
474
  children: t.timeRangeOn
604
475
  })
605
476
  ]
606
- }), timeRangeOpen && /* @__PURE__ */ jsxs("div", {
607
- ref: timeRangePopoverRef,
608
- className: clsx("absolute top-full left-0 mt-1 z-50 w-80 p-3 rounded-lg shadow-lg", "border border-[var(--theme-border)] bg-[var(--theme-panel-bg)]", "flex flex-col gap-y-3"),
609
- children: [
610
- /* @__PURE__ */ jsxs("div", {
611
- className: "flex items-center gap-x-1.5",
612
- children: [/* @__PURE__ */ jsx("span", {
613
- className: "text-xs font-semibold text-[var(--theme-app)]",
614
- children: t.filterByTimeRange
615
- }), /* @__PURE__ */ jsx(InfoTip, { text: t.timeRangeHelp })]
616
- }),
617
- /* @__PURE__ */ jsxs("label", {
618
- className: "flex flex-col gap-y-1",
619
- children: [/* @__PURE__ */ jsx("span", {
620
- className: "text-[11px] uppercase tracking-wide text-[var(--theme-muted-text-color)]",
621
- children: t.timeRangeFrom
622
- }), /* @__PURE__ */ jsx("input", {
623
- type: "datetime-local",
624
- value: timeRangeFrom,
625
- onChange: (e) => setTimeRangeFrom(e.target.value),
626
- className: "rounded-md text-sm h-8 px-2 bg-[var(--theme-input-bg)] text-[var(--theme-input)] border border-[var(--theme-border)]"
627
- })]
628
- }),
629
- /* @__PURE__ */ jsxs("label", {
630
- className: "flex flex-col gap-y-1",
631
- children: [/* @__PURE__ */ jsx("span", {
632
- className: "text-[11px] uppercase tracking-wide text-[var(--theme-muted-text-color)]",
633
- children: t.timeRangeTo
634
- }), /* @__PURE__ */ jsx("input", {
635
- type: "datetime-local",
636
- value: timeRangeTo,
637
- onChange: (e) => setTimeRangeTo(e.target.value),
638
- className: "rounded-md text-sm h-8 px-2 bg-[var(--theme-input-bg)] text-[var(--theme-input)] border border-[var(--theme-border)]"
639
- })]
640
- }),
641
- timeRangeError !== "" && /* @__PURE__ */ jsx("span", {
642
- className: "text-[11px] text-red-500",
643
- children: t[timeRangeError]
644
- }),
645
- /* @__PURE__ */ jsxs("div", {
646
- className: "flex gap-x-2",
647
- children: [/* @__PURE__ */ jsx("button", {
648
- type: "button",
649
- disabled: timeRangeError !== "",
650
- className: "btn btn-primary flex-1 justify-center",
651
- onClick: () => {
652
- onTimeRangeChange?.(timeRangeFrom, timeRangeTo);
653
- setTimeRangeOpen(false);
654
- },
655
- children: t.apply
656
- }), (timeRangeFrom !== "" || timeRangeTo !== "") && /* @__PURE__ */ jsx("button", {
657
- type: "button",
658
- className: "btn btn-neutral flex-1 justify-center",
659
- onClick: () => {
660
- setTimeRangeFrom("");
661
- setTimeRangeTo("");
662
- onTimeRangeChange?.("", "");
663
- setTimeRangeOpen(false);
664
- },
665
- children: t.clear
666
- })]
667
- })
668
- ]
669
- })]
477
+ }),
478
+ children: [
479
+ /* @__PURE__ */ jsxs("div", {
480
+ className: "flex items-center gap-x-1.5",
481
+ children: [/* @__PURE__ */ jsx("span", {
482
+ className: "text-xs font-semibold text-[var(--theme-app)]",
483
+ children: t.filterByTimeRange
484
+ }), /* @__PURE__ */ jsx(InfoTip, { text: t.timeRangeHelp })]
485
+ }),
486
+ /* @__PURE__ */ jsxs("div", {
487
+ className: "flex flex-col gap-y-1",
488
+ children: [/* @__PURE__ */ jsx("span", {
489
+ id: `${timeRangeId}-timeRangeFrom`,
490
+ className: "text-[11px] uppercase tracking-wide text-[var(--theme-muted-text-color)]",
491
+ children: t.timeRangeFrom
492
+ }), /* @__PURE__ */ jsx(DatePicker, {
493
+ withTime: true,
494
+ "aria-labelledby": `${timeRangeId}-timeRangeFrom`,
495
+ value: timeRangeFrom,
496
+ onValueChange: setTimeRangeFrom
497
+ })]
498
+ }),
499
+ /* @__PURE__ */ jsxs("div", {
500
+ className: "flex flex-col gap-y-1",
501
+ children: [/* @__PURE__ */ jsx("span", {
502
+ id: `${timeRangeId}-timeRangeTo`,
503
+ className: "text-[11px] uppercase tracking-wide text-[var(--theme-muted-text-color)]",
504
+ children: t.timeRangeTo
505
+ }), /* @__PURE__ */ jsx(DatePicker, {
506
+ withTime: true,
507
+ "aria-labelledby": `${timeRangeId}-timeRangeTo`,
508
+ value: timeRangeTo,
509
+ onValueChange: setTimeRangeTo
510
+ })]
511
+ }),
512
+ timeRangeError !== "" && /* @__PURE__ */ jsx("span", {
513
+ className: "text-[11px] text-red-500",
514
+ children: t[timeRangeError]
515
+ }),
516
+ /* @__PURE__ */ jsxs("div", {
517
+ className: "flex gap-x-2",
518
+ children: [/* @__PURE__ */ jsx(Button, {
519
+ variant: "primary",
520
+ size: "sm",
521
+ disabled: timeRangeError !== "",
522
+ className: "flex-1",
523
+ onClick: () => {
524
+ onTimeRangeChange?.(timeRangeFrom, timeRangeTo);
525
+ setTimeRangeOpen(false);
526
+ },
527
+ children: common.apply
528
+ }), (timeRangeFrom !== "" || timeRangeTo !== "") && /* @__PURE__ */ jsx(Button, {
529
+ variant: "secondary",
530
+ size: "sm",
531
+ className: "flex-1",
532
+ onClick: () => {
533
+ setTimeRangeFrom("");
534
+ setTimeRangeTo("");
535
+ onTimeRangeChange?.("", "");
536
+ setTimeRangeOpen(false);
537
+ },
538
+ children: common.clear
539
+ })]
540
+ })
541
+ ]
670
542
  })
671
543
  ]
672
544
  }),
673
- /* @__PURE__ */ jsx("input", {
674
- type: "text",
675
- className: "rounded-md text-sm h-8",
676
- placeholder: t.filterLogs,
677
- onChange: handleFilterChange
545
+ /* @__PURE__ */ jsx(SearchInput, {
546
+ label: t.filterLogs,
547
+ value: filter,
548
+ onValueChange: handleFilterChange,
549
+ className: "w-48"
678
550
  }),
679
551
  /* @__PURE__ */ jsxs("a", {
680
- href: logUrl,
681
- className: clsx(!logUrl && "disabled", "btn btn-neutral"),
552
+ href: logUrl || void 0,
553
+ "aria-disabled": !logUrl || void 0,
554
+ className: buttonClasses({
555
+ variant: "secondary",
556
+ size: "sm"
557
+ }),
682
558
  download: true,
683
- children: [/* @__PURE__ */ jsx(FaCloudDownloadAlt, {}), /* @__PURE__ */ jsx("span", { children: t.download })]
559
+ children: [/* @__PURE__ */ jsx(DownloadIcon, {}), common.download]
684
560
  }),
685
- /* @__PURE__ */ jsxs("button", {
686
- type: "button",
687
- className: clsx("btn btn-neutral", hideExpand && "hidden"),
561
+ !hideExpand && /* @__PURE__ */ jsx(Button, {
562
+ variant: "secondary",
563
+ size: "sm",
564
+ icon: /* @__PURE__ */ jsx(ExpandButtonIcon, {}),
688
565
  onClick: () => setFullscreen((prev) => !prev),
689
- children: [/* @__PURE__ */ jsx(ExpandButtonIcon, {}), /* @__PURE__ */ jsx("span", { children: expandButtonText })]
566
+ children: expandButtonText
690
567
  })
691
568
  ]
692
569
  }), additionalRightBarComponents]
@@ -694,7 +571,7 @@ function LogViewer({ log, height = "unset", width, roundedBottom = false, lineNu
694
571
  /* @__PURE__ */ jsxs("div", {
695
572
  "data-testid": "logviewer",
696
573
  role: "none",
697
- className: clsx(roundedBottom && "rounded-b-lg", "w-full overflow-x-auto", !inline && "h-full grow overflow-y-auto", !inline && "bg-(--theme-muted-panel-bg)", contentClassName),
574
+ className: cx(roundedBottom && "rounded-b-lg", "w-full overflow-x-auto", !inline && "h-full grow overflow-y-auto", !inline && "bg-(--theme-muted-panel-bg)", contentClassName),
698
575
  style: inline ? void 0 : {
699
576
  overflowY: "auto",
700
577
  position: "relative",
@@ -708,43 +585,52 @@ function LogViewer({ log, height = "unset", width, roundedBottom = false, lineNu
708
585
  loadingTop,
709
586
  onLoadOlder: onReachTop
710
587
  }), /* @__PURE__ */ jsx("div", {
711
- className: "min-w-max",
712
- style: inline ? void 0 : {
713
- paddingTop,
714
- paddingBottom
715
- },
716
- children: visibleLogs.map((item) => /* @__PURE__ */ jsx(LogLine, {
717
- index: item.index,
718
- segments: item.segments,
719
- lineNumbers,
720
- isSelected: selectedLines.has(item.index + 1),
721
- lineHeight: LINE_HEIGHT,
722
- onLineClick: handleLineClick,
723
- searchTerm: filter,
724
- command: enableWorkflowCommands ? item.command : void 0,
725
- groupDepth: enableWorkflowCommands ? item.groupDepth : 0,
726
- isGroupCollapsed: enableWorkflowCommands && item.command?.type === "group" ? collapsedGroups.has(item.index) : void 0,
727
- onGroupToggle: enableWorkflowCommands ? handleGroupToggle : void 0,
728
- annotationLabels
729
- }, item.index))
588
+ ref: listRef,
589
+ className: cx(!inline && "relative"),
590
+ style: inline ? void 0 : { height: virtualizer.getTotalSize() },
591
+ children: /* @__PURE__ */ jsx("div", {
592
+ className: cx("min-w-max", !inline && "absolute top-0 left-0 min-w-full"),
593
+ style: inline ? void 0 : { transform: `translateY(${offset}px)` },
594
+ children: visibleLogs.map(({ item, index }) => /* @__PURE__ */ jsx("div", {
595
+ "data-index": index,
596
+ ref: inline ? void 0 : virtualizer.measureElement,
597
+ children: /* @__PURE__ */ jsx(LogLine, {
598
+ index: item.index,
599
+ segments: item.segments,
600
+ lineNumbers,
601
+ isSelected: selectedLines.has(item.index + 1),
602
+ lineHeight: LINE_HEIGHT,
603
+ onLineClick: handleLineClick,
604
+ searchTerm: filter,
605
+ command: enableWorkflowCommands ? item.command : void 0,
606
+ groupDepth: enableWorkflowCommands ? item.groupDepth : 0,
607
+ isGroupCollapsed: enableWorkflowCommands && item.command?.type === "group" ? collapsedGroups.has(item.index) : void 0,
608
+ onGroupToggle: enableWorkflowCommands ? handleGroupToggle : void 0,
609
+ annotationLabels
610
+ })
611
+ }, item.index))
612
+ })
730
613
  })]
731
614
  }),
732
- highlightCopyPosition && highlightedText && /* @__PURE__ */ jsx("button", {
733
- type: "button",
734
- "data-highlight-copy-button": true,
735
- className: clsx("fixed z-[10000] flex items-center gap-1 px-2 py-1.5 text-xs font-medium", "rounded-md shadow-lg border cursor-pointer transition-colors duration-150", "bg-(--theme-panel-bg) border-(--theme-border) hover:bg-(--theme-hover) text-(--theme-app)"),
736
- style: {
737
- left: highlightCopyPosition.x,
738
- top: highlightCopyPosition.y + 8,
739
- transform: "translateX(-50%)"
740
- },
741
- onClick: copyHighlightedText,
742
- children: copied ? /* @__PURE__ */ jsxs(Fragment, { children: [/* @__PURE__ */ jsx(FaCheck, { className: "text-green-500 w-3.5 h-3.5" }), /* @__PURE__ */ jsx("span", { children: tCommon.copied })] }) : /* @__PURE__ */ jsxs(Fragment, { children: [/* @__PURE__ */ jsx(FiCopy, { className: "w-3.5 h-3.5" }), /* @__PURE__ */ jsx("span", { children: tCommon.copy })] })
615
+ selection && /* @__PURE__ */ jsx(Popover, {
616
+ open: true,
617
+ onOpenChange: (open) => !open && setSelection(null),
618
+ at: selection.at,
619
+ initialFocus: "none",
620
+ "aria-label": common.copy,
621
+ className: "p-1",
622
+ children: /* @__PURE__ */ jsx(Button, {
623
+ variant: "ghost",
624
+ size: "xs",
625
+ icon: /* @__PURE__ */ jsx(CopyIcon, {}),
626
+ onClick: copySelection,
627
+ children: common.copy
628
+ })
743
629
  }),
744
630
  (additionalBottomLeftBarComponents || additionalBottomRightBarComponents) && /* @__PURE__ */ jsxs("div", {
745
631
  className: "flex theme-panel select-none items-center gap-x-2 p-2",
746
632
  children: [/* @__PURE__ */ jsx("div", {
747
- className: clsx("w-full flex flex-row gap-x-2 items-center", hideExpand && "justify-between"),
633
+ className: cx("w-full flex flex-row gap-x-2 items-center", hideExpand && "justify-between"),
748
634
  children: /* @__PURE__ */ jsx("div", {
749
635
  className: "flex gap-x-2 w-full",
750
636
  children: additionalBottomLeftBarComponents