@parallelworks/ui 0.16.0 → 0.18.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 (59) hide show
  1. package/LICENSE +202 -21
  2. package/dist/chunks/{CodePreviewEditor-DuMZMA_k.js → CodePreviewEditor-4lx3kE-w.js} +2 -2
  3. package/dist/chunks/{CreateModal-B7smkHkv.js → CreateModal-BY6DLmur.js} +11 -11
  4. package/dist/chunks/{lib-CUTRDpa6.js → FieldWrapper-Bef01EWO.js} +49 -48
  5. package/dist/chunks/{Monaco-BXDH2jVj.js → Monaco-C1POOdVv.js} +485 -172
  6. package/dist/chunks/{PageHeader-CoZWF0pJ.js → PageHeader-l49p1nM9.js} +145 -82
  7. package/dist/chunks/{Provider-CbFVFB7O.js → Provider-Ghua9PkN.js} +34 -6
  8. package/dist/chunks/{StatusBadge-zvEtK16a.js → StatusBadge-C1Blx_cW.js} +23 -6
  9. package/dist/chunks/{SwitchToggle-3V836Cn7.js → SwitchToggle-CHPP8uZQ.js} +17 -14
  10. package/dist/chunks/{Table-CutP1bRt.js → Table-4OHjdKdO.js} +2 -2
  11. package/dist/chunks/{Tooltip-n9w7Tkt1.js → Tooltip-Crxo_eU_.js} +3 -3
  12. package/dist/chunks/{editor-Ko3zX22Y.js → editor-9_uVtUyy.js} +4 -4
  13. package/dist/chunks/{list-CduoUsMW.js → list-qrojZZNv.js} +146 -33
  14. package/dist/components/AddMenu.d.ts +1 -0
  15. package/dist/components/Avatar.d.ts +13 -0
  16. package/dist/components/Button.d.ts +2 -1
  17. package/dist/components/Dropdown.d.ts +2 -0
  18. package/dist/components/Provider.d.ts +59 -2
  19. package/dist/components/SectionHeader.d.ts +3 -1
  20. package/dist/components/StatusBadge.d.ts +7 -2
  21. package/dist/components/relativeTime.d.ts +15 -0
  22. package/dist/editor/index.js +1 -1
  23. package/dist/editor/usesGitlab.d.ts +97 -0
  24. package/dist/file-explorer/index.js +275 -274
  25. package/dist/file-explorer/lib/paging.d.ts +27 -28
  26. package/dist/file-explorer/lib/types.d.ts +0 -1
  27. package/dist/file-explorer/lib/utils.d.ts +16 -5
  28. package/dist/form/FieldWrapper.d.ts +2 -1
  29. package/dist/form/Form.d.ts +3 -1
  30. package/dist/form/index.js +23 -21
  31. package/dist/form/types/fieldComponentTypes.d.ts +1 -0
  32. package/dist/form/types/fieldTypes.d.ts +4 -4
  33. package/dist/form/types/workflow-schema.d.ts +38 -0
  34. package/dist/form/useParsedOpts.d.ts +1 -1
  35. package/dist/icons.d.ts +1 -1
  36. package/dist/icons.js +3 -3
  37. package/dist/index.d.ts +5 -2
  38. package/dist/index.js +49 -18
  39. package/dist/list/ListPage.d.ts +3 -1
  40. package/dist/list/ListPager.d.ts +3 -1
  41. package/dist/list/ListTable.d.ts +2 -1
  42. package/dist/list/RowContextMenu.d.ts +9 -9
  43. package/dist/list/UserHoverCard.d.ts +45 -0
  44. package/dist/list/index.d.ts +2 -1
  45. package/dist/list/index.js +3 -3
  46. package/dist/list/listView.d.ts +1 -1
  47. package/dist/logviewer/index.js +7 -7
  48. package/dist/styles/Geist-Variable.woff2 +0 -0
  49. package/dist/styles/GeistMono-Variable.woff2 +0 -0
  50. package/dist/styles/base.css +57 -0
  51. package/dist/styles/fonts.css +15 -0
  52. package/dist/styles/theme.css +6 -40
  53. package/dist/styles.css +1 -1
  54. package/dist/workflow/DependencyGraph.d.ts +2 -0
  55. package/dist/workflow/index.d.ts +1 -0
  56. package/dist/workflow/index.js +10 -9
  57. package/dist/workflow/types.d.ts +5 -0
  58. package/package.json +12 -11
  59. package/dist/chunks/{BareModal-BqroLbZ5.js → BareModal-BtRiQezg.js} +1 -1
@@ -7,11 +7,10 @@ export type TListPageRequest = {
7
7
  /** Overridable so a test can page without seeding 2,000 objects. */
8
8
  pageSize?: number;
9
9
  };
10
- /** Keyed by tree path. A storage's flat `objects` bag cannot say whether a directory
11
- * was listed at all, only whether anything landed under it. */
10
+ /** Keyed by tree path. */
12
11
  export type TDirectoryListing = {
13
12
  /** Present ⇒ more entries exist and the provider can resume from here. */
14
- cursor?: string;
13
+ cursor?: string | undefined;
15
14
  /** 0 ⇒ never listed, which is what tells "empty" apart from "not asked yet". */
16
15
  pagesLoaded: number;
17
16
  /** Not `loadingPaths`, which swaps the whole table for a skeleton and would blank
@@ -19,7 +18,9 @@ export type TDirectoryListing = {
19
18
  loadingMore: boolean;
20
19
  /** The storage-level error surfaces only on an empty folder, so without this a
21
20
  * failure mid-folder is invisible. */
22
- error?: string;
21
+ error?: string | undefined;
22
+ /** A new array per page, never mutated: the builder reuses work by identity. */
23
+ entries: readonly TStorageObject[];
23
24
  };
24
25
  /** Uncapped, opening a 200k-object folder and scrolling would walk all of it. */
25
26
  export declare const MAX_AUTO_PAGES = 5;
@@ -32,20 +33,20 @@ export declare function canAutoLoadMore(listings: TListings, path: string): bool
32
33
  export declare function isLoadingMore(listings: TListings, path: string): boolean;
33
34
  export declare function loadMoreError(listings: TListings, path: string): string | undefined;
34
35
  export declare function beginLoadingMore(listings: TListings, path: string): TListings;
35
- /** `expectedPagesLoaded` is captured before the request: a mismatch means a refresh
36
- * reset this directory while the page was in flight. */
37
- export declare function advanceListing(listings: TListings, path: string, page: {
38
- cursor?: string;
39
- }, expectedPagesLoaded: number): TListings;
40
- /** Always a new map, since the hydration walk only re-runs on a `listings` change.
41
- * `pagesLoaded` stays put, so a failed first page still reads as unlisted. */
36
+ type TListPage = {
37
+ cursor?: string | undefined;
38
+ entries: readonly TStorageObject[];
39
+ };
40
+ export declare function advanceListing(listings: TListings, path: string, page: TListPage): TListings;
41
+ /** Subfolders the page no longer names lose their records, or a re-created folder
42
+ * would show old contents; the rest keep theirs, since a refresh lists them
43
+ * alongside this one and a parent landing later must not undo a child's page. */
44
+ export declare function replaceListing(listings: TListings, path: string, page: TListPage): TListings;
45
+ /** `pagesLoaded` stays put, so a failed first page still reads as unlisted. */
42
46
  export declare function recordListingError(listings: TListings, path: string, error: string): TListings;
43
- /** Slash-terminates the prefix: without it, clearing `logs` would also clear
44
- * `logs-archive/`. */
47
+ /** Keeps the cursor and pages, so a retry resumes paging instead of starting over. */
48
+ export declare function clearListingError(listings: TListings, path: string): TListings;
45
49
  export declare function clearListingsUnder(listings: TListings, path: string): TListings;
46
- /** The same prefix rule for the attempt sets that shadow `listings`. They gate
47
- * re-listing, so a path left behind here reads as tried-and-empty forever. */
48
- export declare function forgetPathsUnder(paths: Set<string>, path: string): void;
49
50
  /** Tree paths whose children should keep arrival order, since sorting them would
50
51
  * reshuffle rows under the user mid-scroll. */
51
52
  export declare function incompletePaths(listings: TListings): Set<string>;
@@ -62,15 +63,18 @@ type THydrationStep =
62
63
  | {
63
64
  kind: 'more';
64
65
  path: string;
65
- } | {
66
+ }
67
+ /** The deepest directory reached. */
68
+ | {
66
69
  kind: 'stuck';
70
+ path: string;
67
71
  }
68
72
  /** Either resolved, or a request is already in flight. */
69
73
  | {
70
74
  kind: 'done';
71
75
  };
72
76
  /** What a deep link needs next. Pure so the walk is table-testable. */
73
- export declare function nextHydrationStep({ targetResolved, ancestors, isListableDir, listings, inFlight, attempted, pagesPulled, }: {
77
+ export declare function nextHydrationStep({ targetResolved, ancestors, isListableDir, listings, inFlight, pagesPulled, }: {
74
78
  targetResolved: boolean;
75
79
  /** Directory paths from the storage root down to the target. */
76
80
  ancestors: readonly string[];
@@ -78,16 +82,11 @@ export declare function nextHydrationStep({ targetResolved, ancestors, isListabl
78
82
  * introduced yet. */
79
83
  isListableDir: (path: string) => boolean;
80
84
  listings: TListings;
81
- /** Must not be a state value: `attempted` is a ref, so a state-backed signal would
82
- * lag it by a render and make an in-flight ancestor read as stuck. */
83
- inFlight: ReadonlySet<string>;
84
- attempted: ReadonlySet<string>;
85
+ /** Must not be a state value: it would lag the claim by a render and make an
86
+ * in-flight ancestor read as stuck. */
87
+ inFlight: {
88
+ has(path: string): boolean;
89
+ };
85
90
  pagesPulled: number;
86
91
  }): THydrationStep;
87
- /** `replace` drops the directory's previous contents first, which is how a refresh
88
- * sheds deleted objects rather than re-adding them. */
89
- export declare function nextObjects(previous: TStorageObject[], page: TStorageObject[], options: {
90
- replace?: boolean;
91
- dirPath: string;
92
- }): TStorageObject[];
93
92
  export {};
@@ -16,7 +16,6 @@ export type TStorage = {
16
16
  canShare?: boolean | undefined;
17
17
  canManageAccess?: boolean | undefined;
18
18
  supportsPwUri?: boolean | undefined;
19
- objects?: TStorageObject[];
20
19
  };
21
20
  export type TStorageObject = {
22
21
  path: string;
@@ -1,14 +1,23 @@
1
1
  import type { IFileExplorerClient } from './fileExplorer.js';
2
- import type { TStorage, TreeMap, TreeNode, UploadNode } from './types.js';
2
+ import type { TStorage, TStorageObject, TreeMap, TreeNode, UploadNode } from './types.js';
3
3
  export declare function formatFileSize(bytes: number): string;
4
4
  export declare function getFileExtension(filename: string): string | null;
5
- export declare function buildTreeFromUserStorages(storages: TStorage[], options?: {
6
- forceUserHierarchy?: boolean;
7
- unsortedParents?: ReadonlySet<string>;
8
- }): {
5
+ export declare function getNodeName(node: TStorageObject): string;
6
+ export type TTree = {
9
7
  treeMap: TreeMap;
10
8
  parentToChildrenMap: Record<string, TreeNode[]>;
9
+ rootNodes: TreeNode[];
10
+ };
11
+ export type TTreeOptions = {
12
+ listings: ReadonlyMap<string, {
13
+ readonly entries: readonly TStorageObject[];
14
+ }>;
15
+ forceUserHierarchy?: boolean;
16
+ unsortedParents?: ReadonlySet<string>;
11
17
  };
18
+ /** One accumulator per listed directory, so a landed page costs the page and not
19
+ * the tree. One builder per explorer instance. */
20
+ export declare function createTreeBuilder(): (storages: TStorage[], options: TTreeOptions) => TTree;
12
21
  export declare function getNodeChildren(parentToChildrenMap: Record<string, TreeNode[]>, parentPath: string): TreeNode[];
13
22
  export declare function getParentPath(currentPath: string): string;
14
23
  export type DirectoryNameError = 'reserved' | 'separator' | 'exists';
@@ -26,8 +35,10 @@ export declare function pruneNodesInsideSelectedDirectories(nodes: TreeNode[]):
26
35
  export declare function collectObjectKeysToDelete(nodes: TreeNode[], listKeysUnderPrefix: (prefix: string) => Promise<string[]>): Promise<string[]>;
27
36
  export declare function getPwUri(username: string, pwName: string, key: string): string;
28
37
  export declare function getCspUri(csp: string, cspBucketName: string, key: string): string | null;
38
+ export declare function getUriScheme(uri: string): string;
29
39
  export declare function removeLeadingSlash(path: string): string;
30
40
  export declare function removeLeadingAndTrailingSlashes(path: string): string;
41
+ export declare function ensureTrailingSlash(path: string): string;
31
42
  export declare function isClientValid(client: IFileExplorerClient): boolean;
32
43
  export declare function getUploadSessionETA(totalLoadedBytes: number, totalSizeBytes: number, lastProgressTime?: number, lastProgressBytes?: number): {
33
44
  estimatedSecondsLeft?: number;
@@ -1,4 +1,5 @@
1
1
  import type React from 'react';
2
+ import type { Optional } from './types/workflow-schema.js';
2
3
  export interface FieldLabelBinding {
3
4
  id: string;
4
5
  labelId: string;
@@ -10,6 +11,6 @@ export declare function FieldWrapper({ label, tooltipComponent, description, lab
10
11
  description?: string | undefined;
11
12
  labelPosition?: 'left' | 'top' | undefined;
12
13
  spaceCompact?: boolean | undefined;
13
- optional?: boolean | undefined;
14
+ optional?: Optional | undefined;
14
15
  children: React.ReactNode | ((binding: FieldLabelBinding) => React.ReactNode);
15
16
  }): React.JSX.Element;
@@ -105,6 +105,8 @@ export interface DynamicFormProps {
105
105
  missingFields?: string[] | undefined;
106
106
  spaceCompact?: boolean;
107
107
  organizationVariables?: WorkflowVariables | undefined;
108
+ /** A remote workflow's repo/branch/yaml, so `${{ remote.* }}` resolves the same here as it does on the run. */
109
+ remoteVars?: Record<string, string | undefined> | undefined;
108
110
  needsOrganizationVariables?: boolean;
109
111
  onSubmit?: ((values: Record<string, unknown>) => void) | undefined;
110
112
  submitLabel?: string;
@@ -120,5 +122,5 @@ export interface DynamicFormProps {
120
122
  /** Host-supplied field components, merged over the core registry by type. */
121
123
  fields?: Record<string, FieldComponent>;
122
124
  }
123
- export declare function DynamicForm({ formJSONs: options, reinitialize, initialValues, setValues, setFormDirty, formikRef, labelPosition, missingFields, spaceCompact, organizationVariables, needsOrganizationVariables, onSubmit, submitLabel, className, workflowForm, contextKey, skipValueParse, fields, }: DynamicFormProps): React.JSX.Element;
125
+ export declare function DynamicForm({ formJSONs: options, reinitialize, initialValues, setValues, setFormDirty, formikRef, labelPosition, missingFields, spaceCompact, organizationVariables, remoteVars, needsOrganizationVariables, onSubmit, submitLabel, className, workflowForm, contextKey, skipValueParse, fields, }: DynamicFormProps): React.JSX.Element;
124
126
  export {};
@@ -1,14 +1,14 @@
1
+ import { l as useSlots, u as useStrings } from "../chunks/Provider-Ghua9PkN.js";
1
2
  import { AngleRightIcon, EyeIcon, EyeOffIcon, SuccessCheckmark, TrashIcon } from "../icons.js";
2
- import { c as useStrings, s as useSlots } from "../chunks/Provider-CbFVFB7O.js";
3
- import { n as TOOLTIP_ID, r as TooltipInfo } from "../chunks/Tooltip-n9w7Tkt1.js";
4
- import { n as StatusDot, s as isCategory } from "../chunks/StatusBadge-zvEtK16a.js";
5
- import { a as UncontrolledCollapsiblePanel, c as Dropdown, n as SectionHeader, o as MultiSelectDropdown, r as ControlledCollapsiblePanel, s as CustomListbox, t as SwitchToggle } from "../chunks/SwitchToggle-3V836Cn7.js";
3
+ import { n as TOOLTIP_ID, r as TooltipInfo } from "../chunks/Tooltip-Crxo_eU_.js";
4
+ import { c as isCategory, n as StatusDot } from "../chunks/StatusBadge-C1Blx_cW.js";
5
+ import { a as UncontrolledCollapsiblePanel, c as Dropdown, n as SectionHeader, o as MultiSelectDropdown, r as ControlledCollapsiblePanel, s as CustomListbox, t as SwitchToggle } from "../chunks/SwitchToggle-CHPP8uZQ.js";
6
6
  import { t as Loader } from "../chunks/Loader-BXoXTZGc.js";
7
- import { n as Table } from "../chunks/Table-CutP1bRt.js";
8
- import { a as resolvedFlag, c as FieldWrapper, d as useFieldLabelledByProps, f as useFieldRequired, i as initializeValues, l as FieldProvider, n as flattenGroups, o as applySecondaryField, r as impureSetValueFromPath, s as findSecondaryOption, t as enforceOneMustBeTrue, u as useFieldControlProps } from "../chunks/lib-CUTRDpa6.js";
7
+ import { n as Table } from "../chunks/Table-4OHjdKdO.js";
8
+ import { a as initializeValues, c as findSecondaryOption, d as useFieldLabelledByProps, f as useFieldRequired, i as impureSetValueFromPath, l as FieldProvider, n as enforceOneMustBeTrue, o as resolvedFlag, r as flattenGroups, s as applySecondaryField, t as FieldWrapper, u as useFieldControlProps } from "../chunks/FieldWrapper-Bef01EWO.js";
9
9
  import cx from "classnames";
10
- import { Fragment, jsx, jsxs } from "react/jsx-runtime";
11
10
  import React, { Suspense, createContext, memo, useCallback, useContext, useEffect, useId, useMemo, useRef, useState } from "react";
11
+ import { Fragment as Fragment$1, jsx, jsxs } from "react/jsx-runtime";
12
12
  import deepEqual from "fast-deep-equal";
13
13
  import { Duration } from "luxon";
14
14
  import { callWhenParserInitialized, convertToDynamicForm, extractInputDeps, initializeParseStringsOfObj, parseStringsOfObj, parseStringsOfObjReady } from "@parallelworks/workflow-parser";
@@ -74,12 +74,13 @@ var EMPTY_KEYS = [];
74
74
  /**
75
75
  * useMemo won't work here — Formik values changes on every keystroke, so this hook extracts which inputs.* keys the schema references and re-parses only when those change. Defaults `userVars`/`secretKeys` to empty — callers in React scope should pass them from `useUserVars()` so the parser leaves `${{ var.SECRET }}` literal during template eval (otherwise the recursive substitution turns `"https://${{ var.PAT }}@host/"` into `"https://@host/"`).
76
76
  */
77
- function useParsedOpts(rawOptions, values, organizationVariables, userVars = EMPTY_VARS, secretKeys = EMPTY_KEYS) {
77
+ function useParsedOpts(rawOptions, values, organizationVariables, userVars = EMPTY_VARS, secretKeys = EMPTY_KEYS, remoteVars = EMPTY_VARS) {
78
78
  const c = useRef({
79
79
  rawOptions: null,
80
80
  orgVars: void 0,
81
81
  userVars: null,
82
82
  secretKeys: null,
83
+ remoteVars: null,
83
84
  converted: {},
84
85
  inputDeps: /* @__PURE__ */ new Set(),
85
86
  hasExpressions: false,
@@ -94,13 +95,11 @@ function useParsedOpts(rawOptions, values, organizationVariables, userVars = EMP
94
95
  c.hasExpressions = hasExpressions;
95
96
  c.result = null;
96
97
  }
97
- if (organizationVariables !== c.orgVars) {
98
+ if (organizationVariables !== c.orgVars || userVars !== c.userVars || secretKeys !== c.secretKeys || remoteVars !== c.remoteVars) {
98
99
  c.orgVars = organizationVariables;
99
- c.result = null;
100
- }
101
- if (userVars !== c.userVars || secretKeys !== c.secretKeys) {
102
100
  c.userVars = userVars;
103
101
  c.secretKeys = secretKeys;
102
+ c.remoteVars = remoteVars;
104
103
  c.result = null;
105
104
  }
106
105
  if (c.result !== null) {
@@ -117,7 +116,8 @@ function useParsedOpts(rawOptions, values, organizationVariables, userVars = EMP
117
116
  obj: c.converted,
118
117
  orgVars: organizationVariables,
119
118
  userVars,
120
- secretKeys
119
+ secretKeys,
120
+ remoteVars
121
121
  });
122
122
  c.result = parsed;
123
123
  c.relevantSnapshot = {};
@@ -1318,7 +1318,7 @@ var DurationField_default = memo(function DurationField({ field, label, labelPos
1318
1318
  labelPosition,
1319
1319
  spaceCompact: spaceCompact ?? false,
1320
1320
  ...field.description !== void 0 && { description: field.description },
1321
- children: ({ id, describedBy }) => /* @__PURE__ */ jsxs(Fragment, { children: [
1321
+ children: ({ id, describedBy }) => /* @__PURE__ */ jsxs(Fragment$1, { children: [
1322
1322
  !isSentinel && /* @__PURE__ */ jsx("input", {
1323
1323
  "data-1p-ignore": true,
1324
1324
  className: cx("w-full", disabled && "disabled", (missing || error !== null) && "invalid"),
@@ -1933,7 +1933,7 @@ function MultiSelectionDropdown({ name, label = "", invalid = false, options: in
1933
1933
  useEffect(() => {
1934
1934
  if (prevParent && parentValue && prevParent !== parentValue) setFieldValue(name, []);
1935
1935
  }, [parentValue]);
1936
- return /* @__PURE__ */ jsxs(Fragment, { children: [/* @__PURE__ */ jsx(CustomListbox, {
1936
+ return /* @__PURE__ */ jsxs(Fragment$1, { children: [/* @__PURE__ */ jsx(CustomListbox, {
1937
1937
  ...controlProps,
1938
1938
  options,
1939
1939
  required,
@@ -2209,14 +2209,14 @@ function FieldsFromOptions({ options = {}, values, setFormDirty, setFieldValue,
2209
2209
  }, idx));
2210
2210
  }
2211
2211
  var noop = () => {};
2212
- function DynamicFormContent({ options, setValues, setFormDirty, labelPosition, missingFields, spaceCompact, organizationVariables, workflowForm, onSubmit, submitLabel, values, contextKey }) {
2212
+ function DynamicFormContent({ options, setValues, setFormDirty, labelPosition, missingFields, spaceCompact, organizationVariables, remoteVars, workflowForm, onSubmit, submitLabel, values, contextKey }) {
2213
2213
  const { setFieldValue, setFieldTouched } = useFormikContext();
2214
- const opts = useParsedOpts(options, values, organizationVariables);
2214
+ const opts = useParsedOpts(options, values, organizationVariables, void 0, void 0, remoteVars);
2215
2215
  const handleChange = useCallback((state) => {
2216
2216
  if (setValues) setValues(state);
2217
2217
  }, [setValues]);
2218
2218
  const wizardConfig = parseWizardConfig(opts);
2219
- return /* @__PURE__ */ jsxs(Fragment, { children: [
2219
+ return /* @__PURE__ */ jsxs(Fragment$1, { children: [
2220
2220
  /* @__PURE__ */ jsx(DirtyStateBridge, { setFormDirty }),
2221
2221
  /* @__PURE__ */ jsx(FormikStateBridge, { onChange: handleChange }),
2222
2222
  /* @__PURE__ */ jsx(DynamicDefaultsSync, { options: opts }, contextKey ?? ""),
@@ -2231,7 +2231,7 @@ function DynamicFormContent({ options, setValues, setFormDirty, labelPosition, m
2231
2231
  workflowForm,
2232
2232
  setFieldValue,
2233
2233
  setFieldTouched
2234
- }) : /* @__PURE__ */ jsxs(Fragment, { children: [/* @__PURE__ */ jsx(FieldsFromOptions, {
2234
+ }) : /* @__PURE__ */ jsxs(Fragment$1, { children: [/* @__PURE__ */ jsx(FieldsFromOptions, {
2235
2235
  ...resolveMetaOverrides(options, labelPosition, spaceCompact),
2236
2236
  options: opts,
2237
2237
  values,
@@ -2251,7 +2251,7 @@ function DynamicFormContent({ options, setValues, setFormDirty, labelPosition, m
2251
2251
  ] });
2252
2252
  }
2253
2253
  var NO_FIELDS = {};
2254
- function DynamicForm({ formJSONs: options = {}, reinitialize = false, initialValues, setValues, setFormDirty = noop, formikRef, labelPosition = "left", missingFields = [], spaceCompact = false, organizationVariables, needsOrganizationVariables = false, onSubmit = void 0, submitLabel = "Submit", className = "w-full", workflowForm = false, contextKey, skipValueParse = false, fields = NO_FIELDS }) {
2254
+ function DynamicForm({ formJSONs: options = {}, reinitialize = false, initialValues, setValues, setFormDirty = noop, formikRef, labelPosition = "left", missingFields = [], spaceCompact = false, organizationVariables, remoteVars, needsOrganizationVariables = false, onSubmit = void 0, submitLabel = "Submit", className = "w-full", workflowForm = false, contextKey, skipValueParse = false, fields = NO_FIELDS }) {
2255
2255
  const [parseReady, setParseReady] = useState(parseStringsOfObjReady);
2256
2256
  useEffect(() => {
2257
2257
  initializeParseStringsOfObj();
@@ -2261,7 +2261,8 @@ function DynamicForm({ formJSONs: options = {}, reinitialize = false, initialVal
2261
2261
  const parsedInitVals = skipValueParse ? initialValues : initialValues && parseStringsOfObj({
2262
2262
  inputs: initialValues,
2263
2263
  obj: initialValues,
2264
- orgVars: organizationVariables
2264
+ orgVars: organizationVariables,
2265
+ remoteVars
2265
2266
  });
2266
2267
  return /* @__PURE__ */ jsx(FieldRegistryContext.Provider, {
2267
2268
  value: fields,
@@ -2286,6 +2287,7 @@ function DynamicForm({ formJSONs: options = {}, reinitialize = false, initialVal
2286
2287
  missingFields,
2287
2288
  spaceCompact,
2288
2289
  organizationVariables,
2290
+ remoteVars,
2289
2291
  workflowForm,
2290
2292
  onSubmit,
2291
2293
  submitLabel,
@@ -7,6 +7,7 @@ interface FieldBase {
7
7
  hidden?: boolean | string;
8
8
  disabled?: boolean | string;
9
9
  optional?: boolean | string;
10
+ ignore?: boolean | string;
10
11
  tooltip?: string | string[];
11
12
  default?: unknown;
12
13
  }
@@ -1,4 +1,4 @@
1
- import type { Inputs } from './workflow-schema.js';
1
+ import type { Hidden, Ignore, Inputs, Optional } from './workflow-schema.js';
2
2
  export type LabelPosition = 'left' | 'top';
3
3
  export type FieldResource = string | {
4
4
  type: string;
@@ -35,9 +35,9 @@ export interface BaseField extends RuntimeFieldExtensions {
35
35
  type: string;
36
36
  label?: string;
37
37
  tooltip?: string | string[];
38
- hidden?: boolean;
39
- optional?: boolean;
40
- ignore?: boolean;
38
+ hidden?: Hidden;
39
+ optional?: Optional;
40
+ ignore?: Ignore;
41
41
  collapsed?: boolean;
42
42
  disabled?: boolean;
43
43
  default?: unknown;
@@ -121,6 +121,44 @@ export interface WorkflowSchema {
121
121
  detach?: string | boolean;
122
122
  };
123
123
  };
124
+ /**
125
+ * Links the run page shows, pointing at sessions the workflow registers itself or at addresses elsewhere.
126
+ */
127
+ links?: {
128
+ /**
129
+ * This interface was referenced by `undefined`'s JSON-Schema definition
130
+ * via the `patternProperty` "^[a-z0-9_-]*[a-z0-9]$".
131
+ */
132
+ [k: string]:
133
+ | {
134
+ /**
135
+ * Name of the endpoint session the workflow registers, resolved once it comes online.
136
+ */
137
+ endpoint: string;
138
+ /**
139
+ * If true, the user is redirected to this link once the workflow runs. Only one session or link may set it.
140
+ */
141
+ redirect?: string | boolean;
142
+ /**
143
+ * If true, the session this link names outlives the run instead of being removed with it.
144
+ */
145
+ detach?: string | boolean;
146
+ }
147
+ | {
148
+ /**
149
+ * An http:// or https:// address to link to directly. A value with no scheme is read as https.
150
+ */
151
+ url: string;
152
+ /**
153
+ * If true, the user is redirected to this link once the workflow runs. Only one session or link may set it.
154
+ */
155
+ redirect?: string | boolean;
156
+ /**
157
+ * If true, a session this link addresses outlives the run instead of being removed with it.
158
+ */
159
+ detach?: string | boolean;
160
+ };
161
+ };
124
162
  /**
125
163
  * environment variables to use for this workflow
126
164
  */
@@ -2,4 +2,4 @@ import { type WorkflowVariables } from '@parallelworks/workflow-parser';
2
2
  /**
3
3
  * useMemo won't work here — Formik values changes on every keystroke, so this hook extracts which inputs.* keys the schema references and re-parses only when those change. Defaults `userVars`/`secretKeys` to empty — callers in React scope should pass them from `useUserVars()` so the parser leaves `${{ var.SECRET }}` literal during template eval (otherwise the recursive substitution turns `"https://${{ var.PAT }}@host/"` into `"https://@host/"`).
4
4
  */
5
- export declare function useParsedOpts<T extends object = Record<string, unknown>>(rawOptions: T, values: Record<string, unknown>, organizationVariables: WorkflowVariables | undefined, userVars?: Record<string, string>, secretKeys?: string[]): T;
5
+ export declare function useParsedOpts<T extends object = Record<string, unknown>>(rawOptions: T, values: Record<string, unknown>, organizationVariables: WorkflowVariables | undefined, userVars?: Record<string, string>, secretKeys?: string[], remoteVars?: Record<string, string | undefined>): T;
package/dist/icons.d.ts CHANGED
@@ -5,7 +5,7 @@ import { FaInfoCircle as InfoIcon } from 'react-icons/fa';
5
5
  export type { IconType } from 'react-icons';
6
6
  export { AiOutlineRollback as RollbackIcon } from 'react-icons/ai';
7
7
  export { BiBell as UnmuteIcon, BiBellOff as MuteIcon, BiExpandVertical as ExpandVerticalIcon, BiBuildings as OrganizationIcon, BiPause as PauseIcon, BiSolidCheckShield as ShieldIcon, BiPlay as StartIcon, BiStop as StopIcon, BiSolidTrashAlt as TrashIcon, } from 'react-icons/bi';
8
- export { BsStar as PinIcon, BsStarFill as PinFilledIcon, BsGrid as GridIcon, BsBucket as BucketIcon, BsArrowsCollapse as CollapseIcon, BsThreeDotsVertical as MenuIcon, BsThreeDots as MoreIcon, BsSearch as SearchOutlineIcon, BsTerminalFill as UserWorkspaceFillIcon, BsTerminal as UserWorkspaceIcon, BsFileEarmarkZip as ZipIcon, BsMusicNoteBeamed as MusicIcon, } from 'react-icons/bs';
8
+ export { BsStar as PinIcon, BsStarFill as PinFilledIcon, BsGrid as GridIcon, BsBucket as BucketIcon, BsArrowsCollapse as CollapseIcon, BsThreeDotsVertical as MenuIcon, BsThreeDots as MoreIcon, BsSearch as SearchOutlineIcon, BsTerminalFill as UserWorkspaceFillIcon, BsTerminal as UserWorkspaceIcon, BsFileEarmarkZip as ZipIcon, BsMusicNoteBeamed as MusicIcon, BsStopCircle as StopCircleIcon, } from 'react-icons/bs';
9
9
  export { FaAmazon as AmazonIcon, FaCentos as CentOSIcon, FaChrome as ChromeIcon, FaCog as CogIcon, FaEdge as EdgeIcon, FaFirefoxBrowser as FirefoxIcon, FaOpera as OperaIcon, FaSafari as SafariIcon, FaExclamationTriangle as WarningTriangleIcon, FaFile as FileSolidIcon, FaFilePdf as PdfSolidIcon, FaFolder as FolderSolidIcon, FaGithub as GitHubIcon, FaGitlab as GitLabIcon, FaLinkedin as LinkedInIcon, FaImage as ImageSolidIcon, FaLinux as LinuxIcon, FaPaperclip as AttachmentIcon, FaRedhat as RedHatIcon, FaRobot as RobotIcon, FaShieldAlt as ShieldAltIcon, FaStop as StopSolidIcon, FaSuse as SuseIcon, FaUbuntu as UbuntuIcon, FaUsers as AccessIcon, FaPlus as AddIcon, FaAngleDown as AngleDownIcon, FaAngleLeft as AngleLeftIcon, FaAngleRight as AngleRightIcon, FaAngleUp as AngleUpIcon, FaArrowDown as ArrowDownIcon, FaArrowLeft as ArrowLeftIcon, FaArrowRight as ArrowRightIcon, FaArrowUp as ArrowUpIcon, FaCaretDown as CaretDownIcon, FaChartLine as ChartIcon, FaComments as ChatIcon, FaCheck as CheckIcon, FaChevronDown as ChevronDownIcon, FaChevronUp as ChevronUpIcon, FaCloud as CloudIcon, FaDollarSign as CostDashboardIcon, FaDocker as DockerIcon, FaCloudDownloadAlt as DownloadIcon, FaEdit as EditIcon, FaRunning as ExecuteWorkflow, FaExpand as ExpandIcon, FaFilter as FilterIcon, FaFlask as FlaskIcon, FaRegFolder as FolderIcon, FaCogs as GearsIcon, FaGlobe as GlobeIcon, FaEye as HiddenFalseIcon, FaEyeSlash as HiddenTrueIcon, FaRegFileImage as ImageIcon, FaKey as KeyIcon, FaLink as LinkIcon, FaLock as LockIcon, FaGlobeAmericas as MarketplaceIcon, FaRegCircle as NotRunningIcon, FaOpenid as OIDCIcon, FaRocket as PartnerIcon, FaKey as PasswordIcon, FaChartPie as PieChartIcon, FaPowerOff as PowerIcon, FaPrint as PrintIcon, FaGlobeAmericas as PublishIcon, FaQrcode as QRCodeIcon, FaLayerGroup as ResourceGroupIcon, FaUndoAlt as RetryIcon, FaSave as SaveIcon, FaList as SchedulerIcon, FaSearch as SearchIcon, FaUsers as SharingIcon, FaCompress as ShrinkIcon, FaDesktop as SnapshotIcon, FaSlack as SlackIcon, FaTerminal as TerminalIcon, FaTimes as TimesIcon, FaQuestionCircle as UserGuideIcon, FaStar as FeaturedIcon, FaUser as UserIcon, FaUsers as UsersIcon, FaWindows as WindowsIcon, } from 'react-icons/fa';
10
10
  export { FaApple as AppleIcon, FaArrowsRotate as RefreshArrowsIcon, FaDebian as DebianIcon, FaWandMagicSparkles as CustomizeIcon, FaFilterCircleXmark as FilterClearIcon, FaRegFolderOpen as FolderOpenIcon, FaLocationDot as IpAddressIcon, FaUpRightFromSquare as NewWindowIcon, FaXTwitter as XTwitterIcon, FaInbox as NotificationInboxIcon, FaRegFilePdf as PdfIcon, } from 'react-icons/fa6';
11
11
  export { FiAlertCircle as AlertCircleIcon, FiActivity as HealthMonitoringIcon, FiChevronDown as ChevronDownStrokeIcon, FiClock as ClockIcon, FiHardDrive as DiskIcon, FiDownload as DownloadFileIcon, FiFile as FileIcon, FiFileText as FileTextIcon, FiRotateCcw as HistoryIcon, FiUpload as UploadIcon, FiZap as ZapIcon, } from 'react-icons/fi';
package/dist/icons.js CHANGED
@@ -1,8 +1,8 @@
1
1
  import cx from "classnames";
2
+ import { jsx } from "react/jsx-runtime";
2
3
  import { BiBell as UnmuteIcon, BiBellOff as MuteIcon, BiBuildings as OrganizationIcon, BiError as ErrorIcon, BiExpandVertical as ExpandVerticalIcon, BiPause as PauseIcon, BiPlay as StartIcon, BiSolidCheckShield as ShieldIcon, BiSolidTrashAlt as TrashIcon, BiStop as StopIcon } from "react-icons/bi";
3
- import { BsArrowsCollapse as CollapseIcon, BsBucket as BucketIcon, BsCurrencyDollar as MoneyIcon, BsFileEarmarkZip as ZipIcon, BsGrid as GridIcon, BsLayers as InfrastructureLayersIcon, BsMusicNoteBeamed as MusicIcon, BsSearch as SearchOutlineIcon, BsStar as PinIcon, BsStarFill as PinFilledIcon, BsTerminal as UserWorkspaceIcon, BsTerminalFill as UserWorkspaceFillIcon, BsThreeDots as MoreIcon, BsThreeDotsVertical as MenuIcon, BsZoomIn as ChartZoomIcon } from "react-icons/bs";
4
+ import { BsArrowsCollapse as CollapseIcon, BsBucket as BucketIcon, BsCurrencyDollar as MoneyIcon, BsFileEarmarkZip as ZipIcon, BsGrid as GridIcon, BsLayers as InfrastructureLayersIcon, BsMusicNoteBeamed as MusicIcon, BsSearch as SearchOutlineIcon, BsStar as PinIcon, BsStarFill as PinFilledIcon, BsStopCircle as StopCircleIcon, BsTerminal as UserWorkspaceIcon, BsTerminalFill as UserWorkspaceFillIcon, BsThreeDots as MoreIcon, BsThreeDotsVertical as MenuIcon, BsZoomIn as ChartZoomIcon } from "react-icons/bs";
4
5
  import { FaAmazon as AmazonIcon, FaAngleDown as AngleDownIcon, FaAngleLeft as AngleLeftIcon, FaAngleRight as AngleRightIcon, FaAngleUp as AngleUpIcon, FaArrowDown as ArrowDownIcon, FaArrowLeft as ArrowLeftIcon, FaArrowRight as ArrowRightIcon, FaArrowUp as ArrowUpIcon, FaCaretDown as CaretDownIcon, FaCentos as CentOSIcon, FaChartLine as ChartIcon, FaChartPie as PieChartIcon, FaCheck as CheckIcon, FaChevronDown as ChevronDownIcon, FaChevronUp as ChevronUpIcon, FaChrome as ChromeIcon, FaCircleNotch, FaCloud as CloudIcon, FaCloudDownloadAlt as DownloadIcon, FaCog as CogIcon, FaCogs as GearsIcon, FaComments as ChatIcon, FaCompress as ShrinkIcon, FaDesktop as SnapshotIcon, FaDocker as DockerIcon, FaDollarSign as CostDashboardIcon, FaEdge as EdgeIcon, FaEdit as EditIcon, FaExclamationTriangle as WarningTriangleIcon, FaExpand as ExpandIcon, FaEye as HiddenFalseIcon, FaEyeSlash as HiddenTrueIcon, FaFile as FileSolidIcon, FaFilePdf as PdfSolidIcon, FaFilter as FilterIcon, FaFirefoxBrowser as FirefoxIcon, FaFlask as FlaskIcon, FaFolder as FolderSolidIcon, FaGithub as GitHubIcon, FaGitlab as GitLabIcon, FaGlobe as GlobeIcon, FaGlobeAmericas as MarketplaceIcon, FaGlobeAmericas as PublishIcon, FaImage as ImageSolidIcon, FaInfoCircle as InfoIcon, FaKey as KeyIcon, FaKey as PasswordIcon, FaLayerGroup as ResourceGroupIcon, FaLink as LinkIcon, FaLinkedin as LinkedInIcon, FaLinux as LinuxIcon, FaList as SchedulerIcon, FaLock as LockIcon, FaOpenid as OIDCIcon, FaOpera as OperaIcon, FaPaperclip as AttachmentIcon, FaPlus as AddIcon, FaPowerOff as PowerIcon, FaPrint as PrintIcon, FaQrcode as QRCodeIcon, FaQuestionCircle as UserGuideIcon, FaRedhat as RedHatIcon, FaRegCircle as NotRunningIcon, FaRegFileImage as ImageIcon, FaRegFolder as FolderIcon, FaRobot as RobotIcon, FaRocket as PartnerIcon, FaRunning as ExecuteWorkflow, FaSafari as SafariIcon, FaSave as SaveIcon, FaSearch as SearchIcon, FaShieldAlt as ShieldAltIcon, FaSlack as SlackIcon, FaStar as FeaturedIcon, FaStop as StopSolidIcon, FaSuse as SuseIcon, FaTerminal as TerminalIcon, FaTimes as TimesIcon, FaUbuntu as UbuntuIcon, FaUndoAlt as RetryIcon, FaUser as UserIcon, FaUsers as AccessIcon, FaUsers as SharingIcon, FaUsers as UsersIcon, FaWindows as WindowsIcon } from "react-icons/fa";
5
- import { jsx } from "react/jsx-runtime";
6
6
  import { AiOutlineRollback as RollbackIcon } from "react-icons/ai";
7
7
  import { FaApple as AppleIcon, FaArrowsRotate as RefreshArrowsIcon, FaDebian as DebianIcon, FaFilterCircleXmark as FilterClearIcon, FaInbox as NotificationInboxIcon, FaLocationDot as IpAddressIcon, FaRegFilePdf as PdfIcon, FaRegFolderOpen as FolderOpenIcon, FaUpRightFromSquare as NewWindowIcon, FaWandMagicSparkles as CustomizeIcon, FaXTwitter as XTwitterIcon } from "react-icons/fa6";
8
8
  import { FiActivity as HealthMonitoringIcon, FiAlertCircle as AlertCircleIcon, FiChevronDown as ChevronDownStrokeIcon, FiClock as ClockIcon, FiCopy as CopyIcon, FiDownload as DownloadFileIcon, FiFile as FileIcon, FiFileText as FileTextIcon, FiHardDrive as DiskIcon, FiRotateCcw as HistoryIcon, FiUpload as UploadIcon, FiX as XIcon, FiZap as ZapIcon } from "react-icons/fi";
@@ -35,4 +35,4 @@ function LoaderIcon({ className, ...props }) {
35
35
  });
36
36
  }
37
37
  //#endregion
38
- export { APIIcon, AccessIcon, AddIcon, AlertCircleIcon, AlertFillIcon, AlertIcon, AmazonIcon, AngleDownIcon, AngleLeftIcon, AngleRightIcon, AngleUpIcon, AnthropicIcon, AppleIcon, ArchiveIcon, ArrowDownIcon, ArrowLeftIcon, ArrowRightIcon, ArrowRightStrokeIcon, ArrowUpIcon, AttachmentIcon, BucketIcon, BuildWorkflowIcon, CalendarIcon, CancelIcon, CaretDownIcon, CentOSIcon, ChartIcon, ChartZoomIcon, ChatIcon, CheckIcon, CheckMarkIcon, CheckStrokeIcon, ChevronDownIcon, ChevronDownStrokeIcon, ChevronLeftIcon, ChevronRightIcon, ChevronUpIcon, ChromeIcon, ClearIcon, ClipboardIcon, ClockIcon, CloseIcon, CloudIcon, CloudUploadIcon, ClusterIcon, CogIcon, CollapseIcon, ComputeIcon, ConnectIcon, CopyIcon, CostDashboardIcon, CustomizeIcon, DebianIcon, DisableCostIcon, DisableUserIcon, DiskIcon, DisplayIcon, DockerIcon, DocumentIcon, DownloadFileIcon, DownloadIcon, DragHandleIcon, DuplicateIcon, EdgeIcon, EditIcon, EditorIcon, EnableCostIcon, EnableUserIcon, EndpointIcon, ErrorCheckmark, ErrorIcon, EventsIcon, ExecuteWorkflow, ExpandIcon, ExpandVerticalIcon, ExternalLink, EyeIcon, EyeOffIcon, FailIcon, FavoriteIcon, FavoriteOutlineIcon, FeaturedIcon, FileIcon, FileSolidIcon, FileTextIcon, FilesystemIcon, FilterClearIcon, FilterIcon, FirefoxIcon, FlaskIcon, FolderIcon, FolderOpenIcon, FolderSolidIcon, FolderTreeIcon, ForbiddenIcon, ForkIcon, GearIcon, GearsIcon, GitHubIcon, GitLabIcon, GlobeIcon, GridIcon, HealthMonitoringIcon, HelmIcon, HiddenFalseIcon, HiddenTrueIcon, HistoryIcon, HomeIcon, IdCardIcon, ImageIcon, ImageSolidIcon, ImpersonateIcon, InboxIcon, InfoCircleIcon, InfoIcon, InfrastructureLayersIcon, InstallIcon, IpAddressIcon, JsonIcon, KeyIcon, KubernetesIcon, KubernetesNamespaceIcon, LanguageIcon, LicenseIcon, LinkIcon, LinkedInIcon, LinuxIcon, LoaderIcon, LockIcon, MFA, MailIcon, MarketplaceIcon, MegaphoneIcon, MenuIcon, MinimizeIcon, MlIcon, MoneyIcon, MonitorIcon, MoonIcon, MoreIcon, MusicIcon, MuteIcon, NewChatIcon, NewWindowIcon, NotRunningIcon, NotificationFillIcon, NotificationInboxIcon, OIDCIcon, OpenAIIcon, OpenInNewGraphIcon, OperaIcon, OrganizationIcon, PartnerIcon, PasswordIcon, PauseIcon, PdfIcon, PdfSolidIcon, PieChartIcon, PinFilledIcon, PinIcon, PlusOutlineIcon, PowerIcon, PowershellIcon, PrintIcon, PublishIcon, QRCodeIcon, QuotaIcon, RedHatIcon, RefreshArrowsIcon, RefreshIcon, ReplayIcon, ResourceGroupIcon, RetryIcon, RobotIcon, RollbackIcon, RunWorkflowIcon, RunningIcon, SafariIcon, SaveIcon, SchedulerIcon, SearchIcon, SearchOutlineIcon, ServerIcon, SettingsIcon, ShareIcon, SharingIcon, ShieldAltIcon, ShieldIcon, ShieldOutlineIcon, ShrinkIcon, SidebarCloseIcon, SidebarIcon, SidebarOpenIcon, SignOutIcon, SkipIcon, SlackIcon, SnapshotIcon, SortDownIcon, SortUnsortedIcon, SortUpIcon, SparklesIcon, SplitIcon, SpreadsheetIcon, StartIcon, StopIcon, StopSolidIcon, StorageIcon, SubdomainIcon, SuccessCheckmark, SuccessIcon, SunIcon, SuseIcon, TerminalIcon, ThinkingIcon, TimesIcon, TooltipIcon, TrashIcon, TunnelIcon, UbuntuIcon, UnfavoriteIcon, UnmuteIcon, UploadIcon, UserGuideIcon, UserIcon, UserWorkspaceFillIcon, UserWorkspaceIcon, UsersIcon, VideoIcon, WarningIcon, WarningTriangleIcon, WindowsIcon, XIcon, XStrokeIcon, XTwitterIcon, ZapIcon, ZipIcon, ZoomInIcon, ZoomOutIcon };
38
+ export { APIIcon, AccessIcon, AddIcon, AlertCircleIcon, AlertFillIcon, AlertIcon, AmazonIcon, AngleDownIcon, AngleLeftIcon, AngleRightIcon, AngleUpIcon, AnthropicIcon, AppleIcon, ArchiveIcon, ArrowDownIcon, ArrowLeftIcon, ArrowRightIcon, ArrowRightStrokeIcon, ArrowUpIcon, AttachmentIcon, BucketIcon, BuildWorkflowIcon, CalendarIcon, CancelIcon, CaretDownIcon, CentOSIcon, ChartIcon, ChartZoomIcon, ChatIcon, CheckIcon, CheckMarkIcon, CheckStrokeIcon, ChevronDownIcon, ChevronDownStrokeIcon, ChevronLeftIcon, ChevronRightIcon, ChevronUpIcon, ChromeIcon, ClearIcon, ClipboardIcon, ClockIcon, CloseIcon, CloudIcon, CloudUploadIcon, ClusterIcon, CogIcon, CollapseIcon, ComputeIcon, ConnectIcon, CopyIcon, CostDashboardIcon, CustomizeIcon, DebianIcon, DisableCostIcon, DisableUserIcon, DiskIcon, DisplayIcon, DockerIcon, DocumentIcon, DownloadFileIcon, DownloadIcon, DragHandleIcon, DuplicateIcon, EdgeIcon, EditIcon, EditorIcon, EnableCostIcon, EnableUserIcon, EndpointIcon, ErrorCheckmark, ErrorIcon, EventsIcon, ExecuteWorkflow, ExpandIcon, ExpandVerticalIcon, ExternalLink, EyeIcon, EyeOffIcon, FailIcon, FavoriteIcon, FavoriteOutlineIcon, FeaturedIcon, FileIcon, FileSolidIcon, FileTextIcon, FilesystemIcon, FilterClearIcon, FilterIcon, FirefoxIcon, FlaskIcon, FolderIcon, FolderOpenIcon, FolderSolidIcon, FolderTreeIcon, ForbiddenIcon, ForkIcon, GearIcon, GearsIcon, GitHubIcon, GitLabIcon, GlobeIcon, GridIcon, HealthMonitoringIcon, HelmIcon, HiddenFalseIcon, HiddenTrueIcon, HistoryIcon, HomeIcon, IdCardIcon, ImageIcon, ImageSolidIcon, ImpersonateIcon, InboxIcon, InfoCircleIcon, InfoIcon, InfrastructureLayersIcon, InstallIcon, IpAddressIcon, JsonIcon, KeyIcon, KubernetesIcon, KubernetesNamespaceIcon, LanguageIcon, LicenseIcon, LinkIcon, LinkedInIcon, LinuxIcon, LoaderIcon, LockIcon, MFA, MailIcon, MarketplaceIcon, MegaphoneIcon, MenuIcon, MinimizeIcon, MlIcon, MoneyIcon, MonitorIcon, MoonIcon, MoreIcon, MusicIcon, MuteIcon, NewChatIcon, NewWindowIcon, NotRunningIcon, NotificationFillIcon, NotificationInboxIcon, OIDCIcon, OpenAIIcon, OpenInNewGraphIcon, OperaIcon, OrganizationIcon, PartnerIcon, PasswordIcon, PauseIcon, PdfIcon, PdfSolidIcon, PieChartIcon, PinFilledIcon, PinIcon, PlusOutlineIcon, PowerIcon, PowershellIcon, PrintIcon, PublishIcon, QRCodeIcon, QuotaIcon, RedHatIcon, RefreshArrowsIcon, RefreshIcon, ReplayIcon, ResourceGroupIcon, RetryIcon, RobotIcon, RollbackIcon, RunWorkflowIcon, RunningIcon, SafariIcon, SaveIcon, SchedulerIcon, SearchIcon, SearchOutlineIcon, ServerIcon, SettingsIcon, ShareIcon, SharingIcon, ShieldAltIcon, ShieldIcon, ShieldOutlineIcon, ShrinkIcon, SidebarCloseIcon, SidebarIcon, SidebarOpenIcon, SignOutIcon, SkipIcon, SlackIcon, SnapshotIcon, SortDownIcon, SortUnsortedIcon, SortUpIcon, SparklesIcon, SplitIcon, SpreadsheetIcon, StartIcon, StopCircleIcon, StopIcon, StopSolidIcon, StorageIcon, SubdomainIcon, SuccessCheckmark, SuccessIcon, SunIcon, SuseIcon, TerminalIcon, ThinkingIcon, TimesIcon, TooltipIcon, TrashIcon, TunnelIcon, UbuntuIcon, UnfavoriteIcon, UnmuteIcon, UploadIcon, UserGuideIcon, UserIcon, UserWorkspaceFillIcon, UserWorkspaceIcon, UsersIcon, VideoIcon, WarningIcon, WarningTriangleIcon, WindowsIcon, XIcon, XStrokeIcon, XTwitterIcon, ZapIcon, ZipIcon, ZoomInIcon, ZoomOutIcon };
package/dist/index.d.ts CHANGED
@@ -1,4 +1,5 @@
1
1
  export * from './theme/index.js';
2
+ export { Avatar, avatarInitials, type AvatarProps, type AvatarSize, type AvatarStatus, } from './components/Avatar.js';
2
3
  export { default as Callout } from './components/Callout.js';
3
4
  export { default as CopyToClipboard } from './components/CopyToClipboard.js';
4
5
  export { CopyCodeBlock } from './components/CopyToClipboard.js';
@@ -13,6 +14,7 @@ export { default as CustomListbox } from './components/Listbox.js';
13
14
  export { default as Loader } from './components/Loader.js';
14
15
  export { default as Markdown } from './components/Markdown.js';
15
16
  export type { MarkdownProps } from './components/Markdown.js';
17
+ export type { GitlabProject, RepoEntry, RepoOwner, RepoRef, RepoSummary, } from './components/Provider.js';
16
18
  export { BareModal, modalPanelClasses } from './components/BareModal.js';
17
19
  export { ConfirmModal } from './components/ConfirmModal.js';
18
20
  export { CREATE_MODAL_SELECT_FILTER_THRESHOLD, CreateModal, CreateModalAutocompleteField, CreateModalField, CreateModalSelect, type CreateModalSelectOption, CreateModalSwitch, CreateModalTextarea, } from './components/CreateModal.js';
@@ -20,13 +22,14 @@ export { AddMenu, type HeaderAddMenuItem } from './components/AddMenu.js';
20
22
  export { dangerButtonClasses, ghostButtonClasses, primaryButtonClasses, } from './components/ghostButton.js';
21
23
  export { default as MultiSelectDropdown } from './components/MultiSelect.js';
22
24
  export { Overview } from './components/Overview.js';
23
- export { UIProvider, useNavigation, useNotify, useProvisionCorsRules, useRunFile, useSlots, useStrings, useWorkflowJsonResolver, type RunFileResult, type WorkflowJsonRef, type UIData, type UINavigation, type UINotify, type UISlots, type UIStrings, } from './components/Provider.js';
25
+ export { UIProvider, useNavigation, useNotify, usePersistedState, useProvisionCorsRules, useRepoSuggestions, useRunFile, useSlots, useStrings, useWorkflowJsonResolver, type PersistedStateHook, type RunFileResult, type WorkflowJsonRef, type UIData, type UILinkComponent, type UINavigation, type UINotify, type UISlots, type UIStrings, } from './components/Provider.js';
24
26
  export { useCssIsDark } from './components/useCssIsDark.js';
25
27
  export { Indicator } from './components/Indicator.js';
26
28
  export { ControlledCollapsiblePanel, MaybeCollapsible, UncontrolledCollapsiblePanel, } from './components/CollapsiblePanel.js';
27
29
  export { default as SectionHeader } from './components/SectionHeader.js';
28
30
  export { default as SwitchToggleSmall } from './components/SwitchToggleSmall.js';
29
- export { StatusBadge, StatusDot } from './components/StatusBadge.js';
31
+ export { StatusBadge, StatusDot, statusTextClass, type BadgeVariant, } from './components/StatusBadge.js';
32
+ export { useRelativeTime } from './components/relativeTime.js';
30
33
  export { default as SwitchToggle } from './components/SwitchToggle.js';
31
34
  export { CompactTable, Table } from './components/Table.js';
32
35
  export { formatTooltipContent, GlobalTooltip, TOOLTIP_ID, TooltipInfo, truncationTooltipProps, } from './components/Tooltip.js';