@parallelworks/ui 0.17.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 (42) hide show
  1. package/LICENSE +202 -21
  2. package/dist/chunks/{CodePreviewEditor-UAtnpmOV.js → CodePreviewEditor-4lx3kE-w.js} +2 -2
  3. package/dist/chunks/{CreateModal-BbV5cTj7.js → CreateModal-BY6DLmur.js} +10 -10
  4. package/dist/chunks/{lib-CUTRDpa6.js → FieldWrapper-Bef01EWO.js} +49 -48
  5. package/dist/chunks/{Monaco-DVyIpyv4.js → Monaco-C1POOdVv.js} +3 -3
  6. package/dist/chunks/{PageHeader-MxuOs9cH.js → PageHeader-l49p1nM9.js} +145 -82
  7. package/dist/chunks/{Provider-DHmZ3v9i.js → Provider-Ghua9PkN.js} +6 -4
  8. package/dist/chunks/{SwitchToggle-BRQoEwLZ.js → SwitchToggle-CHPP8uZQ.js} +11 -11
  9. package/dist/chunks/{Table-C6JdFFiJ.js → Table-4OHjdKdO.js} +2 -2
  10. package/dist/chunks/{Tooltip-n9w7Tkt1.js → Tooltip-Crxo_eU_.js} +3 -3
  11. package/dist/chunks/{editor-mNznodJN.js → editor-9_uVtUyy.js} +4 -4
  12. package/dist/chunks/{list-7k0eaI5N.js → list-qrojZZNv.js} +128 -17
  13. package/dist/components/AddMenu.d.ts +1 -0
  14. package/dist/components/Avatar.d.ts +13 -0
  15. package/dist/components/Dropdown.d.ts +2 -0
  16. package/dist/components/Provider.d.ts +2 -0
  17. package/dist/editor/index.js +1 -1
  18. package/dist/file-explorer/index.js +28 -27
  19. package/dist/form/FieldWrapper.d.ts +2 -1
  20. package/dist/form/Form.d.ts +3 -1
  21. package/dist/form/index.js +22 -20
  22. package/dist/form/types/fieldComponentTypes.d.ts +1 -0
  23. package/dist/form/types/fieldTypes.d.ts +4 -4
  24. package/dist/form/useParsedOpts.d.ts +1 -1
  25. package/dist/icons.d.ts +1 -1
  26. package/dist/icons.js +3 -3
  27. package/dist/index.d.ts +2 -1
  28. package/dist/index.js +13 -13
  29. package/dist/list/RowContextMenu.d.ts +9 -9
  30. package/dist/list/UserHoverCard.d.ts +45 -0
  31. package/dist/list/index.d.ts +2 -1
  32. package/dist/list/index.js +3 -3
  33. package/dist/logviewer/index.js +7 -7
  34. package/dist/styles/Geist-Variable.woff2 +0 -0
  35. package/dist/styles/GeistMono-Variable.woff2 +0 -0
  36. package/dist/styles/base.css +57 -0
  37. package/dist/styles/fonts.css +15 -0
  38. package/dist/styles/theme.css +6 -40
  39. package/dist/styles.css +1 -1
  40. package/dist/workflow/index.js +8 -8
  41. package/package.json +10 -9
  42. package/dist/chunks/{BareModal-BqroLbZ5.js → BareModal-BtRiQezg.js} +1 -1
@@ -1,12 +1,12 @@
1
+ import { a as usePersistedState, n as useLink, r as useNavigation, u as useStrings } from "./Provider-Ghua9PkN.js";
2
+ import { T as Avatar, _ as useRowMenuActive, c as PageHeader, f as rowContextMenuProps, u as MoreButton } from "./PageHeader-l49p1nM9.js";
1
3
  import { CheckIcon, ChevronDownIcon, ChevronLeftIcon, ChevronRightIcon, ChevronUpIcon, DisplayIcon, ErrorIcon, FilterIcon, MenuIcon, SearchIcon, XIcon } from "../icons.js";
2
- import { a as usePersistedState, n as useLink, r as useNavigation, u as useStrings } from "./Provider-DHmZ3v9i.js";
3
- import { n as TOOLTIP_ID, r as TooltipInfo } from "./Tooltip-n9w7Tkt1.js";
4
- import { _ as useRowMenuActive, c as PageHeader, p as rowContextMenuProps, u as MoreButton } from "./PageHeader-MxuOs9cH.js";
5
- import { n as Table } from "./Table-C6JdFFiJ.js";
4
+ import { n as TOOLTIP_ID, r as TooltipInfo } from "./Tooltip-Crxo_eU_.js";
5
+ import { n as Table } from "./Table-4OHjdKdO.js";
6
6
  import cx from "classnames";
7
- import { Fragment, jsx, jsxs } from "react/jsx-runtime";
8
- import { Children, Fragment as Fragment$1, cloneElement, createContext, isValidElement, useCallback, useContext, useEffect, useLayoutEffect, useMemo, useRef, useState } from "react";
7
+ import { Children, Fragment, cloneElement, createContext, isValidElement, useCallback, useContext, useEffect, useLayoutEffect, useMemo, useRef, useState } from "react";
9
8
  import { useLocalStorage } from "usehooks-ts";
9
+ import { Fragment as Fragment$1, jsx, jsxs } from "react/jsx-runtime";
10
10
  import { createPortal } from "react-dom";
11
11
  import { Menu, MenuButton, MenuItem, MenuItems } from "@headlessui/react";
12
12
  //#region src/list/ActionToolbar.tsx
@@ -20,7 +20,7 @@ function tipProps(content, place) {
20
20
  };
21
21
  }
22
22
  function ToolbarItemView({ item }) {
23
- if ("element" in item) return /* @__PURE__ */ jsx(Fragment, { children: item.element });
23
+ if ("element" in item) return /* @__PURE__ */ jsx(Fragment$1, { children: item.element });
24
24
  return /* @__PURE__ */ jsx(ToolbarButton, { action: item });
25
25
  }
26
26
  function ToolbarButton({ action }) {
@@ -30,7 +30,7 @@ function ToolbarButton({ action }) {
30
30
  const className = cx("inline-flex items-center gap-x-0.5 h-9 px-2 rounded-md text-[13.5px] uppercase font-semibold transition-colors whitespace-nowrap", "bg-(--theme-element) text-(--theme-element-text)", action.disabled ? "opacity-50 cursor-not-allowed" : "cursor-pointer hover:bg-(--theme-element-hover)");
31
31
  const tooltipProps = tipProps(action.disabled ? action.disabledTooltip : action.enabledTooltip, "bottom");
32
32
  const Icon = action.icon;
33
- const content = /* @__PURE__ */ jsxs(Fragment, { children: [/* @__PURE__ */ jsx("div", {
33
+ const content = /* @__PURE__ */ jsxs(Fragment$1, { children: [/* @__PURE__ */ jsx("div", {
34
34
  className: "h-6 flex items-center",
35
35
  children: /* @__PURE__ */ jsx(Icon, { className: cx("w-auto", action.iconClassName) })
36
36
  }), action.label] });
@@ -64,7 +64,7 @@ function OverflowRow({ item }) {
64
64
  const Icon = item.icon;
65
65
  const className = cx("flex w-full items-center gap-x-1 px-4 py-2 text-[13px] uppercase font-semibold link hover:theme-hover", item.disabled && "opacity-50 cursor-not-allowed");
66
66
  const tooltipProps = tipProps(item.disabled ? item.disabledTooltip : item.enabledTooltip, "left");
67
- const content = /* @__PURE__ */ jsxs(Fragment, { children: [/* @__PURE__ */ jsx("div", {
67
+ const content = /* @__PURE__ */ jsxs(Fragment$1, { children: [/* @__PURE__ */ jsx("div", {
68
68
  className: "w-5 h-6 flex items-center",
69
69
  children: /* @__PURE__ */ jsx(Icon, { className: cx(item.iconClassName) })
70
70
  }), item.label] });
@@ -106,7 +106,7 @@ function OverflowMenu({ items }) {
106
106
  className: "z-50 min-w-56 rounded-md border theme-border bg-(--theme-app-bg) shadow-lg py-1 focus:outline-none",
107
107
  children: /* @__PURE__ */ jsx(OverflowMenuContext.Provider, {
108
108
  value: true,
109
- children: items.map((item) => "element" in item ? /* @__PURE__ */ jsx(Fragment$1, { children: item.element }, item.key) : /* @__PURE__ */ jsx(OverflowRow, { item }, item.key))
109
+ children: items.map((item) => "element" in item ? /* @__PURE__ */ jsx(Fragment, { children: item.element }, item.key) : /* @__PURE__ */ jsx(OverflowRow, { item }, item.key))
110
110
  })
111
111
  })]
112
112
  });
@@ -177,7 +177,7 @@ function ActionToolbar({ groups, right = [], sticky = false }) {
177
177
  className: cx("flex items-center gap-2.5", sticky && cx("sticky top-10 z-10 bg-(--theme-app-bg)", "py-1.5")),
178
178
  children: [visibleGroups.length > 0 && /* @__PURE__ */ jsx("div", {
179
179
  className: "flex items-center gap-2.5 shrink-0",
180
- children: visibleGroups.map((group, i) => /* @__PURE__ */ jsxs(Fragment$1, { children: [i > 0 && /* @__PURE__ */ jsx("div", { className: "w-px h-5 bg-(--theme-border)" }), /* @__PURE__ */ jsx("div", {
180
+ children: visibleGroups.map((group, i) => /* @__PURE__ */ jsxs(Fragment, { children: [i > 0 && /* @__PURE__ */ jsx("div", { className: "w-px h-5 bg-(--theme-border)" }), /* @__PURE__ */ jsx("div", {
181
181
  className: "flex items-center gap-1",
182
182
  children: group.map((item) => /* @__PURE__ */ jsx(ToolbarItemView, { item }, item.key))
183
183
  })] }, group[0]?.key ?? i))
@@ -205,7 +205,7 @@ var listTableFixedProps = {
205
205
  };
206
206
  function NameCell({ icon, name, subtitle, href, badge, title }) {
207
207
  const Link = useLink();
208
- const inner = /* @__PURE__ */ jsxs(Fragment, { children: [icon, /* @__PURE__ */ jsxs("div", {
208
+ const inner = /* @__PURE__ */ jsxs(Fragment$1, { children: [icon, /* @__PURE__ */ jsxs("div", {
209
209
  className: "min-w-0",
210
210
  children: [/* @__PURE__ */ jsxs("div", {
211
211
  className: "flex min-w-0 items-center gap-1.5",
@@ -332,7 +332,7 @@ function ListActionsHeader({ view, actionCount = 0, className }) {
332
332
  width,
333
333
  minWidth: width
334
334
  },
335
- className: cx("py-2 text-right @max-[43rem]:w-[52px]! @max-[43rem]:min-w-[52px]!", className),
335
+ className: cx("relative py-2 text-right @max-[43rem]:w-[52px]! @max-[43rem]:min-w-[52px]!", className),
336
336
  children: /* @__PURE__ */ jsx("span", {
337
337
  className: "sr-only",
338
338
  children: "Actions"
@@ -462,7 +462,7 @@ function ListRow({ href, onActivate, items, goTo, openMenu, pinnedActions, selec
462
462
  }
463
463
  /** Name column min-width is by role, not position, so a leading checkbox doesn't shift it. */
464
464
  function ListColumns({ view }) {
465
- return /* @__PURE__ */ jsxs(Fragment, { children: [view.visibleColumns.map((col, i) => /* @__PURE__ */ jsx(Table.Header, {
465
+ return /* @__PURE__ */ jsxs(Fragment$1, { children: [view.visibleColumns.map((col, i) => /* @__PURE__ */ jsx(Table.Header, {
466
466
  caps: false,
467
467
  className: cx(col.headerClassName, view.columnClasses[i]),
468
468
  style: col.alwaysVisible ? { minWidth: 200 } : void 0,
@@ -743,7 +743,7 @@ function AnchoredPopover({ icon, label, active, shortcut, panelClassName, childr
743
743
  window.addEventListener("keydown", onKey);
744
744
  return () => window.removeEventListener("keydown", onKey);
745
745
  }, [shortcut, open]);
746
- return /* @__PURE__ */ jsxs(Fragment, { children: [/* @__PURE__ */ jsxs("button", {
746
+ return /* @__PURE__ */ jsxs(Fragment$1, { children: [/* @__PURE__ */ jsxs("button", {
747
747
  ref: btnRef,
748
748
  type: "button",
749
749
  onClick: () => pos ? close() : open(),
@@ -986,7 +986,7 @@ function FilterMenuBody({ view }) {
986
986
  const scheduleClose = () => {
987
987
  closeTimer.current = setTimeout(() => setOpenKey(null), 160);
988
988
  };
989
- return /* @__PURE__ */ jsxs(Fragment, { children: [/* @__PURE__ */ jsxs("div", {
989
+ return /* @__PURE__ */ jsxs(Fragment$1, { children: [/* @__PURE__ */ jsxs("div", {
990
990
  className: "flex items-center justify-between px-3 py-1",
991
991
  children: [/* @__PURE__ */ jsx("span", {
992
992
  className: "text-[11px] font-medium uppercase tracking-wide text-(--theme-muted-text-color)",
@@ -1297,4 +1297,115 @@ function HoverCardSurface({ x, y, widthClassName, padded = true, relayoutKey, on
1297
1297
  }), document.querySelector(".ds-root") ?? document.body);
1298
1298
  }
1299
1299
  //#endregion
1300
- export { ActionToolbar as A, ListSkeleton as C, actionsColumnWidth as D, RowSelectCheckbox as E, stickyTabsClasses as M, stickyTabsUnderHeaderClasses as N, listTableFixedProps as O, stickyToolbarClasses as P, ListError as S, NameCell as T, ListRow as _, ListCount as a, GroupRow as b, ListDisplayMenu as c, isTextEntryContext as d, DEFAULT_ORDER as f, ListPage as g, ListColumns as h, ListPager as i, ToolbarButton as j, listTableProps as k, ListFilterMenu as l, useListView as m, useHoverCard as n, ListSearchControl as o, FAVORITE_ORDER as p, LIST_PAGE_SIZES as r, useListSearch as s, HoverCardSurface as t, listControlButtonClasses as u, ListRowActionsProvider as v, NAME_MIN_WIDTH_PX as w, ListActionsHeader as x, useListNavigate as y };
1300
+ //#region src/list/UserHoverCard.tsx
1301
+ /** Opens `card` after a short hover or on focus of `children`. */
1302
+ function HoverCardTrigger({ className, children, card }) {
1303
+ const { triggerRef, coords, scheduleOpen, scheduleClose, keepOpen } = useHoverCard();
1304
+ return /* @__PURE__ */ jsxs("span", {
1305
+ ref: triggerRef,
1306
+ role: "none",
1307
+ className,
1308
+ onMouseEnter: scheduleOpen,
1309
+ onMouseLeave: scheduleClose,
1310
+ onFocus: scheduleOpen,
1311
+ onBlur: scheduleClose,
1312
+ children: [children, coords && card({
1313
+ x: coords.x,
1314
+ y: coords.y,
1315
+ onKeepOpen: keepOpen,
1316
+ onLeave: scheduleClose
1317
+ })]
1318
+ });
1319
+ }
1320
+ function UserHoverCard({ x, y, onKeepOpen, onLeave, username, name, avatarSrc, badge, href, linkComponent, loading = false, relayoutKey, children }) {
1321
+ const strings = useStrings();
1322
+ const SlotLink = useLink();
1323
+ const Link = linkComponent ?? SlotLink;
1324
+ const displayName = name || username;
1325
+ const header = /* @__PURE__ */ jsxs(Fragment$1, { children: [/* @__PURE__ */ jsx(Avatar, {
1326
+ src: avatarSrc,
1327
+ name: displayName,
1328
+ size: "lg",
1329
+ className: "shrink-0"
1330
+ }), /* @__PURE__ */ jsxs("div", {
1331
+ className: "min-w-0",
1332
+ children: [/* @__PURE__ */ jsxs("div", {
1333
+ className: "flex items-center gap-1.5",
1334
+ children: [/* @__PURE__ */ jsx("span", {
1335
+ className: "truncate text-sm font-semibold text-(--theme-app)",
1336
+ children: displayName
1337
+ }), badge && /* @__PURE__ */ jsx("span", {
1338
+ className: "shrink-0 rounded-full bg-(--theme-muted-panel-bg) px-1.5 py-0.5 text-[10px] font-medium leading-none text-(--theme-muted-text-color)",
1339
+ children: badge
1340
+ })]
1341
+ }), /* @__PURE__ */ jsx("div", {
1342
+ className: "truncate text-xs text-(--theme-muted-text-color)",
1343
+ children: username
1344
+ })]
1345
+ })] });
1346
+ return /* @__PURE__ */ jsxs(HoverCardSurface, {
1347
+ x,
1348
+ y,
1349
+ widthClassName: "w-64",
1350
+ relayoutKey,
1351
+ onKeepOpen,
1352
+ onLeave,
1353
+ children: [href ? /* @__PURE__ */ jsx(Link, {
1354
+ to: href,
1355
+ className: "flex items-center gap-3 transition-opacity hover:opacity-80",
1356
+ children: header
1357
+ }) : /* @__PURE__ */ jsx("div", {
1358
+ className: "flex items-center gap-3",
1359
+ children: header
1360
+ }), loading ? /* @__PURE__ */ jsxs("div", {
1361
+ role: "status",
1362
+ "aria-label": strings.loading,
1363
+ className: "mt-3 space-y-2 border-t border-(--theme-border) pt-3",
1364
+ children: [
1365
+ /* @__PURE__ */ jsx("div", {
1366
+ "aria-hidden": "true",
1367
+ className: "h-3 w-24 animate-pulse rounded theme-muted-panel"
1368
+ }),
1369
+ /* @__PURE__ */ jsx("div", {
1370
+ "aria-hidden": "true",
1371
+ className: "h-3 w-36 animate-pulse rounded theme-muted-panel"
1372
+ }),
1373
+ /* @__PURE__ */ jsx("span", {
1374
+ className: "sr-only",
1375
+ children: strings.loading
1376
+ })
1377
+ ]
1378
+ }) : children ? /* @__PURE__ */ jsx("div", {
1379
+ className: "mt-3 space-y-2 border-t border-(--theme-border) pt-3 text-[13px]",
1380
+ children
1381
+ }) : null]
1382
+ });
1383
+ }
1384
+ var rowClasses = "flex gap-2 text-(--theme-muted-text-color)";
1385
+ /** One detail line of a hover card: a leading icon and its content. With
1386
+ * `onClick` the line is a button. */
1387
+ function HoverCardRow({ icon, children, title, align = "center", truncate = false, onClick }) {
1388
+ const content = /* @__PURE__ */ jsxs(Fragment$1, { children: [/* @__PURE__ */ jsx("span", {
1389
+ "aria-hidden": "true",
1390
+ className: cx("flex shrink-0 items-center [&>svg]:h-3.5 [&>svg]:w-3.5", align === "start" && "mt-0.5"),
1391
+ children: icon
1392
+ }), /* @__PURE__ */ jsx("span", {
1393
+ className: cx("min-w-0", truncate && "truncate"),
1394
+ children
1395
+ })] });
1396
+ const alignClass = align === "start" ? "items-start" : "items-center";
1397
+ if (onClick) return /* @__PURE__ */ jsx("button", {
1398
+ type: "button",
1399
+ title,
1400
+ onClick,
1401
+ className: cx(rowClasses, alignClass, "-mx-1 max-w-full rounded px-1 py-0.5 text-left transition-colors hover:bg-(--theme-muted-panel-bg) hover:text-(--theme-app)"),
1402
+ children: content
1403
+ });
1404
+ return /* @__PURE__ */ jsx("div", {
1405
+ title,
1406
+ className: cx(rowClasses, alignClass),
1407
+ children: content
1408
+ });
1409
+ }
1410
+ //#endregion
1411
+ export { actionsColumnWidth as A, GroupRow as C, NAME_MIN_WIDTH_PX as D, ListSkeleton as E, stickyTabsClasses as F, stickyTabsUnderHeaderClasses as I, stickyToolbarClasses as L, listTableProps as M, ActionToolbar as N, NameCell as O, ToolbarButton as P, useListNavigate as S, ListError as T, useListView as _, useHoverCard as a, ListRow as b, ListCount as c, ListDisplayMenu as d, ListFilterMenu as f, FAVORITE_ORDER as g, DEFAULT_ORDER as h, HoverCardSurface as i, listTableFixedProps as j, RowSelectCheckbox as k, ListSearchControl as l, isTextEntryContext as m, HoverCardTrigger as n, LIST_PAGE_SIZES as o, listControlButtonClasses as p, UserHoverCard as r, ListPager as s, HoverCardRow as t, useListSearch as u, ListColumns as v, ListActionsHeader as w, ListRowActionsProvider as x, ListPage as y };
@@ -5,6 +5,7 @@ export interface HeaderAddMenuItem {
5
5
  to?: string;
6
6
  onSelect?: () => void;
7
7
  disabled?: boolean;
8
+ hint?: string | undefined;
8
9
  separatorAbove?: boolean;
9
10
  }
10
11
  export declare function AddMenu({ items, label, buttonClassName, zClassName, children, }: {
@@ -0,0 +1,13 @@
1
+ export type AvatarSize = 'sm' | 'md' | 'lg' | 'xl' | '2xl';
2
+ export type AvatarStatus = 'online' | 'offline' | 'busy' | 'away';
3
+ export interface AvatarProps {
4
+ /** Image URL; absent or failing to load shows the initials of `name`. */
5
+ src?: string | null | undefined;
6
+ name?: string | undefined;
7
+ size?: AvatarSize | undefined;
8
+ status?: AvatarStatus | undefined;
9
+ className?: string | undefined;
10
+ }
11
+ /** Up to two initials: the first and last word of a name split on spaces and dots. */
12
+ export declare function avatarInitials(name: string | undefined): string;
13
+ export declare function Avatar({ src, name, size, status, className, }: AvatarProps): import("react").JSX.Element;
@@ -24,5 +24,7 @@ export interface IProps {
24
24
  /** Label for the toggle row hiding a category's collapsible options. */
25
25
  collapsedLabel?: (count: number) => string;
26
26
  portalEl?: HTMLElement;
27
+ /** Smaller option rows and text, for dense toolbars. */
28
+ compact?: boolean | undefined;
27
29
  }
28
30
  export default function Dropdown(props: IProps): import("react").JSX.Element;
@@ -55,6 +55,7 @@ export interface UIStrings {
55
55
  create: string;
56
56
  remove: string;
57
57
  sort: string;
58
+ userAvatar: string;
58
59
  };
59
60
  dropdown: {
60
61
  select: (type: string) => string;
@@ -330,6 +331,7 @@ export interface UIStrings {
330
331
  years: (n: number) => string;
331
332
  };
332
333
  list: {
334
+ copyMenu: string;
333
335
  copy: (label: string) => string;
334
336
  copied: (label: string) => string;
335
337
  couldntCopy: (label: string) => string;
@@ -1,2 +1,2 @@
1
- import { a as EditorField, i as FormCodePanel, n as defineEditorThemes, o as Editor, r as getThemeName, t as setupMonacoWorkers } from "../chunks/editor-mNznodJN.js";
1
+ import { a as EditorField, i as FormCodePanel, n as defineEditorThemes, o as Editor, r as getThemeName, t as setupMonacoWorkers } from "../chunks/editor-9_uVtUyy.js";
2
2
  export { Editor, EditorField, FormCodePanel, defineEditorThemes, getThemeName, setupMonacoWorkers };
@@ -1,16 +1,16 @@
1
+ import { i as useNotify, l as useSlots, o as useProvisionCorsRules, u as useStrings } from "../chunks/Provider-Ghua9PkN.js";
2
+ import { _ as useRowMenuActive, d as assembleRowMenu, g as useRowMenu, h as useCopySubmenu, u as MoreButton } from "../chunks/PageHeader-l49p1nM9.js";
1
3
  import { AccessIcon, AlertIcon, AngleDownIcon, AngleRightIcon, AngleUpIcon, ChevronLeftIcon, ChevronRightIcon, ClipboardIcon, CloseIcon, CloudUploadIcon, CollapseIcon, CustomizeIcon, DiskIcon, DocumentIcon, DownloadFileIcon, ExpandIcon, ExpandVerticalIcon, EyeIcon, FileIcon, FileTextIcon, FolderIcon, FolderOpenIcon, ImageIcon, LinkIcon, LockIcon, MinimizeIcon, MusicIcon, PdfIcon, RefreshIcon, ShareIcon, SpreadsheetIcon, SuccessIcon, TrashIcon, UploadIcon, UserIcon, VideoIcon, ZipIcon, ZoomInIcon, ZoomOutIcon } from "../icons.js";
2
- import { c as ConfirmModal, f as Markdown, h as Callout, m as CopyToClipboard, n as CreateModal, p as CopyCodeBlock } from "../chunks/CreateModal-BbV5cTj7.js";
3
- import { i as useNotify, l as useSlots, o as useProvisionCorsRules, u as useStrings } from "../chunks/Provider-DHmZ3v9i.js";
4
- import { n as TOOLTIP_ID, r as TooltipInfo } from "../chunks/Tooltip-n9w7Tkt1.js";
4
+ import { c as ConfirmModal, f as Markdown, h as Callout, m as CopyToClipboard, n as CreateModal, p as CopyCodeBlock } from "../chunks/CreateModal-BY6DLmur.js";
5
+ import { n as TOOLTIP_ID, r as TooltipInfo } from "../chunks/Tooltip-Crxo_eU_.js";
5
6
  import { t as StatusBadge } from "../chunks/StatusBadge-C1Blx_cW.js";
6
7
  import { t as Loader } from "../chunks/Loader-BXoXTZGc.js";
7
- import { _ as useRowMenuActive, d as assembleRowMenu, f as copySubmenu, g as useRowMenu, u as MoreButton } from "../chunks/PageHeader-MxuOs9cH.js";
8
- import { n as Table } from "../chunks/Table-C6JdFFiJ.js";
9
- import { C as ListSkeleton, E as RowSelectCheckbox, O as listTableFixedProps, k as listTableProps, x as ListActionsHeader } from "../chunks/list-7k0eaI5N.js";
8
+ import { n as Table } from "../chunks/Table-4OHjdKdO.js";
9
+ import { E as ListSkeleton, M as listTableProps, j as listTableFixedProps, k as RowSelectCheckbox, w as ListActionsHeader } from "../chunks/list-qrojZZNv.js";
10
10
  import cx from "classnames";
11
- import { Fragment, jsx, jsxs } from "react/jsx-runtime";
12
11
  import { Suspense, createContext, lazy, memo, use, useCallback, useEffect, useEffectEvent, useId, useLayoutEffect, useMemo, useRef, useState, useTransition } from "react";
13
12
  import { useLocalStorage } from "usehooks-ts";
13
+ import { Fragment as Fragment$1, jsx, jsxs } from "react/jsx-runtime";
14
14
  import { createPortal } from "react-dom";
15
15
  import { Menu, MenuButton, MenuItem, MenuItems, MenuSeparator } from "@headlessui/react";
16
16
  import Skeleton from "react-loading-skeleton";
@@ -451,7 +451,7 @@ function FileProgressBar({ fileProgress, fileName, progressBarColorScheme, onCan
451
451
  children: [/* @__PURE__ */ jsx("div", {
452
452
  className: cx("h-full transition-all duration-300 relative flex items-center justify-center", barColor, isHovered && "opacity-80"),
453
453
  style: { width: `${percentage}%` }
454
- }), isHovered && !isCompleted && totalBytes > 0 && /* @__PURE__ */ jsxs(Fragment, { children: [/* @__PURE__ */ jsxs("div", {
454
+ }), isHovered && !isCompleted && totalBytes > 0 && /* @__PURE__ */ jsxs(Fragment$1, { children: [/* @__PURE__ */ jsxs("div", {
455
455
  className: "absolute inset-0 flex items-center justify-center text-xs whitespace-nowrap p-0.5 z-10",
456
456
  style: {
457
457
  WebkitClipPath: `inset(0 ${100 - percentage}% 0 0)`,
@@ -625,7 +625,7 @@ function UploadSessionToast({ session, queueLength, onCancel, onCancelFile }) {
625
625
  })
626
626
  ]
627
627
  })]
628
- }), isToastExpanded && /* @__PURE__ */ jsxs(Fragment, { children: [
628
+ }), isToastExpanded && /* @__PURE__ */ jsxs(Fragment$1, { children: [
629
629
  /* @__PURE__ */ jsxs("div", {
630
630
  className: "flex items-center justify-between",
631
631
  children: [/* @__PURE__ */ jsxs("div", {
@@ -1493,7 +1493,7 @@ function PropagationStage({ status, label }) {
1493
1493
  "aria-hidden": "true",
1494
1494
  children: /* @__PURE__ */ jsx("polyline", { points: "3.5 8.5 6.5 11.5 12.5 5" })
1495
1495
  }),
1496
- status === "active" && /* @__PURE__ */ jsxs(Fragment, { children: [/* @__PURE__ */ jsx("span", { className: "absolute inline-flex h-full w-full animate-ping rounded-full bg-blue-400/60" }), /* @__PURE__ */ jsx("span", { className: "relative inline-flex h-2 w-2 rounded-full bg-blue-500" })] }),
1496
+ status === "active" && /* @__PURE__ */ jsxs(Fragment$1, { children: [/* @__PURE__ */ jsx("span", { className: "absolute inline-flex h-full w-full animate-ping rounded-full bg-blue-400/60" }), /* @__PURE__ */ jsx("span", { className: "relative inline-flex h-2 w-2 rounded-full bg-blue-500" })] }),
1497
1497
  status === "pending" && /* @__PURE__ */ jsx("span", { className: "inline-flex h-1.5 w-1.5 rounded-full theme-muted-text opacity-60" })
1498
1498
  ]
1499
1499
  }), /* @__PURE__ */ jsx("span", {
@@ -2557,7 +2557,7 @@ function useObjectText(url, { enabled, maxBytes, maxLines, knownSize, cacheKey,
2557
2557
  }
2558
2558
  //#endregion
2559
2559
  //#region src/file-explorer/FilePreview/Viewer.tsx
2560
- var CodePreviewEditor = lazy(() => import("../chunks/CodePreviewEditor-UAtnpmOV.js"));
2560
+ var CodePreviewEditor = lazy(() => import("../chunks/CodePreviewEditor-4lx3kE-w.js"));
2561
2561
  var PREVIEW_MARKDOWN_CONTROLS = {
2562
2562
  table: { fullscreen: false },
2563
2563
  mermaid: { fullscreen: false }
@@ -2998,7 +2998,7 @@ function PreviewFetchState({ loading, tooLarge, error, corsError, storage, onCor
2998
2998
  });
2999
2999
  if (tooLarge) return /* @__PURE__ */ jsx(TooLargeInline, { onDownload });
3000
3000
  if (error) return /* @__PURE__ */ jsx(PreviewError, { onDownload });
3001
- return /* @__PURE__ */ jsx(Fragment, { children });
3001
+ return /* @__PURE__ */ jsx(Fragment$1, { children });
3002
3002
  }
3003
3003
  function NotPreviewable({ icon, title, message, onDownload }) {
3004
3004
  const t = useStrings().fileExplorer;
@@ -3247,7 +3247,7 @@ function FilePreview({ open, node, siblings, storage, getPresignedUrl, onNavigat
3247
3247
  onClick: (e) => {
3248
3248
  if (e.target === e.currentTarget) onClose();
3249
3249
  },
3250
- children: [isOverlay && /* @__PURE__ */ jsxs(Fragment, { children: [/* @__PURE__ */ jsx(EdgeButton, {
3250
+ children: [isOverlay && /* @__PURE__ */ jsxs(Fragment$1, { children: [/* @__PURE__ */ jsx(EdgeButton, {
3251
3251
  side: "left",
3252
3252
  label: t.preview.previousFile,
3253
3253
  disabled: !hasPrev,
@@ -3592,7 +3592,7 @@ function FileRowsWindow({ items, padTop, padBottom, nodes, checkedItems, activeI
3592
3592
  const storageIconAlt = useStrings().fileExplorer.chrome.storageIconAlt;
3593
3593
  useNestedScrollerWarning(scrollEl, nodes.length);
3594
3594
  useRowPitchAudit(scrollEl, nodes, items);
3595
- return /* @__PURE__ */ jsxs(Fragment, { children: [
3595
+ return /* @__PURE__ */ jsxs(Fragment$1, { children: [
3596
3596
  padTop > 0 && /* @__PURE__ */ jsx(Spacer, { height: padTop }, "pad-top"),
3597
3597
  items.map((item) => {
3598
3598
  const node = nodes[item.index];
@@ -3625,7 +3625,7 @@ function FileRowsWindow({ items, padTop, padBottom, nodes, checkedItems, activeI
3625
3625
  ] });
3626
3626
  }
3627
3627
  function Spacer({ height }) {
3628
- return /* @__PURE__ */ jsx(Fragment, { children: /* @__PURE__ */ jsx("tr", {
3628
+ return /* @__PURE__ */ jsx(Fragment$1, { children: /* @__PURE__ */ jsx("tr", {
3629
3629
  "aria-hidden": "true",
3630
3630
  className: "border-0",
3631
3631
  children: /* @__PURE__ */ jsx("td", {
@@ -3658,7 +3658,7 @@ function useRowPitchAudit(scrollEl, nodes, items) {
3658
3658
  * would land in `<tbody>`, since Children.toArray only flattens arrays. */
3659
3659
  function FileTableHeaders({ allSelected, someSelected, onSelectAll }) {
3660
3660
  const t = useStrings().fileExplorer;
3661
- return /* @__PURE__ */ jsxs(Fragment, { children: [
3661
+ return /* @__PURE__ */ jsxs(Fragment$1, { children: [
3662
3662
  /* @__PURE__ */ jsx(Table.Header, {
3663
3663
  caps: false,
3664
3664
  className: "py-2",
@@ -4100,7 +4100,7 @@ function indentStyle(depth, isDirectory) {
4100
4100
  }
4101
4101
  function IndentGuides({ depth }) {
4102
4102
  if (depth === 0) return null;
4103
- return /* @__PURE__ */ jsx(Fragment, { children: Array.from({ length: depth }, (_, level) => /* @__PURE__ */ jsx("span", {
4103
+ return /* @__PURE__ */ jsx(Fragment$1, { children: Array.from({ length: depth }, (_, level) => /* @__PURE__ */ jsx("span", {
4104
4104
  "aria-hidden": "true",
4105
4105
  className: "pointer-events-none absolute inset-y-0 w-px bg-(--theme-border)/60",
4106
4106
  style: { left: GUIDE_OFFSET + level * INDENT_PER_LEVEL }
@@ -4112,7 +4112,7 @@ function RowIcons({ isDirectory, isExpanded, customIcon }) {
4112
4112
  children: customIcon
4113
4113
  });
4114
4114
  const folder = isExpanded ? /* @__PURE__ */ jsx(FolderOpenIcon, { className: "h-4 w-4 mr-1 text-sky-500" }) : /* @__PURE__ */ jsx(FolderIcon, { className: "h-4 w-4 mr-1 text-sky-500/80" });
4115
- return /* @__PURE__ */ jsxs(Fragment, { children: [/* @__PURE__ */ jsx(AngleRightIcon, { className: cx("h-3.5 w-3.5 shrink-0 theme-muted-text transition-transform duration-150", isExpanded && "rotate-90") }), customIcon ?? folder] });
4115
+ return /* @__PURE__ */ jsxs(Fragment$1, { children: [/* @__PURE__ */ jsx(AngleRightIcon, { className: cx("h-3.5 w-3.5 shrink-0 theme-muted-text transition-transform duration-150", isExpanded && "rotate-90") }), customIcon ?? folder] });
4116
4116
  }
4117
4117
  /** Sized by the slot, not by its contents: react-loading-skeleton wraps each bar
4118
4118
  * in an inline span, so a bar occupies a line box taller than its `height` and
@@ -4364,6 +4364,7 @@ function TreeFrame({ treeOnly, sidebarWidth, onWidthChange, children }) {
4364
4364
  });
4365
4365
  }
4366
4366
  function FileExplorer({ storages, onRefresh, refreshKey, onOpenFile, showUserHierarchy = false, groups = [], groupsLoading = false, selectedPath, onPathChange, getProviderAndClient, treeOnly = false, initialExpandedPaths, onExpandedPathsChange }) {
4367
+ const copySubmenu = useCopySubmenu();
4367
4368
  const t = useStrings().fileExplorer;
4368
4369
  const notify = useNotify();
4369
4370
  const slots = useSlots();
@@ -5228,7 +5229,7 @@ function FileExplorer({ storages, onRefresh, refreshKey, onOpenFile, showUserHie
5228
5229
  selectedStorage: null,
5229
5230
  onRefresh: handleRefresh
5230
5231
  })]
5231
- }) : !selectedNode ? /* @__PURE__ */ jsx(NoFileSelectedPreview, {}) : /* @__PURE__ */ jsxs(Fragment, { children: [
5232
+ }) : !selectedNode ? /* @__PURE__ */ jsx(NoFileSelectedPreview, {}) : /* @__PURE__ */ jsxs(Fragment$1, { children: [
5232
5233
  /* @__PURE__ */ jsxs("div", {
5233
5234
  className: "flex items-center justify-between gap-3 px-4 h-12 shrink-0 border-b theme-border",
5234
5235
  children: [renderBreadcrumb(), /* @__PURE__ */ jsxs("div", {
@@ -5320,7 +5321,7 @@ function FileExplorer({ storages, onRefresh, refreshKey, onOpenFile, showUserHie
5320
5321
  className: "text-sm rounded-sm hover:theme-hover cursor-pointer w-full items-center px-2 py-1.5",
5321
5322
  onClick: handleDownload,
5322
5323
  children: "From browser"
5323
- }) }), selectedNodeSupportsPwUri && /* @__PURE__ */ jsxs(Fragment, { children: [/* @__PURE__ */ jsx(MenuSeparator, { className: "my-0.5 h-px theme-border" }), /* @__PURE__ */ jsx(MenuItem, { children: /* @__PURE__ */ jsxs("div", { children: [/* @__PURE__ */ jsx("p", {
5324
+ }) }), selectedNodeSupportsPwUri && /* @__PURE__ */ jsxs(Fragment$1, { children: [/* @__PURE__ */ jsx(MenuSeparator, { className: "my-0.5 h-px theme-border" }), /* @__PURE__ */ jsx(MenuItem, { children: /* @__PURE__ */ jsxs("div", { children: [/* @__PURE__ */ jsx("p", {
5324
5325
  className: "text-sm w-full text-center pointer-events-none px-2 py-1.5",
5325
5326
  children: "Using PW CLI"
5326
5327
  }), (() => {
@@ -5456,7 +5457,7 @@ function FileExplorer({ storages, onRefresh, refreshKey, onOpenFile, showUserHie
5456
5457
  className: "tabular-nums",
5457
5458
  children: formatFileSize(selectedNode.size)
5458
5459
  }),
5459
- modifiedDt && /* @__PURE__ */ jsxs(Fragment, { children: [/* @__PURE__ */ jsx("span", {
5460
+ modifiedDt && /* @__PURE__ */ jsxs(Fragment$1, { children: [/* @__PURE__ */ jsx("span", {
5460
5461
  "aria-hidden": true,
5461
5462
  children: "·"
5462
5463
  }), /* @__PURE__ */ jsxs("span", { children: ["Modified ", modifiedDt.toRelative()] })] })
@@ -5486,21 +5487,21 @@ function FileExplorer({ storages, onRefresh, refreshKey, onOpenFile, showUserHie
5486
5487
  }), /* @__PURE__ */ jsxs("dl", {
5487
5488
  className: "grid grid-cols-[minmax(0,140px)_1fr] gap-x-6 gap-y-2 text-sm",
5488
5489
  children: [
5489
- typeof selectedNode.size === "number" && /* @__PURE__ */ jsxs(Fragment, { children: [/* @__PURE__ */ jsx("dt", {
5490
+ typeof selectedNode.size === "number" && /* @__PURE__ */ jsxs(Fragment$1, { children: [/* @__PURE__ */ jsx("dt", {
5490
5491
  className: "theme-muted-text",
5491
5492
  children: t.chrome.size
5492
5493
  }), /* @__PURE__ */ jsx("dd", {
5493
5494
  className: "tabular-nums",
5494
5495
  children: formatFileSize(selectedNode.size)
5495
5496
  })] }),
5496
- selectedNode.contentType && /* @__PURE__ */ jsxs(Fragment, { children: [/* @__PURE__ */ jsx("dt", {
5497
+ selectedNode.contentType && /* @__PURE__ */ jsxs(Fragment$1, { children: [/* @__PURE__ */ jsx("dt", {
5497
5498
  className: "theme-muted-text",
5498
5499
  children: "Content Type"
5499
5500
  }), /* @__PURE__ */ jsx("dd", {
5500
5501
  className: "font-mono text-xs",
5501
5502
  children: selectedNode.contentType
5502
5503
  })] }),
5503
- createdDt && /* @__PURE__ */ jsxs(Fragment, { children: [/* @__PURE__ */ jsx("dt", {
5504
+ createdDt && /* @__PURE__ */ jsxs(Fragment$1, { children: [/* @__PURE__ */ jsx("dt", {
5504
5505
  className: "theme-muted-text",
5505
5506
  children: t.chrome.created
5506
5507
  }), /* @__PURE__ */ jsxs("dd", { children: [
@@ -5511,7 +5512,7 @@ function FileExplorer({ storages, onRefresh, refreshKey, onOpenFile, showUserHie
5511
5512
  children: ["· ", createdDt.toRelative()]
5512
5513
  })
5513
5514
  ] })] }),
5514
- modifiedDt && /* @__PURE__ */ jsxs(Fragment, { children: [/* @__PURE__ */ jsx("dt", {
5515
+ modifiedDt && /* @__PURE__ */ jsxs(Fragment$1, { children: [/* @__PURE__ */ jsx("dt", {
5515
5516
  className: "theme-muted-text",
5516
5517
  children: "Last Modified"
5517
5518
  }), /* @__PURE__ */ jsxs("dd", { children: [
@@ -5522,14 +5523,14 @@ function FileExplorer({ storages, onRefresh, refreshKey, onOpenFile, showUserHie
5522
5523
  children: ["· ", modifiedDt.toRelative()]
5523
5524
  })
5524
5525
  ] })] }),
5525
- selectedNode.hash && /* @__PURE__ */ jsxs(Fragment, { children: [/* @__PURE__ */ jsx("dt", {
5526
+ selectedNode.hash && /* @__PURE__ */ jsxs(Fragment$1, { children: [/* @__PURE__ */ jsx("dt", {
5526
5527
  className: "theme-muted-text",
5527
5528
  children: t.chrome.hash
5528
5529
  }), /* @__PURE__ */ jsx("dd", {
5529
5530
  className: "font-mono text-xs break-all",
5530
5531
  children: selectedNode.hash.replace(/^"|"$/g, "")
5531
5532
  })] }),
5532
- selectedNode.storageClass && /* @__PURE__ */ jsxs(Fragment, { children: [/* @__PURE__ */ jsx("dt", {
5533
+ selectedNode.storageClass && /* @__PURE__ */ jsxs(Fragment$1, { children: [/* @__PURE__ */ jsx("dt", {
5533
5534
  className: "theme-muted-text",
5534
5535
  children: "Storage Class"
5535
5536
  }), /* @__PURE__ */ jsx("dd", {
@@ -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 {};