@parallelworks/ui 0.56.0 → 0.58.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 (41) hide show
  1. package/README.md +36 -13
  2. package/dist/access/PrincipalPicker.js +2 -1
  3. package/dist/ai/ai.css +38 -0
  4. package/dist/components/Avatar.d.ts +5 -1
  5. package/dist/components/Avatar.js +4 -2
  6. package/dist/components/Markdown.d.ts +3 -0
  7. package/dist/components/Markdown.js +2 -1
  8. package/dist/components/MarkdownImpl.d.ts +1 -1
  9. package/dist/components/MarkdownImpl.js +5 -3
  10. package/dist/components/Provider.d.ts +10 -0
  11. package/dist/components/Provider.js +9 -0
  12. package/dist/components/Table.d.ts +7 -5
  13. package/dist/components/Table.js +6 -2
  14. package/dist/components/ThemeEditor.js +1 -1
  15. package/dist/components/category.d.ts +9 -0
  16. package/dist/components/category.js +30 -0
  17. package/dist/components/fieldBox.js +3 -3
  18. package/dist/components/httpsImages.d.ts +12 -0
  19. package/dist/components/httpsImages.js +27 -0
  20. package/dist/components/stickyTop.d.ts +10 -0
  21. package/dist/components/stickyTop.js +88 -0
  22. package/dist/file-explorer/FileExplorer.js +21 -15
  23. package/dist/graph/DependencyGraph.d.ts +14 -1
  24. package/dist/graph/DependencyGraph.js +169 -77
  25. package/dist/graph/JobSummary.js +13 -3
  26. package/dist/graph/StepSummary.d.ts +4 -0
  27. package/dist/graph/StepSummary.js +31 -0
  28. package/dist/graph/index.d.ts +1 -0
  29. package/dist/graph/index.js +2 -1
  30. package/dist/graph/types.d.ts +3 -0
  31. package/dist/graph/util.d.ts +1 -1
  32. package/dist/icons.d.ts +3 -0
  33. package/dist/icons.js +23 -2
  34. package/dist/index.d.ts +1 -0
  35. package/dist/index.js +2 -1
  36. package/dist/logviewer/LogViewer.js +3 -3
  37. package/dist/styles/theme.css +17 -0
  38. package/dist/styles.css +1 -1
  39. package/dist/theme/derive.d.ts +2 -1
  40. package/dist/theme/derive.js +52 -1
  41. package/package.json +1 -1
@@ -1,3 +1,4 @@
1
+ import { type ReactNode } from 'react';
1
2
  import type { GraphLayout } from '../editing.js';
2
3
  import type { DependencyGraphEditor } from './editorApi.js';
3
4
  import { type RunLink, type WorkflowJob } from './types.js';
@@ -17,7 +18,7 @@ interface GraphRun {
17
18
  executedJobs?: Record<string, unknown> | undefined;
18
19
  links?: Record<string, RunLink> | undefined;
19
20
  }
20
- export default function DependencyGraph({ run, preview, removeBorder, viewMode, setViewMode, layout, editor, yamlJobs, inputs, workflow, fixedHeight, }: {
21
+ export default function DependencyGraph({ run, preview, removeBorder, viewMode, setViewMode, layout, editor, yamlJobs, inputs, workflow, fixedHeight, openStep, onCloseLog, sidebarStickyTop, children, }: {
21
22
  run: GraphRun;
22
23
  preview?: boolean;
23
24
  removeBorder?: boolean | undefined;
@@ -30,6 +31,18 @@ export default function DependencyGraph({ run, preview, removeBorder, viewMode,
30
31
  /** The workflow as written, for what the editor's expressions can read. */
31
32
  workflow?: Record<string, unknown> | undefined;
32
33
  fixedHeight?: string | undefined;
34
+ /** A step to open; `prefix` is its `subworkflows/<job>/step_<n>/` chain when it runs inside a subworkflow. */
35
+ openStep?: {
36
+ job: string;
37
+ step: number;
38
+ prefix?: string | undefined;
39
+ } | undefined;
40
+ /** Called when the log dialog closes, so a host can forget the step it asked to open. */
41
+ onCloseLog?: (() => void) | undefined;
42
+ /** Pins the job list this many pixels below the top of the page's scroll area, under the host's own pinned bars. */
43
+ sidebarStickyTop?: number | undefined;
44
+ /** Shown under the annotations, above the graph. */
45
+ children?: ReactNode;
33
46
  }): import("react").JSX.Element | undefined;
34
47
  export declare function DependencyGraphPreview(inputs: {
35
48
  yml?: Record<string, unknown>;
@@ -1,5 +1,5 @@
1
1
  import { cx } from "../cx.js";
2
- import { ArrowLeftIcon, ArrowRightIcon, ChevronLeftIcon, ChevronRightIcon, FileTextIcon, ZoomInIcon, ZoomOutIcon } from "../icons.js";
2
+ import { ArrowLeftIcon, ArrowRightIcon, ChevronLeftIcon, ChevronRightIcon, CloseIcon, FileTextIcon, ZoomInIcon, ZoomOutIcon } from "../icons.js";
3
3
  import { Loader } from "../components/Loader.js";
4
4
  import { useRunFile, useSlots, useStrings, useWorkflowEngine } from "../components/Provider.js";
5
5
  import { Button } from "../components/Button.js";
@@ -10,6 +10,7 @@ import { DisclosurePanel } from "../components/Disclosure.js";
10
10
  import { formatDateTime } from "../format.js";
11
11
  import { Elapsed } from "../components/relativeTime.js";
12
12
  import { RunStatusIcon } from "../components/RunStatusIcon.js";
13
+ import { Tabs } from "../components/Tabs.js";
13
14
  import { LogViewer } from "../logviewer/LogViewer.js";
14
15
  import { initializeValues } from "../form/lib.js";
15
16
  import { AnnotationBanner } from "./AnnotationBanner.js";
@@ -27,6 +28,7 @@ import { routeConnectors, sameBoxes } from "./connectorGeometry.js";
27
28
  import { isJobRecord } from "./types.js";
28
29
  import { computeGraphLayout, displayJobsOf, hopDistances, positionsOf } from "./graphLayout.js";
29
30
  import { MatrixGroupNode, MatrixGroupSummaryItem } from "./MatrixGroup.js";
31
+ import { StepSummary } from "./StepSummary.js";
30
32
  import TreeView from "./TreeView.js";
31
33
  import { FIT_MAX_SCALE, MIN_SCALE, ZOOM_STEP, fitMargin, fitView, intoView, wheelFactor, zoomAround, zoomLimit } from "./viewport.js";
32
34
  import { Fragment, jsx, jsxs } from "react/jsx-runtime";
@@ -35,6 +37,12 @@ import { flushSync } from "react-dom";
35
37
  import { DateTime } from "luxon";
36
38
  import { TransformComponent, TransformWrapper } from "react-zoom-pan-pinch";
37
39
  //#region src/graph/DependencyGraph.tsx
40
+ var stepTabFiles = {
41
+ summary: "summary.md",
42
+ logs: "logs.out",
43
+ script: "script-unstable-redacted.sh"
44
+ };
45
+ var fileBeside = (path, file) => path.slice(0, path.lastIndexOf("/") + 1) + file;
38
46
  function ViewToggle({ viewMode, setViewMode }) {
39
47
  const { dag: t } = useStrings();
40
48
  return /* @__PURE__ */ jsxs("div", {
@@ -193,6 +201,11 @@ function offsetWithin(el, ancestor) {
193
201
  y
194
202
  };
195
203
  }
204
+ function unscrolledTop(el) {
205
+ let top = el.getBoundingClientRect().top;
206
+ for (let cur = el.parentElement; cur; cur = cur.parentElement) top += cur.scrollTop;
207
+ return top;
208
+ }
196
209
  function parsePrefixToPath(prefix) {
197
210
  const parts = prefix.split("/").filter(Boolean);
198
211
  const path = [];
@@ -683,7 +696,7 @@ function graphBounds(content) {
683
696
  }
684
697
  return bounds;
685
698
  }
686
- function DependencyGraph({ run, preview = false, removeBorder, viewMode = "dag", setViewMode, layout, editor, yamlJobs, inputs, workflow, fixedHeight }) {
699
+ function DependencyGraph({ run, preview = false, removeBorder, viewMode = "dag", setViewMode, layout, editor, yamlJobs, inputs, workflow, fixedHeight, openStep, onCloseLog, sidebarStickyTop, children }) {
687
700
  const engine = useWorkflowEngine();
688
701
  const animT = .125;
689
702
  const rootJobs = isJobRecord(run.executedJobs) ? run.executedJobs : {};
@@ -724,7 +737,7 @@ function DependencyGraph({ run, preview = false, removeBorder, viewMode = "dag",
724
737
  const cur = containerRef.current;
725
738
  if (!cur) return;
726
739
  setTopOffset((prev) => {
727
- const next = cur.getBoundingClientRect().top;
740
+ const next = unscrolledTop(cur);
728
741
  return prev === next ? prev : next;
729
742
  });
730
743
  };
@@ -768,6 +781,7 @@ function DependencyGraph({ run, preview = false, removeBorder, viewMode = "dag",
768
781
  };
769
782
  }, [preview, fixedHeight]);
770
783
  const { common, dag: dagStrings } = useStrings();
784
+ const stepHeaderRef = useRef(null);
771
785
  const slots = useSlots();
772
786
  const [executedJobsPath, setExecutedJobsPath] = useState([[]]);
773
787
  const [executedJobsPathIdx, setExecutedJobsPathIdx] = useState(0);
@@ -827,7 +841,44 @@ function DependencyGraph({ run, preview = false, removeBorder, viewMode = "dag",
827
841
  setMatrixOpen((prev) => toggled(prev, key));
828
842
  requestAnimationFrame(invalidateConnectors);
829
843
  }, [invalidateConnectors]);
830
- const { data: sublogs, isLoading: sublogsLoading, error: sublogsError } = useRunFile(runSlug, sublogOpen || null, preview ? void 0 : { refreshInterval: 2e3 });
844
+ const nestingDepth = currentPath.length / 5;
845
+ const levelPrefixes = [];
846
+ for (let i = 0; i < nestingDepth; i++) levelPrefixes.push(`subworkflows/${currentPath[5 * i]}/step_${currentPath[5 * i + 2]}/`);
847
+ const pathAppend = levelPrefixes.join("");
848
+ let generalLogPath = "logs.out";
849
+ if (nestingDepth > 0) {
850
+ const lastJob = String(currentPath[5 * (nestingDepth - 1)] ?? "");
851
+ const lastStep = currentPath[5 * (nestingDepth - 1) + 2] ?? "";
852
+ generalLogPath = engine.stepLogPath(levelPrefixes.slice(0, -1).join(""), lastJob, lastStep);
853
+ }
854
+ const openJob = openStep?.job;
855
+ const openStepIndex = openStep?.step;
856
+ const openPrefix = openStep?.prefix ?? "";
857
+ useEffect(() => {
858
+ if (openJob !== void 0 && openStepIndex !== void 0) setSublogOpen(fileBeside(engine.stepLogPath(openPrefix, openJob, openStepIndex), "summary.md"));
859
+ }, [
860
+ engine,
861
+ openJob,
862
+ openStepIndex,
863
+ openPrefix
864
+ ]);
865
+ const [sublogJob = "", sublogStepDir] = sublogOpen.split("/").slice(-3, -1);
866
+ const sublogStep = sublogStepDir === void 0 ? void 0 : sublogStepDir.split("_")[1] ?? "";
867
+ const sublogIsStep = sublogStep !== void 0;
868
+ const sublogJobs = sublogOpen === generalLogPath ? jobs : walkJobPath(rootJobs, parsePrefixToPath(sublogOpen.split("/").slice(0, -4).join("/")));
869
+ const sublogStepData = sublogIsStep ? sublogJobs[sublogJob]?.steps[Number(sublogStep)] : void 0;
870
+ const stepTitle = sublogIsStep ? `${jobLabel(sublogJob, sublogJobs[sublogJob])} › ${engine.stepLabel(sublogStepData ?? {}, Number(sublogStep))}` : "";
871
+ const sublogIsSubworkflow = !!sublogStepData?.subworkflow;
872
+ const sublogDir = sublogOpen.slice(0, sublogOpen.lastIndexOf("/") + 1);
873
+ const sublogFile = sublogOpen.slice(sublogDir.length);
874
+ const sublogHasSummary = !preview && !!sublogStepData?.summary;
875
+ const sublogTab = sublogFile === "summary.md" && sublogHasSummary ? "summary" : sublogFile === "logs.out" || sublogFile === "summary.md" ? "logs" : "script";
876
+ const stepTabs = !sublogIsStep || preview || sublogIsSubworkflow ? [] : sublogHasSummary ? [
877
+ "summary",
878
+ "logs",
879
+ "script"
880
+ ] : ["logs", "script"];
881
+ const { data: sublogs, isLoading: sublogsLoading, error: sublogsError } = useRunFile(runSlug, sublogOpen === "" || sublogTab === "summary" ? null : sublogFile === "summary.md" ? `${sublogDir}logs.out` : sublogOpen, preview ? void 0 : { refreshInterval: 2e3 });
831
882
  useEffect(() => {
832
883
  if (sublogOpen.endsWith("/script-unstable-redacted.sh") && !sublogsLoading && (sublogsError || !sublogs)) setSublogOpen(sublogOpen.replace(/script-unstable-redacted\.sh$/, "script-unstable.sh"));
833
884
  }, [
@@ -836,14 +887,6 @@ function DependencyGraph({ run, preview = false, removeBorder, viewMode = "dag",
836
887
  sublogsError,
837
888
  sublogsLoading
838
889
  ]);
839
- const [sublogJob = "", sublogStepDir] = sublogOpen.split("/").slice(-3, -1);
840
- const sublogStep = sublogStepDir === void 0 ? void 0 : sublogStepDir.split("_")[1] ?? "";
841
- const sublogIsStep = sublogStep !== void 0;
842
- const sublogStepData = sublogIsStep ? jobs[sublogJob]?.steps[Number(sublogStep)] : void 0;
843
- const logName = sublogIsStep ? `Job: ${jobLabel(sublogJob)} \nStep: ${sublogStepData?.name || `Step ${sublogStep}`}` : "";
844
- const sublogIsSubworkflow = !!sublogStepData?.subworkflow;
845
- const sublogFileStart = sublogOpen.lastIndexOf("/") + 1;
846
- const sublogShowsLog = sublogOpen.slice(sublogFileStart) === "logs.out";
847
890
  const rootGraph = useMemo(() => computeGraphLayout(engine, jobs, engine.matrixGroups(jobs), placed), [
848
891
  engine,
849
892
  jobs,
@@ -1022,16 +1065,6 @@ function DependencyGraph({ run, preview = false, removeBorder, viewMode = "dag",
1022
1065
  windowSize,
1023
1066
  executedJobsPathIdx
1024
1067
  ]);
1025
- const nestingDepth = currentPath.length / 5;
1026
- const levelPrefixes = [];
1027
- for (let i = 0; i < nestingDepth; i++) levelPrefixes.push(`subworkflows/${currentPath[5 * i]}/step_${currentPath[5 * i + 2]}/`);
1028
- const pathAppend = levelPrefixes.join("");
1029
- let generalLogPath = "logs.out";
1030
- if (nestingDepth > 0) {
1031
- const lastJob = String(currentPath[5 * (nestingDepth - 1)] ?? "");
1032
- const lastStep = currentPath[5 * (nestingDepth - 1) + 2] ?? "";
1033
- generalLogPath = engine.stepLogPath(levelPrefixes.slice(0, -1).join(""), lastJob, lastStep);
1034
- }
1035
1068
  const missingLogText = sublogIsSubworkflow ? "Subworkflows generally have no logs/scripts at this level.\nClick on the \"Open in new graph\" icon on the subworkflow step to open the subworkflow graph." : sublogsError ? dagStrings.logLoadFailed : (sublogOpen === generalLogPath ? dagStrings.statusReason(run.statusReason) : void 0) ?? dagStrings.noLogFound;
1036
1069
  const currentSublog = sublogOpen === "" ? "" : preview ? engine.toYaml(sublogStepData) : sublogsError || !sublogs ? missingLogText : sublogs;
1037
1070
  const expansionKeys = useMemo(() => engine.expansionKeys(jobs, pathAppend), [
@@ -1087,6 +1120,8 @@ function DependencyGraph({ run, preview = false, removeBorder, viewMode = "dag",
1087
1120
  setSublogOpen(`${sublogSplit.slice(0, -3).join("/")}/${job}/step_${step}/${sublogSplit.slice(-1)[0]}`);
1088
1121
  }, [jobs, sublogOpen]);
1089
1122
  const handleKeyDown = useCallback((e) => {
1123
+ const target = e.target instanceof Element ? e.target : null;
1124
+ if (e.defaultPrevented || e.altKey || e.ctrlKey || e.metaKey || e.shiftKey || target?.closest("input, textarea, select, [contenteditable=\"\"], [contenteditable=\"true\"], [role=\"tablist\"], [role=\"listbox\"], [role=\"menu\"], [role=\"slider\"], [role=\"radiogroup\"]")) return;
1090
1125
  if (e.key === "ArrowRight") nextStep(false);
1091
1126
  else if (e.key === "ArrowLeft") nextStep(true);
1092
1127
  }, [nextStep]);
@@ -1129,40 +1164,99 @@ function DependencyGraph({ run, preview = false, removeBorder, viewMode = "dag",
1129
1164
  })
1130
1165
  }) : void 0;
1131
1166
  const startDt = run.createdAt ? DateTime.fromISO(run.createdAt) : shownAt;
1132
- const additionalBottomLeftBarComponents = sublogIsStep ? /* @__PURE__ */ jsxs(Fragment, { children: [
1133
- /* @__PURE__ */ jsx(IconButton, {
1134
- variant: "outline",
1167
+ const jobNames = Object.keys(jobs);
1168
+ const stepCount = jobNames.reduce((n, name) => n + (jobs[name]?.steps.length ?? 0), 0);
1169
+ const stepPosition = jobNames.slice(0, Math.max(0, jobNames.indexOf(sublogJob))).reduce((n, name) => n + (jobs[name]?.steps.length ?? 0), 0) + Number(sublogStep ?? 0) + 1;
1170
+ const stepPager = sublogIsStep ? /* @__PURE__ */ jsxs("div", {
1171
+ className: "flex shrink-0 items-center",
1172
+ children: [/* @__PURE__ */ jsx(IconButton, {
1135
1173
  icon: /* @__PURE__ */ jsx(ArrowLeftIcon, {}),
1136
1174
  label: dagStrings.previousStep,
1137
1175
  onClick: () => nextStep(true)
1138
- }),
1139
- /* @__PURE__ */ jsx(IconButton, {
1140
- variant: "outline",
1176
+ }), /* @__PURE__ */ jsx(IconButton, {
1141
1177
  icon: /* @__PURE__ */ jsx(ArrowRightIcon, {}),
1142
1178
  label: dagStrings.nextStep,
1143
1179
  onClick: () => nextStep(false)
1144
- }),
1145
- /* @__PURE__ */ jsx("span", {
1146
- className: "pt-0.5 whitespace-pre-wrap text-xs",
1147
- children: logName
1148
- })
1149
- ] }) : void 0;
1150
- const additionalBottomRightBarComponents = (!preview || sublogIsSubworkflow) && sublogIsStep ? /* @__PURE__ */ jsx(Button, {
1151
- variant: "secondary",
1152
- size: "sm",
1153
- onClick: () => {
1154
- if (sublogIsSubworkflow) {
1155
- openInNewGraph(pathAppend, sublogJob, parseInt(sublogStep ?? "", 10));
1156
- setSublogOpen("");
1157
- } else setSublogOpen(sublogOpen.slice(0, sublogFileStart) + (sublogShowsLog ? "script-unstable-redacted.sh" : "logs.out"));
1158
- },
1159
- children: sublogIsSubworkflow ? "Open Subworkflow" : sublogShowsLog ? "Show Script" : "Show Logs"
1180
+ })]
1181
+ }) : void 0;
1182
+ const stepCounter = sublogIsStep && sublogJobs === jobs ? dagStrings.stepOf(stepPosition, stepCount) : void 0;
1183
+ const stepTabLabels = {
1184
+ summary: dagStrings.summaryTab,
1185
+ logs: dagStrings.logsTab,
1186
+ script: dagStrings.scriptTab
1187
+ };
1188
+ const closeLog = () => {
1189
+ setSublogOpen("");
1190
+ onCloseLog?.();
1191
+ };
1192
+ const narrowDialog = windowSize.w < 640;
1193
+ const stepHeader = sublogIsStep ? /* @__PURE__ */ jsxs("div", {
1194
+ ref: stepHeaderRef,
1195
+ className: "grid shrink-0 grid-cols-[auto_minmax(0,1fr)_auto] items-center gap-x-2 gap-y-2 border-b border-(--theme-border) px-2 py-2 sm:flex sm:gap-x-3",
1196
+ children: [
1197
+ stepPager,
1198
+ /* @__PURE__ */ jsxs("div", {
1199
+ className: "flex min-w-0 items-baseline gap-x-2.5 sm:flex-1",
1200
+ children: [/* @__PURE__ */ jsx("h2", {
1201
+ className: "min-w-0 truncate font-semibold",
1202
+ title: stepTitle,
1203
+ children: stepTitle
1204
+ }), stepCounter && /* @__PURE__ */ jsx("span", {
1205
+ className: "hidden shrink-0 text-xs tabular-nums theme-muted-text sm:inline",
1206
+ children: stepCounter
1207
+ })]
1208
+ }),
1209
+ sublogIsSubworkflow && /* @__PURE__ */ jsx(Button, {
1210
+ className: narrowDialog ? "col-span-3 row-start-2 justify-self-start" : void 0,
1211
+ variant: "secondary",
1212
+ size: "sm",
1213
+ onClick: () => {
1214
+ openInNewGraph(pathAppend, sublogJob, parseInt(sublogStep ?? "", 10));
1215
+ setSublogOpen("");
1216
+ },
1217
+ children: dagStrings.openSubworkflow
1218
+ }),
1219
+ stepTabs.length > 0 && /* @__PURE__ */ jsx(Tabs, {
1220
+ className: narrowDialog ? "col-span-3 row-start-2 [&>[role=tablist]]:flex-1" : void 0,
1221
+ label: stepTitle,
1222
+ variant: "segmented",
1223
+ fill: narrowDialog,
1224
+ items: stepTabs.map((tab) => ({
1225
+ value: tab,
1226
+ label: stepTabLabels[tab]
1227
+ })),
1228
+ value: sublogTab,
1229
+ onValueChange: (tab) => setSublogOpen(sublogDir + stepTabFiles[tab])
1230
+ }),
1231
+ /* @__PURE__ */ jsx(IconButton, {
1232
+ className: "col-start-3 row-start-1",
1233
+ icon: /* @__PURE__ */ jsx(CloseIcon, {}),
1234
+ label: common.close,
1235
+ onClick: closeLog
1236
+ })
1237
+ ]
1160
1238
  }) : void 0;
1239
+ const sublogLoading = sublogsLoading && (!sublogs || !runNumber);
1240
+ const sublogLoader = /* @__PURE__ */ jsx(Loader, {
1241
+ label: dagStrings.loadingLogs,
1242
+ size: 70
1243
+ });
1244
+ const stepLogViewer = /* @__PURE__ */ jsx(LogViewer, {
1245
+ log: currentSublog.slice(-1e5),
1246
+ height: sublogIsStep ? "100%" : windowSize.h / 1.2,
1247
+ width: sublogIsStep ? "100%" : windowSize.w / 1.2,
1248
+ hideExpand: true,
1249
+ enableWorkflowCommands: true
1250
+ });
1161
1251
  const graph = /* @__PURE__ */ jsxs("div", {
1162
1252
  className: "flex flex-col lg:flex-row w-full",
1163
1253
  children: [
1164
1254
  !preview && /* @__PURE__ */ jsxs("div", {
1165
- className: "hidden lg:block lg:w-[280px] flex-shrink-0 lg:mr-1",
1255
+ className: cx("hidden lg:block lg:w-[280px] flex-shrink-0 lg:mr-1", sidebarStickyTop !== void 0 && "lg:sticky lg:self-start lg:overflow-y-auto"),
1256
+ style: sidebarStickyTop !== void 0 ? {
1257
+ top: sidebarStickyTop,
1258
+ maxHeight: `calc(100dvh - ${sidebarStickyTop + 24}px)`
1259
+ } : void 0,
1166
1260
  children: [
1167
1261
  slots.runSessions && /* @__PURE__ */ jsx("div", {
1168
1262
  className: "mb-4 overflow-y-auto",
@@ -1267,6 +1361,7 @@ function DependencyGraph({ run, preview = false, removeBorder, viewMode = "dag",
1267
1361
  ]
1268
1362
  }),
1269
1363
  !preview && /* @__PURE__ */ jsx(AnnotationBanner, { executedJobs: jobs }),
1364
+ children,
1270
1365
  viewMode === "tree" && !preview ? /* @__PURE__ */ jsx("div", {
1271
1366
  className: "panel w-full border",
1272
1367
  children: /* @__PURE__ */ jsx(TreeView, {
@@ -1354,45 +1449,42 @@ function DependencyGraph({ run, preview = false, removeBorder, viewMode = "dag",
1354
1449
  }),
1355
1450
  /* @__PURE__ */ jsx(Modal, {
1356
1451
  open: sublogOpen !== "",
1357
- onClose: () => setSublogOpen(""),
1358
- "aria-label": logName.replace(/\s+/g, " ") || sublogOpen.slice(sublogFileStart),
1452
+ onClose: closeLog,
1453
+ "aria-label": stepTitle || sublogFile,
1454
+ initialFocus: () => stepHeaderRef.current?.querySelector("[role=\"tab\"][aria-selected=\"true\"]") ?? true,
1359
1455
  align: "center",
1360
- className: "max-h-full overflow-y-auto p-4 sm:p-6",
1361
- children: /* @__PURE__ */ jsx("div", {
1362
- className: "flex w-full",
1363
- children: sublogsLoading && (!sublogs || !runNumber) ? /* @__PURE__ */ jsx(Loader, {
1364
- label: dagStrings.loadingLogs,
1365
- size: 70
1366
- }) : preview ? /* @__PURE__ */ jsxs("div", { children: [slots.yamlViewer?.({
1456
+ className: sublogIsStep ? "max-h-full overflow-hidden bg-(--theme-panel-bg) p-0" : "max-h-full overflow-y-auto p-4 sm:p-6",
1457
+ children: sublogIsStep ? /* @__PURE__ */ jsxs("div", {
1458
+ className: "flex flex-col",
1459
+ style: preview ? { width: window.innerWidth / 1.4 } : {
1460
+ width: windowSize.w / 1.2,
1461
+ height: windowSize.h / 1.2
1462
+ },
1463
+ children: [stepHeader, preview ? sublogLoading ? /* @__PURE__ */ jsx("div", {
1464
+ className: "flex justify-center py-16",
1465
+ children: sublogLoader
1466
+ }) : slots.yamlViewer?.({
1367
1467
  value: currentSublog,
1368
1468
  height: window.innerHeight / 1.4,
1369
1469
  width: window.innerWidth / 1.4,
1370
1470
  contentKey: `editor_${sublogOpen}`
1371
1471
  }) ?? /* @__PURE__ */ jsx("pre", {
1372
- className: "h-full overflow-auto text-xs p-4",
1373
- style: {
1374
- height: window.innerHeight / 1.4,
1375
- width: window.innerWidth / 1.4
1376
- },
1472
+ className: "overflow-auto p-4 text-xs",
1473
+ style: { height: window.innerHeight / 1.4 },
1377
1474
  children: currentSublog
1378
- }), /* @__PURE__ */ jsxs("div", {
1379
- className: "flex theme-panel select-none items-center gap-x-2 p-2",
1380
- children: [/* @__PURE__ */ jsx("div", {
1381
- className: "w-full flex flex-row gap-x-2 items-center",
1382
- children: /* @__PURE__ */ jsx("div", {
1383
- className: "flex gap-x-2 w-full",
1384
- children: additionalBottomLeftBarComponents
1385
- })
1386
- }), additionalBottomRightBarComponents]
1387
- })] }) : /* @__PURE__ */ jsx(LogViewer, {
1388
- log: currentSublog.slice(-1e5),
1389
- height: windowSize.h / 1.2,
1390
- width: windowSize.w / 1.2,
1391
- hideExpand: true,
1392
- additionalBottomLeftBarComponents,
1393
- additionalBottomRightBarComponents,
1394
- enableWorkflowCommands: true
1395
- })
1475
+ }) : /* @__PURE__ */ jsx("div", {
1476
+ className: "flex min-h-0 flex-1 flex-col",
1477
+ children: sublogTab === "summary" ? /* @__PURE__ */ jsx(StepSummary, {
1478
+ runSlug,
1479
+ path: `${sublogDir}summary.md`
1480
+ }) : sublogLoading ? /* @__PURE__ */ jsx("div", {
1481
+ className: "flex flex-1 items-center justify-center",
1482
+ children: sublogLoader
1483
+ }) : stepLogViewer
1484
+ })]
1485
+ }) : /* @__PURE__ */ jsx("div", {
1486
+ className: "flex w-full",
1487
+ children: sublogLoading ? sublogLoader : stepLogViewer
1396
1488
  })
1397
1489
  })
1398
1490
  ]
@@ -1,5 +1,5 @@
1
1
  import { cx } from "../cx.js";
2
- import { FileTextIcon, OpenInNewGraphIcon } from "../icons.js";
2
+ import { FileTextIcon, OpenInNewGraphIcon, SummaryIcon } from "../icons.js";
3
3
  import { Tooltip } from "../components/Tooltip.js";
4
4
  import { useNavigation, useSlots, useStrings, useWorkflowEngine } from "../components/Provider.js";
5
5
  import { RunStatusIcon } from "../components/RunStatusIcon.js";
@@ -30,7 +30,7 @@ function UsesIcon({ uses, subworkflow }) {
30
30
  });
31
31
  }
32
32
  function Joblist(inputs) {
33
- const { jobActions } = useStrings();
33
+ const { dag, jobActions } = useStrings();
34
34
  const engine = useWorkflowEngine();
35
35
  return inputs.jobNames.map((jobName) => {
36
36
  if (inputs.jobs[jobName]?._matrixGroup) return null;
@@ -68,7 +68,17 @@ function Joblist(inputs) {
68
68
  onClick: () => inputs.onStepClick(jobName, i),
69
69
  className: cx(inputs.preview ? "ml-1.5" : "ml-4", "gap-x-1.5 flex items-center text-left"),
70
70
  "data-testid": stepLabel,
71
- children: [inputs.preview ? "↳" : /* @__PURE__ */ jsx(RunStatusIcon, { status: step.status }), /* @__PURE__ */ jsx("div", { children: stepLabel })]
71
+ children: [
72
+ inputs.preview ? "↳" : /* @__PURE__ */ jsx(RunStatusIcon, { status: step.status }),
73
+ /* @__PURE__ */ jsx("div", { children: stepLabel }),
74
+ step.summary && !inputs.preview && /* @__PURE__ */ jsx(Tooltip, {
75
+ content: dag.hasSummary,
76
+ children: /* @__PURE__ */ jsx(SummaryIcon, {
77
+ "aria-label": dag.hasSummary,
78
+ className: "w-[1.1em] h-[1.1em] shrink-0 text-(--theme-muted-text-color)"
79
+ })
80
+ })
81
+ ]
72
82
  });
73
83
  return /* @__PURE__ */ jsxs("div", { children: [/* @__PURE__ */ jsxs("div", {
74
84
  className: cx("flex items-center", step.status === "skipped" || step.status === "skipped-failed" ? "cursor-default" : "cursor-pointer"),
@@ -0,0 +1,4 @@
1
+ export declare function StepSummary({ runSlug, path }: {
2
+ runSlug: string;
3
+ path: string;
4
+ }): import("react").JSX.Element;
@@ -0,0 +1,31 @@
1
+ import { Loader } from "../components/Loader.js";
2
+ import { useRunFile, useStrings } from "../components/Provider.js";
3
+ import Markdown from "../components/Markdown.js";
4
+ import { jsx } from "react/jsx-runtime";
5
+ //#region src/graph/StepSummary.tsx
6
+ function StepSummary({ runSlug, path }) {
7
+ const { dag } = useStrings();
8
+ const { data, isLoading, error } = useRunFile(runSlug, path);
9
+ return /* @__PURE__ */ jsx("div", {
10
+ className: "min-h-0 flex-1 overflow-y-auto overscroll-contain px-5 py-5 sm:px-8 sm:py-7",
11
+ children: isLoading && data === void 0 ? /* @__PURE__ */ jsx("div", {
12
+ className: "flex h-full items-center justify-center",
13
+ children: /* @__PURE__ */ jsx(Loader, {
14
+ label: dag.loadingSummary,
15
+ size: 70
16
+ })
17
+ }) : error || data === void 0 ? /* @__PURE__ */ jsx("p", {
18
+ className: "text-xs theme-muted-text",
19
+ children: dag.summaryLoadFailed
20
+ }) : /* @__PURE__ */ jsx("div", {
21
+ className: "max-w-[72ch]",
22
+ children: /* @__PURE__ */ jsx(Markdown, {
23
+ httpsImagesOnly: true,
24
+ compact: true,
25
+ children: data
26
+ })
27
+ })
28
+ });
29
+ }
30
+ //#endregion
31
+ export { StepSummary };
@@ -9,4 +9,5 @@ export { type ListedProblem, ProblemsButton } from './ProblemsButton.js';
9
9
  export type { SettingsView } from './settingsViews.js';
10
10
  export { type WorkflowActions, withFields } from './stepWith.js';
11
11
  export type { RunLink } from './types.js';
12
+ export { jobLabel } from './util.js';
12
13
  export { INPUT_FORM_FIELDS, LINK_FIELDS, NEEDS_FIELDS, SESSION_FIELDS, WORKFLOW_FIELDS, WorkflowSettingsDialog, } from './WorkflowSettingsDialog.js';
@@ -1,4 +1,5 @@
1
1
  import { trackDrag } from "./editorPrimitives.js";
2
+ import { jobLabel } from "./util.js";
2
3
  import DependencyGraph, { DependencyGraphPreview } from "./DependencyGraph.js";
3
4
  import { GRAPH_EDITOR_STRINGS, INPUTS_EDITOR_STRINGS } from "./editorStrings.js";
4
5
  import { inputTypes, offeredInputKeys } from "./InputDialog.js";
@@ -7,4 +8,4 @@ import { JOB_FIELDS, RETRY_FIELDS, RUNS_ON_FIELDS, SSH_KEYS, STEP_FIELDS, STRATE
7
8
  import { ProblemsButton } from "./ProblemsButton.js";
8
9
  import { InputsFormEditor } from "./InputsEditor.js";
9
10
  import { INPUT_FORM_FIELDS, LINK_FIELDS, NEEDS_FIELDS, SESSION_FIELDS, WORKFLOW_FIELDS, WorkflowSettingsDialog } from "./WorkflowSettingsDialog.js";
10
- export { DependencyGraph, DependencyGraphPreview, GRAPH_EDITOR_STRINGS, INPUTS_EDITOR_STRINGS, INPUT_FORM_FIELDS, InputsFormEditor, JOB_FIELDS, LINK_FIELDS, NEEDS_FIELDS, ProblemsButton, RETRY_FIELDS, RUNS_ON_FIELDS, SESSION_FIELDS, SSH_KEYS, STEP_FIELDS, STRATEGY_FIELDS, WORKFLOW_FIELDS, WorkflowSettingsDialog, inputTypes, offeredInputKeys, trackDrag, withFields };
11
+ export { DependencyGraph, DependencyGraphPreview, GRAPH_EDITOR_STRINGS, INPUTS_EDITOR_STRINGS, INPUT_FORM_FIELDS, InputsFormEditor, JOB_FIELDS, LINK_FIELDS, NEEDS_FIELDS, ProblemsButton, RETRY_FIELDS, RUNS_ON_FIELDS, SESSION_FIELDS, SSH_KEYS, STEP_FIELDS, STRATEGY_FIELDS, WORKFLOW_FIELDS, WorkflowSettingsDialog, inputTypes, jobLabel, offeredInputKeys, trackDrag, withFields };
@@ -30,6 +30,9 @@ export interface WorkflowStep {
30
30
  startedAt?: string;
31
31
  completedAt?: string;
32
32
  annotations?: WorkflowAnnotation[];
33
+ summary?: {
34
+ bytes: number;
35
+ };
33
36
  subworkflow?: WorkflowSubworkflow | undefined;
34
37
  }
35
38
  interface WorkflowMatrixMeta {
@@ -2,6 +2,6 @@ import type { WorkflowJob } from './types.js';
2
2
  /** How far below a node's top edge its connectors meet it, level with its first job. */
3
3
  export declare const NODE_CONNECTOR_Y = 37;
4
4
  /** A job as people read it: `run_tests` is "Run tests", a matrix member "Build (2/4)". */
5
- export declare function jobLabel(jobName: string, job?: WorkflowJob): string;
5
+ export declare function jobLabel(jobName: string, job?: Pick<WorkflowJob, '_matrix'>): string;
6
6
  /** A copy of `set` with `key` added, or removed if it was there. */
7
7
  export declare function toggled<T>(set: Set<T>, key: T): Set<T>;
package/dist/icons.d.ts CHANGED
@@ -8,6 +8,7 @@ export interface IconProps extends LucideProps {
8
8
  /** An icon from this module or the brand icons. */
9
9
  export type IconType = (props: IconProps) => ReactNode;
10
10
  export declare const AccessIcon: IconType;
11
+ export declare const AddAllocationIcon: IconType;
11
12
  export declare const AddIcon: IconType;
12
13
  export declare const AddProjectIcon: IconType;
13
14
  export declare const AddUserIcon: IconType;
@@ -19,6 +20,7 @@ export declare const ArrowDownIcon: IconType;
19
20
  export declare const ArrowLeftIcon: IconType;
20
21
  export declare const ArrowRightIcon: IconType;
21
22
  export declare const ArrowUpIcon: IconType;
23
+ export declare const ArticleIcon: IconType;
22
24
  export declare const AttachmentIcon: IconType;
23
25
  export declare const AuthenticationIcon: IconType;
24
26
  export declare const BillingIcon: IconType;
@@ -225,6 +227,7 @@ export declare const StopIcon: IconType;
225
227
  export declare const StorageIcon: IconType;
226
228
  export declare const SubdomainIcon: IconType;
227
229
  export declare const SuccessIcon: IconType;
230
+ export declare const SummaryIcon: IconType;
228
231
  export declare const SunIcon: IconType;
229
232
  export declare const SupportIcon: IconType;
230
233
  export declare const SwapIcon: IconType;
package/dist/icons.js CHANGED
@@ -1,5 +1,5 @@
1
1
  import { ErrorCheckmark, SuccessCheckmark } from "./components/StatusIcons.js";
2
- import { Activity, Archive, ArrowDown, ArrowDownWideNarrow, ArrowLeft, ArrowLeftRight, ArrowRight, ArrowUp, ArrowUpDown, ArrowUpNarrowWide, AtSign, BadgeCheck, Ban, BanknoteX, Bell, BellOff, BellRing, BookUser, Bot, Boxes, Braces, Brain, BrainCircuit, Briefcase, Building2, Calendar, CalendarClock, CalendarSync, CalendarX, Camera, ChartLine, ChartPie, Check, ChevronDown, ChevronLeft, ChevronRight, ChevronUp, ChevronsDown, ChevronsDownUp, ChevronsUp, ChevronsUpDown, Circle, CircleAlert, CircleCheck, CircleDollarSign, CircleDot, CircleHelp, CircleMinus, CirclePlay, CircleSlash, CircleX, ClipboardCheck, ClipboardPen, Clock, Cloud, CloudCog, CloudOff, Code, CodeXml, Cog, Columns3, Copy, CopyPlus, CornerUpRight, Cpu, CreditCard, Database, DatabaseSearch, DatabaseZap, Disc3, DollarSign, Download, Earth, Ellipsis, EthernetPort, ExternalLink, Eye, EyeOff, File, FileArchive, FileCode, FileImage, FileJson, FileKey, FilePenLine, FileText, FileType, Files, Fingerprint, Flag, FlaskConical, Folder, FolderKanban, FolderOpen, FolderPlus, FolderTree, Folders, Funnel, FunnelX, Gauge, GitCommitHorizontal, GitFork, GitPullRequest, Globe, GraduationCap, Grid3x3, GripHorizontal, Group, Handshake, HardDrive, HatGlasses, Headset, Heart, HeartOff, History, Hourglass, House, IdCard, Inbox, Info, Key, KeyRound, Keyboard, Landmark, Languages, Layers, LayoutGrid, LibraryBig, Link, List, ListOrdered, ListTodo, ListVideo, LoaderCircle, Lock, LogIn, LogOut, Logs, Mail, MailCheck, MailX, MapPin, MapPinned, Maximize, Megaphone, MemoryStick, Menu, MessageSquare, MessageSquareWarning, MessagesSquare, Minimize, Minimize2, Minus, Monitor, MonitorDown, MonitorPlay, MonitorSmartphone, Moon, Music, Network, NotebookText, PaintBucket, PanelLeft, PanelLeftClose, PanelLeftOpen, Paperclip, PartyPopper, Pause, PcCase, Pencil, PencilLine, Phone, Pin, Play, PlugZap, Plus, Power, Printer, QrCode, Redo2, RefreshCw, Rocket, RotateCcw, RotateCcwSquare, Route, Save, Scale, ScanEye, Search, Send, Server, Settings, Settings2, Share2, Sheet, Shield, ShieldOff, ShieldUser, Smartphone, Sparkles, Square, SquareChevronRight, SquareCode, SquareDashed, SquarePen, SquareSplitHorizontal, SquareTerminal, Star, Store, Sun, Tag, Terminal, TextCursorInput, Trash2, TriangleAlert, Undo2, UndoDot, Unlink, Unplug, Upload, User, UserCheck, UserLock, UserMinus, UserPlus, UserX, Users, Video, Wallet, WandSparkles, Waypoints, Webhook, Wrench, X, Zap, ZoomIn, ZoomOut } from "lucide-react";
2
+ import { Activity, Archive, ArrowDown, ArrowDownWideNarrow, ArrowLeft, ArrowLeftRight, ArrowRight, ArrowUp, ArrowUpDown, ArrowUpNarrowWide, AtSign, BadgeCheck, Ban, BanknoteX, Bell, BellOff, BellRing, BookOpenText, BookUser, Bot, Boxes, Braces, Brain, BrainCircuit, Briefcase, Building2, Calendar, CalendarClock, CalendarSync, CalendarX, Camera, ChartLine, ChartPie, Check, ChevronDown, ChevronLeft, ChevronRight, ChevronUp, ChevronsDown, ChevronsDownUp, ChevronsUp, ChevronsUpDown, Circle, CircleAlert, CircleCheck, CircleDollarSign, CircleDot, CircleHelp, CircleMinus, CirclePlay, CircleSlash, CircleX, ClipboardCheck, ClipboardPen, Clock, Cloud, CloudCog, CloudOff, Code, CodeXml, Cog, Columns3, Copy, CopyPlus, CornerUpRight, Cpu, CreditCard, Database, DatabaseSearch, DatabaseZap, Disc3, DollarSign, Download, Earth, Ellipsis, EthernetPort, ExternalLink, Eye, EyeOff, File, FileArchive, FileCode, FileImage, FileJson, FileKey, FilePenLine, FileText, FileType, Files, Fingerprint, Flag, FlaskConical, Folder, FolderKanban, FolderOpen, FolderPlus, FolderTree, Folders, Funnel, FunnelX, Gauge, GitCommitHorizontal, GitFork, GitPullRequest, Globe, GraduationCap, Grid3x3, GripHorizontal, Group, Handshake, HardDrive, HatGlasses, Headset, Heart, HeartOff, History, Hourglass, House, IdCard, Inbox, Info, Key, KeyRound, Keyboard, Landmark, Languages, Layers, LayoutGrid, LibraryBig, Link, List, ListOrdered, ListTodo, ListVideo, LoaderCircle, Lock, LogIn, LogOut, Logs, Mail, MailCheck, MailX, MapPin, MapPinned, Maximize, Megaphone, MemoryStick, Menu, MessageSquare, MessageSquareWarning, MessagesSquare, Minimize, Minimize2, Minus, Monitor, MonitorDown, MonitorPlay, MonitorSmartphone, Moon, Music, Network, NotebookText, PaintBucket, PanelLeft, PanelLeftClose, PanelLeftOpen, Paperclip, PartyPopper, Pause, PcCase, Pencil, PencilLine, Phone, Pin, Play, PlugZap, Plus, Power, Printer, QrCode, Redo2, RefreshCw, Rocket, RotateCcw, RotateCcwSquare, Route, Save, Scale, ScanEye, ScrollText, Search, Send, Server, Settings, Settings2, Share2, Sheet, Shield, ShieldOff, ShieldUser, Smartphone, Sparkles, Square, SquareChevronRight, SquareCode, SquareDashed, SquarePen, SquareSplitHorizontal, SquareTerminal, Star, Store, Sun, Tag, Terminal, TextCursorInput, Trash2, TriangleAlert, Undo2, UndoDot, Unlink, Unplug, Upload, User, UserCheck, UserLock, UserMinus, UserPlus, UserX, Users, Video, Wallet, WandSparkles, Waypoints, Webhook, Wrench, X, Zap, ZoomIn, ZoomOut, createLucideIcon } from "lucide-react";
3
3
  import { Fragment, jsx, jsxs } from "react/jsx-runtime";
4
4
  //#region src/icons.tsx
5
5
  var STROKE_WIDTH = 2;
@@ -21,7 +21,26 @@ function icon(Glyph, defaults) {
21
21
  return Icon;
22
22
  }
23
23
  var filled = { fill: "currentColor" };
24
+ var WalletPlus = /* @__PURE__ */ createLucideIcon("wallet-plus", [
25
+ ["path", {
26
+ d: "M19 7V4a1 1 0 0 0-1-1H5a2 2 0 0 0 0 4h15a1 1 0 0 1 1 1v4h-3a2 2 0 0 0 0 4h3a1 1 0 0 0 1-1v-2a1 1 0 0 0-1-1",
27
+ key: "wallet-flap"
28
+ }],
29
+ ["path", {
30
+ d: "M3 5v14a2 2 0 0 0 2 2h15a1 1 0 0 0 1-1v-4",
31
+ key: "wallet-body"
32
+ }],
33
+ ["path", {
34
+ d: "M10 11v6",
35
+ key: "plus-stem"
36
+ }],
37
+ ["path", {
38
+ d: "M7 14h6",
39
+ key: "plus-bar"
40
+ }]
41
+ ]);
24
42
  var AccessIcon = /* @__PURE__ */ icon(UserLock);
43
+ var AddAllocationIcon = /* @__PURE__ */ icon(WalletPlus);
25
44
  var AddIcon = /* @__PURE__ */ icon(Plus);
26
45
  var AddProjectIcon = /* @__PURE__ */ icon(FolderPlus);
27
46
  var AddUserIcon = /* @__PURE__ */ icon(UserPlus);
@@ -33,6 +52,7 @@ var ArrowDownIcon = /* @__PURE__ */ icon(ArrowDown);
33
52
  var ArrowLeftIcon = /* @__PURE__ */ icon(ArrowLeft);
34
53
  var ArrowRightIcon = /* @__PURE__ */ icon(ArrowRight);
35
54
  var ArrowUpIcon = /* @__PURE__ */ icon(ArrowUp);
55
+ var ArticleIcon = /* @__PURE__ */ icon(BookOpenText);
36
56
  var AttachmentIcon = /* @__PURE__ */ icon(Paperclip);
37
57
  var AuthenticationIcon = /* @__PURE__ */ icon(Fingerprint);
38
58
  var BillingIcon = /* @__PURE__ */ icon(CreditCard);
@@ -239,6 +259,7 @@ var StopIcon = /* @__PURE__ */ icon(Square);
239
259
  var StorageIcon = /* @__PURE__ */ icon(Database);
240
260
  var SubdomainIcon = /* @__PURE__ */ icon(AtSign);
241
261
  var SuccessIcon = /* @__PURE__ */ icon(CircleCheck);
262
+ var SummaryIcon = /* @__PURE__ */ icon(ScrollText);
242
263
  var SunIcon = /* @__PURE__ */ icon(Sun);
243
264
  var SupportIcon = /* @__PURE__ */ icon(Headset);
244
265
  var SwapIcon = /* @__PURE__ */ icon(ArrowLeftRight);
@@ -264,4 +285,4 @@ var ZipIcon = /* @__PURE__ */ icon(FileArchive);
264
285
  var ZoomInIcon = /* @__PURE__ */ icon(ZoomIn);
265
286
  var ZoomOutIcon = /* @__PURE__ */ icon(ZoomOut);
266
287
  //#endregion
267
- export { APIIcon, AccessIcon, AddIcon, AddProjectIcon, AddUserIcon, AgentIcon, AllocationIcon, ArchiveIcon, ArrowDownIcon, ArrowLeftIcon, ArrowRightIcon, ArrowUpIcon, AttachmentIcon, AuthenticationIcon, BillingIcon, BriefcaseIcon, BucketIcon, BuildWorkflowIcon, CalendarIcon, CancelIcon, CelebrateIcon, CertificateIcon, ChangesRequestedIcon, ChartIcon, ChatIcon, CheckIcon, ChevronDoubleDownIcon, ChevronDoubleUpIcon, ChevronDownIcon, ChevronLeftIcon, ChevronRightIcon, ChevronUpIcon, ClipboardCheckIcon, ClockIcon, CloseIcon, CloudIcon, ClusterIcon, CodeIcon, CollapseIcon, ColumnsIcon, CommentIcon, CommitIcon, ComputeIcon, ConnectIcon, ContractIcon, CopyIcon, CustomizeIcon, DesktopIcon, DestroyIcon, DeviceIcon, DirectoryIcon, DisableCostIcon, DisableUserIcon, DisconnectIcon, DiskIcon, DisplayIcon, DownloadIcon, DragHandleIcon, DuplicateIcon, EditIcon, EditorIcon, EducationIcon, EnableCostIcon, EnableUserIcon, EndpointIcon, ErrorCheckmark, ErrorIcon, EventsIcon, ExpandIcon, ExpandVerticalIcon, ExpiredIcon, ExpiringIcon, ExpressionIcon, ExternalLinkIcon, EyeIcon, EyeOffIcon, FailIcon, FavoriteIcon, FavoriteOutlineIcon, FeaturedIcon, FileIcon, FileTextIcon, FilesIcon, FilesystemIcon, FilterClearIcon, FilterIcon, FlaggedIcon, FlaskIcon, FolderIcon, FolderOpenIcon, FolderTreeIcon, ForbiddenIcon, ForkIcon, GearsIcon, GlobeIcon, GovernmentIcon, GraphIcon, GridIcon, HealthMonitoringIcon, HelpIcon, HistoryIcon, HomeIcon, IdCardIcon, ImageIcon, ImpersonateIcon, InboxIcon, IndexIcon, InfoIcon, InfrastructureLayersIcon, InputFormIcon, InstallIcon, InstanceIcon, InstanceTypeIcon, IpAddressIcon, IssueIcon, JobIcon, JsonIcon, KeyIcon, KeyboardIcon, KubernetesNamespaceIcon, LanguageIcon, LegalIcon, LibraryIcon, LicenseIcon, LinkIcon, ListViewIcon, LockIcon, MFAIcon, MachineImageIcon, MailFailedIcon, MailIcon, MailVerifiedIcon, MapPinIcon, MarketplaceIcon, MatrixIcon, MegaphoneIcon, MigrationIcon, MinimizeIcon, MinusIcon, MlIcon, MoneyIcon, MoonIcon, MoreIcon, MusicIcon, MuteIcon, NavigationIcon, NetworkInterfaceIcon, NewChatIcon, NodeIcon, NotRunningIcon, NotebookIcon, NotificationIcon, OnboardingIcon, OpenInNewGraphIcon, OrganizationIcon, PartnerIcon, PasswordIcon, PauseIcon, PdfIcon, PendingIcon, PhoneIcon, PieChartIcon, PinFilledIcon, PinIcon, PowerIcon, PowershellIcon, PreviewIcon, PrintIcon, ProjectIcon, PublishIcon, PullRequestIcon, QRCodeIcon, QueueIcon, QuotaIcon, RedoIcon, RefreshIcon, RemoveIcon, RemoveUserIcon, RenameIcon, RenewIcon, ResetLayoutIcon, ResourceGroupIcon, ResourceIcon, RetryIcon, RoleIcon, RollbackIcon, RunWorkflowIcon, RunningIcon, RunsIcon, SaveIcon, SchedulerIcon, ScriptIcon, SearchIcon, SendIcon, ServiceIcon, SessionIcon, SettingsIcon, ShareIcon, ShieldIcon, ShieldOffIcon, ShrinkIcon, SidebarCloseIcon, SidebarIcon, SidebarOpenIcon, SignInIcon, SignOutIcon, SkipIcon, SnapshotIcon, SortDownIcon, SortUnsortedIcon, SortUpIcon, SparklesIcon, SplitIcon, SpreadsheetIcon, StartIcon, StopIcon, StorageIcon, SubdomainIcon, SuccessCheckmark, SuccessIcon, SunIcon, SupportIcon, SwapIcon, TagIcon, TerminalIcon, ThinkingIcon, TodoIcon, TrashIcon, TunnelIcon, UndoIcon, UnfavoriteIcon, UnlinkIcon, UnmuteIcon, UploadIcon, UserIcon, UserWorkspaceIcon, UsersIcon, VideoIcon, WarningIcon, WebhookIcon, ZapIcon, ZipIcon, ZoomInIcon, ZoomOutIcon };
288
+ export { APIIcon, AccessIcon, AddAllocationIcon, AddIcon, AddProjectIcon, AddUserIcon, AgentIcon, AllocationIcon, ArchiveIcon, ArrowDownIcon, ArrowLeftIcon, ArrowRightIcon, ArrowUpIcon, ArticleIcon, AttachmentIcon, AuthenticationIcon, BillingIcon, BriefcaseIcon, BucketIcon, BuildWorkflowIcon, CalendarIcon, CancelIcon, CelebrateIcon, CertificateIcon, ChangesRequestedIcon, ChartIcon, ChatIcon, CheckIcon, ChevronDoubleDownIcon, ChevronDoubleUpIcon, ChevronDownIcon, ChevronLeftIcon, ChevronRightIcon, ChevronUpIcon, ClipboardCheckIcon, ClockIcon, CloseIcon, CloudIcon, ClusterIcon, CodeIcon, CollapseIcon, ColumnsIcon, CommentIcon, CommitIcon, ComputeIcon, ConnectIcon, ContractIcon, CopyIcon, CustomizeIcon, DesktopIcon, DestroyIcon, DeviceIcon, DirectoryIcon, DisableCostIcon, DisableUserIcon, DisconnectIcon, DiskIcon, DisplayIcon, DownloadIcon, DragHandleIcon, DuplicateIcon, EditIcon, EditorIcon, EducationIcon, EnableCostIcon, EnableUserIcon, EndpointIcon, ErrorCheckmark, ErrorIcon, EventsIcon, ExpandIcon, ExpandVerticalIcon, ExpiredIcon, ExpiringIcon, ExpressionIcon, ExternalLinkIcon, EyeIcon, EyeOffIcon, FailIcon, FavoriteIcon, FavoriteOutlineIcon, FeaturedIcon, FileIcon, FileTextIcon, FilesIcon, FilesystemIcon, FilterClearIcon, FilterIcon, FlaggedIcon, FlaskIcon, FolderIcon, FolderOpenIcon, FolderTreeIcon, ForbiddenIcon, ForkIcon, GearsIcon, GlobeIcon, GovernmentIcon, GraphIcon, GridIcon, HealthMonitoringIcon, HelpIcon, HistoryIcon, HomeIcon, IdCardIcon, ImageIcon, ImpersonateIcon, InboxIcon, IndexIcon, InfoIcon, InfrastructureLayersIcon, InputFormIcon, InstallIcon, InstanceIcon, InstanceTypeIcon, IpAddressIcon, IssueIcon, JobIcon, JsonIcon, KeyIcon, KeyboardIcon, KubernetesNamespaceIcon, LanguageIcon, LegalIcon, LibraryIcon, LicenseIcon, LinkIcon, ListViewIcon, LockIcon, MFAIcon, MachineImageIcon, MailFailedIcon, MailIcon, MailVerifiedIcon, MapPinIcon, MarketplaceIcon, MatrixIcon, MegaphoneIcon, MigrationIcon, MinimizeIcon, MinusIcon, MlIcon, MoneyIcon, MoonIcon, MoreIcon, MusicIcon, MuteIcon, NavigationIcon, NetworkInterfaceIcon, NewChatIcon, NodeIcon, NotRunningIcon, NotebookIcon, NotificationIcon, OnboardingIcon, OpenInNewGraphIcon, OrganizationIcon, PartnerIcon, PasswordIcon, PauseIcon, PdfIcon, PendingIcon, PhoneIcon, PieChartIcon, PinFilledIcon, PinIcon, PowerIcon, PowershellIcon, PreviewIcon, PrintIcon, ProjectIcon, PublishIcon, PullRequestIcon, QRCodeIcon, QueueIcon, QuotaIcon, RedoIcon, RefreshIcon, RemoveIcon, RemoveUserIcon, RenameIcon, RenewIcon, ResetLayoutIcon, ResourceGroupIcon, ResourceIcon, RetryIcon, RoleIcon, RollbackIcon, RunWorkflowIcon, RunningIcon, RunsIcon, SaveIcon, SchedulerIcon, ScriptIcon, SearchIcon, SendIcon, ServiceIcon, SessionIcon, SettingsIcon, ShareIcon, ShieldIcon, ShieldOffIcon, ShrinkIcon, SidebarCloseIcon, SidebarIcon, SidebarOpenIcon, SignInIcon, SignOutIcon, SkipIcon, SnapshotIcon, SortDownIcon, SortUnsortedIcon, SortUpIcon, SparklesIcon, SplitIcon, SpreadsheetIcon, StartIcon, StopIcon, StorageIcon, SubdomainIcon, SuccessCheckmark, SuccessIcon, SummaryIcon, SunIcon, SupportIcon, SwapIcon, TagIcon, TerminalIcon, ThinkingIcon, TodoIcon, TrashIcon, TunnelIcon, UndoIcon, UnfavoriteIcon, UnlinkIcon, UnmuteIcon, UploadIcon, UserIcon, UserWorkspaceIcon, UsersIcon, VideoIcon, WarningIcon, WebhookIcon, ZapIcon, ZipIcon, ZoomInIcon, ZoomOutIcon };
package/dist/index.d.ts CHANGED
@@ -12,6 +12,7 @@ export { ConfirmModal, type ConfirmModalProps } from './components/ConfirmModal.
12
12
  export { type OpenMenu, type OpenMenuOptions, useContextMenu, } from './components/ContextMenu.js';
13
13
  export { CopyButton, type CopyButtonProps, CopyCodeBlock, type CopyCodeBlockProps, } from './components/CopyButton.js';
14
14
  export { CreateModal, CreateModalSelect, CreateModalSwitch, } from './components/CreateModal.js';
15
+ export { categoryClasses, categoryOf } from './components/category.js';
15
16
  export { DatePicker, type DatePickerProps } from './components/DatePicker.js';
16
17
  export { DescriptionListGroup, DescriptionListItem, type DescriptionListItemProps, type DescriptionListProps, type DescriptionListVariant, default as DescriptionList, } from './components/DescriptionList.js';
17
18
  export { Disclosure, DisclosurePanel, type DisclosureProps } from './components/Disclosure.js';