@parallelworks/ui 0.5.0 → 0.5.2

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 (32) hide show
  1. package/README.md +0 -6
  2. package/dist/chunks/{CodePreviewEditor-CBtYRZi6.js → CodePreviewEditor-Uij_Npp4.js} +1 -1
  3. package/dist/chunks/{CreateModal-6zZZHxCI.js → CreateModal-DEvWkdFl.js} +4 -29
  4. package/dist/chunks/{Monaco-CvFXoW3r.js → Monaco-H1M5hQbJ.js} +2 -2
  5. package/dist/chunks/PageHeader-CSo3LVId.js +571 -0
  6. package/dist/chunks/{Provider-jQCAN3NN.js → Provider-BIL5347a.js} +5 -1
  7. package/dist/chunks/{SwitchToggle-D0ud8cd5.js → SwitchToggle-DiBXEP12.js} +1 -1
  8. package/dist/chunks/{editor-CEXg6C8X.js → editor-4ZuZruLz.js} +2 -2
  9. package/dist/chunks/{list-CvDWt0TC.js → list-CgzqVlao.js} +296 -302
  10. package/dist/components/Breadcrumbs.d.ts +28 -0
  11. package/dist/components/PageHeader.d.ts +69 -0
  12. package/dist/components/Provider.d.ts +13 -1
  13. package/dist/components/Table.d.ts +1 -1
  14. package/dist/editor/index.js +1 -1
  15. package/dist/file-explorer/FileExplorer.d.ts +1 -3
  16. package/dist/file-explorer/helpers.d.ts +1 -3
  17. package/dist/file-explorer/index.js +15 -22
  18. package/dist/form/index.js +2 -2
  19. package/dist/index.d.ts +2 -0
  20. package/dist/index.js +6 -5
  21. package/dist/list/ActionToolbar.d.ts +38 -0
  22. package/dist/list/ListPage.d.ts +63 -0
  23. package/dist/list/RowContextMenu.d.ts +1 -1
  24. package/dist/list/index.d.ts +2 -0
  25. package/dist/list/index.js +3 -2
  26. package/dist/logviewer/index.js +1 -1
  27. package/dist/styles/theme.css +2 -0
  28. package/dist/styles.css +1 -1
  29. package/dist/theme/index.d.ts +1 -1
  30. package/dist/theme/index.js +9 -0
  31. package/dist/workflow/index.js +1 -1
  32. package/package.json +1 -1
@@ -0,0 +1,28 @@
1
+ import React from 'react';
2
+ export interface IBreadcrumbItem {
3
+ label: string;
4
+ href?: string;
5
+ newWindow?: boolean;
6
+ }
7
+ interface BreadcrumbContextType {
8
+ breadcrumbs: IBreadcrumbItem[];
9
+ setBreadcrumbs: (breadcrumbs: IBreadcrumbItem[]) => void;
10
+ rightsideBreadcrumb?: IBreadcrumbItem | null;
11
+ setRightsideBreadcrumb: (breadcrumb: IBreadcrumbItem | null) => void;
12
+ hidden: boolean;
13
+ setHidden: (hidden: boolean) => void;
14
+ /** Null whenever the breadcrumb strip isn't rendered (classic chrome). */
15
+ titleActionSlot: HTMLElement | null;
16
+ setTitleActionSlot: (el: HTMLElement | null) => void;
17
+ rightActionSlot: HTMLElement | null;
18
+ setRightActionSlot: (el: HTMLElement | null) => void;
19
+ }
20
+ export declare const useBreadcrumb: () => BreadcrumbContextType;
21
+ export declare function BreadcrumbProvider({ children, }: {
22
+ children: React.ReactNode;
23
+ }): React.JSX.Element;
24
+ export declare function useSetBreadcrumbs(getBreadcrumbs: (() => IBreadcrumbItem[]) | IBreadcrumbItem[]): void;
25
+ /** For pages that render their own header instead of the breadcrumb strip. */
26
+ export declare function useClearBreadcrumbs(): void;
27
+ export declare function useHideBreadcrumbs(hidden: boolean): void;
28
+ export {};
@@ -0,0 +1,69 @@
1
+ import type { ComponentType, ReactNode } from 'react';
2
+ import { type RowMenuItem } from '../list/RowContextMenu.js';
3
+ import { type HeaderAddMenuItem } from './AddMenu.js';
4
+ export interface PageHeaderBreadcrumb {
5
+ label: string;
6
+ href?: string;
7
+ }
8
+ /** A rendered crumb row entry, as handed to the breadcrumbPin slot. */
9
+ export interface PageHeaderCrumb {
10
+ label: ReactNode;
11
+ href?: string;
12
+ }
13
+ /** With menu, the plus opens a chooser; otherwise navigates to or calls the
14
+ * single action. `word` is the visible verb; `label` stays the full action for
15
+ * the tooltip and screen readers. */
16
+ export declare function HeaderAddButton({ to, onClick, label, word, menu, }: {
17
+ to?: string;
18
+ onClick?: () => void;
19
+ label: string;
20
+ word?: 'add' | 'create';
21
+ menu?: HeaderAddMenuItem[];
22
+ }): import("react").JSX.Element;
23
+ export declare function HeaderActionMenu({ items, label, }: {
24
+ items: HeaderAddMenuItem[];
25
+ label?: string;
26
+ }): import("react").JSX.Element | null;
27
+ /** The header "…" trigger for a RowMenuItem menu — same rendering (submenus,
28
+ * destructive styling) as the list pages' right-click context menus. */
29
+ export declare function HeaderRowMenu({ items, label, }: {
30
+ items: RowMenuItem[];
31
+ label?: string;
32
+ }): import("react").JSX.Element | null;
33
+ export declare function HeaderEditButton({ to, onClick, label, disabled, tooltip, }: {
34
+ to?: string;
35
+ onClick?: () => void;
36
+ label?: string;
37
+ disabled?: boolean;
38
+ tooltip?: string;
39
+ }): import("react").JSX.Element;
40
+ /** Renders nothing when the modern breadcrumb strip isn't mounted (classic chrome or self-headered pages). */
41
+ export declare function BreadcrumbsTitleAction({ children }: {
42
+ children: ReactNode;
43
+ }): import("react").ReactPortal | null;
44
+ export declare function BreadcrumbsRightAction({ children }: {
45
+ children: ReactNode;
46
+ }): import("react").ReactPortal | null;
47
+ export declare function BreadcrumbsActionButton({ icon: Icon, label, to, onClick, disabled, tooltip, }: {
48
+ icon: ComponentType<{
49
+ className?: string;
50
+ }>;
51
+ label: string;
52
+ to?: string;
53
+ onClick?: () => void;
54
+ disabled?: boolean;
55
+ tooltip?: string;
56
+ }): import("react").JSX.Element;
57
+ interface PageHeaderProps {
58
+ breadcrumbs?: PageHeaderBreadcrumb[] | undefined;
59
+ title?: ReactNode;
60
+ titleAction?: ReactNode;
61
+ actions?: ReactNode;
62
+ toolbar?: ReactNode;
63
+ className?: string;
64
+ sticky?: boolean;
65
+ /** Negative offset (e.g. -top-4) prevents rows peeking above the header when the container has top padding. */
66
+ stickyTopClassName?: string;
67
+ }
68
+ export declare function PageHeader({ breadcrumbs, title, titleAction, actions, toolbar, className, sticky, stickyTopClassName, }: PageHeaderProps): import("react").JSX.Element;
69
+ export {};
@@ -50,6 +50,8 @@ export interface UIStrings {
50
50
  showHiddenFields: string;
51
51
  showHiddenFieldsHint: string;
52
52
  jsonHasErrors: string;
53
+ add: string;
54
+ create: string;
53
55
  };
54
56
  dropdown: {
55
57
  select: (type: string) => string;
@@ -337,6 +339,7 @@ export interface UIStrings {
337
339
  };
338
340
  }
339
341
  export interface UINavigation {
342
+ goTo: (to: string) => void;
340
343
  toWorkflow: (name: string) => void;
341
344
  toMarketItem: (name: string) => void;
342
345
  openExternal: (href: string) => void;
@@ -382,12 +385,17 @@ export interface UIData {
382
385
  }>;
383
386
  }
384
387
  import type { FieldComponent } from '../form/fieldRegistry.js';
385
- /** Renders internal navigation; hosts bind their router's Link. */
388
+ import type { PageHeaderCrumb } from './PageHeader.js';
389
+ /** Renders internal navigation; hosts bind their router's Link. Accessibility
390
+ * and tooltip data attributes pass through so header links keep their labels. */
386
391
  export type UILinkComponent = React.ComponentType<{
387
392
  to: string;
388
393
  onClick?: () => void;
389
394
  className?: string;
390
395
  children: ReactNode;
396
+ title?: string;
397
+ 'aria-label'?: string;
398
+ [dataAttr: `data-${string}`]: string | undefined;
391
399
  }>;
392
400
  /** The provider's link slot, with a plain anchor fallback. */
393
401
  export declare function useLink(): UILinkComponent;
@@ -436,6 +444,10 @@ export interface UISlots {
436
444
  storage: unknown;
437
445
  groups?: unknown;
438
446
  }) => ReactNode;
447
+ /** Pin affordance rendered after the page header's crumb trail; absent hides it. */
448
+ breadcrumbPin?: (args: {
449
+ crumbs: readonly PageHeaderCrumb[];
450
+ }) => ReactNode;
439
451
  }
440
452
  export interface UIProviderValue {
441
453
  notify: UINotify;
@@ -8,7 +8,7 @@ declare function CompactItem({ wrap, children, className, colspan, ...tdProps }:
8
8
  interface ITableHeaderProps {
9
9
  children?: React.ReactNode;
10
10
  className?: string;
11
- style?: React.CSSProperties;
11
+ style?: React.CSSProperties | undefined;
12
12
  colspan?: number;
13
13
  onClick?: () => void;
14
14
  /** When false, drops uppercase + tracking-wider for a sentence-case header. */
@@ -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-CEXg6C8X.js";
1
+ import { a as EditorField, i as FormCodePanel, n as defineEditorThemes, o as Editor, r as getThemeName, t as setupMonacoWorkers } from "../chunks/editor-4ZuZruLz.js";
2
2
  export { Editor, EditorField, FormCodePanel, defineEditorThemes, getThemeName, setupMonacoWorkers };
@@ -16,8 +16,6 @@ interface IFileExplorerProps {
16
16
  groupsLoading?: boolean;
17
17
  selectedPath: string;
18
18
  onPathChange: (path: string) => void;
19
- /** The modern layout drops the sidebar heading and adds the toolbar row. */
20
- variant?: 'classic' | 'modern';
21
19
  }
22
- export default function FileExplorer({ storages, onRefresh, showUserHierarchy, groups, groupsLoading, selectedPath, onPathChange, getProviderAndClient, variant, }: IFileExplorerProps): import("react").JSX.Element;
20
+ export default function FileExplorer({ storages, onRefresh, showUserHierarchy, groups, groupsLoading, selectedPath, onPathChange, getProviderAndClient, }: IFileExplorerProps): import("react").JSX.Element;
23
21
  export {};
@@ -30,9 +30,7 @@ declare function NoDataAvailablePreview({ selectedStorage, error, onRefresh, con
30
30
  className?: string;
31
31
  canWrite?: boolean;
32
32
  }): JSX.Element;
33
- declare function SkeletonPreview({ variant, }?: {
34
- variant?: 'classic' | 'modern';
35
- }): JSX.Element;
33
+ declare function SkeletonPreview(): JSX.Element;
36
34
  interface IDragDropZoneProps {
37
35
  onDropFiles?: ((files: FileList | DataTransferItemList) => void) | undefined;
38
36
  children: React.ReactNode;
@@ -1,11 +1,12 @@
1
1
  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, p as CopyCodeBlock, t as CreateModal } from "../chunks/CreateModal-6zZZHxCI.js";
3
- import { a as useProvisionCorsRules, c as useStrings, i as useNotify, s as useSlots } from "../chunks/Provider-jQCAN3NN.js";
2
+ import { d as Markdown, f as CopyCodeBlock, m as Callout, p as CopyToClipboard, s as ConfirmModal, t as CreateModal } from "../chunks/CreateModal-DEvWkdFl.js";
3
+ import { a as useProvisionCorsRules, c as useStrings, i as useNotify, s as useSlots } from "../chunks/Provider-BIL5347a.js";
4
4
  import { n as TOOLTIP_ID, r as TooltipInfo } from "../chunks/Tooltip-WgbiC_nd.js";
5
5
  import { t as Loader } from "../chunks/Loader-BXoXTZGc.js";
6
+ import { d as copySubmenu, g as useRowMenuActive, h as useRowMenu, l as MoreButton, u as assembleRowMenu } from "../chunks/PageHeader-CSo3LVId.js";
6
7
  import { t as StatusBadge } from "../chunks/StatusBadge-DXp4zkSd.js";
7
8
  import { n as Table } from "../chunks/Table-ByziK93x.js";
8
- import { A as useRowMenu, C as listTableProps, E as copySubmenu, S as listTableFixedProps, T as assembleRowMenu, _ as ListSkeleton, b as RowSelectCheckbox, h as ListActionsHeader, j as useRowMenuActive, w as MoreButton } from "../chunks/list-CvDWt0TC.js";
9
+ import { D as listTableFixedProps, O as listTableProps, S as ListSkeleton, T as RowSelectCheckbox, b as ListActionsHeader } from "../chunks/list-CgzqVlao.js";
9
10
  import cx from "classnames";
10
11
  import { Fragment, jsx, jsxs } from "react/jsx-runtime";
11
12
  import { Suspense, createContext, lazy, memo, use, useCallback, useEffect, useEffectEvent, useId, useLayoutEffect, useMemo, useRef, useState, useTransition } from "react";
@@ -1536,9 +1537,8 @@ function NoDataAvailablePreview({ selectedStorage, error, onRefresh, connectionI
1536
1537
  })
1537
1538
  });
1538
1539
  }
1539
- function SkeletonPreview({ variant = "classic" } = {}) {
1540
+ function SkeletonPreview() {
1540
1541
  const [sidebarWidth] = useLocalStorage(SIDEBAR_WIDTH_STORAGE_KEY, 300);
1541
- const newNavigation = variant === "modern";
1542
1542
  return /* @__PURE__ */ jsxs("div", {
1543
1543
  className: "w-full h-full flex",
1544
1544
  children: [/* @__PURE__ */ jsx("div", {
@@ -1546,15 +1546,12 @@ function SkeletonPreview({ variant = "classic" } = {}) {
1546
1546
  style: { width: `${sidebarWidth}px` },
1547
1547
  children: /* @__PURE__ */ jsxs("div", {
1548
1548
  className: "h-full flex flex-col border-r theme-border bg-(--theme-panel-bg)/60",
1549
- children: [/* @__PURE__ */ jsxs("div", {
1550
- className: cx("flex items-center h-10 px-3 shrink-0 border-b theme-border", newNavigation ? "justify-end" : "justify-between"),
1551
- children: [!newNavigation && /* @__PURE__ */ jsx("h3", {
1552
- className: "text-[11px] font-semibold uppercase tracking-widest theme-muted-text",
1553
- children: "Explorer"
1554
- }), /* @__PURE__ */ jsxs("div", {
1549
+ children: [/* @__PURE__ */ jsx("div", {
1550
+ className: "flex items-center justify-end h-10 px-3 shrink-0 border-b theme-border",
1551
+ children: /* @__PURE__ */ jsxs("div", {
1555
1552
  className: "flex gap-x-0.5",
1556
1553
  children: [/* @__PURE__ */ jsx("div", { className: "h-7 w-7" }), /* @__PURE__ */ jsx("div", { className: "h-7 w-7" })]
1557
- })]
1554
+ })
1558
1555
  }), /* @__PURE__ */ jsx("div", {
1559
1556
  className: "overflow-auto flex-1 px-2 py-2 space-y-1.5",
1560
1557
  children: [...Array(6)].map((_, i) => /* @__PURE__ */ jsx(Skeleton, { height: 14 }, i))
@@ -2518,7 +2515,7 @@ function useObjectText(url, { enabled, maxBytes, maxLines, knownSize, cacheKey,
2518
2515
  }
2519
2516
  //#endregion
2520
2517
  //#region src/file-explorer/FilePreview/Viewer.tsx
2521
- var CodePreviewEditor = lazy(() => import("../chunks/CodePreviewEditor-CBtYRZi6.js"));
2518
+ var CodePreviewEditor = lazy(() => import("../chunks/CodePreviewEditor-Uij_Npp4.js"));
2522
2519
  var PREVIEW_MARKDOWN_CONTROLS = {
2523
2520
  table: { fullscreen: false },
2524
2521
  mermaid: { fullscreen: false }
@@ -4292,11 +4289,10 @@ function getAncestorDirPaths(path) {
4292
4289
  for (let i = 1; i <= dirSegmentCount; i++) ancestors.push(segments.slice(0, i).join("/") + "/");
4293
4290
  return ancestors;
4294
4291
  }
4295
- function FileExplorer({ storages, onRefresh, showUserHierarchy = false, groups = [], groupsLoading = false, selectedPath, onPathChange, getProviderAndClient, variant = "classic" }) {
4292
+ function FileExplorer({ storages, onRefresh, showUserHierarchy = false, groups = [], groupsLoading = false, selectedPath, onPathChange, getProviderAndClient }) {
4296
4293
  const t = useStrings().fileExplorer;
4297
4294
  const notify = useNotify();
4298
4295
  const slots = useSlots();
4299
- const newNavigation = variant === "modern";
4300
4296
  const fileExplorerContext = useFileExplorer();
4301
4297
  const [localStorages, setLocalStorages] = useState(storages);
4302
4298
  const [listings, setListings] = useState(() => /* @__PURE__ */ new Map());
@@ -5082,12 +5078,9 @@ function FileExplorer({ storages, onRefresh, showUserHierarchy = false, groups =
5082
5078
  },
5083
5079
  children: /* @__PURE__ */ jsxs("div", {
5084
5080
  className: "h-full flex flex-col border-r theme-border bg-(--theme-panel-bg)/60",
5085
- children: [/* @__PURE__ */ jsxs("div", {
5086
- className: cx("flex items-center h-10 px-3 shrink-0 border-b theme-border", newNavigation ? "justify-end" : "justify-between"),
5087
- children: [!newNavigation && /* @__PURE__ */ jsx("h3", {
5088
- className: "text-[11px] font-semibold uppercase tracking-widest theme-muted-text",
5089
- children: t.chrome.explorer
5090
- }), /* @__PURE__ */ jsxs("div", {
5081
+ children: [/* @__PURE__ */ jsx("div", {
5082
+ className: "flex items-center justify-end h-10 px-3 shrink-0 border-b theme-border",
5083
+ children: /* @__PURE__ */ jsxs("div", {
5091
5084
  className: "flex gap-x-0.5",
5092
5085
  children: [/* @__PURE__ */ jsx("button", {
5093
5086
  "aria-label": t.chrome.refresh,
@@ -5106,7 +5099,7 @@ function FileExplorer({ storages, onRefresh, showUserHierarchy = false, groups =
5106
5099
  onClick: collapseAll,
5107
5100
  children: /* @__PURE__ */ jsx(CollapseIcon, { className: "h-3.5 w-3.5" })
5108
5101
  })]
5109
- })]
5102
+ })
5110
5103
  }), /* @__PURE__ */ jsx(TreeView, {
5111
5104
  rootNodes,
5112
5105
  parentToChildrenMap,
@@ -1,7 +1,7 @@
1
1
  import { AngleRightIcon, EyeIcon, EyeOffIcon, SuccessCheckmark, TrashIcon } from "../icons.js";
2
- import { c as useStrings, s as useSlots } from "../chunks/Provider-jQCAN3NN.js";
2
+ import { c as useStrings, s as useSlots } from "../chunks/Provider-BIL5347a.js";
3
3
  import { n as TOOLTIP_ID, r as TooltipInfo } from "../chunks/Tooltip-WgbiC_nd.js";
4
- import { a as UncontrolledCollapsiblePanel, c as Dropdown, f as isCategory, n as SectionHeader, o as MultiSelectDropdown, r as ControlledCollapsiblePanel, s as CustomListbox, t as SwitchToggle } from "../chunks/SwitchToggle-D0ud8cd5.js";
4
+ import { a as UncontrolledCollapsiblePanel, c as Dropdown, f as isCategory, n as SectionHeader, o as MultiSelectDropdown, r as ControlledCollapsiblePanel, s as CustomListbox, t as SwitchToggle } from "../chunks/SwitchToggle-DiBXEP12.js";
5
5
  import { t as Loader } from "../chunks/Loader-BXoXTZGc.js";
6
6
  import { n as StatusDot } from "../chunks/StatusBadge-DXp4zkSd.js";
7
7
  import { n as Table } from "../chunks/Table-ByziK93x.js";
package/dist/index.d.ts CHANGED
@@ -45,3 +45,5 @@ export { default as SettingsCard } from './components/SettingsCard.js';
45
45
  export { default as SettingsGroup } from './components/SettingsGroup.js';
46
46
  export { SettingRow, SettingSection } from './components/SettingRow.js';
47
47
  export { SettingModeOption } from './components/SettingModeOption.js';
48
+ export { BreadcrumbProvider, useBreadcrumb, useClearBreadcrumbs, useHideBreadcrumbs, useSetBreadcrumbs, type IBreadcrumbItem, } from './components/Breadcrumbs.js';
49
+ export { BreadcrumbsActionButton, BreadcrumbsRightAction, BreadcrumbsTitleAction, HeaderActionMenu, HeaderAddButton, HeaderEditButton, HeaderRowMenu, PageHeader, type PageHeaderBreadcrumb, type PageHeaderCrumb, } from './components/PageHeader.js';
package/dist/index.js CHANGED
@@ -1,11 +1,12 @@
1
1
  import { DEFAULT_PRESET, THEME_PRESETS, THEME_TOKENS, applyTheme, contrastRatio, deriveTheme, isDarkColor } from "./theme/index.js";
2
2
  import { AlertIcon, AngleRightIcon, EyeIcon, EyeOffIcon, FilterIcon, LoaderIcon, SortDownIcon, SortUnsortedIcon, SortUpIcon } from "./icons.js";
3
- import { a as CreateModalSwitch, c as ConfirmModal, d as primaryButtonClasses, f as Markdown, h as Callout, i as CreateModalSelect, l as dangerButtonClasses, m as CopyToClipboard, n as CreateModalAutocompleteField, o as CreateModalTextarea, p as CopyCodeBlock, r as CreateModalField, s as AddMenu, t as CreateModal, u as ghostButtonClasses } from "./chunks/CreateModal-6zZZHxCI.js";
4
- import { a as useProvisionCorsRules, c as useStrings, i as useNotify, l as useWorkflowJsonResolver, n as useLink, o as useRunFile, r as useNavigation, s as useSlots, t as UIProvider } from "./chunks/Provider-jQCAN3NN.js";
3
+ import { a as CreateModalSwitch, c as dangerButtonClasses, d as Markdown, f as CopyCodeBlock, i as CreateModalSelect, l as ghostButtonClasses, m as Callout, n as CreateModalAutocompleteField, o as CreateModalTextarea, p as CopyToClipboard, r as CreateModalField, s as ConfirmModal, t as CreateModal, u as primaryButtonClasses } from "./chunks/CreateModal-DEvWkdFl.js";
4
+ import { a as useProvisionCorsRules, c as useStrings, i as useNotify, l as useWorkflowJsonResolver, n as useLink, o as useRunFile, r as useNavigation, s as useSlots, t as UIProvider } from "./chunks/Provider-BIL5347a.js";
5
5
  import { i as formatTooltipContent, n as TOOLTIP_ID, r as TooltipInfo, t as GlobalTooltip } from "./chunks/Tooltip-WgbiC_nd.js";
6
- import { a as UncontrolledCollapsiblePanel, c as Dropdown, d as flattenOptions, f as isCategory, i as MaybeCollapsible, l as DropdownCaret, n as SectionHeader, o as MultiSelectDropdown, p as isOption, r as ControlledCollapsiblePanel, s as CustomListbox, t as SwitchToggle, u as filterOption } from "./chunks/SwitchToggle-D0ud8cd5.js";
6
+ import { a as UncontrolledCollapsiblePanel, c as Dropdown, d as flattenOptions, f as isCategory, i as MaybeCollapsible, l as DropdownCaret, n as SectionHeader, o as MultiSelectDropdown, p as isOption, r as ControlledCollapsiblePanel, s as CustomListbox, t as SwitchToggle, u as filterOption } from "./chunks/SwitchToggle-DiBXEP12.js";
7
7
  import { t as Loader } from "./chunks/Loader-BXoXTZGc.js";
8
8
  import { n as modalPanelClasses, t as BareModal } from "./chunks/BareModal-DBa84JZO.js";
9
+ import { S as AddMenu, _ as BreadcrumbProvider, a as HeaderAddButton, b as useHideBreadcrumbs, c as PageHeader, i as HeaderActionMenu, n as BreadcrumbsRightAction, o as HeaderEditButton, r as BreadcrumbsTitleAction, s as HeaderRowMenu, t as BreadcrumbsActionButton, v as useBreadcrumb, x as useSetBreadcrumbs, y as useClearBreadcrumbs } from "./chunks/PageHeader-CSo3LVId.js";
9
10
  import { t as useCssIsDark } from "./chunks/useCssIsDark-DHr05dG2.js";
10
11
  import { t as Indicator } from "./chunks/Indicator-hBSIxOPK.js";
11
12
  import { t as SwitchToggleSmall } from "./chunks/SwitchToggleSmall-FcsaYSTs.js";
@@ -188,7 +189,7 @@ function MethodButton({ icon, label, description, href, className = "", ...props
188
189
  //#region src/components/Card.tsx
189
190
  function Card({ children, className = "", wide, compact, interactive, authShadow }) {
190
191
  return /* @__PURE__ */ jsx("div", {
191
- className: cx("w-full bg-[var(--theme-panel-bg)] backdrop-blur-xl border border-[var(--theme-border)] rounded-2xl", authShadow ? "shadow-[0_25px_80px_-20px_rgba(0,0,0,0.4),0_10px_30px_-10px_rgba(0,0,0,0.25)]" : "shadow-md", wide && "max-w-[560px] p-8", compact && "max-w-[400px] p-6", !wide && !compact && "max-w-[520px] p-10", interactive && "ds-card-interactive cursor-pointer", className),
192
+ className: cx("w-full bg-[var(--theme-card-bg)] backdrop-blur-xl border border-[var(--theme-border)] rounded-2xl", authShadow ? "shadow-[var(--theme-auth-shadow)]" : "shadow-[var(--theme-shadow)]", wide && "max-w-[560px] p-8", compact && "max-w-[400px] p-6", !wide && !compact && "max-w-[520px] p-10", interactive && "ds-card-interactive cursor-pointer", className),
192
193
  children
193
194
  });
194
195
  }
@@ -535,4 +536,4 @@ function SettingModeOption({ name, checked, onSelect, label, description, isFirs
535
536
  });
536
537
  }
537
538
  //#endregion
538
- export { AddMenu, BareModal, Button, Callout, Card, CardHeader, CompactTable, ConfirmModal, ControlledCollapsiblePanel, CopyCodeBlock, CopyToClipboard, CreateModal, CreateModalAutocompleteField, CreateModalField, CreateModalSelect, CreateModalSwitch, CreateModalTextarea, CustomListbox, DEFAULT_PRESET, DescriptionList, DescriptionListItem, Dropdown, DropdownCaret, EmptyState, Filter, FilterPill, GlobalTooltip, IconButton, Indicator, Input, LetterBadge, Loader, Markdown, MaybeCollapsible, MethodButton, MultiSelectDropdown, Overview, Pagination, SectionHeader, SettingModeOption, SettingRow, SettingSection, SettingsCard, SettingsGroup, Sort, StatusBadge, StatusDot, SwitchToggle, SwitchToggleSmall, THEME_PRESETS, THEME_TOKENS, TOOLTIP_ID, Table, Textarea, Toggle, TooltipInfo, UIProvider, UncontrolledCollapsiblePanel, applyTheme, contrastRatio, dangerButtonClasses, deriveTheme, filterOption, flattenOptions, formatTooltipContent, ghostButtonClasses, inputClasses, isCategory, isDarkColor, isOption, modalPanelClasses, primaryButtonClasses, useCssIsDark, useNavigation, useNotify, useProvisionCorsRules, useRunFile, useSlots, useStrings, useWorkflowJsonResolver };
539
+ export { AddMenu, BareModal, BreadcrumbProvider, BreadcrumbsActionButton, BreadcrumbsRightAction, BreadcrumbsTitleAction, Button, Callout, Card, CardHeader, CompactTable, ConfirmModal, ControlledCollapsiblePanel, CopyCodeBlock, CopyToClipboard, CreateModal, CreateModalAutocompleteField, CreateModalField, CreateModalSelect, CreateModalSwitch, CreateModalTextarea, CustomListbox, DEFAULT_PRESET, DescriptionList, DescriptionListItem, Dropdown, DropdownCaret, EmptyState, Filter, FilterPill, GlobalTooltip, HeaderActionMenu, HeaderAddButton, HeaderEditButton, HeaderRowMenu, IconButton, Indicator, Input, LetterBadge, Loader, Markdown, MaybeCollapsible, MethodButton, MultiSelectDropdown, Overview, PageHeader, Pagination, SectionHeader, SettingModeOption, SettingRow, SettingSection, SettingsCard, SettingsGroup, Sort, StatusBadge, StatusDot, SwitchToggle, SwitchToggleSmall, THEME_PRESETS, THEME_TOKENS, TOOLTIP_ID, Table, Textarea, Toggle, TooltipInfo, UIProvider, UncontrolledCollapsiblePanel, applyTheme, contrastRatio, dangerButtonClasses, deriveTheme, filterOption, flattenOptions, formatTooltipContent, ghostButtonClasses, inputClasses, isCategory, isDarkColor, isOption, modalPanelClasses, primaryButtonClasses, useBreadcrumb, useClearBreadcrumbs, useCssIsDark, useHideBreadcrumbs, useNavigation, useNotify, useProvisionCorsRules, useRunFile, useSetBreadcrumbs, useSlots, useStrings, useWorkflowJsonResolver };
@@ -0,0 +1,38 @@
1
+ export interface ToolbarAction {
2
+ key: string;
3
+ label: string;
4
+ icon: React.ComponentType<{
5
+ className?: string;
6
+ }>;
7
+ iconClassName?: string;
8
+ onClick?: () => void;
9
+ href?: string;
10
+ disabled?: boolean;
11
+ enabledTooltip?: string;
12
+ disabledTooltip?: string;
13
+ hidden?: boolean;
14
+ }
15
+ /** A pre-rendered element (e.g. a button component that owns its modal). */
16
+ interface ToolbarElement {
17
+ key: string;
18
+ element: React.ReactNode;
19
+ hidden?: boolean;
20
+ }
21
+ export type ToolbarItem = ToolbarAction | ToolbarElement;
22
+ export declare function ToolbarButton({ action }: {
23
+ action: ToolbarAction;
24
+ }): import("react").JSX.Element;
25
+ /** Pins a detail-page toolbar just below the sticky breadcrumb strip (top-10 matches the strip's 40px height). */
26
+ export declare const stickyToolbarClasses = "sticky top-10 z-10 bg-(--theme-app-bg)";
27
+ /** Pins a detail-page tabs row under the pinned toolbar (top-22 = 40px strip + 48px toolbar block). */
28
+ export declare const stickyTabsClasses = "sticky top-22 z-10 bg-(--theme-app-bg)";
29
+ /** Pins a detail-page tabs row directly under the breadcrumb strip when the page has no pinned toolbar (top-10 = the strip's height). */
30
+ export declare const stickyTabsUnderHeaderClasses = "sticky top-10 z-10 bg-(--theme-app-bg)";
31
+ /** Action groups left, secondary actions right (collapsing into a `…` menu). */
32
+ export declare function ActionToolbar({ groups, right, sticky, }: {
33
+ groups: ToolbarItem[][];
34
+ right?: ToolbarItem[];
35
+ /** Pin below the breadcrumb strip while the page scrolls. Requires the toolbar's parent to span the page content. */
36
+ sticky?: boolean;
37
+ }): import("react").JSX.Element;
38
+ export {};
@@ -0,0 +1,63 @@
1
+ import type { MouseEvent as ReactMouseEvent, ReactNode } from 'react';
2
+ import { type PageHeaderBreadcrumb } from '../components/PageHeader.js';
3
+ import type { ListView, ListViewChrome } from './listView.js';
4
+ import { type OpenMenu, type RowMenuItem } from './RowContextMenu.js';
5
+ /** Negative offsets (admin/org) cancel the shell's pt-4 so rows don't peek through the gap above the pinned header. */
6
+ declare const SECTION_STICKY_TOP: {
7
+ readonly main: 'top-0';
8
+ readonly kubernetes: 'top-0';
9
+ readonly admin: '-top-4';
10
+ readonly org: '-top-4';
11
+ };
12
+ export type ListSection = keyof typeof SECTION_STICKY_TOP;
13
+ export declare function ListRowActionsProvider({ view, children, }: {
14
+ view?: ListViewChrome | undefined;
15
+ children: ReactNode;
16
+ }): import("react").JSX.Element;
17
+ export interface ListPageProps {
18
+ section?: ListSection;
19
+ /** Force edge-to-edge negative margin for a main-shell page nested under a padded route layout. */
20
+ shellPadded?: boolean;
21
+ breadcrumbs?: PageHeaderBreadcrumb[] | undefined;
22
+ title?: ReactNode;
23
+ titleAction?: ReactNode;
24
+ actions?: ReactNode;
25
+ toolbar?: ReactNode;
26
+ /** Omit on pages without a list view — rows show all actions by default. */
27
+ view?: ListViewChrome | undefined;
28
+ children: ReactNode;
29
+ }
30
+ export declare function ListPage({ section, shellPadded, breadcrumbs, title, titleAction, actions, toolbar, view, children, }: ListPageProps): import("react").JSX.Element;
31
+ export interface PinnedRowAction {
32
+ key: string;
33
+ label: string;
34
+ icon: ReactNode;
35
+ onSelect: () => void;
36
+ disabled?: boolean;
37
+ }
38
+ export declare function ListRow({ href, items, goTo, openMenu, pinnedActions, selected, selectionActive, onRowSelect, leading, className, children, }: {
39
+ href: string | null;
40
+ items: RowMenuItem[];
41
+ goTo: (to: string) => void;
42
+ openMenu: OpenMenu;
43
+ pinnedActions?: PinnedRowAction[];
44
+ className?: string;
45
+ /** Tints the whole row to mark it as part of a multi-selection. */
46
+ selected?: boolean;
47
+ /** When multi-selection is active, plain row click toggles selection instead of navigating. */
48
+ selectionActive?: boolean;
49
+ onRowSelect?: (e: ReactMouseEvent) => void;
50
+ /** Non-column cell rendered before the column cells; kept out of `children` so they stay aligned with `columns`. */
51
+ leading?: ReactNode;
52
+ children: ReactNode;
53
+ }): import("react").JSX.Element;
54
+ /** Name column min-width is by role, not position, so a leading checkbox doesn't shift it. */
55
+ export declare function ListColumns<T>({ view }: {
56
+ view: ListView<T>;
57
+ }): import("react").JSX.Element;
58
+ export declare namespace ListColumns {
59
+ var isTableHeader: boolean;
60
+ }
61
+ /** Stable `goTo` for whole-row navigation (`rowNavProps`, `ListRow`). */
62
+ export declare function useListNavigate(): (to: string) => void;
63
+ export {};
@@ -109,5 +109,5 @@ export declare function copySubmenu({ name, nameLabel, email, username, uid, id,
109
109
  export declare function MoreButton({ onOpen, active, className, }: {
110
110
  onOpen: (x: number, y: number) => void;
111
111
  active?: boolean;
112
- className?: string;
112
+ className?: string | undefined;
113
113
  }): import("react").JSX.Element;
@@ -1,3 +1,5 @@
1
+ export { ActionToolbar, stickyTabsClasses, stickyTabsUnderHeaderClasses, stickyToolbarClasses, ToolbarButton, type ToolbarAction, type ToolbarItem, } from './ActionToolbar.js';
2
+ export { ListColumns, ListPage, ListRow, ListRowActionsProvider, useListNavigate, type ListPageProps, type ListSection, type PinnedRowAction, } from './ListPage.js';
1
3
  export { assembleRowMenu, copySubmenu, MoreButton, rowContextMenuProps, toolbarActionToRowAction, toRowMenuItem, useRowMenu, useRowMenuActive, type OpenMenu, type RowAction, type RowMenuItem, } from './RowContextMenu.js';
2
4
  export { actionsColumnWidth, GroupRow, ListActionsHeader, ListError, ListSkeleton, listTableFixedProps, listTableProps, NAME_MIN_WIDTH_PX, NameCell, RowSelectCheckbox, } from './ListTable.js';
3
5
  export { DEFAULT_ORDER, FAVORITE_ORDER, useListView, type ActionDef, type ColumnDef, type FilterFacet, type ListView, type ListViewChrome, type ListViewConfig, type OrderByOption, } from './listView.js';
@@ -1,2 +1,3 @@
1
- import { A as useRowMenu, C as listTableProps, D as rowContextMenuProps, E as copySubmenu, O as toRowMenuItem, S as listTableFixedProps, T as assembleRowMenu, _ as ListSkeleton, a as ListSearchControl, b as RowSelectCheckbox, c as ListFilterMenu, d as DEFAULT_ORDER, f as FAVORITE_ORDER, g as ListError, h as ListActionsHeader, i as ListCount, j as useRowMenuActive, k as toolbarActionToRowAction, l as listControlButtonClasses, m as GroupRow, n as useHoverCard, o as useListSearch, p as useListView, r as ListPager, s as ListDisplayMenu, t as HoverCardSurface, u as isTextEntryContext, v as NAME_MIN_WIDTH_PX, w as MoreButton, x as actionsColumnWidth, y as NameCell } from "../chunks/list-CvDWt0TC.js";
2
- export { DEFAULT_ORDER, FAVORITE_ORDER, GroupRow, HoverCardSurface, ListActionsHeader, ListCount, ListDisplayMenu, ListError, ListFilterMenu, ListPager, ListSearchControl, ListSkeleton, MoreButton, NAME_MIN_WIDTH_PX, NameCell, RowSelectCheckbox, actionsColumnWidth, assembleRowMenu, copySubmenu, isTextEntryContext, listControlButtonClasses, listTableFixedProps, listTableProps, rowContextMenuProps, toRowMenuItem, toolbarActionToRowAction, useHoverCard, useListSearch, useListView, useRowMenu, useRowMenuActive };
1
+ import { d as copySubmenu, f as rowContextMenuProps, g as useRowMenuActive, h as useRowMenu, l as MoreButton, m as toolbarActionToRowAction, p as toRowMenuItem, u as assembleRowMenu } from "../chunks/PageHeader-CSo3LVId.js";
2
+ import { A as ToolbarButton, C as NAME_MIN_WIDTH_PX, D as listTableFixedProps, E as actionsColumnWidth, M as stickyTabsUnderHeaderClasses, N as stickyToolbarClasses, O as listTableProps, S as ListSkeleton, T as RowSelectCheckbox, _ as ListRowActionsProvider, a as ListSearchControl, b as ListActionsHeader, c as ListFilterMenu, d as DEFAULT_ORDER, f as FAVORITE_ORDER, g as ListRow, h as ListPage, i as ListCount, j as stickyTabsClasses, k as ActionToolbar, l as listControlButtonClasses, m as ListColumns, n as useHoverCard, o as useListSearch, p as useListView, r as ListPager, s as ListDisplayMenu, t as HoverCardSurface, u as isTextEntryContext, v as useListNavigate, w as NameCell, x as ListError, y as GroupRow } from "../chunks/list-CgzqVlao.js";
3
+ export { ActionToolbar, DEFAULT_ORDER, FAVORITE_ORDER, GroupRow, HoverCardSurface, ListActionsHeader, ListColumns, ListCount, ListDisplayMenu, ListError, ListFilterMenu, ListPage, ListPager, ListRow, ListRowActionsProvider, ListSearchControl, ListSkeleton, MoreButton, NAME_MIN_WIDTH_PX, NameCell, RowSelectCheckbox, ToolbarButton, actionsColumnWidth, assembleRowMenu, copySubmenu, isTextEntryContext, listControlButtonClasses, listTableFixedProps, listTableProps, rowContextMenuProps, stickyTabsClasses, stickyTabsUnderHeaderClasses, stickyToolbarClasses, toRowMenuItem, toolbarActionToRowAction, useHoverCard, useListNavigate, useListSearch, useListView, useRowMenu, useRowMenuActive };
@@ -1,5 +1,5 @@
1
1
  import { ArrowDownIcon, ArrowUpIcon, CheckIcon, ChevronDownIcon, ChevronRightIcon, CopyIcon, DownloadIcon, ExpandIcon, ShrinkIcon, XIcon } from "../icons.js";
2
- import { c as useStrings, i as useNotify } from "../chunks/Provider-jQCAN3NN.js";
2
+ import { c as useStrings, i as useNotify } from "../chunks/Provider-BIL5347a.js";
3
3
  import cx from "classnames";
4
4
  import { Fragment, jsx, jsxs } from "react/jsx-runtime";
5
5
  import { Fragment as Fragment$1, memo, useCallback, useEffect, useMemo, useRef, useState } from "react";
@@ -19,6 +19,7 @@
19
19
  --theme-border: #d1d5db;
20
20
  --theme-element: #06354f;
21
21
  --theme-element-text: #ffffff;
22
+ --theme-element-hover: #053047;
22
23
  --theme-hover: #f3f4f6;
23
24
  --theme-hover-text: #000000;
24
25
  --theme-link: #428bca;
@@ -46,6 +47,7 @@
46
47
  --theme-shadow-sm: 0 1px 2px rgba(0, 0, 0, 0.04);
47
48
  --theme-shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.07), 0 2px 4px -2px rgba(0, 0, 0, 0.05);
48
49
  --theme-shadow-lg: 0 10px 15px -3px rgba(0, 0, 0, 0.08), 0 4px 6px -4px rgba(0, 0, 0, 0.04);
50
+ --theme-auth-shadow: 0 25px 80px -20px rgba(0, 0, 0, 0.2), 0 10px 30px -10px rgba(0, 0, 0, 0.1);
49
51
  }
50
52
 
51
53
  @utility theme-element {