@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,4 +1,3 @@
1
- import { useWorkflowEditing } from "../components/Provider.js";
2
1
  import { BiSolidTrashAlt } from "../icons/bi/BiSolidTrashAlt.js";
3
2
  import { BsGrid } from "../icons/bs/BsGrid.js";
4
3
  import { FaEdit } from "../icons/fa/FaEdit.js";
@@ -7,8 +6,10 @@ import { FaPlus } from "../icons/fa/FaPlus.js";
7
6
  import { HiDuplicate } from "../icons/hi/HiDuplicate.js";
8
7
  import { IoMdClose } from "../icons/io/IoMdClose.js";
9
8
  import { MdRefresh } from "../icons/md/MdRefresh.js";
9
+ import { useWorkflowEditing } from "../components/Provider.js";
10
+ import { menuDivider } from "../components/MenuEntries.js";
11
+ import { useContextMenu } from "../components/ContextMenu.js";
10
12
  import { IconButton } from "../components/IconButton.js";
11
- import { useRowMenu } from "../list/RowContextMenu.js";
12
13
  import { createStore, reclaimFocus, returningFocus, trackDrag, useFocusAfterDialog, usePressOutside } from "./editorPrimitives.js";
13
14
  import { jobLabel } from "./util.js";
14
15
  import { EDITOR_HANDLE_CLASS, NO_EDGES, NO_PROBLEMS, NO_SELECTION, NO_STEPS, contentBox, labelsOf, sameEdge, sameStep, selectionBounds, toContent, useUi } from "./graphEditorState.js";
@@ -20,9 +21,9 @@ import { JobDialog, StepDialog } from "./GraphEditorDialogs.js";
20
21
  import { overlaps, typing } from "./editorApi.js";
21
22
  import { MOD_KEY } from "./ShortcutsButton.js";
22
23
  import { AddChip, BarDivider, DragLabel, EditorBar } from "./editorChrome.js";
23
- import cx from "classnames";
24
+ import { clsx } from "clsx";
25
+ import { Fragment, jsx, jsxs } from "react/jsx-runtime";
24
26
  import { useEffect, useMemo, useRef, useState } from "react";
25
- import { Fragment as Fragment$1, jsx, jsxs } from "react/jsx-runtime";
26
27
  //#region src/graph/GraphEditor.tsx
27
28
  var EDGE_ZONE = 48;
28
29
  var INDICATOR = 6;
@@ -331,7 +332,7 @@ function useGraphEditorState({ editor, jobs, yamlJobs, inputs, workflow, layout,
331
332
  layout,
332
333
  container
333
334
  };
334
- const rowMenu = useRowMenu();
335
+ const rowMenu = useContextMenu();
335
336
  const openMenu = useMemo(() => returningFocus(rowMenu.openMenu, () => latest.current.container), [rowMenu.openMenu]);
336
337
  const contextMenu = rowMenu.contextMenu;
337
338
  useFocusAfterDialog(store, () => latest.current.container);
@@ -716,60 +717,53 @@ function useGraphEditorState({ editor, jobs, yamlJobs, inputs, workflow, layout,
716
717
  port: ""
717
718
  }, [other]);
718
719
  return edits ? [{
719
- kind: "action",
720
720
  label: jobLabel(other),
721
- onSelect: () => connectWith(edits, {
721
+ onClick: () => connectWith(edits, {
722
722
  from: [job],
723
723
  side
724
724
  })
725
725
  }] : [];
726
726
  });
727
727
  return items.length > 0 ? [{
728
- kind: "submenu",
729
728
  label,
730
729
  icon: /* @__PURE__ */ jsx(FaLink, {}),
731
730
  items
732
731
  }] : [];
733
732
  };
734
- const openJobMenu = (x, y, job) => {
733
+ const openJobMenu = (at, job) => {
735
734
  const matrix = isMatrix(latest.current.source[job]);
736
735
  const items = [
737
736
  {
738
- kind: "action",
739
737
  label: matrix ? t.editMatrix : t.editJob,
740
738
  icon: matrix ? /* @__PURE__ */ jsx(BsGrid, {}) : /* @__PURE__ */ jsx(FaEdit, {}),
741
- onSelect: () => editJob(job)
739
+ onClick: () => editJob(job)
742
740
  },
743
741
  {
744
- kind: "action",
745
742
  label: t.duplicate,
746
743
  icon: /* @__PURE__ */ jsx(HiDuplicate, {}),
747
- onSelect: () => edit({
744
+ onClick: () => edit({
748
745
  type: "duplicateJob",
749
746
  job,
750
747
  layout: materialize()
751
748
  })
752
749
  },
753
750
  {
754
- kind: "action",
755
751
  label: t.addStep,
756
752
  icon: /* @__PURE__ */ jsx(FaPlus, {}),
757
- onSelect: () => addStep(job)
753
+ onClick: () => addStep(job)
758
754
  },
759
755
  matrix ? {
760
- kind: "action",
761
756
  label: t.removeMatrix,
762
757
  icon: /* @__PURE__ */ jsx(IoMdClose, {}),
763
- onSelect: () => edit({
758
+ onClick: () => edit({
764
759
  type: "setMatrix",
765
760
  job,
766
761
  variables: null
767
762
  })
768
763
  } : {
769
- kind: "action",
770
764
  label: t.makeMatrix,
771
765
  icon: /* @__PURE__ */ jsx(BsGrid, {}),
772
- onSelect: () => edit({
766
+ onClick: () => edit({
773
767
  type: "setMatrix",
774
768
  job,
775
769
  variables: [["value", [1, 2]]]
@@ -777,32 +771,29 @@ function useGraphEditorState({ editor, jobs, yamlJobs, inputs, workflow, layout,
777
771
  },
778
772
  ...connectMenu(job, "in", t.menuDependsOn),
779
773
  ...connectMenu(job, "out", t.menuNeededBy),
780
- { kind: "divider" },
774
+ menuDivider,
781
775
  {
782
- kind: "action",
783
776
  label: t.deleteJob,
784
777
  icon: /* @__PURE__ */ jsx(BiSolidTrashAlt, {}),
785
778
  destructive: true,
786
- onSelect: () => edit({
779
+ onClick: () => edit({
787
780
  type: "deleteJob",
788
781
  jobs: [job]
789
782
  })
790
783
  }
791
784
  ];
792
- openMenu(x, y, items);
785
+ openMenu(at, items);
793
786
  };
794
- const openStepMenu = (x, y, job, index) => {
795
- openMenu(x, y, [{
796
- kind: "action",
787
+ const openStepMenu = (at, job, index) => {
788
+ openMenu(at, [{
797
789
  label: t.editStep,
798
790
  icon: /* @__PURE__ */ jsx(FaEdit, {}),
799
- onSelect: () => editStep(job, index)
791
+ onClick: () => editStep(job, index)
800
792
  }, {
801
- kind: "action",
802
793
  label: t.deleteStep,
803
794
  icon: /* @__PURE__ */ jsx(BiSolidTrashAlt, {}),
804
795
  destructive: true,
805
- onSelect: () => edit({
796
+ onClick: () => edit({
806
797
  type: "deleteStep",
807
798
  job,
808
799
  index
@@ -888,20 +879,19 @@ function useGraphEditorState({ editor, jobs, yamlJobs, inputs, workflow, layout,
888
879
  });
889
880
  return true;
890
881
  };
891
- const openEdgeMenu = (x, y, edge) => {
882
+ const openEdgeMenu = (at, edge) => {
892
883
  const cols = gridRef.current?.cols ?? [];
893
884
  const deps = boxOf(cols, edge.from);
894
885
  const targets = boxOf(cols, edge.to);
895
886
  const refs = edgeRefs(edge);
896
887
  const inUse = refsInUse(refs);
897
888
  const items = [{
898
- kind: "action",
899
889
  label: t.removeDependency,
900
890
  icon: /* @__PURE__ */ jsx(BiSolidTrashAlt, {}),
901
891
  destructive: true,
902
892
  disabled: inUse,
903
- tooltip: inUse ? t.dependencyInUse : void 0,
904
- onSelect: () => edit({
893
+ disabledReason: inUse ? t.dependencyInUse : void 0,
894
+ onClick: () => edit({
905
895
  type: "disconnect",
906
896
  needs: refs
907
897
  })
@@ -909,11 +899,10 @@ function useGraphEditorState({ editor, jobs, yamlJobs, inputs, workflow, layout,
909
899
  if (deps.length === 1 && isMatrix(latest.current.source[edge.from])) {
910
900
  const any = refs.length > 0 && refs.every((r) => r.need.endsWith(":any"));
911
901
  items.unshift({
912
- kind: "action",
913
902
  label: t.waitForAny,
914
903
  icon: /* @__PURE__ */ jsx(BsGrid, {}),
915
- selected: any,
916
- onSelect: () => edit({
904
+ checked: any,
905
+ onClick: () => edit({
917
906
  type: "setNeedAny",
918
907
  jobs: targets,
919
908
  dep: edge.from,
@@ -922,7 +911,7 @@ function useGraphEditorState({ editor, jobs, yamlJobs, inputs, workflow, layout,
922
911
  });
923
912
  }
924
913
  if (!store.get().edges.some((other) => sameEdge(other, edge))) selectEdge(edge, false);
925
- openMenu(x, y, items);
914
+ openMenu(at, items);
926
915
  };
927
916
  const copySelection = () => {
928
917
  const yml = latest.current.editor?.readSource?.();
@@ -1298,7 +1287,7 @@ function useGraphEditorState({ editor, jobs, yamlJobs, inputs, workflow, layout,
1298
1287
  ]);
1299
1288
  return {
1300
1289
  api,
1301
- overlays: /* @__PURE__ */ jsxs(Fragment$1, { children: [
1290
+ overlays: /* @__PURE__ */ jsxs(Fragment, { children: [
1302
1291
  /* @__PURE__ */ jsx(EditorToolbar, {
1303
1292
  api,
1304
1293
  editor,
@@ -1451,7 +1440,7 @@ function EditorToolbar({ api, editor, layout }) {
1451
1440
  return /* @__PURE__ */ jsxs(EditorBar, {
1452
1441
  editor: undoable,
1453
1442
  groups: graphShortcuts(t),
1454
- className: cx(EDITOR_HANDLE_CLASS, "absolute bottom-2 right-2 z-10 max-w-[calc(100%-1rem)]"),
1443
+ className: clsx(EDITOR_HANDLE_CLASS, "absolute bottom-2 right-2 z-10 max-w-[calc(100%-1rem)]"),
1455
1444
  children: [
1456
1445
  chip(false),
1457
1446
  chip(true),
@@ -1474,9 +1463,9 @@ function DragOverlays({ api, container, trashRef }) {
1474
1463
  const rect = container.getBoundingClientRect();
1475
1464
  const overTrash = drag.target?.kind === "trash";
1476
1465
  const problem = drag.target?.kind === "steps" ? drag.target.problem : void 0;
1477
- return /* @__PURE__ */ jsxs(Fragment$1, { children: [drag.payload.kind === "jobs" && /* @__PURE__ */ jsxs("div", {
1466
+ return /* @__PURE__ */ jsxs(Fragment, { children: [drag.payload.kind === "jobs" && /* @__PURE__ */ jsxs("div", {
1478
1467
  ref: trashRef,
1479
- className: cx("absolute bottom-2 left-1/2 z-20 flex -translate-x-1/2 items-center gap-2 rounded-lg border-2 border-dashed px-4 py-2 text-sm", overTrash ? "border-(--theme-error) bg-(--theme-error-muted) text-(--theme-error)" : "theme-border bg-(--theme-panel-bg) theme-muted-text"),
1468
+ className: clsx("absolute bottom-2 left-1/2 z-20 flex -translate-x-1/2 items-center gap-2 rounded-lg border-2 border-dashed px-4 py-2 text-sm", overTrash ? "border-(--theme-error) bg-(--theme-error-muted) text-(--theme-error)" : "theme-border bg-(--theme-panel-bg) theme-muted-text"),
1480
1469
  children: [/* @__PURE__ */ jsx(BiSolidTrashAlt, { className: "h-4 w-4" }), t.dropToDelete]
1481
1470
  }), drag.payload.kind !== "connect" && /* @__PURE__ */ jsx(DragLabel, {
1482
1471
  at: {
@@ -1,9 +1,9 @@
1
- import { useWorkflowActions, useWorkflowEditing } from "../components/Provider.js";
2
1
  import { BiSolidTrashAlt } from "../icons/bi/BiSolidTrashAlt.js";
3
2
  import { FaArrowDown } from "../icons/fa/FaArrowDown.js";
4
3
  import { FaArrowUp } from "../icons/fa/FaArrowUp.js";
5
4
  import { IoMdClose } from "../icons/io/IoMdClose.js";
6
5
  import { withPositionKeys } from "../components/keys.js";
6
+ import { useWorkflowActions, useWorkflowEditing } from "../components/Provider.js";
7
7
  import { IconButton } from "../components/IconButton.js";
8
8
  import { Input, fieldBoxClasses } from "../components/Input.js";
9
9
  import { useGraphEditorStrings } from "./editorStrings.js";
@@ -18,9 +18,9 @@ import { NO_SCOPED, ViewSwitch, YamlPane, yamlProblem } from "./settingsViews.js
18
18
  import { useNewInputs } from "./InputDialog.js";
19
19
  import { editErrorText } from "./refusalText.js";
20
20
  import { UsesPicker, WithEditor, usesKind, withDraftFrom, withError, withValue } from "./stepWith.js";
21
- import cx from "classnames";
21
+ import { clsx } from "clsx";
22
+ import { Fragment, jsx, jsxs } from "react/jsx-runtime";
22
23
  import { useId, useMemo, useRef, useState } from "react";
23
- import { Fragment as Fragment$1, jsx, jsxs } from "react/jsx-runtime";
24
24
  //#region src/graph/GraphEditorDialogs.tsx
25
25
  var SHELL = /^$|^(\/?([^/ ]+\/)*)?(bash|sh)( .*)?$/;
26
26
  var OUTPUT_KEY = /^[a-zA-Z0-9_-]+$/;
@@ -311,7 +311,7 @@ function OutputsEditor({ rows, onChange, stepIds, error }) {
311
311
  value: row.custom,
312
312
  onChange: (e) => update(i, { custom: e.target.value })
313
313
  })
314
- }) : /* @__PURE__ */ jsxs(Fragment$1, { children: [/* @__PURE__ */ jsx("div", {
314
+ }) : /* @__PURE__ */ jsxs(Fragment, { children: [/* @__PURE__ */ jsx("div", {
315
315
  className: "w-1/3",
316
316
  children: /* @__PURE__ */ jsxs("select", {
317
317
  "aria-label": t.outputStep,
@@ -446,7 +446,7 @@ function MatrixEntries({ label, yamlKey, description, entries, onChange, text, o
446
446
  value: text,
447
447
  error,
448
448
  onChange: (e) => onText(e.target.value)
449
- }) : /* @__PURE__ */ jsxs(Fragment$1, { children: [
449
+ }) : /* @__PURE__ */ jsxs(Fragment, { children: [
450
450
  withPositionKeys(entries).map(({ key, item: rows }, i) => /* @__PURE__ */ jsxs("div", {
451
451
  className: "flex items-start gap-2",
452
452
  children: [/* @__PURE__ */ jsx("div", {
@@ -670,7 +670,7 @@ function JobForm({ job, jobs, inputs, workflow, onEdit, onClose, renderShell, on
670
670
  ...patch
671
671
  } : null);
672
672
  onDraft?.(saveEdit, invalid);
673
- const children = /* @__PURE__ */ jsxs(Fragment$1, { children: [
673
+ const children = /* @__PURE__ */ jsxs(Fragment, { children: [
674
674
  newInputs.dialog,
675
675
  /* @__PURE__ */ jsx(Input, {
676
676
  autoFocus: true,
@@ -714,7 +714,7 @@ function JobForm({ job, jobs, inputs, workflow, onEdit, onClose, renderShell, on
714
714
  return /* @__PURE__ */ jsxs("div", {
715
715
  className: "flex items-center gap-2 text-sm",
716
716
  children: [/* @__PURE__ */ jsxs("label", {
717
- className: cx("flex flex-1 items-center gap-2", cycle ? "cursor-not-allowed opacity-50" : "cursor-pointer"),
717
+ className: clsx("flex flex-1 items-center gap-2", cycle ? "cursor-not-allowed opacity-50" : "cursor-pointer"),
718
718
  title: cycle ? t.dependsOnThisJob : void 0,
719
719
  children: [
720
720
  /* @__PURE__ */ jsx("input", {
@@ -788,7 +788,7 @@ function JobForm({ job, jobs, inputs, workflow, onEdit, onClose, renderShell, on
788
788
  value: runsOnText,
789
789
  error: errors.runsOn,
790
790
  onChange: (e) => setRunsOnText(e.target.value)
791
- }) : /* @__PURE__ */ jsxs(Fragment$1, { children: [
791
+ }) : /* @__PURE__ */ jsxs(Fragment, { children: [
792
792
  /* @__PURE__ */ jsx(ChoiceButtons, {
793
793
  options: [{
794
794
  value: "name",
@@ -803,7 +803,7 @@ function JobForm({ job, jobs, inputs, workflow, onEdit, onClose, renderShell, on
803
803
  kind
804
804
  })
805
805
  }),
806
- runsOn.kind === "name" ? /* @__PURE__ */ jsxs(Fragment$1, { children: [
806
+ runsOn.kind === "name" ? /* @__PURE__ */ jsxs(Fragment, { children: [
807
807
  /* @__PURE__ */ jsx(Input, {
808
808
  mono: true,
809
809
  ...labelled(t.fields.environmentCluster, "cluster"),
@@ -837,7 +837,7 @@ function JobForm({ job, jobs, inputs, workflow, onEdit, onClose, renderShell, on
837
837
  error: void 0
838
838
  })
839
839
  })
840
- ] }) : /* @__PURE__ */ jsxs(Fragment$1, { children: [
840
+ ] }) : /* @__PURE__ */ jsxs(Fragment, { children: [
841
841
  /* @__PURE__ */ jsx(LabelledField, {
842
842
  label: t.fields.targetMode,
843
843
  yamlKey: "mode",
@@ -925,8 +925,8 @@ function JobForm({ job, jobs, inputs, workflow, onEdit, onClose, renderShell, on
925
925
  setMatrixOn(on);
926
926
  if (on && matrixMode === "variables") addVariableRow();
927
927
  }
928
- }), matrixOn && /* @__PURE__ */ jsxs(Fragment$1, { children: [
929
- typeof rawMatrix === "string" && /* @__PURE__ */ jsxs(Fragment$1, { children: [/* @__PURE__ */ jsx(FieldLabel, {
928
+ }), matrixOn && /* @__PURE__ */ jsxs(Fragment, { children: [
929
+ typeof rawMatrix === "string" && /* @__PURE__ */ jsxs(Fragment, { children: [/* @__PURE__ */ jsx(FieldLabel, {
930
930
  label: t.fields.matrixSource,
931
931
  description: t.help.matrixMode
932
932
  }), /* @__PURE__ */ jsx(ChoiceButtons, {
@@ -950,7 +950,7 @@ function JobForm({ job, jobs, inputs, workflow, onEdit, onClose, renderShell, on
950
950
  value: matrixText,
951
951
  error: errors.matrix,
952
952
  onChange: (e) => setMatrixText(e.target.value)
953
- }) : /* @__PURE__ */ jsxs(Fragment$1, { children: [
953
+ }) : /* @__PURE__ */ jsxs(Fragment, { children: [
954
954
  /* @__PURE__ */ jsx("div", {
955
955
  className: "text-xs theme-muted-text",
956
956
  children: t.help.matrixVariables
@@ -1156,7 +1156,7 @@ function StepForm({ job, index, steps, inputs, workflow, usesSuggestions, onEdit
1156
1156
  ...patch
1157
1157
  }, ...references]) : null);
1158
1158
  onDraft?.(saveEdit, invalid);
1159
- const children = /* @__PURE__ */ jsxs(Fragment$1, { children: [
1159
+ const children = /* @__PURE__ */ jsxs(Fragment, { children: [
1160
1160
  newInputs.dialog,
1161
1161
  /* @__PURE__ */ jsx(Input, {
1162
1162
  autoFocus: true,
@@ -1190,7 +1190,7 @@ function StepForm({ job, index, steps, inputs, workflow, usesSuggestions, onEdit
1190
1190
  placeholder: "echo \"Hello World\"",
1191
1191
  onChange: setRun,
1192
1192
  source
1193
- }) : /* @__PURE__ */ jsxs(Fragment$1, { children: [/* @__PURE__ */ jsx(UsesPicker, {
1193
+ }) : /* @__PURE__ */ jsxs(Fragment, { children: [/* @__PURE__ */ jsx(UsesPicker, {
1194
1194
  uses: trimmedUses,
1195
1195
  onUses: setUses,
1196
1196
  choices: usesSuggestions,
@@ -1267,7 +1267,7 @@ function StepForm({ job, index, steps, inputs, workflow, usesSuggestions, onEdit
1267
1267
  description: t.help.retry,
1268
1268
  checked: retryOn,
1269
1269
  onChange: setRetryOn
1270
- }), retryOn && /* @__PURE__ */ jsxs(Fragment$1, { children: [
1270
+ }), retryOn && /* @__PURE__ */ jsxs(Fragment, { children: [
1271
1271
  /* @__PURE__ */ jsx(Input, {
1272
1272
  mono: true,
1273
1273
  ...labelled(t.fields.maxRetries, "max-retries"),
@@ -1385,7 +1385,7 @@ function StepForm({ job, index, steps, inputs, workflow, usesSuggestions, onEdit
1385
1385
  if (saveEdit) onEdit(saveEdit);
1386
1386
  onClose();
1387
1387
  },
1388
- footerStart: /* @__PURE__ */ jsxs(Fragment$1, { children: [
1388
+ footerStart: /* @__PURE__ */ jsxs(Fragment, { children: [
1389
1389
  /* @__PURE__ */ jsx(IconButton, {
1390
1390
  icon: /* @__PURE__ */ jsx(BiSolidTrashAlt, { className: "h-4 w-4" }),
1391
1391
  label: t.deleteStep,
@@ -2,8 +2,8 @@ import { BoxGrip } from "./editorRows.js";
2
2
  import { emptyRowsStyle } from "./gridSpacing.js";
3
3
  import { Joblist } from "./JobSummary.js";
4
4
  import { useLineage, useLineageStore } from "./lineage.js";
5
- import { memo } from "react";
6
5
  import { jsx, jsxs } from "react/jsx-runtime";
6
+ import { memo } from "react";
7
7
  //#region src/graph/GraphNode.tsx
8
8
  var dimClasses = (depth) => ({
9
9
  level: `dag-dim-${depth}`,
@@ -1,11 +1,11 @@
1
- import { useWorkflowEditing, useWorkflowEngine } from "../components/Provider.js";
2
1
  import { BiSolidTrashAlt } from "../icons/bi/BiSolidTrashAlt.js";
3
2
  import { FaArrowDown } from "../icons/fa/FaArrowDown.js";
4
3
  import { FaArrowUp } from "../icons/fa/FaArrowUp.js";
5
4
  import { FaEdit } from "../icons/fa/FaEdit.js";
6
5
  import { IoMdClose } from "../icons/io/IoMdClose.js";
7
6
  import { withPositionKeys } from "../components/keys.js";
8
- import Dropdown from "../components/Dropdown.js";
7
+ import { useWorkflowEditing, useWorkflowEngine } from "../components/Provider.js";
8
+ import { Combobox } from "../components/Combobox.js";
9
9
  import { FilterPill } from "../components/FilterPill.js";
10
10
  import { IconButton } from "../components/IconButton.js";
11
11
  import { Input, Textarea } from "../components/Input.js";
@@ -20,9 +20,9 @@ import { FormEditingContext } from "../form/formEditing.js";
20
20
  import { DynamicForm } from "../form/Form.js";
21
21
  import { withInputLayouts } from "./inputLayout.js";
22
22
  import { NO_SCOPED, ViewSwitch, YamlPane, yamlProblem } from "./settingsViews.js";
23
- import cx from "classnames";
23
+ import { clsx } from "clsx";
24
+ import { Fragment, jsx, jsxs } from "react/jsx-runtime";
24
25
  import { useEffect, useId, useMemo, useRef, useState } from "react";
25
- import { Fragment as Fragment$1, jsx, jsxs } from "react/jsx-runtime";
26
26
  //#region src/graph/InputDialog.tsx
27
27
  /** Input types by menu group, in the order the add menu lists them. */
28
28
  var INPUT_TYPE_GROUPS = [
@@ -755,7 +755,7 @@ function OptionsEditor({ draft, onChange, error, keyed, described }) {
755
755
  mode
756
756
  })
757
757
  }),
758
- draft.mode === "list" ? /* @__PURE__ */ jsxs(Fragment$1, { children: [
758
+ draft.mode === "list" ? /* @__PURE__ */ jsxs(Fragment, { children: [
759
759
  draft.rows.length > 0 && /* @__PURE__ */ jsxs("div", {
760
760
  "aria-hidden": "true",
761
761
  className: "flex items-center gap-2 text-xs theme-muted-text",
@@ -842,7 +842,7 @@ function OptionsEditor({ draft, onChange, error, keyed, described }) {
842
842
  ...draft,
843
843
  text: e.target.value
844
844
  })
845
- }) : /* @__PURE__ */ jsxs(Fragment$1, { children: [/* @__PURE__ */ jsx("div", {
845
+ }) : /* @__PURE__ */ jsxs(Fragment, { children: [/* @__PURE__ */ jsx("div", {
846
846
  className: "text-xs theme-muted-text",
847
847
  children: draft.mode === "byKey" ? t.optionsByKeyHelp : t.optionsJsonHelp
848
848
  }), /* @__PURE__ */ jsx(Textarea, {
@@ -939,7 +939,6 @@ function TypeSelect({ value, onChange, allowStep, disabled }) {
939
939
  const id = useId();
940
940
  const types = t.types;
941
941
  const help = t.typeHelp;
942
- const known = inputTypes().includes(value);
943
942
  return /* @__PURE__ */ jsxs("div", {
944
943
  className: "flex flex-col gap-1.5",
945
944
  children: [
@@ -954,23 +953,21 @@ function TypeSelect({ value, onChange, allowStep, disabled }) {
954
953
  yamlKey: "type"
955
954
  })]
956
955
  }),
957
- /* @__PURE__ */ jsx(Dropdown, {
956
+ /* @__PURE__ */ jsx(Combobox, {
958
957
  id,
959
958
  value,
960
959
  disabled,
961
- textBoxClassName: FIELD_TEXT_BOX,
962
- options: [...known ? [] : [{
963
- label: value,
964
- value
965
- }], ...INPUT_TYPE_GROUPS.map(([group, list]) => ({
966
- category: t.typeGroups[group],
967
- options: list.filter((type) => allowStep || type !== "step" || value === "step").map((type) => ({
960
+ className: FIELD_TEXT_BOX,
961
+ items: INPUT_TYPE_GROUPS.map(([group, list]) => ({
962
+ label: t.typeGroups[group],
963
+ items: list.filter((type) => allowStep || type !== "step" || value === "step").map((type) => ({
968
964
  label: types[type] ?? type,
969
965
  value: type
970
966
  }))
971
- }))],
972
- onChange: (next) => {
973
- if (typeof next === "string" && next) onChange(next);
967
+ })),
968
+ itemToStringLabel: (type) => types[type] ?? type,
969
+ onValueChange: (next) => {
970
+ if (next) onChange(next);
974
971
  }
975
972
  }),
976
973
  /* @__PURE__ */ jsx("span", {
@@ -1353,7 +1350,7 @@ function RowsField({ draft, template, label, onChange, error }) {
1353
1350
  initialValues: { rows: draft.rows },
1354
1351
  labelPosition: "top",
1355
1352
  workflowForm: true,
1356
- setValues: (values) => {
1353
+ onValuesChange: (values) => {
1357
1354
  if (touched.current) {
1358
1355
  const rows = values["rows"];
1359
1356
  onChange({
@@ -1455,11 +1452,11 @@ function PropField({ prop, kind, draft, original, error, onChange, suggestions,
1455
1452
  values: next.values
1456
1453
  }),
1457
1454
  error
1458
- }) : /* @__PURE__ */ jsxs(Fragment$1, { children: [/* @__PURE__ */ jsx(SuggestionInput, {
1455
+ }) : /* @__PURE__ */ jsxs(Fragment, { children: [/* @__PURE__ */ jsx(SuggestionInput, {
1459
1456
  "aria-label": name,
1460
1457
  value: perCopy.text,
1461
1458
  suggestions: [],
1462
- onChange: (next) => onChange({
1459
+ onValueChange: (next) => onChange({
1463
1460
  ...perCopy,
1464
1461
  text: next
1465
1462
  })
@@ -2102,7 +2099,7 @@ function InputForm({ name, definition, isNew, siblings, allowStep, inputs, home,
2102
2099
  function TypeBadge({ type }) {
2103
2100
  const types = useInputsEditorStrings().types;
2104
2101
  return /* @__PURE__ */ jsx("span", {
2105
- className: cx("rounded border theme-border px-1 text-[11px] leading-4 theme-muted-text"),
2102
+ className: clsx("rounded border theme-border px-1 text-[11px] leading-4 theme-muted-text"),
2106
2103
  children: types[type] ?? (type || "?")
2107
2104
  });
2108
2105
  }