@parallelworks/ui 0.4.0 → 0.5.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 (35) hide show
  1. package/dist/chunks/BareModal-DBa84JZO.js +80 -0
  2. package/dist/chunks/{CodePreviewEditor-B3688Fx4.js → CodePreviewEditor-CBtYRZi6.js} +2 -1
  3. package/dist/chunks/CreateModal-6zZZHxCI.js +595 -0
  4. package/dist/chunks/Loader-BXoXTZGc.js +47 -0
  5. package/dist/chunks/{Monaco-BEj--GTx.js → Monaco-CvFXoW3r.js} +3 -2
  6. package/dist/chunks/{Provider-uUHgWOWc.js → Provider-jQCAN3NN.js} +18 -0
  7. package/dist/chunks/{SwitchToggle-BqD0dE-L.js → SwitchToggle-D0ud8cd5.js} +1 -1
  8. package/dist/chunks/{Table-C5z6qWjM.js → Table-ByziK93x.js} +1 -1
  9. package/dist/chunks/{editor-CdQbKtYO.js → editor-CEXg6C8X.js} +5 -41
  10. package/dist/chunks/{list-D5f5Fq-O.js → list-CvDWt0TC.js} +2 -2
  11. package/dist/chunks/useCssIsDark-DHr05dG2.js +38 -0
  12. package/dist/components/AddMenu.d.ts +17 -0
  13. package/dist/components/BareModal.d.ts +17 -0
  14. package/dist/components/ConfirmModal.d.ts +17 -0
  15. package/dist/components/CreateModal.d.ts +92 -0
  16. package/dist/components/Loader.d.ts +2 -1
  17. package/dist/components/Provider.d.ts +14 -12
  18. package/dist/components/ghostButton.d.ts +4 -0
  19. package/dist/editor/index.d.ts +0 -1
  20. package/dist/editor/index.js +2 -2
  21. package/dist/file-explorer/index.js +23 -25
  22. package/dist/form/index.js +4 -4
  23. package/dist/index.d.ts +6 -1
  24. package/dist/index.js +8 -7
  25. package/dist/list/index.js +1 -1
  26. package/dist/logviewer/index.js +1 -1
  27. package/dist/styles/theme.css +21 -0
  28. package/dist/styles.css +1 -1
  29. package/dist/workflow/index.js +8 -8
  30. package/package.json +1 -1
  31. package/dist/chunks/Loader-DQiZ75fa.js +0 -25
  32. package/dist/chunks/Markdown-iFhq8Gb0.js +0 -101
  33. package/dist/chunks/Modal-sOUEwebV.js +0 -121
  34. package/dist/components/Modal.d.ts +0 -26
  35. /package/dist/{editor → components}/useCssIsDark.d.ts +0 -0
@@ -0,0 +1,47 @@
1
+ import { LoaderIcon } from "../icons.js";
2
+ import cx from "classnames";
3
+ import { jsx, jsxs } from "react/jsx-runtime";
4
+ //#region src/components/Loader.tsx
5
+ var RIPPLE_STAGGER_S = .22;
6
+ var LOGO_RINGS = [
7
+ "M24.89,55V32.14a7.25,7.25,0,1,1,7.25,7.25h-6",
8
+ "M17.27,58.12v-26A14.88,14.88,0,1,1,32.14,47H24.89",
9
+ "M9.25,52.35V32.14A22.9,22.9,0,1,1,32.14,55H24.89",
10
+ "M62.68,32.14A30.54,30.54,0,1,1,1.6,32.14,30.54,30.54,0,1,1,62.68,32.14"
11
+ ];
12
+ function Loader({ size = 48, text, textSize = 12, full = true, color = "", loaderStyle = {}, variant = "spinner" }) {
13
+ const loaderColor = color || "text-(--theme-element,#3b82f6)";
14
+ const dimension = typeof size === "number" ? `${size}px` : size;
15
+ return /* @__PURE__ */ jsxs("div", {
16
+ role: "status",
17
+ "aria-label": text || "Loading",
18
+ className: cx(full && "w-full", "flex flex-col flex-wrap justify-center items-center gap-y-1"),
19
+ children: [/* @__PURE__ */ jsx("div", {
20
+ className: cx("w-full flex justify-center items-center", loaderColor),
21
+ style: loaderStyle,
22
+ children: variant === "logo" ? /* @__PURE__ */ jsx("svg", {
23
+ viewBox: "0 0 64.29 64.29",
24
+ width: dimension,
25
+ height: dimension,
26
+ fill: "none",
27
+ stroke: "currentColor",
28
+ strokeWidth: 3.2,
29
+ "aria-hidden": "true",
30
+ children: LOGO_RINGS.map((d, i) => /* @__PURE__ */ jsx("path", {
31
+ d,
32
+ className: "logo-loader-ring",
33
+ style: { animationDelay: `${(i * RIPPLE_STAGGER_S).toFixed(2)}s` }
34
+ }, d))
35
+ }) : /* @__PURE__ */ jsx(LoaderIcon, {
36
+ className: "animate-spin",
37
+ style: { fontSize: dimension }
38
+ })
39
+ }), text && /* @__PURE__ */ jsx("div", {
40
+ className: "text-center italic",
41
+ style: { fontSize: `${textSize}px` },
42
+ children: text
43
+ })]
44
+ });
45
+ }
46
+ //#endregion
47
+ export { Loader as t };
@@ -1,5 +1,6 @@
1
- import { l as useWorkflowJsonResolver } from "./Provider-uUHgWOWc.js";
2
- import { i as getThemeName, n as setupMonacoWorkers, r as defineEditorThemes, t as useCssIsDark } from "./editor-CdQbKtYO.js";
1
+ import { l as useWorkflowJsonResolver } from "./Provider-jQCAN3NN.js";
2
+ import { t as useCssIsDark } from "./useCssIsDark-DHr05dG2.js";
3
+ import { n as defineEditorThemes, r as getThemeName, t as setupMonacoWorkers } from "./editor-CEXg6C8X.js";
3
4
  import cx from "classnames";
4
5
  import { jsx } from "react/jsx-runtime";
5
6
  import { useEffect, useRef } from "react";
@@ -28,6 +28,20 @@ var DEFAULTS = {
28
28
  },
29
29
  strings: {
30
30
  loading: "Loading…",
31
+ modal: {
32
+ cancel: "Cancel",
33
+ close: "Close",
34
+ create: "Create",
35
+ creating: "Creating…",
36
+ addDescription: "Add description…",
37
+ advanced: "Advanced",
38
+ favorite: "Favorite",
39
+ favorited: "Favorited",
40
+ favoriteHintOn: "Your item will be favorited when it's created",
41
+ favoriteHintOff: "Favorite your item when it's created",
42
+ filter: "Filter",
43
+ noOptions: "No options available"
44
+ },
31
45
  common: {
32
46
  copy: "Copy",
33
47
  copied: "Copied!",
@@ -386,6 +400,10 @@ function UIProvider({ notify, strings, navigation, data, slots, children }) {
386
400
  },
387
401
  strings: {
388
402
  loading: strings?.loading ?? DEFAULTS.strings.loading,
403
+ modal: {
404
+ ...DEFAULTS.strings.modal,
405
+ ...strings?.modal
406
+ },
389
407
  common: {
390
408
  ...DEFAULTS.strings.common,
391
409
  ...strings?.common
@@ -1,5 +1,5 @@
1
1
  import { AngleDownIcon, AngleRightIcon, CaretDownIcon } from "../icons.js";
2
- import { c as useStrings } from "./Provider-uUHgWOWc.js";
2
+ import { c as useStrings } from "./Provider-jQCAN3NN.js";
3
3
  import { n as TOOLTIP_ID } from "./Tooltip-WgbiC_nd.js";
4
4
  import cx from "classnames";
5
5
  import { Fragment, jsx, jsxs } from "react/jsx-runtime";
@@ -1,4 +1,4 @@
1
- import { t as Loader } from "./Loader-DQiZ75fa.js";
1
+ import { t as Loader } from "./Loader-BXoXTZGc.js";
2
2
  import cx from "classnames";
3
3
  import { jsx, jsxs } from "react/jsx-runtime";
4
4
  import React from "react";
@@ -1,15 +1,15 @@
1
1
  import { CheckIcon, CopyIcon, EyeIcon, EyeOffIcon } from "../icons.js";
2
- import { c as useStrings, i as useNotify } from "./Provider-uUHgWOWc.js";
3
- import { t as Loader } from "./Loader-DQiZ75fa.js";
2
+ import { c as useStrings, i as useNotify } from "./Provider-jQCAN3NN.js";
3
+ import { t as Loader } from "./Loader-BXoXTZGc.js";
4
4
  import { t as SwitchToggleSmall } from "./SwitchToggleSmall-FcsaYSTs.js";
5
5
  import { c as FieldWrapper, n as flattenGroups, r as impureSetValueFromPath } from "./lib-DTgL8klR.js";
6
6
  import cx from "classnames";
7
7
  import { jsx, jsxs } from "react/jsx-runtime";
8
- import { Suspense, lazy, useEffect, useMemo, useRef, useState } from "react";
8
+ import { Suspense, lazy, useMemo, useRef, useState } from "react";
9
9
  import { convertToDynamicForm, parseStringsOfObj, parseStringsOfObjReady } from "@parallelworks/workflow-parser";
10
10
  import { useField, useFormikContext } from "formik";
11
11
  //#region src/editor/Editor.tsx
12
- var MonacoEditor = lazy(() => import("./Monaco-BEj--GTx.js"));
12
+ var MonacoEditor = lazy(() => import("./Monaco-CvFXoW3r.js"));
13
13
  function Editor({ ...props }) {
14
14
  return /* @__PURE__ */ jsx(Suspense, {
15
15
  fallback: /* @__PURE__ */ jsx(Loader, { text: "Loading editor..." }),
@@ -333,40 +333,4 @@ function setupMonacoWorkers() {
333
333
  window.MonacoEnvironment = monacoEnvironment;
334
334
  }
335
335
  //#endregion
336
- //#region src/editor/useCssIsDark.ts
337
- function readIsDark() {
338
- const scheme = getComputedStyle(document.documentElement).colorScheme;
339
- const dark = scheme.includes("dark");
340
- if (dark !== scheme.includes("light")) return dark;
341
- if (typeof window.matchMedia !== "function") return false;
342
- return window.matchMedia("(prefers-color-scheme: dark)").matches;
343
- }
344
- /**
345
- * Follows the host's CSS color-scheme, the same signal the log viewer's
346
- * light-dark() palette uses — no provider API involved. For the rare concrete
347
- * pick (editor themes, image variants) the tokens cannot express.
348
- */
349
- function useCssIsDark() {
350
- const [isDark, setIsDark] = useState(readIsDark);
351
- useEffect(() => {
352
- const update = () => setIsDark(readIsDark());
353
- const media = typeof window.matchMedia === "function" ? window.matchMedia("(prefers-color-scheme: dark)") : void 0;
354
- media?.addEventListener("change", update);
355
- const observer = new MutationObserver(update);
356
- observer.observe(document.documentElement, {
357
- attributes: true,
358
- attributeFilter: [
359
- "style",
360
- "class",
361
- "data-theme"
362
- ]
363
- });
364
- return () => {
365
- media?.removeEventListener("change", update);
366
- observer.disconnect();
367
- };
368
- }, []);
369
- return isDark;
370
- }
371
- //#endregion
372
- export { FormCodePanel as a, getThemeName as i, setupMonacoWorkers as n, EditorField as o, defineEditorThemes as r, Editor as s, useCssIsDark as t };
336
+ export { EditorField as a, FormCodePanel as i, defineEditorThemes as n, Editor as o, getThemeName as r, setupMonacoWorkers as t };
@@ -1,7 +1,7 @@
1
1
  import { CheckIcon, ChevronDownIcon, ChevronLeftIcon, ChevronRightIcon, ChevronUpIcon, ClipboardIcon, CopyIcon, DisplayIcon, ErrorIcon, FilterIcon, IdCardIcon, KeyIcon, LinkIcon, MailIcon, MoreIcon, SearchIcon, UserIcon, XIcon } from "../icons.js";
2
- import { c as useStrings, i as useNotify, n as useLink } from "./Provider-uUHgWOWc.js";
2
+ import { c as useStrings, i as useNotify, n as useLink } from "./Provider-jQCAN3NN.js";
3
3
  import { n as TOOLTIP_ID, r as TooltipInfo } from "./Tooltip-WgbiC_nd.js";
4
- import { n as Table } from "./Table-C5z6qWjM.js";
4
+ import { n as Table } from "./Table-ByziK93x.js";
5
5
  import cx from "classnames";
6
6
  import { Fragment, jsx, jsxs } from "react/jsx-runtime";
7
7
  import { useCallback, useEffect, useLayoutEffect, useMemo, useRef, useState } from "react";
@@ -0,0 +1,38 @@
1
+ import { useEffect, useState } from "react";
2
+ //#region src/components/useCssIsDark.ts
3
+ function readIsDark() {
4
+ const scheme = getComputedStyle(document.documentElement).colorScheme;
5
+ const dark = scheme.includes("dark");
6
+ if (dark !== scheme.includes("light")) return dark;
7
+ if (typeof window.matchMedia !== "function") return false;
8
+ return window.matchMedia("(prefers-color-scheme: dark)").matches;
9
+ }
10
+ /**
11
+ * Follows the host's CSS color-scheme, the same signal the log viewer's
12
+ * light-dark() palette uses — no provider API involved. For the rare concrete
13
+ * pick (editor themes, image variants) the tokens cannot express.
14
+ */
15
+ function useCssIsDark() {
16
+ const [isDark, setIsDark] = useState(readIsDark);
17
+ useEffect(() => {
18
+ const update = () => setIsDark(readIsDark());
19
+ const media = typeof window.matchMedia === "function" ? window.matchMedia("(prefers-color-scheme: dark)") : void 0;
20
+ media?.addEventListener("change", update);
21
+ const observer = new MutationObserver(update);
22
+ observer.observe(document.documentElement, {
23
+ attributes: true,
24
+ attributeFilter: [
25
+ "style",
26
+ "class",
27
+ "data-theme"
28
+ ]
29
+ });
30
+ return () => {
31
+ media?.removeEventListener("change", update);
32
+ observer.disconnect();
33
+ };
34
+ }, []);
35
+ return isDark;
36
+ }
37
+ //#endregion
38
+ export { useCssIsDark as t };
@@ -0,0 +1,17 @@
1
+ import type { ReactNode } from 'react';
2
+ export interface HeaderAddMenuItem {
3
+ label: string;
4
+ icon?: ReactNode;
5
+ to?: string;
6
+ onSelect?: () => void;
7
+ disabled?: boolean;
8
+ separatorAbove?: boolean;
9
+ }
10
+ export declare function AddMenu({ items, label, buttonClassName, zClassName, children, }: {
11
+ items: HeaderAddMenuItem[];
12
+ label: string;
13
+ buttonClassName?: string;
14
+ /** Raise above modals when needed (e.g. z-[9999]). */
15
+ zClassName?: string;
16
+ children: ReactNode;
17
+ }): import("react").JSX.Element;
@@ -0,0 +1,17 @@
1
+ import type { KeyboardEvent as ReactKeyboardEvent, MouseEvent as ReactMouseEvent, ReactNode } from 'react';
2
+ /** Omit when the content supplies its own panel styling. */
3
+ export declare const modalPanelClasses = "rounded-xl border border-(--theme-border) bg-(--theme-app-bg) text-(--theme-app) shadow-2xl";
4
+ export declare function BareModal({ open, onClose, ariaLabel, className, onPanelKeyDown, onPanelMouseDown, align, preventClose, children, }: {
5
+ open: boolean;
6
+ onClose: () => void;
7
+ ariaLabel?: string;
8
+ className?: string;
9
+ onPanelKeyDown?: (e: ReactKeyboardEvent<HTMLDivElement>) => void;
10
+ onPanelMouseDown?: (e: ReactMouseEvent<HTMLDivElement>) => void;
11
+ /** Vertical placement of the panel. Defaults to the ds top-anchored position. */
12
+ align?: 'top' | 'center';
13
+ /** Block the accidental-dismiss paths (backdrop click, Escape) so typed
14
+ * input isn't lost. The explicit close controls still work. */
15
+ preventClose?: boolean;
16
+ children: ReactNode;
17
+ }): import("react").ReactPortal | null;
@@ -0,0 +1,17 @@
1
+ import type { ReactNode } from 'react';
2
+ export declare function ConfirmModal({ open, onClose, title, description, children, confirmLabel, onConfirm, confirmDisabled, destructive, align, cancelLabel, closeOnConfirm, }: {
3
+ open: boolean;
4
+ onClose: () => void;
5
+ title: string;
6
+ description?: ReactNode;
7
+ children?: ReactNode;
8
+ confirmLabel: string;
9
+ /** An async handler keeps both buttons disabled until it settles. */
10
+ onConfirm: () => void | Promise<unknown>;
11
+ confirmDisabled?: boolean;
12
+ destructive?: boolean;
13
+ align?: 'top' | 'center';
14
+ cancelLabel?: string;
15
+ /** When false, the dialog stays open after a successful confirm. */
16
+ closeOnConfirm?: boolean;
17
+ }): import("react").JSX.Element;
@@ -0,0 +1,92 @@
1
+ import type { InputHTMLAttributes, ReactNode, TextareaHTMLAttributes } from 'react';
2
+ import { type HeaderAddMenuItem } from './AddMenu.js';
3
+ interface CreateModalProps {
4
+ open: boolean;
5
+ onClose: () => void;
6
+ typeIcon?: ReactNode;
7
+ typeLabel: string;
8
+ /** Makes the type chip a dropdown to switch between sibling form types. */
9
+ typeMenu?: HeaderAddMenuItem[];
10
+ namePlaceholder: string;
11
+ hideName?: boolean;
12
+ initialName?: string;
13
+ showDescription?: boolean;
14
+ descriptionPlaceholder?: string;
15
+ submitLabel?: string;
16
+ submittingLabel?: string;
17
+ validateName?: (name: string) => string | null;
18
+ /** Normalize the name as the user types (e.g. strip disallowed characters). */
19
+ sanitizeName?: (name: string) => string;
20
+ nameHint?: (name: string) => ReactNode;
21
+ children?: ReactNode;
22
+ properties?: ReactNode;
23
+ advanced?: ReactNode;
24
+ submitDisabled?: boolean;
25
+ /** Hide the primary submit button and label the dismiss button "Close". */
26
+ hideSubmit?: boolean;
27
+ nameOptional?: boolean;
28
+ onNameChange?: (name: string) => void;
29
+ /** Additional unsaved input in `children`/`properties` that should block an
30
+ * accidental dismiss (name/description/favorite are already tracked). */
31
+ dirty?: boolean;
32
+ /** Show a favorite toggle in the footer. */
33
+ showFavorite?: boolean;
34
+ /** Resolves true to close the modal, false to keep it open (e.g. on error). */
35
+ onSubmit: (name: string, description: string, favorite: boolean) => Promise<boolean>;
36
+ }
37
+ /** Submits on Enter in the name field or ⌘/Ctrl+Enter from anywhere in the panel. */
38
+ export declare function CreateModal({ open, onClose, typeIcon, typeLabel, typeMenu, namePlaceholder, hideName, initialName, showDescription, descriptionPlaceholder, submitLabel, submittingLabel, validateName, sanitizeName, nameHint, children, properties, advanced, submitDisabled, hideSubmit, nameOptional, onNameChange, dirty, showFavorite, onSubmit, }: CreateModalProps): import("react").JSX.Element;
39
+ /** Labeled single-line input row for the dialog's extra fields. */
40
+ export declare function CreateModalField({ label, tooltip, ...props }: InputHTMLAttributes<HTMLInputElement> & {
41
+ label: string;
42
+ /** Help text surfaced via an info icon next to the label. */
43
+ tooltip?: string;
44
+ }): import("react").JSX.Element;
45
+ /** Labeled multi-line field for credential blobs (JSON keys, PEM keys). */
46
+ export declare function CreateModalTextarea({ label, tooltip, rows, ...props }: TextareaHTMLAttributes<HTMLTextAreaElement> & {
47
+ label: string;
48
+ /** Help text surfaced via an info icon next to the label. */
49
+ tooltip?: string;
50
+ }): import("react").JSX.Element;
51
+ /** Labeled input row with typeahead suggestions; free-form values allowed. */
52
+ export declare function CreateModalAutocompleteField({ label, tooltip, value, onChange, options, placeholder, }: {
53
+ label: string;
54
+ /** Help text surfaced via an info icon next to the label. */
55
+ tooltip?: string;
56
+ value: string;
57
+ onChange: (value: string) => void;
58
+ options: string[];
59
+ placeholder?: string;
60
+ }): import("react").JSX.Element;
61
+ /** Compact property pill with an on/off switch. */
62
+ export declare function CreateModalSwitch({ label, checked, onChange, tooltip, }: {
63
+ label: string;
64
+ checked: boolean;
65
+ onChange: (checked: boolean) => void;
66
+ /** Help text surfaced on hover (explains what the toggle does). */
67
+ tooltip?: string;
68
+ }): import("react").JSX.Element;
69
+ export interface CreateModalSelectOption {
70
+ label: string;
71
+ value: string;
72
+ /** Small leading icon (e.g. the resource's provider icon). */
73
+ icon?: ReactNode;
74
+ /** Category header to group this option under in the dropdown. */
75
+ group?: string;
76
+ }
77
+ /** Compact property pill with a dropdown of options. Options may carry leading
78
+ * icons and group headers (e.g. Clusters vs Kubernetes). */
79
+ export declare function CreateModalSelect({ label, icon, value, options, onChange, disabled, disabledHint, tooltip, }: {
80
+ label: string;
81
+ icon?: ReactNode;
82
+ value?: string;
83
+ options: CreateModalSelectOption[];
84
+ onChange: (value: string) => void;
85
+ /** Gray the pill out (e.g. while a prerequisite pill is unset). */
86
+ disabled?: boolean;
87
+ /** Shown as the pill's tooltip while disabled (e.g. the prerequisite). */
88
+ disabledHint?: string;
89
+ /** Help text surfaced on hover (explains what the pill selects). */
90
+ tooltip?: string;
91
+ }): import("react").JSX.Element;
92
+ export {};
@@ -5,6 +5,7 @@ interface LoaderProps {
5
5
  color?: string;
6
6
  full?: boolean;
7
7
  loaderStyle?: React.CSSProperties;
8
+ variant?: 'spinner' | 'logo';
8
9
  }
9
- export default function Loader({ size, text, textSize, full, color, loaderStyle, }: LoaderProps): import("react").JSX.Element;
10
+ export default function Loader({ size, text, textSize, full, color, loaderStyle, variant, }: LoaderProps): import("react").JSX.Element;
10
11
  export {};
@@ -29,6 +29,20 @@ export interface UINotify {
29
29
  }
30
30
  export interface UIStrings {
31
31
  loading: string;
32
+ modal: {
33
+ cancel: string;
34
+ close: string;
35
+ create: string;
36
+ creating: string;
37
+ addDescription: string;
38
+ advanced: string;
39
+ favorite: string;
40
+ favorited: string;
41
+ favoriteHintOn: string;
42
+ favoriteHintOff: string;
43
+ filter: string;
44
+ noOptions: string;
45
+ };
32
46
  common: {
33
47
  copy: string;
34
48
  copied: string;
@@ -422,18 +436,6 @@ export interface UISlots {
422
436
  storage: unknown;
423
437
  groups?: unknown;
424
438
  }) => ReactNode;
425
- /** The storage explorer's create-folder dialog; absent hides the affordance. */
426
- createFolderDialog?: (args: {
427
- open: boolean;
428
- onClose: () => void;
429
- typeIcon?: ReactNode;
430
- typeLabel: string;
431
- namePlaceholder: string;
432
- submitLabel: string;
433
- submittingLabel: string;
434
- validateName: (name: string) => string | null;
435
- onSubmit: (name: string) => Promise<boolean>;
436
- }) => ReactNode;
437
439
  }
438
440
  export interface UIProviderValue {
439
441
  notify: UINotify;
@@ -0,0 +1,4 @@
1
+ export declare const ghostButtonClasses = "inline-flex cursor-pointer items-center gap-1.5 h-8 px-3 rounded-md text-sm text-(--theme-muted-text-color) hover:text-(--theme-app) hover:bg-(--theme-muted-panel-bg) transition-colors";
2
+ export declare const primaryButtonClasses = "inline-flex cursor-pointer items-center gap-1.5 h-7 px-2.5 rounded-md text-[12.5px] font-medium bg-(--theme-element) text-(--theme-element-text) hover:opacity-90 transition-opacity";
3
+ /** Filled destructive button for confirming irreversible actions in ds modals. */
4
+ export declare const dangerButtonClasses = "inline-flex cursor-pointer items-center gap-1.5 h-7 px-2.5 rounded-md text-[12.5px] font-medium bg-red-600 text-white hover:bg-red-700 transition-colors";
@@ -4,4 +4,3 @@ export { default as FormCodePanel } from './FormCodePanel.js';
4
4
  export type { EditorMarketplaceItem, EditorWorkflowItem, IEditorProps, ISchemaError, } from './Monaco.js';
5
5
  export { defineEditorThemes, getThemeName } from './themes.js';
6
6
  export { setupMonacoWorkers } from './workers.js';
7
- export { useCssIsDark } from './useCssIsDark.js';
@@ -1,2 +1,2 @@
1
- import { a as FormCodePanel, i as getThemeName, n as setupMonacoWorkers, o as EditorField, r as defineEditorThemes, s as Editor, t as useCssIsDark } from "../chunks/editor-CdQbKtYO.js";
2
- export { Editor, EditorField, FormCodePanel, defineEditorThemes, getThemeName, setupMonacoWorkers, useCssIsDark };
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";
2
+ export { Editor, EditorField, FormCodePanel, defineEditorThemes, getThemeName, setupMonacoWorkers };
@@ -1,12 +1,11 @@
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 { i as Callout, n as CopyCodeBlock, r as CopyToClipboard, t as Markdown } from "../chunks/Markdown-iFhq8Gb0.js";
3
- import { a as useProvisionCorsRules, c as useStrings, i as useNotify, s as useSlots } from "../chunks/Provider-uUHgWOWc.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";
4
4
  import { n as TOOLTIP_ID, r as TooltipInfo } from "../chunks/Tooltip-WgbiC_nd.js";
5
- import { t as Loader } from "../chunks/Loader-DQiZ75fa.js";
6
- import { t as Modal } from "../chunks/Modal-sOUEwebV.js";
5
+ import { t as Loader } from "../chunks/Loader-BXoXTZGc.js";
7
6
  import { t as StatusBadge } from "../chunks/StatusBadge-DXp4zkSd.js";
8
- import { n as Table } from "../chunks/Table-C5z6qWjM.js";
9
- 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-D5f5Fq-O.js";
7
+ 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";
10
9
  import cx from "classnames";
11
10
  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";
@@ -2519,7 +2518,7 @@ function useObjectText(url, { enabled, maxBytes, maxLines, knownSize, cacheKey,
2519
2518
  }
2520
2519
  //#endregion
2521
2520
  //#region src/file-explorer/FilePreview/Viewer.tsx
2522
- var CodePreviewEditor = lazy(() => import("../chunks/CodePreviewEditor-B3688Fx4.js"));
2521
+ var CodePreviewEditor = lazy(() => import("../chunks/CodePreviewEditor-CBtYRZi6.js"));
2523
2522
  var PREVIEW_MARKDOWN_CONTROLS = {
2524
2523
  table: { fullscreen: false },
2525
2524
  mermaid: { fullscreen: false }
@@ -5499,7 +5498,7 @@ function FileExplorer({ storages, onRefresh, showUserHierarchy = false, groups =
5499
5498
  onDownload: downloadNode,
5500
5499
  onCopyUri: copyNodeUri
5501
5500
  }),
5502
- slots.createFolderDialog?.({
5501
+ /* @__PURE__ */ jsx(CreateModal, {
5503
5502
  open: !!createFolderTarget,
5504
5503
  onClose: () => setCreateFolderTarget(null),
5505
5504
  typeIcon: /* @__PURE__ */ jsx(FolderIcon, { className: "w-3 h-3" }),
@@ -5514,19 +5513,18 @@ function FileExplorer({ storages, onRefresh, showUserHierarchy = false, groups =
5514
5513
  className: "absolute inset-0 bg-(--theme-app-bg)/75 backdrop-blur-[2px] transition-opacity flex items-center justify-center z-50",
5515
5514
  children: /* @__PURE__ */ jsx(Loader, { full: true })
5516
5515
  }),
5517
- /* @__PURE__ */ jsx(Modal, {
5518
- isOpen: uploadModalOpen && !!pendingUpload,
5519
- close: () => {
5516
+ /* @__PURE__ */ jsx(ConfirmModal, {
5517
+ open: uploadModalOpen && !!pendingUpload,
5518
+ onClose: () => {
5520
5519
  setUploadModalOpen(false);
5521
5520
  setPendingUpload(null);
5522
5521
  },
5523
- type: "info",
5522
+ align: "center",
5524
5523
  title: t.confirmUpload.title,
5525
- text: t.confirmUpload.text(pendingUpload?.targetPath || t.confirmUpload.defaultPath),
5526
- actionLabel: t.confirmUpload.confirm,
5527
- action: handleUpload,
5528
- disableAction: pendingUpload ? isUploadSizeExceeded(pendingUpload.totalSize) : false,
5529
- fitWidth: true,
5524
+ description: t.confirmUpload.text(pendingUpload?.targetPath || t.confirmUpload.defaultPath),
5525
+ confirmLabel: t.confirmUpload.confirm,
5526
+ onConfirm: handleUpload,
5527
+ confirmDisabled: pendingUpload ? isUploadSizeExceeded(pendingUpload.totalSize) : false,
5530
5528
  children: /* @__PURE__ */ jsxs("div", {
5531
5529
  className: "text-sm flex flex-col gap-2 mt-2 text-left",
5532
5530
  children: [
@@ -5575,19 +5573,19 @@ function FileExplorer({ storages, onRefresh, showUserHierarchy = false, groups =
5575
5573
  ]
5576
5574
  })
5577
5575
  }),
5578
- /* @__PURE__ */ jsx(Modal, {
5579
- isOpen: deleteModalOpen && !!pendingDelete,
5580
- close: () => {
5576
+ /* @__PURE__ */ jsx(ConfirmModal, {
5577
+ open: deleteModalOpen && !!pendingDelete,
5578
+ onClose: () => {
5581
5579
  setDeleteModalOpen(false);
5582
5580
  setPendingDelete(null);
5583
5581
  setCheckedItems(/* @__PURE__ */ new Set());
5584
5582
  },
5585
- type: "destructive",
5583
+ align: "center",
5584
+ destructive: true,
5586
5585
  title: t.confirmDelete.title,
5587
- text: t.confirmDelete.text,
5588
- actionLabel: t.confirmDelete.action,
5589
- action: handleDelete,
5590
- fitWidth: true,
5586
+ description: t.confirmDelete.text,
5587
+ confirmLabel: t.confirmDelete.action,
5588
+ onConfirm: handleDelete,
5591
5589
  children: /* @__PURE__ */ jsx("div", {
5592
5590
  className: "text-sm flex flex-col gap-2 mt-2 text-left",
5593
5591
  children: /* @__PURE__ */ jsx("ul", {
@@ -1,10 +1,10 @@
1
1
  import { AngleRightIcon, EyeIcon, EyeOffIcon, SuccessCheckmark, TrashIcon } from "../icons.js";
2
- import { c as useStrings, s as useSlots } from "../chunks/Provider-uUHgWOWc.js";
2
+ import { c as useStrings, s as useSlots } from "../chunks/Provider-jQCAN3NN.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-BqD0dE-L.js";
5
- import { t as Loader } from "../chunks/Loader-DQiZ75fa.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";
5
+ import { t as Loader } from "../chunks/Loader-BXoXTZGc.js";
6
6
  import { n as StatusDot } from "../chunks/StatusBadge-DXp4zkSd.js";
7
- import { n as Table } from "../chunks/Table-C5z6qWjM.js";
7
+ import { n as Table } from "../chunks/Table-ByziK93x.js";
8
8
  import { a as resolvedFlag, c as FieldWrapper, i as initializeValues, n as flattenGroups, o as applySecondaryField, r as impureSetValueFromPath, s as findSecondaryOption, t as enforceOneMustBeTrue } from "../chunks/lib-DTgL8klR.js";
9
9
  import cx from "classnames";
10
10
  import { Fragment, jsx, jsxs } from "react/jsx-runtime";
package/dist/index.d.ts CHANGED
@@ -13,10 +13,15 @@ export { default as CustomListbox } from './components/Listbox.js';
13
13
  export { default as Loader } from './components/Loader.js';
14
14
  export { default as Markdown } from './components/Markdown.js';
15
15
  export type { MarkdownProps } from './components/Markdown.js';
16
- export { default as Modal, type ModalProps } from './components/Modal.js';
16
+ export { BareModal, modalPanelClasses } from './components/BareModal.js';
17
+ export { ConfirmModal } from './components/ConfirmModal.js';
18
+ export { CreateModal, CreateModalAutocompleteField, CreateModalField, CreateModalSelect, type CreateModalSelectOption, CreateModalSwitch, CreateModalTextarea, } from './components/CreateModal.js';
19
+ export { AddMenu, type HeaderAddMenuItem } from './components/AddMenu.js';
20
+ export { dangerButtonClasses, ghostButtonClasses, primaryButtonClasses, } from './components/ghostButton.js';
17
21
  export { default as MultiSelectDropdown } from './components/MultiSelect.js';
18
22
  export { Overview } from './components/Overview.js';
19
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';
24
+ export { useCssIsDark } from './components/useCssIsDark.js';
20
25
  export { Indicator } from './components/Indicator.js';
21
26
  export { ControlledCollapsiblePanel, MaybeCollapsible, UncontrolledCollapsiblePanel, } from './components/CollapsiblePanel.js';
22
27
  export { default as SectionHeader } from './components/SectionHeader.js';
package/dist/index.js CHANGED
@@ -1,15 +1,16 @@
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 { i as Callout, n as CopyCodeBlock, r as CopyToClipboard, t as Markdown } from "./chunks/Markdown-iFhq8Gb0.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-uUHgWOWc.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";
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-BqD0dE-L.js";
7
- import { t as Loader } from "./chunks/Loader-DQiZ75fa.js";
8
- import { t as Modal } from "./chunks/Modal-sOUEwebV.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";
7
+ import { t as Loader } from "./chunks/Loader-BXoXTZGc.js";
8
+ import { n as modalPanelClasses, t as BareModal } from "./chunks/BareModal-DBa84JZO.js";
9
+ import { t as useCssIsDark } from "./chunks/useCssIsDark-DHr05dG2.js";
9
10
  import { t as Indicator } from "./chunks/Indicator-hBSIxOPK.js";
10
11
  import { t as SwitchToggleSmall } from "./chunks/SwitchToggleSmall-FcsaYSTs.js";
11
12
  import { n as StatusDot, t as StatusBadge } from "./chunks/StatusBadge-DXp4zkSd.js";
12
- import { n as Table, t as CompactTable } from "./chunks/Table-C5z6qWjM.js";
13
+ import { n as Table, t as CompactTable } from "./chunks/Table-ByziK93x.js";
13
14
  import cx from "classnames";
14
15
  import { Fragment, jsx, jsxs } from "react/jsx-runtime";
15
16
  import React, { forwardRef, useState } from "react";
@@ -534,4 +535,4 @@ function SettingModeOption({ name, checked, onSelect, label, description, isFirs
534
535
  });
535
536
  }
536
537
  //#endregion
537
- export { Button, Callout, Card, CardHeader, CompactTable, ControlledCollapsiblePanel, CopyCodeBlock, CopyToClipboard, CustomListbox, DEFAULT_PRESET, DescriptionList, DescriptionListItem, Dropdown, DropdownCaret, EmptyState, Filter, FilterPill, GlobalTooltip, IconButton, Indicator, Input, LetterBadge, Loader, Markdown, MaybeCollapsible, MethodButton, Modal, 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, deriveTheme, filterOption, flattenOptions, formatTooltipContent, inputClasses, isCategory, isDarkColor, isOption, useNavigation, useNotify, useProvisionCorsRules, useRunFile, useSlots, useStrings, useWorkflowJsonResolver };
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 };
@@ -1,2 +1,2 @@
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-D5f5Fq-O.js";
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
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,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-uUHgWOWc.js";
2
+ import { c as useStrings, i as useNotify } from "../chunks/Provider-jQCAN3NN.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";