@uipath/apollo-wind 2.36.2 → 2.37.1

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/components/forms/field-renderer.cjs +2 -3
  2. package/dist/components/forms/field-renderer.js +3 -4
  3. package/dist/components/forms/form-designer.cjs +2 -3
  4. package/dist/components/forms/form-designer.js +3 -4
  5. package/dist/components/ui/file-upload.cjs +8 -2
  6. package/dist/components/ui/file-upload.d.ts +3 -0
  7. package/dist/components/ui/file-upload.js +8 -2
  8. package/dist/components/ui/index.cjs +12 -12
  9. package/dist/components/ui/input-group.cjs +59 -15
  10. package/dist/components/ui/input-group.d.ts +5 -1
  11. package/dist/components/ui/input-group.js +61 -17
  12. package/dist/components/ui/input.cjs +31 -7
  13. package/dist/components/ui/input.d.ts +7 -0
  14. package/dist/components/ui/input.js +33 -9
  15. package/dist/components/ui/label.cjs +20 -1
  16. package/dist/components/ui/label.d.ts +15 -1
  17. package/dist/components/ui/label.js +18 -2
  18. package/dist/components/ui/lockable-value-field/components/field-header.cjs +1 -4
  19. package/dist/components/ui/lockable-value-field/components/field-header.js +2 -5
  20. package/dist/components/ui/lockable-value-field/lockable-value-field.cjs +38 -5
  21. package/dist/components/ui/lockable-value-field/lockable-value-field.d.ts +1 -1
  22. package/dist/components/ui/lockable-value-field/lockable-value-field.js +38 -5
  23. package/dist/components/ui/lockable-value-field/types.d.ts +9 -1
  24. package/dist/components/ui/multi-select.cjs +4 -1
  25. package/dist/components/ui/multi-select.d.ts +3 -0
  26. package/dist/components/ui/multi-select.js +4 -1
  27. package/dist/components/ui/prompt-editor/components/MarkdownPreview.cjs +2 -2
  28. package/dist/components/ui/prompt-editor/components/MarkdownPreview.js +2 -2
  29. package/dist/components/ui/prompt-editor/types.cjs +5 -5
  30. package/dist/components/ui/prompt-editor/types.js +5 -5
  31. package/dist/index.cjs +3 -0
  32. package/dist/index.d.ts +2 -2
  33. package/dist/index.js +2 -2
  34. package/dist/styles.css +87 -6
  35. package/package.json +1 -1
@@ -4,4 +4,18 @@ import * as React from 'react';
4
4
  declare const labelVariants: (props?: import("class-variance-authority/types").ClassProp | undefined) => string;
5
5
  export type LabelProps = React.ComponentPropsWithoutRef<typeof LabelPrimitive.Root> & VariantProps<typeof labelVariants>;
6
6
  declare const Label: React.ForwardRefExoticComponent<Omit<LabelPrimitive.LabelProps & React.RefAttributes<HTMLLabelElement>, "ref"> & VariantProps<(props?: import("class-variance-authority/types").ClassProp | undefined) => string> & React.RefAttributes<HTMLLabelElement>>;
7
- export { Label };
7
+ export interface RequiredIndicatorProps extends Omit<React.HTMLAttributes<HTMLSpanElement>, 'children' | 'aria-hidden'> {
8
+ }
9
+ /**
10
+ * Marks a field as required. Place it right after the label text.
11
+ *
12
+ * Uses `text-current` rather than an error/destructive color: an untouched
13
+ * required field isn't in an error state, so coloring the asterisk red reads
14
+ * as a validation failure before the person has done anything. The asterisk
15
+ * glyph is `aria-hidden` since it's a visual affordance, not the thing that
16
+ * makes the field required to assistive tech; a `sr-only` "(required)" is
17
+ * included alongside it so the label still announces the requirement even if
18
+ * the field's own control is missing `required`/`aria-required`.
19
+ */
20
+ declare const RequiredIndicator: React.ForwardRefExoticComponent<RequiredIndicatorProps & React.RefAttributes<HTMLSpanElement>>;
21
+ export { Label, RequiredIndicator };
@@ -1,4 +1,4 @@
1
- import { jsx } from "react/jsx-runtime";
1
+ import { jsx, jsxs } from "react/jsx-runtime";
2
2
  import { Root } from "@radix-ui/react-label";
3
3
  import { cva } from "class-variance-authority";
4
4
  import { forwardRef } from "react";
@@ -11,4 +11,20 @@ const Label = /*#__PURE__*/ forwardRef(({ className, ...props }, ref)=>/*#__PURE
11
11
  ...props
12
12
  }));
13
13
  Label.displayName = Root.displayName;
14
- export { Label };
14
+ const RequiredIndicator = /*#__PURE__*/ forwardRef(({ className, ...props }, ref)=>/*#__PURE__*/ jsxs("span", {
15
+ ref: ref,
16
+ ...props,
17
+ className: cn('ml-0.5 text-current', className),
18
+ children: [
19
+ /*#__PURE__*/ jsx("span", {
20
+ "aria-hidden": "true",
21
+ children: "*"
22
+ }),
23
+ /*#__PURE__*/ jsx("span", {
24
+ className: "sr-only",
25
+ children: " (required)"
26
+ })
27
+ ]
28
+ }));
29
+ RequiredIndicator.displayName = 'RequiredIndicator';
30
+ export { Label, RequiredIndicator };
@@ -54,10 +54,7 @@ function FieldHeader({ label, fieldId, fieldLabel, required, fieldType, onFieldT
54
54
  className: "text-xs font-medium text-foreground-muted",
55
55
  children: [
56
56
  fieldLabel,
57
- required && /*#__PURE__*/ (0, jsx_runtime_namespaceObject.jsx)("span", {
58
- className: "ml-0.5 text-destructive",
59
- children: "*"
60
- })
57
+ required && /*#__PURE__*/ (0, jsx_runtime_namespaceObject.jsx)(external_label_cjs_namespaceObject.RequiredIndicator, {})
61
58
  ]
62
59
  }),
63
60
  /*#__PURE__*/ (0, jsx_runtime_namespaceObject.jsx)(external_tooltip_cjs_namespaceObject.TooltipProvider, {
@@ -3,7 +3,7 @@ import { Asterisk, Braces, ChevronDown, Sparkles } from "lucide-react";
3
3
  import { useId, useState } from "react";
4
4
  import { Button } from "../../button.js";
5
5
  import { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuTrigger } from "../../dropdown-menu.js";
6
- import { Label } from "../../label.js";
6
+ import { Label, RequiredIndicator } from "../../label.js";
7
7
  import { Popover, PopoverContent, PopoverTrigger } from "../../popover.js";
8
8
  import { Switch } from "../../switch.js";
9
9
  import { Textarea } from "../../textarea.js";
@@ -26,10 +26,7 @@ function FieldHeader({ label, fieldId, fieldLabel, required, fieldType, onFieldT
26
26
  className: "text-xs font-medium text-foreground-muted",
27
27
  children: [
28
28
  fieldLabel,
29
- required && /*#__PURE__*/ jsx("span", {
30
- className: "ml-0.5 text-destructive",
31
- children: "*"
32
- })
29
+ required && /*#__PURE__*/ jsx(RequiredIndicator, {})
33
30
  ]
34
31
  }),
35
32
  /*#__PURE__*/ jsx(TooltipProvider, {
@@ -44,11 +44,12 @@ const lock_toggle_button_cjs_namespaceObject = require("./components/lock-toggle
44
44
  const mode_menu_item_cjs_namespaceObject = require("./components/mode-menu-item.cjs");
45
45
  const external_types_cjs_namespaceObject = require("./types.cjs");
46
46
  const external_utils_cjs_namespaceObject = require("./utils.cjs");
47
- function LockableValueField({ value = '', onValueChange, onValueBlur, locked = true, onLockedChange, mode = 'fixed', onModeChange, renderExpressionEditor, fieldType = 'string', onFieldTypeChange, required, onRequiredChange, label, fileUploadAriaLabel, headerActions, compact, controlsVisibility = 'visible', showFieldActions = true, options = external_utils_cjs_namespaceObject.DEFAULT_SELECT_OPTIONS, onGenerateWithAi, variables = [], id, className }) {
48
- const generatedId = (0, external_react_namespaceObject.useId)();
47
+ function LockableValueField({ value = '', onValueChange, onValueBlur, locked = true, onLockedChange, mode = 'fixed', onModeChange, renderExpressionEditor, fieldType = 'string', onFieldTypeChange, required, onRequiredChange, label, error, errorId, fileUploadAriaLabel, headerActions, compact, controlsVisibility = 'visible', showFieldActions = true, options = external_utils_cjs_namespaceObject.DEFAULT_SELECT_OPTIONS, onGenerateWithAi, variables = [], id, className }) {
48
+ const generatedId = (0, external_react_namespaceObject.useId)().replace(/:/g, '');
49
49
  const [datePopoverOpen, setDatePopoverOpen] = (0, external_react_namespaceObject.useState)(false);
50
50
  const [selectOpen, setSelectOpen] = (0, external_react_namespaceObject.useState)(false);
51
51
  const fieldId = id ?? generatedId;
52
+ const validationId = errorId ?? `${fieldId}-error`;
52
53
  const typeMeta = external_types_cjs_namespaceObject.FIELD_TYPE_META[fieldType];
53
54
  const effectiveMode = typeMeta.supportsExpression ? mode : 'fixed';
54
55
  const editableOnValueChange = locked ? void 0 : onValueChange;
@@ -77,6 +78,8 @@ function LockableValueField({ value = '', onValueChange, onValueBlur, locked = t
77
78
  headerActions: headerActions
78
79
  }),
79
80
  typeMeta.supportsExpression ? /*#__PURE__*/ (0, jsx_runtime_namespaceObject.jsxs)(external_input_group_cjs_namespaceObject.InputGroup, {
81
+ error: error,
82
+ errorId: validationId,
80
83
  children: [
81
84
  /*#__PURE__*/ (0, jsx_runtime_namespaceObject.jsx)(external_input_group_cjs_namespaceObject.InputGroupAddon, {
82
85
  align: "inline-start",
@@ -92,7 +95,11 @@ function LockableValueField({ value = '', onValueChange, onValueBlur, locked = t
92
95
  onBlur: onValueBlur,
93
96
  readOnly: !editableOnValueChange,
94
97
  placeholder: fieldLabel,
95
- fieldType
98
+ fieldType,
99
+ 'aria-invalid': error ? true : void 0,
100
+ 'aria-describedby': error ? validationId : void 0,
101
+ 'aria-errormessage': error ? validationId : void 0,
102
+ 'data-slot': 'input-group-control'
96
103
  }) : /*#__PURE__*/ (0, jsx_runtime_namespaceObject.jsx)(external_input_group_cjs_namespaceObject.InputGroupInput, {
97
104
  id: fieldId,
98
105
  readOnly: !editableOnValueChange,
@@ -111,6 +118,9 @@ function LockableValueField({ value = '', onValueChange, onValueBlur, locked = t
111
118
  className: "flex h-full flex-1 items-center px-3",
112
119
  children: /*#__PURE__*/ (0, jsx_runtime_namespaceObject.jsx)(external_switch_cjs_namespaceObject.Switch, {
113
120
  id: fieldId,
121
+ "aria-invalid": error ? true : void 0,
122
+ "aria-describedby": error ? validationId : void 0,
123
+ "aria-errormessage": error ? validationId : void 0,
114
124
  checked: 'true' === value,
115
125
  onCheckedChange: (checked)=>onValueChange?.(String(checked)),
116
126
  onBlur: onValueBlur,
@@ -129,6 +139,9 @@ function LockableValueField({ value = '', onValueChange, onValueBlur, locked = t
129
139
  type: "button",
130
140
  id: fieldId,
131
141
  "data-slot": "input-group-control",
142
+ "aria-invalid": error ? true : void 0,
143
+ "aria-describedby": error ? validationId : void 0,
144
+ "aria-errormessage": error ? validationId : void 0,
132
145
  disabled: !onValueChange,
133
146
  className: "flex h-full flex-1 items-center text-left text-sm text-foreground outline-none disabled:cursor-not-allowed disabled:opacity-50",
134
147
  children: value ? (0, external_utils_cjs_namespaceObject.formatDateValue)(value) : /*#__PURE__*/ (0, jsx_runtime_namespaceObject.jsx)("span", {
@@ -204,6 +217,9 @@ function LockableValueField({ value = '', onValueChange, onValueBlur, locked = t
204
217
  }),
205
218
  locked ? /*#__PURE__*/ (0, jsx_runtime_namespaceObject.jsx)(external_input_cjs_namespaceObject.Input, {
206
219
  id: fieldId,
220
+ "aria-invalid": error ? true : void 0,
221
+ "aria-describedby": error ? validationId : void 0,
222
+ "aria-errormessage": error ? validationId : void 0,
207
223
  readOnly: true,
208
224
  value: lockedDisplayValue,
209
225
  placeholder: fieldLabel,
@@ -222,6 +238,9 @@ function LockableValueField({ value = '', onValueChange, onValueBlur, locked = t
222
238
  /*#__PURE__*/ (0, jsx_runtime_namespaceObject.jsx)(external_select_cjs_namespaceObject.SelectTrigger, {
223
239
  id: fieldId,
224
240
  className: "flex-1",
241
+ "aria-invalid": error ? true : void 0,
242
+ "aria-describedby": error ? validationId : void 0,
243
+ "aria-errormessage": error ? validationId : void 0,
225
244
  children: /*#__PURE__*/ (0, jsx_runtime_namespaceObject.jsx)(external_select_cjs_namespaceObject.SelectValue, {
226
245
  placeholder: "Select an option"
227
246
  })
@@ -241,16 +260,30 @@ function LockableValueField({ value = '', onValueChange, onValueBlur, locked = t
241
260
  onChange: (selected)=>onValueChange?.(JSON.stringify(selected)),
242
261
  placeholder: "Select options...",
243
262
  disabled: !onValueChange,
244
- onBlur: onValueBlur
263
+ onBlur: onValueBlur,
264
+ "aria-invalid": error ? true : void 0,
265
+ "aria-describedby": error ? validationId : void 0,
266
+ "aria-errormessage": error ? validationId : void 0
245
267
  }) : 'file' === fieldType && /*#__PURE__*/ (0, jsx_runtime_namespaceObject.jsx)(external_file_upload_cjs_namespaceObject.FileUpload, {
246
268
  id: fieldId,
247
269
  ariaLabel: fileUploadAriaLabel ?? ('string' == typeof label ? label : fieldLabel),
248
270
  className: "flex-1",
249
271
  onFilesChange: (files)=>onValueChange?.(files.map((f)=>f.name).join(', ')),
250
272
  disabled: !onValueChange,
251
- onBlur: onValueBlur
273
+ onBlur: onValueBlur,
274
+ "aria-invalid": error ? true : void 0,
275
+ "aria-describedby": error ? validationId : void 0,
276
+ "aria-errormessage": error ? validationId : void 0
252
277
  })
253
278
  ]
279
+ }),
280
+ error && !typeMeta.supportsExpression && /*#__PURE__*/ (0, jsx_runtime_namespaceObject.jsx)("p", {
281
+ id: validationId,
282
+ "data-slot": "lockable-value-field-error",
283
+ "aria-live": "polite",
284
+ "aria-atomic": "true",
285
+ className: "mt-1 text-xs leading-4 text-error",
286
+ children: error
254
287
  })
255
288
  ]
256
289
  });
@@ -11,4 +11,4 @@ import type { LockableValueFieldProps } from './types';
11
11
  * Insert-variable menu is empty (and disabled) unless `variables` is
12
12
  * provided; file uploads aren't persisted anywhere.
13
13
  */
14
- export declare function LockableValueField({ value, onValueChange, onValueBlur, locked, onLockedChange, mode, onModeChange, renderExpressionEditor, fieldType, onFieldTypeChange, required, onRequiredChange, label, fileUploadAriaLabel, headerActions, compact, controlsVisibility, showFieldActions, options, onGenerateWithAi, variables, id, className, }: LockableValueFieldProps): import("react/jsx-runtime").JSX.Element;
14
+ export declare function LockableValueField({ value, onValueChange, onValueBlur, locked, onLockedChange, mode, onModeChange, renderExpressionEditor, fieldType, onFieldTypeChange, required, onRequiredChange, label, error, errorId, fileUploadAriaLabel, headerActions, compact, controlsVisibility, showFieldActions, options, onGenerateWithAi, variables, id, className, }: LockableValueFieldProps): import("react/jsx-runtime").JSX.Element;
@@ -16,11 +16,12 @@ import { LockToggleButton } from "./components/lock-toggle-button.js";
16
16
  import { ModeMenuItem } from "./components/mode-menu-item.js";
17
17
  import { FIELD_TYPE_META } from "./types.js";
18
18
  import { DEFAULT_SELECT_OPTIONS, formatDateValue, getLockedDisplayValue, parseDateValue, parseListValue, toDateOnlyString } from "./utils.js";
19
- function LockableValueField({ value = '', onValueChange, onValueBlur, locked = true, onLockedChange, mode = 'fixed', onModeChange, renderExpressionEditor, fieldType = 'string', onFieldTypeChange, required, onRequiredChange, label, fileUploadAriaLabel, headerActions, compact, controlsVisibility = 'visible', showFieldActions = true, options = DEFAULT_SELECT_OPTIONS, onGenerateWithAi, variables = [], id, className }) {
20
- const generatedId = useId();
19
+ function LockableValueField({ value = '', onValueChange, onValueBlur, locked = true, onLockedChange, mode = 'fixed', onModeChange, renderExpressionEditor, fieldType = 'string', onFieldTypeChange, required, onRequiredChange, label, error, errorId, fileUploadAriaLabel, headerActions, compact, controlsVisibility = 'visible', showFieldActions = true, options = DEFAULT_SELECT_OPTIONS, onGenerateWithAi, variables = [], id, className }) {
20
+ const generatedId = useId().replace(/:/g, '');
21
21
  const [datePopoverOpen, setDatePopoverOpen] = useState(false);
22
22
  const [selectOpen, setSelectOpen] = useState(false);
23
23
  const fieldId = id ?? generatedId;
24
+ const validationId = errorId ?? `${fieldId}-error`;
24
25
  const typeMeta = FIELD_TYPE_META[fieldType];
25
26
  const effectiveMode = typeMeta.supportsExpression ? mode : 'fixed';
26
27
  const editableOnValueChange = locked ? void 0 : onValueChange;
@@ -49,6 +50,8 @@ function LockableValueField({ value = '', onValueChange, onValueBlur, locked = t
49
50
  headerActions: headerActions
50
51
  }),
51
52
  typeMeta.supportsExpression ? /*#__PURE__*/ jsxs(InputGroup, {
53
+ error: error,
54
+ errorId: validationId,
52
55
  children: [
53
56
  /*#__PURE__*/ jsx(InputGroupAddon, {
54
57
  align: "inline-start",
@@ -64,7 +67,11 @@ function LockableValueField({ value = '', onValueChange, onValueBlur, locked = t
64
67
  onBlur: onValueBlur,
65
68
  readOnly: !editableOnValueChange,
66
69
  placeholder: fieldLabel,
67
- fieldType
70
+ fieldType,
71
+ 'aria-invalid': error ? true : void 0,
72
+ 'aria-describedby': error ? validationId : void 0,
73
+ 'aria-errormessage': error ? validationId : void 0,
74
+ 'data-slot': 'input-group-control'
68
75
  }) : /*#__PURE__*/ jsx(InputGroupInput, {
69
76
  id: fieldId,
70
77
  readOnly: !editableOnValueChange,
@@ -83,6 +90,9 @@ function LockableValueField({ value = '', onValueChange, onValueBlur, locked = t
83
90
  className: "flex h-full flex-1 items-center px-3",
84
91
  children: /*#__PURE__*/ jsx(Switch, {
85
92
  id: fieldId,
93
+ "aria-invalid": error ? true : void 0,
94
+ "aria-describedby": error ? validationId : void 0,
95
+ "aria-errormessage": error ? validationId : void 0,
86
96
  checked: 'true' === value,
87
97
  onCheckedChange: (checked)=>onValueChange?.(String(checked)),
88
98
  onBlur: onValueBlur,
@@ -101,6 +111,9 @@ function LockableValueField({ value = '', onValueChange, onValueBlur, locked = t
101
111
  type: "button",
102
112
  id: fieldId,
103
113
  "data-slot": "input-group-control",
114
+ "aria-invalid": error ? true : void 0,
115
+ "aria-describedby": error ? validationId : void 0,
116
+ "aria-errormessage": error ? validationId : void 0,
104
117
  disabled: !onValueChange,
105
118
  className: "flex h-full flex-1 items-center text-left text-sm text-foreground outline-none disabled:cursor-not-allowed disabled:opacity-50",
106
119
  children: value ? formatDateValue(value) : /*#__PURE__*/ jsx("span", {
@@ -176,6 +189,9 @@ function LockableValueField({ value = '', onValueChange, onValueBlur, locked = t
176
189
  }),
177
190
  locked ? /*#__PURE__*/ jsx(Input, {
178
191
  id: fieldId,
192
+ "aria-invalid": error ? true : void 0,
193
+ "aria-describedby": error ? validationId : void 0,
194
+ "aria-errormessage": error ? validationId : void 0,
179
195
  readOnly: true,
180
196
  value: lockedDisplayValue,
181
197
  placeholder: fieldLabel,
@@ -194,6 +210,9 @@ function LockableValueField({ value = '', onValueChange, onValueBlur, locked = t
194
210
  /*#__PURE__*/ jsx(SelectTrigger, {
195
211
  id: fieldId,
196
212
  className: "flex-1",
213
+ "aria-invalid": error ? true : void 0,
214
+ "aria-describedby": error ? validationId : void 0,
215
+ "aria-errormessage": error ? validationId : void 0,
197
216
  children: /*#__PURE__*/ jsx(SelectValue, {
198
217
  placeholder: "Select an option"
199
218
  })
@@ -213,16 +232,30 @@ function LockableValueField({ value = '', onValueChange, onValueBlur, locked = t
213
232
  onChange: (selected)=>onValueChange?.(JSON.stringify(selected)),
214
233
  placeholder: "Select options...",
215
234
  disabled: !onValueChange,
216
- onBlur: onValueBlur
235
+ onBlur: onValueBlur,
236
+ "aria-invalid": error ? true : void 0,
237
+ "aria-describedby": error ? validationId : void 0,
238
+ "aria-errormessage": error ? validationId : void 0
217
239
  }) : 'file' === fieldType && /*#__PURE__*/ jsx(FileUpload, {
218
240
  id: fieldId,
219
241
  ariaLabel: fileUploadAriaLabel ?? ('string' == typeof label ? label : fieldLabel),
220
242
  className: "flex-1",
221
243
  onFilesChange: (files)=>onValueChange?.(files.map((f)=>f.name).join(', ')),
222
244
  disabled: !onValueChange,
223
- onBlur: onValueBlur
245
+ onBlur: onValueBlur,
246
+ "aria-invalid": error ? true : void 0,
247
+ "aria-describedby": error ? validationId : void 0,
248
+ "aria-errormessage": error ? validationId : void 0
224
249
  })
225
250
  ]
251
+ }),
252
+ error && !typeMeta.supportsExpression && /*#__PURE__*/ jsx("p", {
253
+ id: validationId,
254
+ "data-slot": "lockable-value-field-error",
255
+ "aria-live": "polite",
256
+ "aria-atomic": "true",
257
+ className: "mt-1 text-xs leading-4 text-error",
258
+ children: error
226
259
  })
227
260
  ]
228
261
  });
@@ -1,5 +1,5 @@
1
1
  import { type LucideIcon } from 'lucide-react';
2
- import type { ReactNode } from 'react';
2
+ import type { AriaAttributes, ReactNode } from 'react';
3
3
  export type LockableValueFieldMode = 'fixed' | 'expression';
4
4
  export type LockableFieldType = 'string' | 'integer' | 'date' | 'boolean' | 'single-select' | 'multi-select' | 'file';
5
5
  interface FieldTypeMeta {
@@ -42,6 +42,10 @@ export interface LockableValueFieldProps {
42
42
  readOnly: boolean;
43
43
  placeholder: string;
44
44
  fieldType: LockableFieldType;
45
+ 'aria-invalid'?: AriaAttributes['aria-invalid'];
46
+ 'aria-describedby'?: string;
47
+ 'aria-errormessage'?: string;
48
+ 'data-slot'?: string;
45
49
  }) => ReactNode;
46
50
  /** The field's data type. Defaults to 'string'. Determines which control renders the value. */
47
51
  fieldType?: LockableFieldType;
@@ -53,6 +57,10 @@ export interface LockableValueFieldProps {
53
57
  onRequiredChange?: (required: boolean) => void;
54
58
  /** Overrides the default mode-based label (e.g. a field name instead of "String value"). */
55
59
  label?: ReactNode;
60
+ /** Field-specific validation feedback rendered immediately below the active control. */
61
+ error?: ReactNode;
62
+ /** Optional id for the inline validation message. */
63
+ errorId?: string;
56
64
  /** Accessible name for the file-upload dropzone. Defaults to a string `label`, then the computed field label. */
57
65
  fileUploadAriaLabel?: string;
58
66
  /** Extra content rendered after the built-in AI assist / Insert variable buttons (e.g. a delete button). */
@@ -35,7 +35,7 @@ const external_checkbox_cjs_namespaceObject = require("./checkbox.cjs");
35
35
  const external_command_cjs_namespaceObject = require("./command.cjs");
36
36
  const external_popover_cjs_namespaceObject = require("./popover.cjs");
37
37
  const index_cjs_namespaceObject = require("../../lib/index.cjs");
38
- const MultiSelect = /*#__PURE__*/ external_react_namespaceObject.forwardRef(({ id, options, selected, onChange, placeholder = 'Select items...', emptyMessage = 'No items found.', className, maxSelected, disabled = false, searchPlaceholder = 'Search...', clearAllText, onBlur }, ref)=>{
38
+ const MultiSelect = /*#__PURE__*/ external_react_namespaceObject.forwardRef(({ id, options, selected, onChange, placeholder = 'Select items...', emptyMessage = 'No items found.', className, maxSelected, disabled = false, searchPlaceholder = 'Search...', clearAllText, onBlur, 'aria-invalid': ariaInvalid, 'aria-describedby': ariaDescribedBy, 'aria-errormessage': ariaErrorMessage }, ref)=>{
39
39
  const [open, setOpen] = external_react_namespaceObject.useState(false);
40
40
  const handleUnselect = (value)=>{
41
41
  onChange(selected.filter((s)=>s !== value));
@@ -71,6 +71,9 @@ const MultiSelect = /*#__PURE__*/ external_react_namespaceObject.forwardRef(({ i
71
71
  variant: "outline",
72
72
  role: "combobox",
73
73
  "aria-expanded": open,
74
+ "aria-invalid": ariaInvalid,
75
+ "aria-describedby": ariaDescribedBy,
76
+ "aria-errormessage": ariaErrorMessage,
74
77
  "aria-label": id ? void 0 : selected.length > 0 ? `${selected.length} ${1 === selected.length ? 'item' : 'items'} selected` : placeholder,
75
78
  className: (0, index_cjs_namespaceObject.cn)('w-full justify-between future:rounded-xl future:border-0 future:bg-surface-overlay future:hover:bg-surface-hover future:font-normal future:text-muted-foreground', selected.length > 0 ? 'h-auto min-h-10' : 'h-10'),
76
79
  disabled: disabled,
@@ -17,6 +17,9 @@ export interface MultiSelectProps {
17
17
  clearAllText?: string | ((count: number) => string);
18
18
  /** Called when the multi-select popover closes after being opened. */
19
19
  onBlur?: () => void;
20
+ 'aria-invalid'?: React.AriaAttributes['aria-invalid'];
21
+ 'aria-describedby'?: string;
22
+ 'aria-errormessage'?: string;
20
23
  }
21
24
  declare const MultiSelect: React.ForwardRefExoticComponent<MultiSelectProps & React.RefAttributes<HTMLDivElement>>;
22
25
  export { MultiSelect };
@@ -7,7 +7,7 @@ import { Checkbox } from "./checkbox.js";
7
7
  import { Command, CommandEmpty, CommandGroup, CommandInput, CommandItem, CommandList } from "./command.js";
8
8
  import { Popover, PopoverContent, PopoverTrigger } from "./popover.js";
9
9
  import { cn } from "../../lib/index.js";
10
- const MultiSelect = /*#__PURE__*/ forwardRef(({ id, options, selected, onChange, placeholder = 'Select items...', emptyMessage = 'No items found.', className, maxSelected, disabled = false, searchPlaceholder = 'Search...', clearAllText, onBlur }, ref)=>{
10
+ const MultiSelect = /*#__PURE__*/ forwardRef(({ id, options, selected, onChange, placeholder = 'Select items...', emptyMessage = 'No items found.', className, maxSelected, disabled = false, searchPlaceholder = 'Search...', clearAllText, onBlur, 'aria-invalid': ariaInvalid, 'aria-describedby': ariaDescribedBy, 'aria-errormessage': ariaErrorMessage }, ref)=>{
11
11
  const [open, setOpen] = useState(false);
12
12
  const handleUnselect = (value)=>{
13
13
  onChange(selected.filter((s)=>s !== value));
@@ -43,6 +43,9 @@ const MultiSelect = /*#__PURE__*/ forwardRef(({ id, options, selected, onChange,
43
43
  variant: "outline",
44
44
  role: "combobox",
45
45
  "aria-expanded": open,
46
+ "aria-invalid": ariaInvalid,
47
+ "aria-describedby": ariaDescribedBy,
48
+ "aria-errormessage": ariaErrorMessage,
46
49
  "aria-label": id ? void 0 : selected.length > 0 ? `${selected.length} ${1 === selected.length ? 'item' : 'items'} selected` : placeholder,
47
50
  className: cn('w-full justify-between future:rounded-xl future:border-0 future:bg-surface-overlay future:hover:bg-surface-hover future:font-normal future:text-muted-foreground', selected.length > 0 ? 'h-auto min-h-10' : 'h-10'),
48
51
  disabled: disabled,
@@ -70,8 +70,8 @@ const MARKDOWN_PREVIEW_STYLES = `
70
70
  .prompt-editor-preview th { font-weight: 600; background-color: var(--color-muted); }
71
71
  .prompt-editor-preview strong { font-weight: 700; }
72
72
  .prompt-editor-preview em { font-style: italic; }
73
- .prompt-editor-preview .token-pill { display: inline-flex; align-items: center; gap: 3px; height: 20px; padding: 0 4px; border-radius: 4px; font-size: 13px; line-height: 20px; vertical-align: middle; background: var(--color-primary-lighter); color: var(--color-foreground); }
74
- .prompt-editor-preview .token-pill svg { display: block; flex-shrink: 0; color: var(--color-primary); width: 14px; height: 14px; }
73
+ .prompt-editor-preview .token-pill { display: inline-flex; align-items: center; gap: 3px; height: 20px; padding: 0 4px; border-radius: 4px; font-size: 13px; line-height: 20px; vertical-align: middle; background: var(--color-info-background); color: var(--color-info-text); }
74
+ .prompt-editor-preview .token-pill svg { display: block; flex-shrink: 0; color: var(--color-info-icon); width: 14px; height: 14px; }
75
75
  `;
76
76
  const PURIFY_CONFIG = {
77
77
  ALLOWED_TAGS: [
@@ -32,8 +32,8 @@ const MARKDOWN_PREVIEW_STYLES = `
32
32
  .prompt-editor-preview th { font-weight: 600; background-color: var(--color-muted); }
33
33
  .prompt-editor-preview strong { font-weight: 700; }
34
34
  .prompt-editor-preview em { font-style: italic; }
35
- .prompt-editor-preview .token-pill { display: inline-flex; align-items: center; gap: 3px; height: 20px; padding: 0 4px; border-radius: 4px; font-size: 13px; line-height: 20px; vertical-align: middle; background: var(--color-primary-lighter); color: var(--color-foreground); }
36
- .prompt-editor-preview .token-pill svg { display: block; flex-shrink: 0; color: var(--color-primary); width: 14px; height: 14px; }
35
+ .prompt-editor-preview .token-pill { display: inline-flex; align-items: center; gap: 3px; height: 20px; padding: 0 4px; border-radius: 4px; font-size: 13px; line-height: 20px; vertical-align: middle; background: var(--color-info-background); color: var(--color-info-text); }
36
+ .prompt-editor-preview .token-pill svg { display: block; flex-shrink: 0; color: var(--color-info-icon); width: 14px; height: 14px; }
37
37
  `;
38
38
  const PURIFY_CONFIG = {
39
39
  ALLOWED_TAGS: [
@@ -31,14 +31,14 @@ __webpack_require__.d(__webpack_exports__, {
31
31
  });
32
32
  const getPromptEditorTokenColors = ()=>({
33
33
  valid: {
34
- background: 'var(--color-primary-lighter)',
35
- border: 'var(--color-primary)',
36
- text: 'var(--color-foreground)',
37
- icon: 'var(--color-primary)'
34
+ background: 'var(--color-info-background)',
35
+ border: 'var(--color-info-icon)',
36
+ text: 'var(--color-info-text)',
37
+ icon: 'var(--color-info-icon)'
38
38
  },
39
39
  invalid: {
40
40
  background: 'var(--color-error-background)',
41
- border: 'var(--color-error)',
41
+ border: 'var(--color-error-icon)',
42
42
  text: 'var(--color-error-text)',
43
43
  icon: 'var(--color-error-icon)'
44
44
  }
@@ -1,13 +1,13 @@
1
1
  const getPromptEditorTokenColors = ()=>({
2
2
  valid: {
3
- background: 'var(--color-primary-lighter)',
4
- border: 'var(--color-primary)',
5
- text: 'var(--color-foreground)',
6
- icon: 'var(--color-primary)'
3
+ background: 'var(--color-info-background)',
4
+ border: 'var(--color-info-icon)',
5
+ text: 'var(--color-info-text)',
6
+ icon: 'var(--color-info-icon)'
7
7
  },
8
8
  invalid: {
9
9
  background: 'var(--color-error-background)',
10
- border: 'var(--color-error)',
10
+ border: 'var(--color-error-icon)',
11
11
  text: 'var(--color-error-text)',
12
12
  icon: 'var(--color-error-icon)'
13
13
  }
package/dist/index.cjs CHANGED
@@ -71,6 +71,7 @@ __webpack_require__.d(__webpack_exports__, {
71
71
  Column: ()=>column_cjs_namespaceObject.Column,
72
72
  AlertDialogTrigger: ()=>alert_dialog_cjs_namespaceObject.AlertDialogTrigger,
73
73
  DrawerOverlay: ()=>drawer_cjs_namespaceObject.DrawerOverlay,
74
+ RequiredIndicator: ()=>label_cjs_namespaceObject.RequiredIndicator,
74
75
  CardContent: ()=>card_cjs_namespaceObject.CardContent,
75
76
  SelectValue: ()=>select_cjs_namespaceObject.SelectValue,
76
77
  Slider: ()=>slider_cjs_namespaceObject.Slider,
@@ -509,6 +510,7 @@ exports.Progress = __webpack_exports__.Progress;
509
510
  exports.PromptEditor = __webpack_exports__.PromptEditor;
510
511
  exports.RadioGroup = __webpack_exports__.RadioGroup;
511
512
  exports.RadioGroupItem = __webpack_exports__.RadioGroupItem;
513
+ exports.RequiredIndicator = __webpack_exports__.RequiredIndicator;
512
514
  exports.ResizableHandle = __webpack_exports__.ResizableHandle;
513
515
  exports.ResizablePanel = __webpack_exports__.ResizablePanel;
514
516
  exports.ResizablePanelGroup = __webpack_exports__.ResizablePanelGroup;
@@ -752,6 +754,7 @@ for(var __rspack_i in __webpack_exports__)if (-1 === [
752
754
  "PromptEditor",
753
755
  "RadioGroup",
754
756
  "RadioGroupItem",
757
+ "RequiredIndicator",
755
758
  "ResizableHandle",
756
759
  "ResizablePanel",
757
760
  "ResizablePanelGroup",
package/dist/index.d.ts CHANGED
@@ -18,8 +18,8 @@ export { FIELD_TYPE_META, FIELD_TYPE_ORDER, LockableValueField, } from './compon
18
18
  export type { LockableValueFieldProps, LockableValueFieldMode, LockableFieldType, LockableValueFieldOption, } from './components/ui/lockable-value-field';
19
19
  export { Textarea } from './components/ui/textarea';
20
20
  export type { TextareaProps } from './components/ui/textarea';
21
- export { Label } from './components/ui/label';
22
- export type { LabelProps } from './components/ui/label';
21
+ export { Label, RequiredIndicator } from './components/ui/label';
22
+ export type { LabelProps, RequiredIndicatorProps } from './components/ui/label';
23
23
  export { Checkbox } from './components/ui/checkbox';
24
24
  export type { CheckboxProps } from './components/ui/checkbox';
25
25
  export { RadioGroup, RadioGroupItem } from './components/ui/radio-group';
package/dist/index.js CHANGED
@@ -10,7 +10,7 @@ import { Input } from "./components/ui/input.js";
10
10
  import { InputGroup, InputGroupAddon, InputGroupButton, InputGroupInput, InputGroupText, InputGroupTextarea } from "./components/ui/input-group.js";
11
11
  import { FIELD_TYPE_META, FIELD_TYPE_ORDER, LockableValueField } from "./components/ui/lockable-value-field/index.js";
12
12
  import { Textarea } from "./components/ui/textarea.js";
13
- import { Label } from "./components/ui/label.js";
13
+ import { Label, RequiredIndicator } from "./components/ui/label.js";
14
14
  import { Checkbox } from "./components/ui/checkbox.js";
15
15
  import { RadioGroup, RadioGroupItem } from "./components/ui/radio-group.js";
16
16
  import { Switch } from "./components/ui/switch.js";
@@ -69,4 +69,4 @@ import { ExpressionBuilder, RuleBuilder, RulesEngine } from "./components/forms/
69
69
  import { DataFetcher, DataSourceBuilder, DataTransformers, FetchAdapter } from "./components/forms/data-fetcher.js";
70
70
  import { analyticsPlugin, auditPlugin, autoSavePlugin, formattingPlugin, validationPlugin, workflowPlugin } from "./components/forms/form-plugins.js";
71
71
  import { hasMinMaxStep, hasOptions, isCustomField, isFileField } from "./components/forms/form-schema.js";
72
- export { Accordion, AccordionContent, AccordionItem, AccordionTrigger, Alert, AlertDescription, AlertDialog, AlertDialogAction, AlertDialogCancel, AlertDialogContent, AlertDialogDescription, AlertDialogFooter, AlertDialogHeader, AlertDialogOverlay, AlertDialogPortal, AlertDialogTitle, AlertDialogTrigger, AlertTitle, AspectRatio, Avatar, AvatarFallback, AvatarImage, Badge, Breadcrumb, BreadcrumbEllipsis, BreadcrumbItem, BreadcrumbLink, BreadcrumbList, BreadcrumbPage, BreadcrumbSeparator, Button, ButtonGroup, ButtonGroupSeparator, ButtonGroupText, Calendar, Card, CardContent, CardDescription, CardFooter, CardHeader, CardTitle, ChartContainer, ChartLegend, ChartLegendContent, ChartStyle, ChartTooltip, ChartTooltipContent, Checkbox, Collapsible, CollapsibleContent, CollapsibleTrigger, Column, Combobox, Command, CommandDialog, CommandEmpty, CommandGroup, CommandInput, CommandItem, CommandList, CommandSeparator, CommandShortcut, ContextMenu, ContextMenuCheckboxItem, ContextMenuContent, ContextMenuGroup, ContextMenuItem, ContextMenuLabel, ContextMenuPortal, ContextMenuRadioGroup, ContextMenuRadioItem, ContextMenuSeparator, ContextMenuShortcut, ContextMenuSub, ContextMenuSubContent, ContextMenuSubTrigger, ContextMenuTrigger, DataFetcher, DataSourceBuilder, DataTable, DataTableColumnHeader, DataTableSelectColumn, DataTransformers, DatePicker, DateTimePicker, Dialog, DialogClose, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogOverlay, DialogPortal, DialogTitle, DialogTrigger, Drawer, DrawerClose, DrawerContent, DrawerDescription, DrawerFooter, DrawerHeader, DrawerOverlay, DrawerPortal, DrawerTitle, DrawerTrigger, DropdownMenu, DropdownMenuCheckboxItem, DropdownMenuContent, DropdownMenuGroup, DropdownMenuItem, DropdownMenuLabel, DropdownMenuPortal, DropdownMenuRadioGroup, DropdownMenuRadioItem, DropdownMenuSeparator, DropdownMenuShortcut, DropdownMenuSub, DropdownMenuSubContent, DropdownMenuSubTrigger, DropdownMenuTrigger, EditableCell, EmptyState, ExpressionBuilder, FIELD_TYPE_META, FIELD_TYPE_ORDER, FetchAdapter, FileUpload, FormDesigner, FormFieldRenderer, FormStateViewer, Grid, HoverCard, HoverCardContent, HoverCardTrigger, Input, InputGroup, InputGroupAddon, InputGroupButton, InputGroupInput, InputGroupText, InputGroupTextarea, Label, LockableValueField, MetadataForm, MultiSelect, Pagination, PaginationContent, PaginationEllipsis, PaginationItem, PaginationLink, PaginationNext, PaginationPrevious, Popover, PopoverAnchor, PopoverContent, PopoverTrigger, PortalContainerProvider, Progress, PromptEditor, RadioGroup, RadioGroupItem, ResizableHandle, ResizablePanel, ResizablePanelGroup, Row, RuleBuilder, RulesEngine, ScrollArea, ScrollBar, ScrollableTabsList, Search, SearchWithSuggestions, Select, SelectContent, SelectGroup, SelectItem, SelectLabel, SelectScrollDownButton, SelectScrollUpButton, SelectSeparator, SelectTrigger, SelectValue, Separator, Sheet, SheetClose, SheetContent, SheetDescription, SheetFooter, SheetHeader, SheetOverlay, SheetPortal, SheetTitle, SheetTrigger, Skeleton, Slider, Spinner, StatsCard, Stepper, Switch, Table, TableBody, TableCaption, TableCell, TableFooter, TableHead, TableHeader, TableRow, Tabs, TabsContent, TabsList, TabsTrigger, Textarea, Toaster, Toggle, ToggleGroup, ToggleGroupItem, Tooltip, TooltipContent, TooltipPortal, TooltipProvider, TooltipTrigger, tree_view as TreeView, VARIABLE_DRAG_MIME, VariablePicker, VariablePickerContent, analyticsPlugin, auditPlugin, autoSavePlugin, badgeVariants, buttonVariants, cn, createEditableColumn, formattingPlugin, hasMinMaxStep, hasOptions, isCustomField, isFileField, spinnerVariants, toast, toggleVariants, validationPlugin, workflowPlugin };
72
+ export { Accordion, AccordionContent, AccordionItem, AccordionTrigger, Alert, AlertDescription, AlertDialog, AlertDialogAction, AlertDialogCancel, AlertDialogContent, AlertDialogDescription, AlertDialogFooter, AlertDialogHeader, AlertDialogOverlay, AlertDialogPortal, AlertDialogTitle, AlertDialogTrigger, AlertTitle, AspectRatio, Avatar, AvatarFallback, AvatarImage, Badge, Breadcrumb, BreadcrumbEllipsis, BreadcrumbItem, BreadcrumbLink, BreadcrumbList, BreadcrumbPage, BreadcrumbSeparator, Button, ButtonGroup, ButtonGroupSeparator, ButtonGroupText, Calendar, Card, CardContent, CardDescription, CardFooter, CardHeader, CardTitle, ChartContainer, ChartLegend, ChartLegendContent, ChartStyle, ChartTooltip, ChartTooltipContent, Checkbox, Collapsible, CollapsibleContent, CollapsibleTrigger, Column, Combobox, Command, CommandDialog, CommandEmpty, CommandGroup, CommandInput, CommandItem, CommandList, CommandSeparator, CommandShortcut, ContextMenu, ContextMenuCheckboxItem, ContextMenuContent, ContextMenuGroup, ContextMenuItem, ContextMenuLabel, ContextMenuPortal, ContextMenuRadioGroup, ContextMenuRadioItem, ContextMenuSeparator, ContextMenuShortcut, ContextMenuSub, ContextMenuSubContent, ContextMenuSubTrigger, ContextMenuTrigger, DataFetcher, DataSourceBuilder, DataTable, DataTableColumnHeader, DataTableSelectColumn, DataTransformers, DatePicker, DateTimePicker, Dialog, DialogClose, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogOverlay, DialogPortal, DialogTitle, DialogTrigger, Drawer, DrawerClose, DrawerContent, DrawerDescription, DrawerFooter, DrawerHeader, DrawerOverlay, DrawerPortal, DrawerTitle, DrawerTrigger, DropdownMenu, DropdownMenuCheckboxItem, DropdownMenuContent, DropdownMenuGroup, DropdownMenuItem, DropdownMenuLabel, DropdownMenuPortal, DropdownMenuRadioGroup, DropdownMenuRadioItem, DropdownMenuSeparator, DropdownMenuShortcut, DropdownMenuSub, DropdownMenuSubContent, DropdownMenuSubTrigger, DropdownMenuTrigger, EditableCell, EmptyState, ExpressionBuilder, FIELD_TYPE_META, FIELD_TYPE_ORDER, FetchAdapter, FileUpload, FormDesigner, FormFieldRenderer, FormStateViewer, Grid, HoverCard, HoverCardContent, HoverCardTrigger, Input, InputGroup, InputGroupAddon, InputGroupButton, InputGroupInput, InputGroupText, InputGroupTextarea, Label, LockableValueField, MetadataForm, MultiSelect, Pagination, PaginationContent, PaginationEllipsis, PaginationItem, PaginationLink, PaginationNext, PaginationPrevious, Popover, PopoverAnchor, PopoverContent, PopoverTrigger, PortalContainerProvider, Progress, PromptEditor, RadioGroup, RadioGroupItem, RequiredIndicator, ResizableHandle, ResizablePanel, ResizablePanelGroup, Row, RuleBuilder, RulesEngine, ScrollArea, ScrollBar, ScrollableTabsList, Search, SearchWithSuggestions, Select, SelectContent, SelectGroup, SelectItem, SelectLabel, SelectScrollDownButton, SelectScrollUpButton, SelectSeparator, SelectTrigger, SelectValue, Separator, Sheet, SheetClose, SheetContent, SheetDescription, SheetFooter, SheetHeader, SheetOverlay, SheetPortal, SheetTitle, SheetTrigger, Skeleton, Slider, Spinner, StatsCard, Stepper, Switch, Table, TableBody, TableCaption, TableCell, TableFooter, TableHead, TableHeader, TableRow, Tabs, TabsContent, TabsList, TabsTrigger, Textarea, Toaster, Toggle, ToggleGroup, ToggleGroupItem, Tooltip, TooltipContent, TooltipPortal, TooltipProvider, TooltipTrigger, tree_view as TreeView, VARIABLE_DRAG_MIME, VariablePicker, VariablePickerContent, analyticsPlugin, auditPlugin, autoSavePlugin, badgeVariants, buttonVariants, cn, createEditableColumn, formattingPlugin, hasMinMaxStep, hasOptions, isCustomField, isFileField, spinnerVariants, toast, toggleVariants, validationPlugin, workflowPlugin };