@parallelworks/ui 0.40.1 → 0.42.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 (289) hide show
  1. package/README.md +25 -0
  2. package/dist/ai/adapter/memoryStore.js +7 -0
  3. package/dist/ai/adapter/mock/mockAdapter.js +52 -17
  4. package/dist/ai/adapter/openai/createOpenAIStream.js +1 -1
  5. package/dist/ai/adapter/openai/index.d.ts +1 -1
  6. package/dist/ai/adapter/openai/sse.d.ts +8 -2
  7. package/dist/ai/adapter/openai/sse.js +40 -4
  8. package/dist/ai/adapter/openai/wire.d.ts +6 -0
  9. package/dist/ai/components/AllocationSelector.d.ts +3 -4
  10. package/dist/ai/components/AllocationSelector.js +37 -33
  11. package/dist/ai/components/AttachmentManager.js +7 -7
  12. package/dist/ai/components/AttachmentUpload.js +5 -5
  13. package/dist/ai/components/BranchNavigator.js +1 -1
  14. package/dist/ai/components/ChatEmptyState.js +2 -2
  15. package/dist/ai/components/ChatInput.js +10 -8
  16. package/dist/ai/components/ChatLayout.js +4 -5
  17. package/dist/ai/components/ChatMessage.js +12 -12
  18. package/dist/ai/components/ChatMessageList.js +9 -9
  19. package/dist/ai/components/ChatSidebar.js +8 -9
  20. package/dist/ai/components/ChatThread.js +4 -4
  21. package/dist/ai/components/ComposerChrome.d.ts +2 -2
  22. package/dist/ai/components/ComposerChrome.js +3 -6
  23. package/dist/ai/components/DragOverlay.js +2 -2
  24. package/dist/ai/components/ModelSelector.d.ts +5 -3
  25. package/dist/ai/components/ModelSelector.js +102 -339
  26. package/dist/ai/components/PastedText.js +11 -11
  27. package/dist/ai/components/ProviderIssueBanner.d.ts +2 -0
  28. package/dist/ai/components/ProviderIssueBanner.js +34 -16
  29. package/dist/ai/components/Reasoning.js +4 -4
  30. package/dist/ai/components/ShareDialog.js +43 -35
  31. package/dist/ai/components/SlashMenu.d.ts +12 -2
  32. package/dist/ai/components/SlashMenu.js +29 -13
  33. package/dist/ai/components/agent/ActivityLine.js +3 -3
  34. package/dist/ai/components/agent/AgentMessageParts.js +20 -20
  35. package/dist/ai/components/agent/PermissionPicker.js +13 -11
  36. package/dist/ai/components/conversationActions.d.ts +4 -6
  37. package/dist/ai/components/conversationActions.js +9 -13
  38. package/dist/ai/core/ChatProvider.js +4 -4
  39. package/dist/ai/core/config.js +1 -1
  40. package/dist/ai/core/parts.d.ts +5 -0
  41. package/dist/ai/core/parts.js +28 -1
  42. package/dist/ai/core/providerIssues.d.ts +7 -0
  43. package/dist/ai/core/providerIssues.js +9 -1
  44. package/dist/ai/core/useKeyboardShortcuts.d.ts +4 -0
  45. package/dist/ai/core/useKeyboardShortcuts.js +8 -2
  46. package/dist/ai/index.d.ts +0 -1
  47. package/dist/ai/index.js +1 -2
  48. package/dist/ai/strings.d.ts +19 -0
  49. package/dist/ai/strings.js +18 -1
  50. package/dist/ai/ui/Avatar.js +5 -5
  51. package/dist/ai/ui/ConversationSidebar.d.ts +0 -1
  52. package/dist/ai/ui/ConversationSidebar.js +6 -7
  53. package/dist/ai/ui/Markdown.js +3 -3
  54. package/dist/ai/ui/Notice.js +6 -6
  55. package/dist/ai/ui/chip.d.ts +4 -0
  56. package/dist/ai/ui/chip.js +8 -0
  57. package/dist/ai/ui/sidebar.d.ts +6 -5
  58. package/dist/ai/ui/sidebar.js +39 -43
  59. package/dist/components/ActionMenu.d.ts +13 -0
  60. package/dist/components/ActionMenu.js +30 -0
  61. package/dist/components/Avatar.js +6 -6
  62. package/dist/components/Breadcrumbs.js +1 -1
  63. package/dist/components/Button.js +10 -10
  64. package/dist/components/Callout.js +2 -2
  65. package/dist/components/Card.js +3 -3
  66. package/dist/components/Combobox.d.ts +66 -0
  67. package/dist/components/Combobox.js +393 -0
  68. package/dist/components/ConfirmModal.js +11 -11
  69. package/dist/components/ContextMenu.d.ts +23 -0
  70. package/dist/components/ContextMenu.js +89 -0
  71. package/dist/components/CopyToClipboard.js +2 -2
  72. package/dist/components/CreateModal.d.ts +17 -36
  73. package/dist/components/CreateModal.js +97 -259
  74. package/dist/components/DescriptionList.js +8 -8
  75. package/dist/components/Filter.js +2 -2
  76. package/dist/components/FilterPill.js +2 -2
  77. package/dist/components/HoverCard.d.ts +14 -0
  78. package/dist/components/HoverCard.js +33 -0
  79. package/dist/components/IconButton.d.ts +5 -5
  80. package/dist/components/IconButton.js +18 -22
  81. package/dist/components/InfoTip.d.ts +15 -0
  82. package/dist/components/InfoTip.js +60 -0
  83. package/dist/components/Input.js +5 -5
  84. package/dist/components/LetterBadge.js +2 -2
  85. package/dist/components/Loader.js +3 -3
  86. package/dist/components/Markdown.js +1 -1
  87. package/dist/components/MarkdownImpl.js +2 -2
  88. package/dist/components/Menu.d.ts +33 -0
  89. package/dist/components/Menu.js +86 -0
  90. package/dist/components/MenuEntries.d.ts +56 -0
  91. package/dist/components/MenuEntries.js +123 -0
  92. package/dist/components/Modal.d.ts +29 -0
  93. package/dist/components/Modal.js +47 -0
  94. package/dist/components/Overview.js +11 -10
  95. package/dist/components/PageHeader.d.ts +10 -16
  96. package/dist/components/PageHeader.js +69 -95
  97. package/dist/components/Pagination.js +5 -5
  98. package/dist/components/Provider.d.ts +5 -11
  99. package/dist/components/Provider.js +11 -14
  100. package/dist/components/Radio.d.ts +8 -0
  101. package/dist/components/Radio.js +16 -0
  102. package/dist/components/SectionHeader.js +2 -2
  103. package/dist/components/SegmentedControl.d.ts +6 -5
  104. package/dist/components/SegmentedControl.js +34 -30
  105. package/dist/components/Select.d.ts +27 -0
  106. package/dist/components/Select.js +78 -0
  107. package/dist/components/SettingModeOption.d.ts +5 -8
  108. package/dist/components/SettingModeOption.js +10 -12
  109. package/dist/components/SettingRow.js +4 -4
  110. package/dist/components/SettingsCard.js +4 -4
  111. package/dist/components/SettingsGroup.js +2 -2
  112. package/dist/components/Sort.js +1 -1
  113. package/dist/components/StatusBadge.js +7 -7
  114. package/dist/components/StatusIcons.js +4 -4
  115. package/dist/components/Switch.d.ts +22 -0
  116. package/dist/components/Switch.js +28 -0
  117. package/dist/components/Table.js +11 -11
  118. package/dist/components/Tooltip.d.ts +24 -20
  119. package/dist/components/Tooltip.js +58 -76
  120. package/dist/components/floating.d.ts +14 -0
  121. package/dist/components/floating.js +21 -0
  122. package/dist/components/search.d.ts +2 -0
  123. package/dist/components/search.js +14 -0
  124. package/dist/editor/Editor.js +1 -1
  125. package/dist/editor/EditorField.js +16 -21
  126. package/dist/editor/FormCodePanel.js +19 -19
  127. package/dist/editor/Monaco.js +3 -3
  128. package/dist/file-explorer/FileExplorer.js +77 -81
  129. package/dist/file-explorer/FileExplorerContext.js +2 -2
  130. package/dist/file-explorer/FilePreview/CodePreviewEditor.js +1 -1
  131. package/dist/file-explorer/FilePreview/Inline.js +1 -1
  132. package/dist/file-explorer/FilePreview/StreamedBadge.js +5 -6
  133. package/dist/file-explorer/FilePreview/Viewer.js +8 -8
  134. package/dist/file-explorer/FilePreview/index.d.ts +1 -1
  135. package/dist/file-explorer/FilePreview/index.js +49 -83
  136. package/dist/file-explorer/FileRow.d.ts +4 -3
  137. package/dist/file-explorer/FileRow.js +32 -38
  138. package/dist/file-explorer/FileRowsWindow.d.ts +3 -2
  139. package/dist/file-explorer/FileRowsWindow.js +4 -4
  140. package/dist/file-explorer/FileTable.d.ts +3 -2
  141. package/dist/file-explorer/FileTable.js +3 -3
  142. package/dist/file-explorer/LoadMoreRow.js +1 -1
  143. package/dist/file-explorer/TreeView.js +11 -16
  144. package/dist/file-explorer/helpers.js +11 -12
  145. package/dist/file-explorer/toasts.js +11 -11
  146. package/dist/form/FieldGroup.d.ts +11 -0
  147. package/dist/form/FieldGroup.js +36 -0
  148. package/dist/form/FieldWrapper.js +4 -4
  149. package/dist/form/Fields/BooleanField.js +23 -33
  150. package/dist/form/Fields/CheckboxGroupField.d.ts +1 -1
  151. package/dist/form/Fields/CheckboxGroupField.js +9 -13
  152. package/dist/form/Fields/ColorField.d.ts +1 -2
  153. package/dist/form/Fields/ColorField.js +6 -11
  154. package/dist/form/Fields/DropdownField.d.ts +3 -13
  155. package/dist/form/Fields/DropdownField.js +40 -27
  156. package/dist/form/Fields/DurationField.d.ts +1 -2
  157. package/dist/form/Fields/DurationField.js +25 -32
  158. package/dist/form/Fields/LabelField.js +2 -2
  159. package/dist/form/Fields/MultiDropdownField.d.ts +6 -12
  160. package/dist/form/Fields/MultiDropdownField.js +31 -22
  161. package/dist/form/Fields/NumberField.d.ts +1 -1
  162. package/dist/form/Fields/NumberField.js +65 -35
  163. package/dist/form/Fields/ObjectField.d.ts +1 -1
  164. package/dist/form/Fields/ObjectField.js +12 -43
  165. package/dist/form/Fields/RadioField.d.ts +1 -1
  166. package/dist/form/Fields/RadioField.js +30 -41
  167. package/dist/form/Fields/RangeField.d.ts +1 -2
  168. package/dist/form/Fields/RangeField.js +23 -16
  169. package/dist/form/Fields/StringField.d.ts +1 -2
  170. package/dist/form/Fields/StringField.js +58 -26
  171. package/dist/form/Fields/TextAreaField.js +12 -10
  172. package/dist/form/Form.d.ts +30 -48
  173. package/dist/form/Form.js +306 -412
  174. package/dist/form/FormLayout.js +9 -9
  175. package/dist/form/Wizard/WizardContainer.d.ts +1 -4
  176. package/dist/form/Wizard/WizardContainer.js +40 -56
  177. package/dist/form/Wizard/WizardNavigation.js +1 -1
  178. package/dist/form/Wizard/WizardStepContent.d.ts +1 -5
  179. package/dist/form/Wizard/WizardStepContent.js +11 -16
  180. package/dist/form/Wizard/WizardStepIndicator.js +6 -6
  181. package/dist/form/Wizard/types.d.ts +0 -14
  182. package/dist/form/fieldRegistry.d.ts +1 -1
  183. package/dist/form/fieldRegistry.js +6 -6
  184. package/dist/form/formEditing.js +1 -1
  185. package/dist/form/index.d.ts +5 -4
  186. package/dist/form/index.js +6 -7
  187. package/dist/form/types/fieldComponentTypes.d.ts +8 -10
  188. package/dist/form/useChoiceField.d.ts +20 -0
  189. package/dist/form/useChoiceField.js +49 -0
  190. package/dist/form/useFieldValue.d.ts +7 -0
  191. package/dist/form/useFieldValue.js +20 -0
  192. package/dist/form/useParsedOpts.d.ts +3 -1
  193. package/dist/form/useParsedOpts.js +12 -17
  194. package/dist/form/utils/dependentOptions.d.ts +8 -4
  195. package/dist/form/utils/dependentOptions.js +25 -17
  196. package/dist/form/utils/fieldItems.d.ts +10 -0
  197. package/dist/form/utils/fieldItems.js +11 -0
  198. package/dist/form/utils/fieldPath.d.ts +10 -0
  199. package/dist/form/utils/fieldPath.js +20 -0
  200. package/dist/form/utils/shareEqual.d.ts +6 -0
  201. package/dist/form/utils/shareEqual.js +38 -0
  202. package/dist/graph/AnnotationBanner.js +8 -8
  203. package/dist/graph/Collapse.d.ts +1 -0
  204. package/dist/graph/Collapse.js +6 -27
  205. package/dist/graph/Connectors.js +5 -5
  206. package/dist/graph/DependencyGraph.js +20 -19
  207. package/dist/graph/GraphEditor.js +30 -41
  208. package/dist/graph/GraphEditorDialogs.js +17 -17
  209. package/dist/graph/GraphNode.js +1 -1
  210. package/dist/graph/InputDialog.js +19 -22
  211. package/dist/graph/InputsEditor.js +58 -66
  212. package/dist/graph/JobSummary.js +42 -39
  213. package/dist/graph/MatrixGroup.js +1 -1
  214. package/dist/graph/ProblemsButton.js +18 -19
  215. package/dist/graph/Reveal.js +1 -1
  216. package/dist/graph/ShortcutsButton.js +15 -18
  217. package/dist/graph/SuggestionInput.d.ts +5 -10
  218. package/dist/graph/SuggestionInput.js +14 -18
  219. package/dist/graph/ToolbarPopover.d.ts +11 -6
  220. package/dist/graph/ToolbarPopover.js +35 -67
  221. package/dist/graph/TreeView.js +24 -37
  222. package/dist/graph/WorkflowSettingsDialog.js +4 -4
  223. package/dist/graph/editorChrome.js +13 -12
  224. package/dist/graph/editorFields.js +29 -29
  225. package/dist/graph/editorPrimitives.d.ts +1 -1
  226. package/dist/graph/editorPrimitives.js +10 -7
  227. package/dist/graph/editorRows.js +103 -97
  228. package/dist/graph/fieldProblems.js +2 -2
  229. package/dist/graph/graphEditorState.d.ts +4 -3
  230. package/dist/graph/inputRefs.js +9 -9
  231. package/dist/graph/settingsViews.js +6 -7
  232. package/dist/graph/stepWith.js +6 -6
  233. package/dist/index.d.ts +14 -15
  234. package/dist/index.js +15 -14
  235. package/dist/list/ActionToolbar.d.ts +6 -14
  236. package/dist/list/ActionToolbar.js +48 -96
  237. package/dist/list/ListPage.d.ts +6 -12
  238. package/dist/list/ListPage.js +46 -29
  239. package/dist/list/ListPager.js +4 -4
  240. package/dist/list/ListTable.js +5 -5
  241. package/dist/list/ListViewControls.d.ts +5 -4
  242. package/dist/list/ListViewControls.js +177 -267
  243. package/dist/list/UserHoverCard.d.ts +3 -17
  244. package/dist/list/UserHoverCard.js +21 -45
  245. package/dist/list/index.d.ts +3 -4
  246. package/dist/list/index.js +3 -4
  247. package/dist/list/listSearch.js +12 -11
  248. package/dist/list/rowMenu.d.ts +63 -0
  249. package/dist/list/rowMenu.js +134 -0
  250. package/dist/logviewer/LogViewer.js +26 -26
  251. package/dist/styles.css +1 -1
  252. package/package.json +7 -13
  253. package/dist/ai/ui/Dropdown.d.ts +0 -31
  254. package/dist/ai/ui/Dropdown.js +0 -110
  255. package/dist/components/AddMenu.d.ts +0 -18
  256. package/dist/components/AddMenu.js +0 -46
  257. package/dist/components/BareModal.d.ts +0 -17
  258. package/dist/components/BareModal.js +0 -77
  259. package/dist/components/CollapsiblePanel.d.ts +0 -27
  260. package/dist/components/CollapsiblePanel.js +0 -77
  261. package/dist/components/Dropdown.d.ts +0 -28
  262. package/dist/components/Dropdown.js +0 -355
  263. package/dist/components/Listbox.d.ts +0 -21
  264. package/dist/components/Listbox.js +0 -119
  265. package/dist/components/MultiSelect.d.ts +0 -22
  266. package/dist/components/MultiSelect.js +0 -168
  267. package/dist/components/SwitchToggle.d.ts +0 -15
  268. package/dist/components/SwitchToggle.js +0 -57
  269. package/dist/components/SwitchToggleSmall.d.ts +0 -6
  270. package/dist/components/SwitchToggleSmall.js +0 -14
  271. package/dist/components/Toggle.d.ts +0 -6
  272. package/dist/components/Toggle.js +0 -20
  273. package/dist/components/dropdownUtils.d.ts +0 -37
  274. package/dist/components/dropdownUtils.js +0 -99
  275. package/dist/form/SpecialTypes/DropdownWrapper.d.ts +0 -25
  276. package/dist/form/SpecialTypes/DropdownWrapper.js +0 -28
  277. package/dist/form/SpecialTypes/FormikCustomDropdown.d.ts +0 -51
  278. package/dist/form/SpecialTypes/FormikCustomDropdown.js +0 -119
  279. package/dist/form/SpecialTypes/FormikCustomInput.d.ts +0 -19
  280. package/dist/form/SpecialTypes/FormikCustomInput.js +0 -121
  281. package/dist/form/SpecialTypes/FormikMultiSelectDropdown.d.ts +0 -13
  282. package/dist/form/SpecialTypes/FormikMultiSelectDropdown.js +0 -31
  283. package/dist/form/SpecialTypes/FormikNumericInput.d.ts +0 -9
  284. package/dist/form/SpecialTypes/FormikNumericInput.js +0 -60
  285. package/dist/form/SpecialTypes/index.d.ts +0 -3
  286. package/dist/list/HoverCard.d.ts +0 -24
  287. package/dist/list/HoverCard.js +0 -73
  288. package/dist/list/RowContextMenu.d.ts +0 -127
  289. package/dist/list/RowContextMenu.js +0 -515
@@ -1,31 +1,11 @@
1
- import { useLink, useNotify, useStrings } from "../components/Provider.js";
2
1
  import { FiCopy } from "../icons/fi/FiCopy.js";
3
- import "../components/Tooltip.js";
2
+ import { Tooltip } from "../components/Tooltip.js";
3
+ import { useLink, useNotify, useStrings } from "../components/Provider.js";
4
4
  import { Avatar } from "../components/Avatar.js";
5
- import { HoverCardSurface, useHoverCard } from "./HoverCard.js";
6
- import cx from "classnames";
5
+ import { clsx } from "clsx";
7
6
  import { Fragment, jsx, jsxs } from "react/jsx-runtime";
8
7
  //#region src/list/UserHoverCard.tsx
9
- /** Opens `card` after a short hover or on focus of `children`. */
10
- function HoverCardTrigger({ className, children, card }) {
11
- const { triggerRef, coords, scheduleOpen, scheduleClose, keepOpen } = useHoverCard();
12
- return /* @__PURE__ */ jsxs("span", {
13
- ref: triggerRef,
14
- role: "none",
15
- className,
16
- onMouseEnter: scheduleOpen,
17
- onMouseLeave: scheduleClose,
18
- onFocus: scheduleOpen,
19
- onBlur: scheduleClose,
20
- children: [children, coords && card({
21
- x: coords.x,
22
- y: coords.y,
23
- onKeepOpen: keepOpen,
24
- onLeave: scheduleClose
25
- })]
26
- });
27
- }
28
- function UserHoverCard({ x, y, onKeepOpen, onLeave, username, name, avatarSrc, badge, href, linkComponent, loading = false, relayoutKey, children }) {
8
+ function UserHoverCard({ username, name, avatarSrc, badge, href, linkComponent, loading = false, children }) {
29
9
  const strings = useStrings();
30
10
  const notify = useNotify();
31
11
  const SlotLink = useLink();
@@ -56,30 +36,26 @@ function UserHoverCard({ x, y, onKeepOpen, onLeave, username, name, avatarSrc, b
56
36
  const t = strings.list;
57
37
  const copyLabel = EMAIL.test(username) ? t.labelEmail : t.labelUsername;
58
38
  const onCopy = () => navigator.clipboard?.writeText(username).then(() => notify.success(t.copied(copyLabel)), () => notify.error(t.couldntCopy(copyLabel)));
59
- return /* @__PURE__ */ jsxs(HoverCardSurface, {
60
- x,
61
- y,
62
- widthClassName: "w-64",
63
- relayoutKey,
64
- onKeepOpen,
65
- onLeave,
39
+ return /* @__PURE__ */ jsxs("div", {
40
+ className: "w-64 p-3",
66
41
  children: [/* @__PURE__ */ jsxs("div", {
67
42
  className: "group/copy flex items-end gap-1",
68
43
  children: [href ? /* @__PURE__ */ jsx(Link, {
69
- to: href,
44
+ href,
70
45
  className: "flex min-w-0 flex-1 items-start gap-3 transition-opacity hover:opacity-80",
71
46
  children: header
72
47
  }) : /* @__PURE__ */ jsx("div", {
73
48
  className: "flex min-w-0 flex-1 items-start gap-3",
74
49
  children: header
75
- }), username && /* @__PURE__ */ jsx("button", {
76
- type: "button",
77
- "aria-label": t.copy(copyLabel),
78
- "data-tooltip-id": "global-tooltip",
79
- "data-tooltip-content": t.copy(copyLabel),
80
- onClick: onCopy,
81
- className: cx("shrink-0 cursor-pointer rounded p-0.5 text-(--theme-muted-text-color) opacity-0 transition hover:bg-(--theme-muted-panel-bg) hover:text-(--theme-app) [&>svg]:h-3.5 [&>svg]:w-3.5", "hover:opacity-100 group-has-[[data-copy-value]:hover]/copy:opacity-100 focus-visible:opacity-100 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-(--theme-link) pointer-coarse:opacity-100"),
82
- children: /* @__PURE__ */ jsx(FiCopy, { "aria-hidden": "true" })
50
+ }), username && /* @__PURE__ */ jsx(Tooltip, {
51
+ content: t.copy(copyLabel),
52
+ children: /* @__PURE__ */ jsx("button", {
53
+ type: "button",
54
+ "aria-label": t.copy(copyLabel),
55
+ onClick: onCopy,
56
+ className: clsx("shrink-0 cursor-pointer rounded p-0.5 text-(--theme-muted-text-color) opacity-0 transition hover:bg-(--theme-muted-panel-bg) hover:text-(--theme-app) [&>svg]:h-3.5 [&>svg]:w-3.5", "hover:opacity-100 group-has-[[data-copy-value]:hover]/copy:opacity-100 focus-visible:opacity-100 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-(--theme-link) pointer-coarse:opacity-100"),
57
+ children: /* @__PURE__ */ jsx(FiCopy, { "aria-hidden": "true" })
58
+ })
83
59
  })]
84
60
  }), loading ? /* @__PURE__ */ jsxs("div", {
85
61
  role: "status",
@@ -112,10 +88,10 @@ var rowClasses = "flex gap-2 text-(--theme-muted-text-color)";
112
88
  function HoverCardRow({ icon, children, title, align = "center", truncate = false, onClick }) {
113
89
  const content = /* @__PURE__ */ jsxs(Fragment, { children: [/* @__PURE__ */ jsx("span", {
114
90
  "aria-hidden": "true",
115
- className: cx("flex shrink-0 items-center [&>svg]:h-3.5 [&>svg]:w-3.5", align === "start" && "mt-0.5"),
91
+ className: clsx("flex shrink-0 items-center [&>svg]:h-3.5 [&>svg]:w-3.5", align === "start" && "mt-0.5"),
116
92
  children: icon
117
93
  }), /* @__PURE__ */ jsx("span", {
118
- className: cx("min-w-0", truncate && "truncate"),
94
+ className: clsx("min-w-0", truncate && "truncate"),
119
95
  children
120
96
  })] });
121
97
  const alignClass = align === "start" ? "items-start" : "items-center";
@@ -123,14 +99,14 @@ function HoverCardRow({ icon, children, title, align = "center", truncate = fals
123
99
  type: "button",
124
100
  title,
125
101
  onClick,
126
- className: cx(rowClasses, alignClass, "-mx-1 max-w-full rounded px-1 py-0.5 text-left transition-colors hover:bg-(--theme-muted-panel-bg) hover:text-(--theme-app)"),
102
+ className: clsx(rowClasses, alignClass, "-mx-1 max-w-full rounded px-1 py-0.5 text-left transition-colors hover:bg-(--theme-muted-panel-bg) hover:text-(--theme-app)"),
127
103
  children: content
128
104
  });
129
105
  return /* @__PURE__ */ jsx("div", {
130
106
  title,
131
- className: cx(rowClasses, alignClass),
107
+ className: clsx(rowClasses, alignClass),
132
108
  children: content
133
109
  });
134
110
  }
135
111
  //#endregion
136
- export { HoverCardRow, HoverCardTrigger, UserHoverCard };
112
+ export { HoverCardRow, UserHoverCard };
@@ -1,11 +1,10 @@
1
1
  export { ActionToolbar, stickyTabsClasses, stickyTabsUnderHeaderClasses, stickyToolbarClasses, type ToolbarAction, ToolbarButton, type ToolbarItem, } from './ActionToolbar.js';
2
- export { HoverCardSurface, useHoverCard } from './HoverCard.js';
3
- export { ListColumns, ListPage, type ListPageProps, ListRow, ListRowActionsProvider, type ListSection, type PinnedRowAction, useListNavigate, } from './ListPage.js';
2
+ export { ListColumns, ListPage, type ListPageProps, ListRow, ListRowActionsProvider, type ListSection, useListNavigate, } from './ListPage.js';
4
3
  export { LIST_PAGE_SIZES, ListPager } from './ListPager.js';
5
4
  export { actionsColumnWidth, GroupRow, ListActionsHeader, ListError, ListSkeleton, listTableFixedProps, listTableProps, NAME_MIN_WIDTH_PX, NameCell, RowSelectCheckbox, } from './ListTable.js';
6
5
  export { AnchoredPopover, ListDisplayMenu, ListFilterMenu, listControlButtonClasses, } from './ListViewControls.js';
7
6
  export { ListCount, type ListSearch, ListSearchControl, useListSearch, } from './listSearch.js';
8
7
  export { type ActionDef, type ColumnDef, DEFAULT_ORDER, FAVORITE_ORDER, type FilterFacet, type ListView, type ListViewChrome, type ListViewConfig, type OrderByOption, useListView, } from './listView.js';
9
- export { assembleRowMenu, type CopyFields, type CopySubmenu, MoreButton, type OpenMenu, type RowAction, type RowMenuItem, rowContextMenuProps, toolbarActionToRowAction, toRowMenuItem, useCopySubmenu, useRowMenu, useRowMenuActive, } from './RowContextMenu.js';
8
+ export { assembleRowMenu, type CopyFields, type CopySubmenu, MoreButton, type RowAction, rowContextMenuProps, useCopySubmenu, useRowMenuActive, } from './rowMenu.js';
10
9
  export { isTextEntryContext } from './textEntry.js';
11
- export { type HoverCardPlacement, HoverCardRow, HoverCardTrigger, UserHoverCard, type UserHoverCardProps, } from './UserHoverCard.js';
10
+ export { HoverCardRow, UserHoverCard, type UserHoverCardProps, } from './UserHoverCard.js';
@@ -1,12 +1,11 @@
1
- import { MoreButton, assembleRowMenu, rowContextMenuProps, toRowMenuItem, toolbarActionToRowAction, useCopySubmenu, useRowMenu, useRowMenuActive } from "./RowContextMenu.js";
2
1
  import { ActionToolbar, ToolbarButton, stickyTabsClasses, stickyTabsUnderHeaderClasses, stickyToolbarClasses } from "./ActionToolbar.js";
3
- import { HoverCardSurface, useHoverCard } from "./HoverCard.js";
4
2
  import { GroupRow, ListActionsHeader, ListError, ListSkeleton, NAME_MIN_WIDTH_PX, NameCell, RowSelectCheckbox, actionsColumnWidth, listTableFixedProps, listTableProps } from "./ListTable.js";
3
+ import { MoreButton, assembleRowMenu, rowContextMenuProps, useCopySubmenu, useRowMenuActive } from "./rowMenu.js";
5
4
  import { ListColumns, ListPage, ListRow, ListRowActionsProvider, useListNavigate } from "./ListPage.js";
6
5
  import { isTextEntryContext } from "./textEntry.js";
7
6
  import { AnchoredPopover, ListDisplayMenu, ListFilterMenu, listControlButtonClasses } from "./ListViewControls.js";
8
7
  import { LIST_PAGE_SIZES, ListPager } from "./ListPager.js";
9
8
  import { ListCount, ListSearchControl, useListSearch } from "./listSearch.js";
10
9
  import { DEFAULT_ORDER, FAVORITE_ORDER, useListView } from "./listView.js";
11
- import { HoverCardRow, HoverCardTrigger, UserHoverCard } from "./UserHoverCard.js";
12
- export { ActionToolbar, AnchoredPopover, DEFAULT_ORDER, FAVORITE_ORDER, GroupRow, HoverCardRow, HoverCardSurface, HoverCardTrigger, LIST_PAGE_SIZES, ListActionsHeader, ListColumns, ListCount, ListDisplayMenu, ListError, ListFilterMenu, ListPage, ListPager, ListRow, ListRowActionsProvider, ListSearchControl, ListSkeleton, MoreButton, NAME_MIN_WIDTH_PX, NameCell, RowSelectCheckbox, ToolbarButton, UserHoverCard, actionsColumnWidth, assembleRowMenu, isTextEntryContext, listControlButtonClasses, listTableFixedProps, listTableProps, rowContextMenuProps, stickyTabsClasses, stickyTabsUnderHeaderClasses, stickyToolbarClasses, toRowMenuItem, toolbarActionToRowAction, useCopySubmenu, useHoverCard, useListNavigate, useListSearch, useListView, useRowMenu, useRowMenuActive };
10
+ import { HoverCardRow, UserHoverCard } from "./UserHoverCard.js";
11
+ export { ActionToolbar, AnchoredPopover, DEFAULT_ORDER, FAVORITE_ORDER, GroupRow, HoverCardRow, LIST_PAGE_SIZES, ListActionsHeader, ListColumns, ListCount, ListDisplayMenu, ListError, ListFilterMenu, ListPage, ListPager, ListRow, ListRowActionsProvider, ListSearchControl, ListSkeleton, MoreButton, NAME_MIN_WIDTH_PX, NameCell, RowSelectCheckbox, ToolbarButton, UserHoverCard, actionsColumnWidth, assembleRowMenu, isTextEntryContext, listControlButtonClasses, listTableFixedProps, listTableProps, rowContextMenuProps, stickyTabsClasses, stickyTabsUnderHeaderClasses, stickyToolbarClasses, useCopySubmenu, useListNavigate, useListSearch, useListView, useRowMenuActive };
@@ -1,11 +1,11 @@
1
1
  import { FaSearch } from "../icons/fa/FaSearch.js";
2
2
  import { FiX } from "../icons/fi/FiX.js";
3
- import { TOOLTIP_ID } from "../components/Tooltip.js";
3
+ import { Tooltip } from "../components/Tooltip.js";
4
4
  import { isTextEntryContext } from "./textEntry.js";
5
5
  import { listControlButtonClasses } from "./ListViewControls.js";
6
+ import { jsx, jsxs } from "react/jsx-runtime";
6
7
  import { useCallback, useEffect, useRef, useState } from "react";
7
8
  import { useLocalStorage } from "usehooks-ts";
8
- import { jsx, jsxs } from "react/jsx-runtime";
9
9
  //#region src/list/listSearch.tsx
10
10
  var NO_TERMS = [];
11
11
  /** Pass `enabled: false` to suspend the global ⌘F/`/` hijack (e.g. when search isn't shown and browser Find should stay active). */
@@ -114,15 +114,16 @@ function ListSearchControl({ search, placeholder, label = "Search" }) {
114
114
  })
115
115
  ]
116
116
  });
117
- return /* @__PURE__ */ jsx("button", {
118
- type: "button",
119
- onClick: search.openSearch,
120
- "aria-label": label,
121
- "data-tooltip-id": TOOLTIP_ID,
122
- "data-tooltip-content": label,
123
- "data-tooltip-shortcut": "⌘+F",
124
- className: listControlButtonClasses,
125
- children: /* @__PURE__ */ jsx(FaSearch, { className: "w-3.5 h-3.5" })
117
+ return /* @__PURE__ */ jsx(Tooltip, {
118
+ content: label,
119
+ shortcut: "⌘+F",
120
+ children: /* @__PURE__ */ jsx("button", {
121
+ type: "button",
122
+ onClick: search.openSearch,
123
+ "aria-label": label,
124
+ className: listControlButtonClasses,
125
+ children: /* @__PURE__ */ jsx(FaSearch, { className: "w-3.5 h-3.5" })
126
+ })
126
127
  });
127
128
  }
128
129
  function ListCount({ total, matches, filterActive, noun, nounPlural }) {
@@ -0,0 +1,63 @@
1
+ import type { MouseEvent as ReactMouseEvent, ReactNode } from 'react';
2
+ import type { OpenMenu } from '../components/ContextMenu.js';
3
+ import type { MenuAction, MenuEntry, MenuSubmenu } from '../components/MenuEntries.js';
4
+ /** An action on a row, which its menu lists and its pinned buttons show, named by `key`. */
5
+ export interface RowAction extends MenuAction {
6
+ key: string;
7
+ }
8
+ /** Assembles a row's context menu in the shared order: leading link(s) → middle
9
+ * actions → extra items → Copy submenu → trailing (destructive) actions last. */
10
+ export declare function assembleRowMenu({ lead, actions, exclude, order, trailing, extra, copy, }: {
11
+ /** Pre-built leading link(s), e.g. "View details". */
12
+ lead?: MenuEntry[];
13
+ /** The row's full action list. */
14
+ actions: RowAction[];
15
+ /** Keys already rendered in `lead`/`extra`; dropped from the middle. */
16
+ exclude?: string[];
17
+ /** Explicit middle order; keys absent from `actions` are skipped, keys absent from `order` are dropped. */
18
+ order?: string[];
19
+ /** Keys rendered last, in this order (default `['delete']`). */
20
+ trailing?: string[];
21
+ /** Items inserted after the middle actions and before Copy, e.g. a marketplace link. */
22
+ extra?: MenuEntry[];
23
+ /** The Copy submenu from `useCopySubmenu()`. */
24
+ copy?: MenuSubmenu | undefined;
25
+ }): MenuEntry[];
26
+ /** The pointer leaves a row for its menu, dropping CSS :hover; wrap openMenu here
27
+ * for an `active` flag that keeps the row lit while its menu is open. */
28
+ export declare function useRowMenuActive(openMenu: OpenMenu): {
29
+ active: boolean;
30
+ openMenu: OpenMenu;
31
+ };
32
+ /** Opens the row's menu on a right-click. Pass a function to build a large
33
+ * list's menus only when one opens, not on every render. */
34
+ export declare function rowContextMenuProps(openMenu: OpenMenu, entries: MenuEntry[] | (() => MenuEntry[])): {
35
+ onContextMenu: (e: ReactMouseEvent) => void;
36
+ };
37
+ export interface CopyFields {
38
+ name?: string | null | undefined;
39
+ /** Overrides the "name" label (raw, pre-translated) for entities whose primary field isn't a name, e.g. "domain". */
40
+ nameLabel?: string;
41
+ email?: string | null | undefined;
42
+ username?: string | null | undefined;
43
+ uid?: string | number | null | undefined;
44
+ id?: string | null | undefined;
45
+ url?: string | null | undefined;
46
+ extra?: {
47
+ label: string;
48
+ value?: string | null | undefined;
49
+ icon?: ReactNode;
50
+ }[] | undefined;
51
+ }
52
+ export type CopySubmenu = (fields: CopyFields) => MenuSubmenu;
53
+ /** Returns a builder for the Copy submenu, labeled from the provider's strings. */
54
+ export declare function useCopySubmenu(): CopySubmenu;
55
+ /** Opens a row's menu under itself. Shows on the row's hover or focus, and
56
+ * stays while its menu is `open`, though the pointer has left the row. */
57
+ export declare function MoreButton({ onOpen, open, visible, className, }: {
58
+ onOpen: (button: HTMLElement) => void;
59
+ open?: boolean;
60
+ /** Shows at rest too. */
61
+ visible?: boolean;
62
+ className?: string | undefined;
63
+ }): import("react").JSX.Element;
@@ -0,0 +1,134 @@
1
+ import { BsThreeDots } from "../icons/bs/BsThreeDots.js";
2
+ import { FaKey } from "../icons/fa/FaKey.js";
3
+ import { FaLink } from "../icons/fa/FaLink.js";
4
+ import { FaUser } from "../icons/fa/FaUser.js";
5
+ import { FiCopy } from "../icons/fi/FiCopy.js";
6
+ import { HiOutlineClipboardCopy } from "../icons/hi/HiOutlineClipboardCopy.js";
7
+ import { LuIdCard } from "../icons/lu/LuIdCard.js";
8
+ import { LuMail } from "../icons/lu/LuMail.js";
9
+ import { useStrings } from "../components/Provider.js";
10
+ import { clsx } from "clsx";
11
+ import { jsx } from "react/jsx-runtime";
12
+ import { useCallback, useState } from "react";
13
+ //#region src/list/rowMenu.tsx
14
+ /** Assembles a row's context menu in the shared order: leading link(s) → middle
15
+ * actions → extra items → Copy submenu → trailing (destructive) actions last. */
16
+ function assembleRowMenu({ lead = [], actions, exclude, order, trailing = ["delete"], extra = [], copy }) {
17
+ const trailingSet = new Set(trailing);
18
+ const excludeSet = new Set(exclude);
19
+ let middle = actions.filter((a) => !trailingSet.has(a.key) && !excludeSet.has(a.key));
20
+ if (order) {
21
+ const byKey = new Map(middle.map((a) => [a.key, a]));
22
+ middle = order.map((key) => byKey.get(key)).filter((a) => a !== void 0);
23
+ }
24
+ const trailingItems = trailing.map((key) => actions.find((a) => a.key === key)).filter((a) => a !== void 0);
25
+ return [
26
+ ...lead,
27
+ ...middle,
28
+ ...extra,
29
+ ...copy ? [copy] : [],
30
+ ...trailingItems
31
+ ];
32
+ }
33
+ /** The pointer leaves a row for its menu, dropping CSS :hover; wrap openMenu here
34
+ * for an `active` flag that keeps the row lit while its menu is open. */
35
+ function useRowMenuActive(openMenu) {
36
+ const [active, setActive] = useState(false);
37
+ return {
38
+ active,
39
+ openMenu: useCallback((at, items, options) => {
40
+ setActive(true);
41
+ openMenu(at, items, {
42
+ ...options,
43
+ onClose: () => {
44
+ setActive(false);
45
+ options?.onClose?.();
46
+ }
47
+ });
48
+ }, [openMenu])
49
+ };
50
+ }
51
+ /** Opens the row's menu on a right-click. Pass a function to build a large
52
+ * list's menus only when one opens, not on every render. */
53
+ function rowContextMenuProps(openMenu, entries) {
54
+ return { onContextMenu: (e) => {
55
+ const items = typeof entries === "function" ? entries() : entries;
56
+ e.preventDefault();
57
+ if (items.length > 0) e.stopPropagation();
58
+ openMenu(e, items);
59
+ } };
60
+ }
61
+ /** Returns a builder for the Copy submenu, labeled from the provider's strings. */
62
+ function useCopySubmenu() {
63
+ const { list: t } = useStrings();
64
+ return useCallback(({ name, nameLabel, email, username, uid, id, url, extra }) => {
65
+ const fields = [
66
+ {
67
+ label: nameLabel ?? t.labelName,
68
+ value: name,
69
+ icon: /* @__PURE__ */ jsx(FiCopy, {})
70
+ },
71
+ {
72
+ label: t.labelEmail,
73
+ value: email,
74
+ icon: /* @__PURE__ */ jsx(LuMail, {})
75
+ },
76
+ {
77
+ label: t.labelUsername,
78
+ value: username,
79
+ icon: /* @__PURE__ */ jsx(FaUser, {})
80
+ },
81
+ {
82
+ label: t.labelUid,
83
+ value: uid === null || uid === void 0 ? null : String(uid),
84
+ icon: /* @__PURE__ */ jsx(FaKey, {})
85
+ },
86
+ {
87
+ label: t.labelId,
88
+ value: id,
89
+ icon: /* @__PURE__ */ jsx(LuIdCard, {})
90
+ },
91
+ {
92
+ label: t.labelUrl,
93
+ value: url,
94
+ icon: /* @__PURE__ */ jsx(FaLink, {})
95
+ },
96
+ ...(extra ?? []).map((e) => ({
97
+ label: e.label,
98
+ value: e.value,
99
+ icon: e.icon ?? /* @__PURE__ */ jsx(FiCopy, {})
100
+ }))
101
+ ];
102
+ return {
103
+ label: t.copyMenu,
104
+ icon: /* @__PURE__ */ jsx(HiOutlineClipboardCopy, {}),
105
+ items: fields.flatMap(({ label, value, icon }) => value ? [{
106
+ label: t.copy(label),
107
+ icon,
108
+ copy: {
109
+ text: value,
110
+ label
111
+ }
112
+ }] : [])
113
+ };
114
+ }, [t]);
115
+ }
116
+ /** Opens a row's menu under itself. Shows on the row's hover or focus, and
117
+ * stays while its menu is `open`, though the pointer has left the row. */
118
+ function MoreButton({ onOpen, open = false, visible = open, className }) {
119
+ const { list: t } = useStrings();
120
+ return /* @__PURE__ */ jsx("button", {
121
+ type: "button",
122
+ "aria-label": t.moreActions,
123
+ "aria-haspopup": "menu",
124
+ "aria-expanded": open,
125
+ onClick: (e) => {
126
+ e.stopPropagation();
127
+ onOpen(e.currentTarget);
128
+ },
129
+ className: clsx("rounded p-1 cursor-pointer text-(--theme-muted-text-color) transition-colors hover:bg-(--theme-muted-panel-bg) hover:text-(--theme-app) focus-visible:opacity-100", visible ? "opacity-100" : "opacity-0 group-hover:opacity-100", className),
130
+ children: /* @__PURE__ */ jsx(BsThreeDots, { className: "h-4 w-4" })
131
+ });
132
+ }
133
+ //#endregion
134
+ export { MoreButton, assembleRowMenu, rowContextMenuProps, useCopySubmenu, useRowMenuActive };
@@ -1,4 +1,3 @@
1
- import { useNotify, useOptionalWorkflowEngine, useStrings } from "../components/Provider.js";
2
1
  import { FaArrowDown } from "../icons/fa/FaArrowDown.js";
3
2
  import { FaArrowUp } from "../icons/fa/FaArrowUp.js";
4
3
  import { FaCheck } from "../icons/fa/FaCheck.js";
@@ -10,21 +9,22 @@ import { FiClock } from "../icons/fi/FiClock.js";
10
9
  import { FiCopy } from "../icons/fi/FiCopy.js";
11
10
  import { FiX } from "../icons/fi/FiX.js";
12
11
  import { LuChevronRight } from "../icons/lu/LuChevronRight.js";
13
- import { TooltipInfo } from "../components/Tooltip.js";
12
+ import { useNotify, useOptionalWorkflowEngine, useStrings } from "../components/Provider.js";
13
+ import { InfoTip } from "../components/InfoTip.js";
14
14
  import { highlightSegments, parseAnsiSegments, plainSegments } from "./segments.js";
15
- import cx from "classnames";
16
- import { Fragment, memo, useCallback, useEffect, useLayoutEffect, useMemo, useRef, useState } from "react";
17
- import { Fragment as Fragment$1, jsx, jsxs } from "react/jsx-runtime";
15
+ import { clsx } from "clsx";
16
+ import { Fragment, jsx, jsxs } from "react/jsx-runtime";
17
+ import { Fragment as Fragment$1, memo, useCallback, useEffect, useLayoutEffect, useMemo, useRef, useState } from "react";
18
18
  import { DateTime } from "luxon";
19
19
  //#region src/logviewer/LogViewer.tsx
20
20
  function LogSegments({ segments }) {
21
21
  return segments.map((segment, i) => segment.highlighted ? /* @__PURE__ */ jsx("mark", {
22
- className: cx("search-highlight", segment.className),
22
+ className: clsx("search-highlight", segment.className),
23
23
  children: segment.content
24
24
  }, i) : segment.className ? /* @__PURE__ */ jsx("span", {
25
25
  className: segment.className,
26
26
  children: segment.content
27
- }, i) : /* @__PURE__ */ jsx(Fragment, { children: segment.content }, i));
27
+ }, i) : /* @__PURE__ */ jsx(Fragment$1, { children: segment.content }, i));
28
28
  }
29
29
  var LogLine = memo(function LogLine({ index, segments, lineNumbers, isSelected, lineHeight, onLineClick, searchTerm, command, groupDepth = 0, isGroupCollapsed, onGroupToggle, annotationLabels }) {
30
30
  const displaySegments = useMemo(() => highlightSegments(command?.message ? plainSegments(command.message) : segments, searchTerm), [
@@ -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: 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"),
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"),
71
71
  style: {
72
72
  minHeight: `${lineHeight}px`,
73
73
  lineHeight: `${lineHeight}px`,
@@ -79,10 +79,10 @@ var LogLine = memo(function LogLine({ index, segments, lineNumbers, isSelected,
79
79
  e.stopPropagation();
80
80
  onLineClick(index + 1, e);
81
81
  },
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)"),
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)"),
83
83
  children: index + 1
84
84
  }), /* @__PURE__ */ jsxs("pre", {
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"),
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"),
86
86
  children: [
87
87
  command?.type === "group" && /* @__PURE__ */ jsx("span", {
88
88
  className: "mr-1 shrink-0 inline-flex items-center",
@@ -106,9 +106,9 @@ 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 = 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)]");
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)]");
110
110
  if (endOfLog) return /* @__PURE__ */ jsx("div", {
111
- className: cx(baseCx, "opacity-70"),
111
+ className: clsx(baseCx, "opacity-70"),
112
112
  children: t.beginningOfLog
113
113
  });
114
114
  if (loadingTop) return /* @__PURE__ */ jsxs("div", {
@@ -121,7 +121,7 @@ var TopPaginationBanner = memo(function TopPaginationBanner({ endOfLog, loadingT
121
121
  return /* @__PURE__ */ jsx("button", {
122
122
  type: "button",
123
123
  onClick: onLoadOlder,
124
- className: cx(baseCx, "w-full hover:text-[var(--theme-app)] hover:bg-[var(--theme-hover)] transition-colors"),
124
+ className: clsx(baseCx, "w-full hover:text-[var(--theme-app)] hover:bg-[var(--theme-hover)] transition-colors"),
125
125
  children: t.loadOlderEntries
126
126
  });
127
127
  });
@@ -516,7 +516,7 @@ function LogViewer({ log, height = "unset", width, roundedBottom = false, lineNu
516
516
  const visibleLogs = inline ? parsedLog : parsedLog.slice(visibleStart, Math.min(parsedLog.length, visibleEnd));
517
517
  return /* @__PURE__ */ jsxs("div", {
518
518
  "data-testid": "logviewer-container",
519
- className: cx("flex flex-col grow", roundedBottom && "rounded-lg"),
519
+ className: clsx("flex flex-col grow", roundedBottom && "rounded-lg"),
520
520
  style: !fullscreen ? {
521
521
  height,
522
522
  width
@@ -530,14 +530,14 @@ function LogViewer({ log, height = "unset", width, roundedBottom = false, lineNu
530
530
  },
531
531
  children: [
532
532
  /* @__PURE__ */ jsxs("div", {
533
- 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"),
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"),
534
534
  children: [/* @__PURE__ */ jsxs("div", {
535
- className: cx("w-full flex flex-row gap-x-2 items-center", hideExpand && "justify-between"),
535
+ className: clsx("w-full flex flex-row gap-x-2 items-center", hideExpand && "justify-between"),
536
536
  children: [
537
537
  /* @__PURE__ */ jsxs("div", {
538
538
  className: "flex gap-x-2 w-full",
539
539
  children: [
540
- !inline && /* @__PURE__ */ jsxs(Fragment$1, { children: [/* @__PURE__ */ jsxs("button", {
540
+ !inline && /* @__PURE__ */ jsxs(Fragment, { children: [/* @__PURE__ */ jsxs("button", {
541
541
  type: "button",
542
542
  className: "btn btn-neutral",
543
543
  onClick: () => {
@@ -583,7 +583,7 @@ function LogViewer({ log, height = "unset", width, roundedBottom = false, lineNu
583
583
  additionalLeftBarComponents,
584
584
  enableWorkflowCommands && /* @__PURE__ */ jsx("button", {
585
585
  type: "button",
586
- className: cx("btn btn-neutral", showDebug && "btn-active"),
586
+ className: clsx("btn btn-neutral", showDebug && "btn-active"),
587
587
  onClick: () => setShowDebug((prev) => !prev),
588
588
  children: /* @__PURE__ */ jsx("span", { children: showDebug ? t.hideDebug : t.showDebug })
589
589
  }),
@@ -605,14 +605,14 @@ function LogViewer({ log, height = "unset", width, roundedBottom = false, lineNu
605
605
  ]
606
606
  }), timeRangeOpen && /* @__PURE__ */ jsxs("div", {
607
607
  ref: timeRangePopoverRef,
608
- className: cx("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"),
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
609
  children: [
610
610
  /* @__PURE__ */ jsxs("div", {
611
611
  className: "flex items-center gap-x-1.5",
612
612
  children: [/* @__PURE__ */ jsx("span", {
613
613
  className: "text-xs font-semibold text-[var(--theme-app)]",
614
614
  children: t.filterByTimeRange
615
- }), /* @__PURE__ */ jsx(TooltipInfo, { text: t.timeRangeHelp })]
615
+ }), /* @__PURE__ */ jsx(InfoTip, { text: t.timeRangeHelp })]
616
616
  }),
617
617
  /* @__PURE__ */ jsxs("label", {
618
618
  className: "flex flex-col gap-y-1",
@@ -678,13 +678,13 @@ function LogViewer({ log, height = "unset", width, roundedBottom = false, lineNu
678
678
  }),
679
679
  /* @__PURE__ */ jsxs("a", {
680
680
  href: logUrl,
681
- className: cx(!logUrl && "disabled", "btn btn-neutral"),
681
+ className: clsx(!logUrl && "disabled", "btn btn-neutral"),
682
682
  download: true,
683
683
  children: [/* @__PURE__ */ jsx(FaCloudDownloadAlt, {}), /* @__PURE__ */ jsx("span", { children: t.download })]
684
684
  }),
685
685
  /* @__PURE__ */ jsxs("button", {
686
686
  type: "button",
687
- className: cx("btn btn-neutral", hideExpand && "hidden"),
687
+ className: clsx("btn btn-neutral", hideExpand && "hidden"),
688
688
  onClick: () => setFullscreen((prev) => !prev),
689
689
  children: [/* @__PURE__ */ jsx(ExpandButtonIcon, {}), /* @__PURE__ */ jsx("span", { children: expandButtonText })]
690
690
  })
@@ -694,7 +694,7 @@ function LogViewer({ log, height = "unset", width, roundedBottom = false, lineNu
694
694
  /* @__PURE__ */ jsxs("div", {
695
695
  "data-testid": "logviewer",
696
696
  role: "none",
697
- 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),
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),
698
698
  style: inline ? void 0 : {
699
699
  overflowY: "auto",
700
700
  position: "relative",
@@ -732,19 +732,19 @@ function LogViewer({ log, height = "unset", width, roundedBottom = false, lineNu
732
732
  highlightCopyPosition && highlightedText && /* @__PURE__ */ jsx("button", {
733
733
  type: "button",
734
734
  "data-highlight-copy-button": true,
735
- className: cx("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)"),
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
736
  style: {
737
737
  left: highlightCopyPosition.x,
738
738
  top: highlightCopyPosition.y + 8,
739
739
  transform: "translateX(-50%)"
740
740
  },
741
741
  onClick: copyHighlightedText,
742
- children: copied ? /* @__PURE__ */ jsxs(Fragment$1, { children: [/* @__PURE__ */ jsx(FaCheck, { className: "text-green-500 w-3.5 h-3.5" }), /* @__PURE__ */ jsx("span", { children: tCommon.copied })] }) : /* @__PURE__ */ jsxs(Fragment$1, { children: [/* @__PURE__ */ jsx(FiCopy, { className: "w-3.5 h-3.5" }), /* @__PURE__ */ jsx("span", { children: tCommon.copy })] })
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 })] })
743
743
  }),
744
744
  (additionalBottomLeftBarComponents || additionalBottomRightBarComponents) && /* @__PURE__ */ jsxs("div", {
745
745
  className: "flex theme-panel select-none items-center gap-x-2 p-2",
746
746
  children: [/* @__PURE__ */ jsx("div", {
747
- className: cx("w-full flex flex-row gap-x-2 items-center", hideExpand && "justify-between"),
747
+ className: clsx("w-full flex flex-row gap-x-2 items-center", hideExpand && "justify-between"),
748
748
  children: /* @__PURE__ */ jsx("div", {
749
749
  className: "flex gap-x-2 w-full",
750
750
  children: additionalBottomLeftBarComponents