@parallelworks/ui 0.12.1 → 0.13.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 (82) hide show
  1. package/dist/chunks/{BareModal-DBa84JZO.js → BareModal-BqroLbZ5.js} +1 -0
  2. package/dist/chunks/{CodePreviewEditor-hwjZof0M.js → CodePreviewEditor-67A_SKgE.js} +1 -1
  3. package/dist/chunks/{CreateModal-DLCC8t_x.js → CreateModal-k_e1dI8c.js} +27 -7
  4. package/dist/chunks/{Monaco-DCwRDrPm.js → Monaco-H56KyEdb.js} +22 -12
  5. package/dist/chunks/{PageHeader-dyoL44ue.js → PageHeader-FhtphHGc.js} +44 -10
  6. package/dist/chunks/{Provider-CfFV-vc5.js → Provider-CbFVFB7O.js} +8 -2
  7. package/dist/chunks/RequiredMark-DfLdYbYZ.js +11 -0
  8. package/dist/chunks/{StatusBadge-P6C2tv7Z.js → StatusBadge-RRUI78iS.js} +4 -4
  9. package/dist/chunks/{SwitchToggle-DcPCXkqL.js → SwitchToggle-DbW0Q__L.js} +49 -32
  10. package/dist/chunks/{Table-ByziK93x.js → Table-CutP1bRt.js} +22 -6
  11. package/dist/chunks/{Tooltip-WgbiC_nd.js → Tooltip-n9w7Tkt1.js} +28 -3
  12. package/dist/chunks/{editor-BH81U5-C.js → editor-BZ9Buwi4.js} +34 -23
  13. package/dist/chunks/lib-DyJvmbzj.js +256 -0
  14. package/dist/chunks/{list-CWVR3dfZ.js → list-3jZW8rmM.js} +33 -13
  15. package/dist/components/Breadcrumbs.d.ts +9 -0
  16. package/dist/components/CollapsiblePanel.d.ts +4 -4
  17. package/dist/components/CreateModal.d.ts +8 -8
  18. package/dist/components/Dropdown.d.ts +5 -3
  19. package/dist/components/Input.d.ts +1 -1
  20. package/dist/components/Listbox.d.ts +7 -4
  21. package/dist/components/Loader.d.ts +1 -1
  22. package/dist/components/MultiSelect.d.ts +8 -5
  23. package/dist/components/PageHeader.d.ts +3 -3
  24. package/dist/components/Pagination.d.ts +2 -2
  25. package/dist/components/Provider.d.ts +9 -3
  26. package/dist/components/RequiredMark.d.ts +1 -0
  27. package/dist/components/SettingRow.d.ts +1 -1
  28. package/dist/components/SwitchToggle.d.ts +3 -2
  29. package/dist/components/Table.d.ts +5 -3
  30. package/dist/components/Tooltip.d.ts +7 -1
  31. package/dist/components/dropdownUtils.d.ts +6 -6
  32. package/dist/editor/FormCodePanel.d.ts +3 -3
  33. package/dist/editor/Monaco.d.ts +2 -2
  34. package/dist/editor/index.js +1 -1
  35. package/dist/file-explorer/FileExplorer.d.ts +2 -2
  36. package/dist/file-explorer/helpers.d.ts +2 -2
  37. package/dist/file-explorer/index.js +46 -18
  38. package/dist/file-explorer/lib/fileExplorer.d.ts +1 -1
  39. package/dist/file-explorer/lib/types.d.ts +21 -21
  40. package/dist/form/FieldWrapper.d.ts +6 -1
  41. package/dist/form/Fields/ResourceOptionIcon.d.ts +1 -1
  42. package/dist/form/Fields/StepField.d.ts +1 -1
  43. package/dist/form/Form.d.ts +28 -27
  44. package/dist/form/SpecialTypes/DropdownWrapper.d.ts +16 -3
  45. package/dist/form/SpecialTypes/FormikCustomDropdown.d.ts +11 -11
  46. package/dist/form/SpecialTypes/FormikCustomInput.d.ts +12 -10
  47. package/dist/form/SpecialTypes/FormikMultiSelectDropdown.d.ts +1 -1
  48. package/dist/form/SpecialTypes/FormikNumericInput.d.ts +2 -2
  49. package/dist/form/Wizard/WizardContainer.d.ts +1 -1
  50. package/dist/form/Wizard/WizardStepContent.d.ts +2 -2
  51. package/dist/form/Wizard/types.d.ts +21 -14
  52. package/dist/form/Wizard/utils.d.ts +1 -1
  53. package/dist/form/fieldContext.d.ts +19 -0
  54. package/dist/form/index.d.ts +2 -1
  55. package/dist/form/index.js +191 -106
  56. package/dist/form/lib.d.ts +3 -3
  57. package/dist/form/types/fieldComponentTypes.d.ts +2 -2
  58. package/dist/form/useParsedOpts.d.ts +1 -1
  59. package/dist/form/utils/getParentValue.d.ts +3 -1
  60. package/dist/form/utils/getValueUsingPath.d.ts +1 -1
  61. package/dist/form/utils/pwResolver.d.ts +4 -4
  62. package/dist/icons.d.ts +5 -5
  63. package/dist/index.d.ts +3 -2
  64. package/dist/index.js +51 -21
  65. package/dist/list/ActionToolbar.d.ts +4 -4
  66. package/dist/list/ListPage.d.ts +3 -3
  67. package/dist/list/ListTable.d.ts +1 -1
  68. package/dist/list/RowContextMenu.d.ts +20 -20
  69. package/dist/list/index.js +2 -2
  70. package/dist/logviewer/index.js +24 -7
  71. package/dist/styles/theme.css +6 -6
  72. package/dist/styles.css +1 -1
  73. package/dist/theme/index.js +4 -3
  74. package/dist/workflow/AnnotationBanner.d.ts +2 -1
  75. package/dist/workflow/DependencyGraph.d.ts +15 -3
  76. package/dist/workflow/JobSummary.d.ts +2 -25
  77. package/dist/workflow/MatrixGroup.d.ts +3 -2
  78. package/dist/workflow/TreeView.d.ts +1 -32
  79. package/dist/workflow/index.js +235 -138
  80. package/dist/workflow/types.d.ts +48 -0
  81. package/package.json +2 -6
  82. package/dist/chunks/lib-DTgL8klR.js +0 -191
@@ -9,7 +9,7 @@ import type { DynamicFormSchema } from './types/fieldTypes.js';
9
9
  */
10
10
  export declare function resolvedFlag<T>(value: T): T | undefined;
11
11
  export declare function enforceOneMustBeTrue(items: Array<Record<string, unknown>>, options: DynamicFormSchema, promoteIndex: number): Array<Record<string, unknown>>;
12
- export declare function flattenGroups(schema: Record<string, any>): Record<string, any>;
12
+ export declare function flattenGroups(schema: unknown): Record<string, unknown>;
13
13
  /**Not a pure function. Edits 'obj' passed into function */
14
- export declare function impureSetValueFromPath(obj: Record<string, any>, path: string, value: unknown): void;
15
- export declare function initializeValues(options: Record<string, any> | undefined, srcData?: Record<string, any>, ignoreDefaultStrings?: boolean): Record<string, any> | undefined;
14
+ export declare function impureSetValueFromPath(obj: Record<string, unknown>, path: string, value: unknown): void;
15
+ export declare function initializeValues(options: unknown, srcData?: object, ignoreDefaultStrings?: boolean): Record<string, unknown> | undefined;
@@ -18,9 +18,9 @@ export interface FieldComponentProps<TField extends FieldBase = FieldBase, TValu
18
18
  missingFields: string[];
19
19
  values: Record<string, unknown>;
20
20
  setFormDirty: TSetFormDirty;
21
- onChange?: (val: unknown) => void;
21
+ onChange?: ((val: unknown) => void) | undefined;
22
22
  disabled: boolean;
23
- computeOn?: boolean;
23
+ computeOn?: boolean | undefined;
24
24
  spaceCompact?: boolean;
25
25
  tooltipComponent?: React.ReactNode;
26
26
  workflowForm?: boolean;
@@ -2,4 +2,4 @@ import { type WorkflowVariables } from '@parallelworks/workflow-parser';
2
2
  /**
3
3
  * useMemo won't work here — Formik values changes on every keystroke, so this hook extracts which inputs.* keys the schema references and re-parses only when those change. Defaults `userVars`/`secretKeys` to empty — callers in React scope should pass them from `useUserVars()` so the parser leaves `${{ var.SECRET }}` literal during template eval (otherwise the recursive substitution turns `"https://${{ var.PAT }}@host/"` into `"https://@host/"`).
4
4
  */
5
- export declare function useParsedOpts(rawOptions: Record<string, any>, values: Record<string, any>, organizationVariables: WorkflowVariables | undefined, userVars?: Record<string, string>, secretKeys?: string[]): Record<string, any>;
5
+ export declare function useParsedOpts<T extends object = Record<string, unknown>>(rawOptions: T, values: Record<string, unknown>, organizationVariables: WorkflowVariables | undefined, userVars?: Record<string, string>, secretKeys?: string[]): T;
@@ -1 +1,3 @@
1
- export declare function getParentValue(index: number | undefined, targetField: any, values: object, dependentPath: string, field: any): unknown;
1
+ export declare function getParentValue(index: number | undefined, targetField: unknown, values: object, dependentPath: string, field: {
2
+ depends_on?: string | undefined;
3
+ }): unknown;
@@ -1 +1 @@
1
- export declare function getValueUsingPath(obj: Record<string, any>, path: string): any | undefined;
1
+ export declare function getValueUsingPath(obj: unknown, path: string): unknown;
@@ -1,9 +1,9 @@
1
1
  interface OptionWithValue {
2
2
  value: {
3
- name?: string;
4
- user?: string;
5
- namespace?: string;
6
- type?: string;
3
+ name?: string | undefined;
4
+ user?: string | undefined;
5
+ namespace?: string | undefined;
6
+ type?: string | null | undefined;
7
7
  } | undefined;
8
8
  }
9
9
  interface OptionCategory {
package/dist/icons.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- import type React from 'react';
1
+ import type { IconBaseProps } from 'react-icons';
2
2
  import { BiError as ErrorIcon } from 'react-icons/bi';
3
3
  import { BsZoomIn as ChartZoomIcon, BsLayers as InfrastructureLayersIcon, BsCurrencyDollar as MoneyIcon } from 'react-icons/bs';
4
4
  import { FaInfoCircle as InfoIcon } from 'react-icons/fa';
@@ -32,8 +32,8 @@ interface IBaseCheckmarkProps {
32
32
  className?: string;
33
33
  colored?: boolean;
34
34
  }
35
- export declare function SuccessCheckmark({ className, colored, }: IBaseCheckmarkProps): React.JSX.Element;
36
- export declare function ErrorCheckmark({ className, colored, }: IBaseCheckmarkProps): React.JSX.Element;
37
- export declare function LoaderIcon({ className, ...props }: React.SVGProps<SVGSVGElement> & {
35
+ export declare function SuccessCheckmark({ className, colored, }: IBaseCheckmarkProps): import("react").JSX.Element;
36
+ export declare function ErrorCheckmark({ className, colored, }: IBaseCheckmarkProps): import("react").JSX.Element;
37
+ export declare function LoaderIcon({ className, ...props }: IconBaseProps & {
38
38
  className?: string;
39
- }): React.JSX.Element;
39
+ }): import("react").JSX.Element;
package/dist/index.d.ts CHANGED
@@ -29,10 +29,11 @@ export { default as SwitchToggleSmall } from './components/SwitchToggleSmall.js'
29
29
  export { StatusBadge, StatusDot } from './components/StatusBadge.js';
30
30
  export { default as SwitchToggle } from './components/SwitchToggle.js';
31
31
  export { CompactTable, Table } from './components/Table.js';
32
- export { formatTooltipContent, GlobalTooltip, TOOLTIP_ID, TooltipInfo, } from './components/Tooltip.js';
32
+ export { formatTooltipContent, GlobalTooltip, TOOLTIP_ID, TooltipInfo, truncationTooltipProps, } from './components/Tooltip.js';
33
33
  export { Button, MethodButton } from './components/Button.js';
34
34
  export { Card, CardHeader } from './components/Card.js';
35
35
  export { Input, Textarea } from './components/Input.js';
36
+ export { RequiredMark } from './components/RequiredMark.js';
36
37
  export { inputClasses } from './components/inputClasses.js';
37
38
  export { IconButton } from './components/IconButton.js';
38
39
  export { Toggle } from './components/Toggle.js';
@@ -45,5 +46,5 @@ export { default as SettingsCard } from './components/SettingsCard.js';
45
46
  export { default as SettingsGroup } from './components/SettingsGroup.js';
46
47
  export { SettingRow, SettingSection } from './components/SettingRow.js';
47
48
  export { SettingModeOption } from './components/SettingModeOption.js';
48
- export { BreadcrumbProvider, useBreadcrumb, useClearBreadcrumbs, useHideBreadcrumbs, useSetBreadcrumbs, type IBreadcrumbItem, } from './components/Breadcrumbs.js';
49
+ export { BreadcrumbProvider, useBreadcrumb, useClearBreadcrumbs, useHideBreadcrumbs, useSetBreadcrumbs, useSetDefaultBreadcrumbs, type IBreadcrumbItem, } from './components/Breadcrumbs.js';
49
50
  export { BreadcrumbsActionButton, BreadcrumbsRightAction, BreadcrumbsTitleAction, HeaderActionMenu, HeaderAddButton, HeaderEditButton, HeaderRowMenu, PageHeader, type PageHeaderBreadcrumb, type PageHeaderCrumb, } from './components/PageHeader.js';
package/dist/index.js CHANGED
@@ -1,20 +1,21 @@
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 CreateModalSelect, c as ConfirmModal, d as primaryButtonClasses, f as Markdown, h as Callout, i as CreateModalField, l as dangerButtonClasses, m as CopyToClipboard, n as CreateModal, o as CreateModalSwitch, p as CopyCodeBlock, r as CreateModalAutocompleteField, s as CreateModalTextarea, t as CREATE_MODAL_SELECT_FILTER_THRESHOLD, u as ghostButtonClasses } from "./chunks/CreateModal-DLCC8t_x.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-CfFV-vc5.js";
5
- import { i as formatTooltipContent, n as TOOLTIP_ID, r as TooltipInfo, t as GlobalTooltip } from "./chunks/Tooltip-WgbiC_nd.js";
6
- import { c as isOption, i as filterOption, l as toggleSetMember, n as StatusDot, o as flattenOptions, r as DropdownCaret, s as isCategory, t as StatusBadge } from "./chunks/StatusBadge-P6C2tv7Z.js";
7
- import { a as UncontrolledCollapsiblePanel, c as Dropdown, i as MaybeCollapsible, n as SectionHeader, o as MultiSelectDropdown, r as ControlledCollapsiblePanel, s as CustomListbox, t as SwitchToggle } from "./chunks/SwitchToggle-DcPCXkqL.js";
3
+ import { a as CreateModalSelect, c as ConfirmModal, d as primaryButtonClasses, f as Markdown, h as Callout, i as CreateModalField, l as dangerButtonClasses, m as CopyToClipboard, n as CreateModal, o as CreateModalSwitch, p as CopyCodeBlock, r as CreateModalAutocompleteField, s as CreateModalTextarea, t as CREATE_MODAL_SELECT_FILTER_THRESHOLD, u as ghostButtonClasses } from "./chunks/CreateModal-k_e1dI8c.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-CbFVFB7O.js";
5
+ import { a as truncationTooltipProps, i as formatTooltipContent, n as TOOLTIP_ID, r as TooltipInfo, t as GlobalTooltip } from "./chunks/Tooltip-n9w7Tkt1.js";
6
+ import { c as isOption, i as filterOption, l as toggleSetMember, n as StatusDot, o as flattenOptions, r as DropdownCaret, s as isCategory, t as StatusBadge } from "./chunks/StatusBadge-RRUI78iS.js";
7
+ import { a as UncontrolledCollapsiblePanel, c as Dropdown, i as MaybeCollapsible, n as SectionHeader, o as MultiSelectDropdown, r as ControlledCollapsiblePanel, s as CustomListbox, t as SwitchToggle } from "./chunks/SwitchToggle-DbW0Q__L.js";
8
8
  import { t as Loader } from "./chunks/Loader-BXoXTZGc.js";
9
- import { n as modalPanelClasses, t as BareModal } from "./chunks/BareModal-DBa84JZO.js";
10
- 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-dyoL44ue.js";
9
+ import { n as modalPanelClasses, t as BareModal } from "./chunks/BareModal-BqroLbZ5.js";
10
+ import { C as AddMenu, S as useSetDefaultBreadcrumbs, _ 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-FhtphHGc.js";
11
11
  import { t as useCssIsDark } from "./chunks/useCssIsDark-DHr05dG2.js";
12
12
  import { t as Indicator } from "./chunks/Indicator-hBSIxOPK.js";
13
13
  import { t as SwitchToggleSmall } from "./chunks/SwitchToggleSmall-FcsaYSTs.js";
14
- import { n as Table, t as CompactTable } from "./chunks/Table-ByziK93x.js";
14
+ import { n as Table, t as CompactTable } from "./chunks/Table-CutP1bRt.js";
15
+ import { t as RequiredMark } from "./chunks/RequiredMark-DfLdYbYZ.js";
15
16
  import cx from "classnames";
16
17
  import { Fragment, jsx, jsxs } from "react/jsx-runtime";
17
- import React, { forwardRef, useState } from "react";
18
+ import React, { forwardRef, useId, useState } from "react";
18
19
  import Skeleton from "react-loading-skeleton";
19
20
  //#region src/components/DescriptionList.tsx
20
21
  function DescriptionListItem({ label, children, tooltip, className, ...props }) {
@@ -130,6 +131,7 @@ var Button = forwardRef(({ children, variant = "primary", size = "default", load
130
131
  const widthClass = fullWidth ? "w-full" : "w-auto";
131
132
  return /* @__PURE__ */ jsx("button", {
132
133
  ref,
134
+ type: "button",
133
135
  disabled: disabled || loading,
134
136
  className: cx(baseClasses, variantClasses[variant], sizeClasses[size], widthClass, className),
135
137
  ...props,
@@ -180,6 +182,7 @@ function MethodButton({ icon, label, description, href, className = "", ...props
180
182
  });
181
183
  }
182
184
  return /* @__PURE__ */ jsx("button", {
185
+ type: "button",
183
186
  className: cx("group", baseClasses, className),
184
187
  ...props,
185
188
  children: content
@@ -215,18 +218,22 @@ function CardHeader({ badge, title, description, className = "", align = "center
215
218
  }
216
219
  //#endregion
217
220
  //#region src/components/Input.tsx
218
- var Input = forwardRef(({ label, error, className = "", mono, type, ...props }, ref) => {
221
+ var Input = forwardRef(({ label, error, className = "", mono, type, required, ...props }, ref) => {
219
222
  const [showPassword, setShowPassword] = useState(false);
220
223
  const isPassword = type === "password";
221
224
  const inputType = isPassword && showPassword ? "text" : type;
225
+ const generatedId = useId();
226
+ const id = props.id ?? generatedId;
227
+ const errorId = `${id}-error`;
228
+ const describedBy = [props["aria-describedby"], error ? errorId : void 0].filter(Boolean).join(" ") || void 0;
222
229
  const inputClasses = cx("w-full py-3 px-4 bg-[var(--theme-muted-panel-bg)] border border-[var(--theme-border)] rounded-lg text-[var(--theme-app)] text-sm transition-all duration-200 box-border", "focus:outline-none focus:border-[var(--theme-element)] focus:shadow-[0_0_0_3px_color-mix(in_srgb,var(--theme-element)_25%,transparent)]", "placeholder:text-[var(--theme-muted-text-color)]", "disabled:bg-[var(--theme-muted-panel-bg)] disabled:text-[var(--theme-muted-text-color)] disabled:cursor-not-allowed disabled:opacity-70", mono && "font-mono text-[0.8125rem]", error && "border-[#ef4444]", isPassword && "pr-11", className);
223
230
  return /* @__PURE__ */ jsxs("div", {
224
231
  className: "flex flex-col gap-1.5",
225
232
  children: [
226
- label && /* @__PURE__ */ jsx("label", {
233
+ label && /* @__PURE__ */ jsxs("label", {
227
234
  className: "text-[0.8125rem] font-medium text-[var(--theme-app)]",
228
- htmlFor: props.id || props.name,
229
- children: label
235
+ htmlFor: id,
236
+ children: [label, required && /* @__PURE__ */ jsx(RequiredMark, {})]
230
237
  }),
231
238
  /* @__PURE__ */ jsxs("div", {
232
239
  className: isPassword ? "relative w-full" : "",
@@ -234,7 +241,11 @@ var Input = forwardRef(({ label, error, className = "", mono, type, ...props },
234
241
  ref,
235
242
  type: inputType,
236
243
  className: inputClasses,
237
- ...props
244
+ ...props,
245
+ id,
246
+ required,
247
+ "aria-invalid": error ? true : props["aria-invalid"],
248
+ "aria-describedby": describedBy
238
249
  }), isPassword && /* @__PURE__ */ jsx("button", {
239
250
  type: "button",
240
251
  className: "absolute right-3 top-1/2 -translate-y-1/2 bg-transparent border-none text-[var(--theme-muted-text-color)] cursor-pointer p-1 transition-colors duration-200 flex items-center justify-center hover:text-[var(--theme-app)]",
@@ -245,6 +256,8 @@ var Input = forwardRef(({ label, error, className = "", mono, type, ...props },
245
256
  })]
246
257
  }),
247
258
  error && /* @__PURE__ */ jsxs("span", {
259
+ id: errorId,
260
+ role: "alert",
248
261
  className: "text-[0.8125rem] text-[#ef4444] flex items-center gap-1.5",
249
262
  children: [/* @__PURE__ */ jsx(AlertIcon, { className: "w-4 h-4" }), error]
250
263
  })
@@ -252,22 +265,32 @@ var Input = forwardRef(({ label, error, className = "", mono, type, ...props },
252
265
  });
253
266
  });
254
267
  Input.displayName = "Input";
255
- var Textarea = forwardRef(({ label, error, className = "", mono, ...props }, ref) => {
268
+ var Textarea = forwardRef(({ label, error, className = "", mono, required, ...props }, ref) => {
269
+ const generatedId = useId();
270
+ const id = props.id ?? generatedId;
271
+ const errorId = `${id}-error`;
272
+ const describedBy = [props["aria-describedby"], error ? errorId : void 0].filter(Boolean).join(" ") || void 0;
256
273
  const textareaClasses = cx("w-full py-3 px-4 bg-[var(--theme-muted-panel-bg)] border border-[var(--theme-border)] rounded-lg text-[var(--theme-app)] text-sm transition-all duration-200 box-border min-h-[140px] resize-y", "focus:outline-none focus:border-[var(--theme-element)] focus:shadow-[0_0_0_3px_color-mix(in_srgb,var(--theme-element)_25%,transparent)]", "placeholder:text-[var(--theme-muted-text-color)]", mono && "font-mono text-[0.8125rem]", error && "border-[#ef4444]", className);
257
274
  return /* @__PURE__ */ jsxs("div", {
258
275
  className: "flex flex-col gap-1.5",
259
276
  children: [
260
- label && /* @__PURE__ */ jsx("label", {
277
+ label && /* @__PURE__ */ jsxs("label", {
261
278
  className: "text-[0.8125rem] font-medium text-[var(--theme-app)]",
262
- htmlFor: props.id || props.name,
263
- children: label
279
+ htmlFor: id,
280
+ children: [label, required && /* @__PURE__ */ jsx(RequiredMark, {})]
264
281
  }),
265
282
  /* @__PURE__ */ jsx("textarea", {
266
283
  ref,
267
284
  className: textareaClasses,
268
- ...props
285
+ ...props,
286
+ id,
287
+ required,
288
+ "aria-invalid": error ? true : props["aria-invalid"],
289
+ "aria-describedby": describedBy
269
290
  }),
270
291
  error && /* @__PURE__ */ jsxs("span", {
292
+ id: errorId,
293
+ role: "alert",
271
294
  className: "text-[0.8125rem] text-[#ef4444] flex items-center gap-1.5",
272
295
  children: [/* @__PURE__ */ jsx(AlertIcon, { className: "w-4 h-4" }), error]
273
296
  })
@@ -297,7 +320,7 @@ var IconButton = forwardRef(({ icon, label, variant = "default", size = "md", ac
297
320
  type: "button",
298
321
  "aria-label": label,
299
322
  disabled,
300
- "data-tooltip-id": showTooltip ? TOOLTIP_ID : void 0,
323
+ ...showTooltip ? { "data-tooltip-id": TOOLTIP_ID } : {},
301
324
  "data-tooltip-content": label,
302
325
  "data-tooltip-delay-show": 300,
303
326
  "data-tooltip-class-name": "!bg-[var(--theme-app)] !text-[var(--theme-app-bg)] !text-xs !py-1 !px-2 !rounded-md",
@@ -311,6 +334,7 @@ IconButton.displayName = "IconButton";
311
334
  //#region src/components/Toggle.tsx
312
335
  function Toggle({ checked, onChange, disabled, label }) {
313
336
  return /* @__PURE__ */ jsxs("label", {
337
+ role: "none",
314
338
  onClick: (e) => e.stopPropagation(),
315
339
  className: cx("relative inline-flex items-center", disabled ? "cursor-not-allowed opacity-60" : "cursor-pointer"),
316
340
  children: [/* @__PURE__ */ jsx("input", {
@@ -382,6 +406,7 @@ var SortIcon = ({ currentlySorted, currentDirection, name }) => {
382
406
  return null;
383
407
  };
384
408
  function Sort({ currentlySorted, name, setCurrentDirection, setCurrentlySorted, currentDirection }) {
409
+ const t = useStrings().common;
385
410
  const sort = (sorted, direction) => {
386
411
  if (sorted === name) {
387
412
  if (direction === "ascending") setCurrentDirection("descending");
@@ -397,6 +422,8 @@ function Sort({ currentlySorted, name, setCurrentDirection, setCurrentlySorted,
397
422
  return /* @__PURE__ */ jsx("div", {
398
423
  className: "inline",
399
424
  children: /* @__PURE__ */ jsx("button", {
425
+ type: "button",
426
+ "aria-label": t.sort,
400
427
  onClick: () => sort(currentlySorted, currentDirection),
401
428
  children: /* @__PURE__ */ jsx(SortIcon, {
402
429
  currentDirection,
@@ -422,11 +449,13 @@ function Pagination({ endingNumber, endingTime, nextCallback, prevCallback, roun
422
449
  }), /* @__PURE__ */ jsxs("div", {
423
450
  className: "flex flex-1 justify-between sm:justify-end gap-x-2",
424
451
  children: [/* @__PURE__ */ jsx("button", {
452
+ type: "button",
425
453
  disabled: prevDisabled,
426
454
  onClick: prevCallback,
427
455
  className: cx("link text-sm", prevDisabled && "disabled"),
428
456
  children: t.paginationPrevious
429
457
  }), /* @__PURE__ */ jsx("button", {
458
+ type: "button",
430
459
  disabled: nextDisabled,
431
460
  onClick: nextCallback,
432
461
  className: cx("link text-sm", nextDisabled && "disabled"),
@@ -481,6 +510,7 @@ function SettingsGroup({ title, children, className }) {
481
510
  //#region src/components/SettingRow.tsx
482
511
  function SettingRow({ label, htmlFor, helpText, children, isFirst, fill, onClick }) {
483
512
  return /* @__PURE__ */ jsxs("div", {
513
+ role: "none",
484
514
  onClick,
485
515
  className: cx("px-5 py-5 grid grid-cols-1 gap-x-8 gap-y-2", fill ? "md:grid-cols-[200px_1fr]" : "md:grid-cols-[1fr_auto]", !isFirst && "border-t theme-border", onClick && "cursor-pointer select-none hover:theme-hover transition-colors"),
486
516
  children: [/* @__PURE__ */ jsxs("div", {
@@ -536,4 +566,4 @@ function SettingModeOption({ name, checked, onSelect, label, description, isFirs
536
566
  });
537
567
  }
538
568
  //#endregion
539
- export { AddMenu, BareModal, BreadcrumbProvider, BreadcrumbsActionButton, BreadcrumbsRightAction, BreadcrumbsTitleAction, Button, CREATE_MODAL_SELECT_FILTER_THRESHOLD, 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, toggleSetMember, useBreadcrumb, useClearBreadcrumbs, useCssIsDark, useHideBreadcrumbs, useNavigation, useNotify, useProvisionCorsRules, useRunFile, useSetBreadcrumbs, useSlots, useStrings, useWorkflowJsonResolver };
569
+ export { AddMenu, BareModal, BreadcrumbProvider, BreadcrumbsActionButton, BreadcrumbsRightAction, BreadcrumbsTitleAction, Button, CREATE_MODAL_SELECT_FILTER_THRESHOLD, 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, RequiredMark, 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, toggleSetMember, truncationTooltipProps, useBreadcrumb, useClearBreadcrumbs, useCssIsDark, useHideBreadcrumbs, useNavigation, useNotify, useProvisionCorsRules, useRunFile, useSetBreadcrumbs, useSetDefaultBreadcrumbs, useSlots, useStrings, useWorkflowJsonResolver };
@@ -5,11 +5,11 @@ export interface ToolbarAction {
5
5
  className?: string;
6
6
  }>;
7
7
  iconClassName?: string;
8
- onClick?: () => void;
9
- href?: string;
10
- disabled?: boolean;
8
+ onClick?: (() => void) | undefined;
9
+ href?: string | undefined;
10
+ disabled?: boolean | undefined;
11
11
  enabledTooltip?: string;
12
- disabledTooltip?: string;
12
+ disabledTooltip?: string | undefined;
13
13
  hidden?: boolean;
14
14
  }
15
15
  /** A pre-rendered element (e.g. a button component that owns its modal). */
@@ -37,20 +37,20 @@ export interface PinnedRowAction {
37
37
  label: string;
38
38
  icon: ReactNode;
39
39
  onSelect: () => void;
40
- disabled?: boolean;
40
+ disabled?: boolean | undefined;
41
41
  }
42
42
  export declare function ListRow({ href, items, goTo, openMenu, pinnedActions, selected, selectionActive, onRowSelect, leading, className, children, }: {
43
43
  href: string | null;
44
44
  items: RowMenuItem[];
45
45
  goTo: (to: string) => void;
46
46
  openMenu: OpenMenu;
47
- pinnedActions?: PinnedRowAction[];
47
+ pinnedActions?: PinnedRowAction[] | undefined;
48
48
  className?: string;
49
49
  /** Tints the whole row to mark it as part of a multi-selection. */
50
50
  selected?: boolean;
51
51
  /** When multi-selection is active, plain row click toggles selection instead of navigating. */
52
52
  selectionActive?: boolean;
53
- onRowSelect?: (e: ReactMouseEvent) => void;
53
+ onRowSelect?: ((e: ReactMouseEvent) => void) | undefined;
54
54
  /** Non-column cell rendered before the column cells; kept out of `children` so they stay aligned with `columns`. */
55
55
  leading?: ReactNode;
56
56
  children: ReactNode;
@@ -21,7 +21,7 @@ export declare const listTableFixedProps: {
21
21
  export declare function NameCell({ icon, name, subtitle, href, }: {
22
22
  icon: ReactNode;
23
23
  name: string;
24
- subtitle?: string;
24
+ subtitle?: string | undefined;
25
25
  href: string | null;
26
26
  }): import("react").JSX.Element;
27
27
  export declare function GroupRow({ label, count, colSpan, }: {
@@ -4,14 +4,14 @@ export type RowMenuItem = {
4
4
  label: string;
5
5
  to: string;
6
6
  icon?: ReactNode;
7
- destructive?: boolean;
7
+ destructive?: boolean | undefined;
8
8
  } | {
9
9
  kind: 'action';
10
10
  label: string;
11
- onSelect?: () => void;
11
+ onSelect?: (() => void) | undefined;
12
12
  icon?: ReactNode;
13
- destructive?: boolean;
14
- disabled?: boolean;
13
+ destructive?: boolean | undefined;
14
+ disabled?: boolean | undefined;
15
15
  /** Trailing checkmark, e.g. the active option in a radio-style submenu. */
16
16
  selected?: boolean;
17
17
  /** Declarative clipboard copy: the menu performs it and notifies, so
@@ -35,10 +35,10 @@ export interface RowAction {
35
35
  key: string;
36
36
  label: string;
37
37
  icon: ReactNode;
38
- onSelect?: () => void;
39
- to?: string;
40
- disabled?: boolean;
41
- destructive?: boolean;
38
+ onSelect?: (() => void) | undefined;
39
+ to?: string | undefined;
40
+ disabled?: boolean | undefined;
41
+ destructive?: boolean | undefined;
42
42
  }
43
43
  /** Converts a single row action to a menu item: a `to` makes it a link, otherwise an action. */
44
44
  export declare function toRowMenuItem(action: RowAction): RowMenuItem;
@@ -51,9 +51,9 @@ export declare function toolbarActionToRowAction(action: {
51
51
  icon: ComponentType<{
52
52
  className?: string;
53
53
  }>;
54
- onClick?: () => void;
55
- href?: string;
56
- disabled?: boolean;
54
+ onClick?: (() => void) | undefined;
55
+ href?: string | undefined;
56
+ disabled?: boolean | undefined;
57
57
  }): RowAction;
58
58
  /** Assembles a row's context menu in the shared order: leading link(s) → middle
59
59
  * actions → extra items → Copy submenu → trailing (destructive) actions last. */
@@ -71,7 +71,7 @@ export declare function assembleRowMenu({ lead, actions, exclude, order, trailin
71
71
  /** Items inserted after the middle actions and before Copy, e.g. a marketplace link. */
72
72
  extra?: RowMenuItem[];
73
73
  /** The Copy submenu from `copySubmenu(...)`. */
74
- copy?: RowMenuItem;
74
+ copy?: RowMenuItem | undefined;
75
75
  }): RowMenuItem[];
76
76
  export declare function useRowMenu(zClassName?: string): {
77
77
  openMenu: OpenMenu;
@@ -90,19 +90,19 @@ export declare function rowContextMenuProps(openMenu: OpenMenu, items: RowMenuIt
90
90
  * host translator for the field labels (falls back to the provider defaults'
91
91
  * English). */
92
92
  export declare function copySubmenu({ name, nameLabel, email, username, uid, id, url, extra, t, }: {
93
- name?: string | null;
93
+ name?: string | null | undefined;
94
94
  /** Overrides the "name" label (raw, pre-translated) for entities whose primary field isn't a name, e.g. "domain". */
95
95
  nameLabel?: string;
96
- email?: string | null;
97
- username?: string | null;
98
- uid?: string | number | null;
99
- id?: string | null;
100
- url?: string | null;
96
+ email?: string | null | undefined;
97
+ username?: string | null | undefined;
98
+ uid?: string | number | null | undefined;
99
+ id?: string | null | undefined;
100
+ url?: string | null | undefined;
101
101
  extra?: {
102
102
  label: string;
103
- value?: string | null;
103
+ value?: string | null | undefined;
104
104
  icon?: ReactNode;
105
- }[];
105
+ }[] | undefined;
106
106
  t?: (key: string, values?: Record<string, string | number>) => string;
107
107
  }): RowMenuItem;
108
108
  /** Stays visible while active (menu open) so it doesn't vanish behind the overlay. */
@@ -1,3 +1,3 @@
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-dyoL44ue.js";
2
- import { A as ActionToolbar, C as ListSkeleton, D as actionsColumnWidth, E as RowSelectCheckbox, M as stickyTabsClasses, N as stickyTabsUnderHeaderClasses, O as listTableFixedProps, P as stickyToolbarClasses, S as ListError, T as NameCell, _ as ListRow, a as ListCount, b as GroupRow, c as ListDisplayMenu, d as isTextEntryContext, f as DEFAULT_ORDER, g as ListPage, h as ListColumns, i as ListPager, j as ToolbarButton, k as listTableProps, l as ListFilterMenu, m as useListView, n as useHoverCard, o as ListSearchControl, p as FAVORITE_ORDER, r as LIST_PAGE_SIZES, s as useListSearch, t as HoverCardSurface, u as listControlButtonClasses, v as ListRowActionsProvider, w as NAME_MIN_WIDTH_PX, x as ListActionsHeader, y as useListNavigate } from "../chunks/list-CWVR3dfZ.js";
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-FhtphHGc.js";
2
+ import { A as ActionToolbar, C as ListSkeleton, D as actionsColumnWidth, E as RowSelectCheckbox, M as stickyTabsClasses, N as stickyTabsUnderHeaderClasses, O as listTableFixedProps, P as stickyToolbarClasses, S as ListError, T as NameCell, _ as ListRow, a as ListCount, b as GroupRow, c as ListDisplayMenu, d as isTextEntryContext, f as DEFAULT_ORDER, g as ListPage, h as ListColumns, i as ListPager, j as ToolbarButton, k as listTableProps, l as ListFilterMenu, m as useListView, n as useHoverCard, o as ListSearchControl, p as FAVORITE_ORDER, r as LIST_PAGE_SIZES, s as useListSearch, t as HoverCardSurface, u as listControlButtonClasses, v as ListRowActionsProvider, w as NAME_MIN_WIDTH_PX, x as ListActionsHeader, y as useListNavigate } from "../chunks/list-3jZW8rmM.js";
3
3
  export { ActionToolbar, DEFAULT_ORDER, FAVORITE_ORDER, GroupRow, HoverCardSurface, LIST_PAGE_SIZES, 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,6 +1,6 @@
1
1
  import { ArrowDownIcon, ArrowUpIcon, CheckIcon, ChevronDownIcon, ChevronRightIcon, ClockIcon, CopyIcon, DownloadIcon, ExpandIcon, ShrinkIcon, XIcon } from "../icons.js";
2
- import { c as useStrings, i as useNotify } from "../chunks/Provider-CfFV-vc5.js";
3
- import { r as TooltipInfo } from "../chunks/Tooltip-WgbiC_nd.js";
2
+ import { c as useStrings, i as useNotify } from "../chunks/Provider-CbFVFB7O.js";
3
+ import { r as TooltipInfo } from "../chunks/Tooltip-n9w7Tkt1.js";
4
4
  import cx from "classnames";
5
5
  import { Fragment, jsx, jsxs } from "react/jsx-runtime";
6
6
  import { Fragment as Fragment$1, memo, useCallback, useEffect, useLayoutEffect, useMemo, useRef, useState } from "react";
@@ -37,19 +37,34 @@ var LogLine = memo(function LogLine({ index, segments, lineNumbers, isSelected,
37
37
  });
38
38
  return null;
39
39
  }, [command?.type, annotationLabels]);
40
+ const groupToggle = command?.type === "group" && onGroupToggle ? () => {
41
+ if (window.getSelection()?.isCollapsed === false) return;
42
+ onGroupToggle(index);
43
+ } : null;
44
+ const groupToggleProps = groupToggle ? {
45
+ role: "button",
46
+ tabIndex: 0,
47
+ "aria-expanded": !isGroupCollapsed,
48
+ onClick: groupToggle,
49
+ onKeyDown: (e) => {
50
+ if (e.target !== e.currentTarget) return;
51
+ if (e.key === "Enter" || e.key === " ") {
52
+ e.preventDefault();
53
+ groupToggle();
54
+ }
55
+ }
56
+ } : void 0;
40
57
  return /* @__PURE__ */ jsxs("div", {
41
58
  "data-line-number": index + 1,
59
+ ...groupToggleProps,
42
60
  className: cx("flex items-start text-sm font-mono group", isSelected ? "bg-(--theme-link)/15" : "hover:bg-(--theme-hover)", "text-(--theme-app)", command?.type === "error" && "bg-red-500/10", command?.type === "warning" && "bg-yellow-500/10", command?.type === "notice" && "bg-blue-500/10", command?.type === "debug" && "opacity-60", command?.type === "group" && "bg-(--theme-hover) cursor-pointer"),
43
61
  style: {
44
62
  minHeight: `${lineHeight}px`,
45
63
  lineHeight: `${lineHeight}px`,
46
64
  paddingLeft: groupDepth > 0 ? `${groupDepth * 16}px` : void 0
47
65
  },
48
- onClick: command?.type === "group" && onGroupToggle ? () => {
49
- if (window.getSelection()?.isCollapsed === false) return;
50
- onGroupToggle(index);
51
- } : void 0,
52
- children: [lineNumbers && /* @__PURE__ */ jsx("span", {
66
+ children: [lineNumbers && /* @__PURE__ */ jsx("button", {
67
+ type: "button",
53
68
  onClick: (e) => {
54
69
  e.stopPropagation();
55
70
  onLineClick(index + 1, e);
@@ -537,6 +552,7 @@ function LogViewer({ log, height = "unset", width, roundedBottom = false, lineNu
537
552
  children: [copied ? /* @__PURE__ */ jsx(CheckIcon, { className: "text-green-500" }) : /* @__PURE__ */ jsx(CopyIcon, {}), /* @__PURE__ */ jsx("span", { children: copied ? tCommon.copied : t.copyLines(selectedLines.size) })]
538
553
  }), /* @__PURE__ */ jsx("button", {
539
554
  type: "button",
555
+ "aria-label": t.clearSelection,
540
556
  className: "absolute -top-1.5 -right-1.5 btn-neutral rounded-full p-1 border transition-colors shadow-sm cursor-pointer z-10",
541
557
  onClick: () => setSelectedLines(/* @__PURE__ */ new Set()),
542
558
  title: t.clearSelection,
@@ -661,6 +677,7 @@ function LogViewer({ log, height = "unset", width, roundedBottom = false, lineNu
661
677
  }),
662
678
  /* @__PURE__ */ jsxs("div", {
663
679
  "data-testid": "logviewer",
680
+ role: "none",
664
681
  className: cx(roundedBottom && "rounded-b-lg", "w-full overflow-x-auto", !inline && "h-full grow overflow-y-auto", !inline && "bg-(--theme-muted-panel-bg)", contentClassName),
665
682
  style: inline ? void 0 : {
666
683
  overflowY: "auto",
@@ -14,15 +14,15 @@
14
14
  --theme-panel-bg: #ffffff;
15
15
  --theme-panel: #000000;
16
16
  --theme-muted-panel-bg: #f8f9fa;
17
- --theme-muted-panel-color: #6c757d;
18
- --theme-muted-text-color: #6c757d;
17
+ --theme-muted-panel-color: #5f6b76;
18
+ --theme-muted-text-color: #5f6b76;
19
19
  --theme-border: #d1d5db;
20
20
  --theme-element: #06354f;
21
21
  --theme-element-text: #ffffff;
22
22
  --theme-element-hover: #053047;
23
23
  --theme-hover: #f3f4f6;
24
24
  --theme-hover-text: #000000;
25
- --theme-link: #428bca;
25
+ --theme-link: #2f6fa8;
26
26
  --theme-input-bg: #f9fafb;
27
27
  --theme-input: #3b82f6;
28
28
  --theme-input-disabled-bg: #f3f4f6;
@@ -67,11 +67,11 @@
67
67
 
68
68
  @utility theme-muted-panel {
69
69
  background-color: var(--theme-muted-panel-bg, #f8f9fa);
70
- color: var(--theme-muted-panel-color, #6c757d);
70
+ color: var(--theme-muted-panel-color, #5f6b76);
71
71
  }
72
72
 
73
73
  @utility theme-muted-text {
74
- color: var(--theme-muted-text-color, #6c757d);
74
+ color: var(--theme-muted-text-color, #5f6b76);
75
75
  }
76
76
 
77
77
  @utility theme-text {
@@ -117,7 +117,7 @@
117
117
  }
118
118
 
119
119
  .tooltip {
120
- color: var(--theme-muted-text-color, #6c757d);
120
+ color: var(--theme-muted-text-color, #5f6b76);
121
121
  }
122
122
  .tooltip:hover {
123
123
  color: var(--theme-app, #000000);