@uipath/apollo-wind 2.32.3 → 2.33.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.
- package/dist/components/ui/alert-dialog.cjs +9 -3
- package/dist/components/ui/alert-dialog.d.ts +5 -2
- package/dist/components/ui/alert-dialog.js +9 -3
- package/dist/components/ui/dialog.cjs +4 -1
- package/dist/components/ui/dialog.d.ts +2 -0
- package/dist/components/ui/dialog.js +4 -1
- package/dist/components/ui/index.cjs +18 -18
- package/dist/components/ui/lockable-value-field/components/field-header.cjs +47 -50
- package/dist/components/ui/lockable-value-field/components/field-header.js +40 -43
- package/dist/components/ui/sheet.cjs +7 -2
- package/dist/components/ui/sheet.d.ts +2 -0
- package/dist/components/ui/sheet.js +7 -2
- package/dist/components/ui/variable-picker/index.cjs +39 -0
- package/dist/components/ui/variable-picker/index.d.ts +2 -0
- package/dist/components/ui/variable-picker/index.js +2 -0
- package/dist/components/ui/variable-picker/variable-picker.cjs +246 -0
- package/dist/components/ui/variable-picker/variable-picker.d.ts +42 -0
- package/dist/components/ui/variable-picker/variable-picker.js +209 -0
- package/dist/index.cjs +129 -122
- package/dist/index.d.ts +2 -0
- package/dist/index.js +2 -1
- package/dist/styles.css +72 -0
- package/package.json +1 -1
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __webpack_require__ = {};
|
|
3
|
+
(()=>{
|
|
4
|
+
__webpack_require__.d = (exports1, definition)=>{
|
|
5
|
+
for(var key in definition)if (__webpack_require__.o(definition, key) && !__webpack_require__.o(exports1, key)) Object.defineProperty(exports1, key, {
|
|
6
|
+
enumerable: true,
|
|
7
|
+
get: definition[key]
|
|
8
|
+
});
|
|
9
|
+
};
|
|
10
|
+
})();
|
|
11
|
+
(()=>{
|
|
12
|
+
__webpack_require__.o = (obj, prop)=>Object.prototype.hasOwnProperty.call(obj, prop);
|
|
13
|
+
})();
|
|
14
|
+
(()=>{
|
|
15
|
+
__webpack_require__.r = (exports1)=>{
|
|
16
|
+
if ("u" > typeof Symbol && Symbol.toStringTag) Object.defineProperty(exports1, Symbol.toStringTag, {
|
|
17
|
+
value: 'Module'
|
|
18
|
+
});
|
|
19
|
+
Object.defineProperty(exports1, '__esModule', {
|
|
20
|
+
value: true
|
|
21
|
+
});
|
|
22
|
+
};
|
|
23
|
+
})();
|
|
24
|
+
var __webpack_exports__ = {};
|
|
25
|
+
__webpack_require__.r(__webpack_exports__);
|
|
26
|
+
__webpack_require__.d(__webpack_exports__, {
|
|
27
|
+
VariablePicker: ()=>external_variable_picker_cjs_namespaceObject.VariablePicker,
|
|
28
|
+
VariablePickerContent: ()=>external_variable_picker_cjs_namespaceObject.VariablePickerContent
|
|
29
|
+
});
|
|
30
|
+
const external_variable_picker_cjs_namespaceObject = require("./variable-picker.cjs");
|
|
31
|
+
exports.VariablePicker = __webpack_exports__.VariablePicker;
|
|
32
|
+
exports.VariablePickerContent = __webpack_exports__.VariablePickerContent;
|
|
33
|
+
for(var __rspack_i in __webpack_exports__)if (-1 === [
|
|
34
|
+
"VariablePicker",
|
|
35
|
+
"VariablePickerContent"
|
|
36
|
+
].indexOf(__rspack_i)) exports[__rspack_i] = __webpack_exports__[__rspack_i];
|
|
37
|
+
Object.defineProperty(exports, '__esModule', {
|
|
38
|
+
value: true
|
|
39
|
+
});
|
|
@@ -0,0 +1,246 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
"use client";
|
|
3
|
+
var __webpack_require__ = {};
|
|
4
|
+
(()=>{
|
|
5
|
+
__webpack_require__.d = (exports1, definition)=>{
|
|
6
|
+
for(var key in definition)if (__webpack_require__.o(definition, key) && !__webpack_require__.o(exports1, key)) Object.defineProperty(exports1, key, {
|
|
7
|
+
enumerable: true,
|
|
8
|
+
get: definition[key]
|
|
9
|
+
});
|
|
10
|
+
};
|
|
11
|
+
})();
|
|
12
|
+
(()=>{
|
|
13
|
+
__webpack_require__.o = (obj, prop)=>Object.prototype.hasOwnProperty.call(obj, prop);
|
|
14
|
+
})();
|
|
15
|
+
(()=>{
|
|
16
|
+
__webpack_require__.r = (exports1)=>{
|
|
17
|
+
if ("u" > typeof Symbol && Symbol.toStringTag) Object.defineProperty(exports1, Symbol.toStringTag, {
|
|
18
|
+
value: 'Module'
|
|
19
|
+
});
|
|
20
|
+
Object.defineProperty(exports1, '__esModule', {
|
|
21
|
+
value: true
|
|
22
|
+
});
|
|
23
|
+
};
|
|
24
|
+
})();
|
|
25
|
+
var __webpack_exports__ = {};
|
|
26
|
+
__webpack_require__.r(__webpack_exports__);
|
|
27
|
+
__webpack_require__.d(__webpack_exports__, {
|
|
28
|
+
VariablePicker: ()=>VariablePicker,
|
|
29
|
+
VariablePickerContent: ()=>VariablePickerContent
|
|
30
|
+
});
|
|
31
|
+
const jsx_runtime_namespaceObject = require("react/jsx-runtime");
|
|
32
|
+
const external_lucide_react_namespaceObject = require("lucide-react");
|
|
33
|
+
const external_react_namespaceObject = require("react");
|
|
34
|
+
const external_command_cjs_namespaceObject = require("../command.cjs");
|
|
35
|
+
const external_popover_cjs_namespaceObject = require("../popover.cjs");
|
|
36
|
+
const index_cjs_namespaceObject = require("../../../lib/index.cjs");
|
|
37
|
+
const TYPE_LABEL = {
|
|
38
|
+
string: 'T',
|
|
39
|
+
number: '#',
|
|
40
|
+
boolean: '?',
|
|
41
|
+
object: '{}',
|
|
42
|
+
array: '[]',
|
|
43
|
+
null: '∅'
|
|
44
|
+
};
|
|
45
|
+
function VariableTypeBadge({ item }) {
|
|
46
|
+
const type = item.type ?? (item.children?.length ? 'object' : 'string');
|
|
47
|
+
return /*#__PURE__*/ (0, jsx_runtime_namespaceObject.jsx)("span", {
|
|
48
|
+
"aria-hidden": "true",
|
|
49
|
+
className: "inline-flex h-[18px] min-w-[18px] shrink-0 items-center justify-center rounded border border-border bg-surface-overlay px-0.5 font-mono text-[9px] font-semibold leading-none text-foreground-muted [&_svg]:size-2.75",
|
|
50
|
+
children: item.icon ?? TYPE_LABEL[type] ?? type
|
|
51
|
+
});
|
|
52
|
+
}
|
|
53
|
+
function itemMatches(item, normalizedQuery) {
|
|
54
|
+
return item.label.toLowerCase().includes(normalizedQuery) || item.value?.toLowerCase().includes(normalizedQuery) === true;
|
|
55
|
+
}
|
|
56
|
+
function filterItems(items, query) {
|
|
57
|
+
const normalizedQuery = query.trim().toLowerCase();
|
|
58
|
+
if (!normalizedQuery) return items;
|
|
59
|
+
return items.flatMap((item)=>{
|
|
60
|
+
if (itemMatches(item, normalizedQuery)) return [
|
|
61
|
+
item
|
|
62
|
+
];
|
|
63
|
+
const children = filterItems(item.children ?? [], normalizedQuery);
|
|
64
|
+
return children.length ? [
|
|
65
|
+
{
|
|
66
|
+
...item,
|
|
67
|
+
children
|
|
68
|
+
}
|
|
69
|
+
] : [];
|
|
70
|
+
});
|
|
71
|
+
}
|
|
72
|
+
function VariableRows({ items, filtering, expandedIds, onToggle, onSelect, insertLabel, depth = 0 }) {
|
|
73
|
+
return items.map((item)=>{
|
|
74
|
+
const hasChildren = !!item.children?.length;
|
|
75
|
+
const selectable = item.selectable ?? (!hasChildren || void 0 !== item.value);
|
|
76
|
+
const expanded = filtering || expandedIds.has(item.id);
|
|
77
|
+
const handleKeyDown = (event)=>{
|
|
78
|
+
if (!hasChildren || 'ArrowLeft' !== event.key && 'ArrowRight' !== event.key) return;
|
|
79
|
+
const shouldExpand = 'ArrowRight' === event.key;
|
|
80
|
+
if (expandedIds.has(item.id) !== shouldExpand) onToggle(item.id);
|
|
81
|
+
event.preventDefault();
|
|
82
|
+
};
|
|
83
|
+
return /*#__PURE__*/ (0, jsx_runtime_namespaceObject.jsxs)("div", {
|
|
84
|
+
role: "none",
|
|
85
|
+
children: [
|
|
86
|
+
/*#__PURE__*/ (0, jsx_runtime_namespaceObject.jsxs)(external_command_cjs_namespaceObject.CommandItem, {
|
|
87
|
+
value: item.id,
|
|
88
|
+
"aria-label": item.label,
|
|
89
|
+
disabled: item.disabled,
|
|
90
|
+
onKeyDown: handleKeyDown,
|
|
91
|
+
onSelect: ()=>hasChildren ? onToggle(item.id) : selectable && onSelect(item),
|
|
92
|
+
"data-expanded": hasChildren ? expanded : void 0,
|
|
93
|
+
className: "group min-h-0 gap-2 rounded-none py-1 pr-3.5 text-xs hover:bg-surface-overlay data-[selected=true]:bg-surface-overlay data-[selected=true]:text-foreground",
|
|
94
|
+
style: {
|
|
95
|
+
paddingLeft: `${8 + 16 * depth}px`
|
|
96
|
+
},
|
|
97
|
+
children: [
|
|
98
|
+
hasChildren ? /*#__PURE__*/ (0, jsx_runtime_namespaceObject.jsx)("span", {
|
|
99
|
+
className: "grid size-3 shrink-0 place-items-center",
|
|
100
|
+
children: /*#__PURE__*/ (0, jsx_runtime_namespaceObject.jsx)(external_lucide_react_namespaceObject.ChevronDown, {
|
|
101
|
+
size: 10,
|
|
102
|
+
className: (0, index_cjs_namespaceObject.cn)('!size-2.5 text-foreground-subtle transition-transform duration-100', !expanded && '-rotate-90')
|
|
103
|
+
})
|
|
104
|
+
}) : /*#__PURE__*/ (0, jsx_runtime_namespaceObject.jsx)("span", {
|
|
105
|
+
className: "size-3 shrink-0"
|
|
106
|
+
}),
|
|
107
|
+
/*#__PURE__*/ (0, jsx_runtime_namespaceObject.jsx)(VariableTypeBadge, {
|
|
108
|
+
item: item
|
|
109
|
+
}),
|
|
110
|
+
/*#__PURE__*/ (0, jsx_runtime_namespaceObject.jsx)("span", {
|
|
111
|
+
className: "min-w-0 flex-1 truncate font-mono text-foreground",
|
|
112
|
+
children: item.label
|
|
113
|
+
}),
|
|
114
|
+
item.trailingAdornment,
|
|
115
|
+
selectable && /*#__PURE__*/ (0, jsx_runtime_namespaceObject.jsx)("button", {
|
|
116
|
+
type: "button",
|
|
117
|
+
"aria-label": `${insertLabel}: ${item.label}`,
|
|
118
|
+
disabled: item.disabled,
|
|
119
|
+
onClick: (event)=>{
|
|
120
|
+
event.stopPropagation();
|
|
121
|
+
onSelect(item);
|
|
122
|
+
},
|
|
123
|
+
className: "grid size-5 shrink-0 place-items-center text-foreground-muted opacity-0 transition-opacity hover:text-foreground group-hover:opacity-100 group-data-[selected=true]:opacity-100 focus-visible:opacity-100",
|
|
124
|
+
children: /*#__PURE__*/ (0, jsx_runtime_namespaceObject.jsx)(external_lucide_react_namespaceObject.SquareArrowRightEnter, {
|
|
125
|
+
className: "!size-3.5"
|
|
126
|
+
})
|
|
127
|
+
})
|
|
128
|
+
]
|
|
129
|
+
}),
|
|
130
|
+
hasChildren && expanded && /*#__PURE__*/ (0, jsx_runtime_namespaceObject.jsx)(VariableRows, {
|
|
131
|
+
items: item.children,
|
|
132
|
+
filtering: filtering,
|
|
133
|
+
expandedIds: expandedIds,
|
|
134
|
+
onToggle: onToggle,
|
|
135
|
+
onSelect: onSelect,
|
|
136
|
+
insertLabel: insertLabel,
|
|
137
|
+
depth: depth + 1
|
|
138
|
+
})
|
|
139
|
+
]
|
|
140
|
+
}, item.id);
|
|
141
|
+
});
|
|
142
|
+
}
|
|
143
|
+
function VariablePickerContent({ items, onSelect, placeholder = 'Search variables...', emptyText = 'No variables found.', query: controlledQuery, initialQuery = '', onQueryChange, defaultExpandedIds, insertLabel = 'Insert variable', className }) {
|
|
144
|
+
const [uncontrolledQuery, setUncontrolledQuery] = (0, external_react_namespaceObject.useState)(initialQuery);
|
|
145
|
+
const [expandedIds, setExpandedIds] = (0, external_react_namespaceObject.useState)(()=>new Set(defaultExpandedIds ?? items.slice(0, 1).map((item)=>item.id)));
|
|
146
|
+
const query = controlledQuery ?? uncontrolledQuery;
|
|
147
|
+
const filteredItems = (0, external_react_namespaceObject.useMemo)(()=>filterItems(items, query), [
|
|
148
|
+
items,
|
|
149
|
+
query
|
|
150
|
+
]);
|
|
151
|
+
const setQuery = (nextQuery)=>{
|
|
152
|
+
if (void 0 === controlledQuery) setUncontrolledQuery(nextQuery);
|
|
153
|
+
onQueryChange?.(nextQuery);
|
|
154
|
+
};
|
|
155
|
+
const toggleExpanded = (id)=>{
|
|
156
|
+
setExpandedIds((current)=>{
|
|
157
|
+
const next = new Set(current);
|
|
158
|
+
if (next.has(id)) next.delete(id);
|
|
159
|
+
else next.add(id);
|
|
160
|
+
return next;
|
|
161
|
+
});
|
|
162
|
+
};
|
|
163
|
+
return /*#__PURE__*/ (0, jsx_runtime_namespaceObject.jsxs)(external_command_cjs_namespaceObject.Command, {
|
|
164
|
+
shouldFilter: false,
|
|
165
|
+
className: className,
|
|
166
|
+
children: [
|
|
167
|
+
/*#__PURE__*/ (0, jsx_runtime_namespaceObject.jsx)(external_command_cjs_namespaceObject.CommandInput, {
|
|
168
|
+
value: query,
|
|
169
|
+
onValueChange: setQuery,
|
|
170
|
+
placeholder: placeholder,
|
|
171
|
+
autoFocus: true
|
|
172
|
+
}),
|
|
173
|
+
/*#__PURE__*/ (0, jsx_runtime_namespaceObject.jsxs)(external_command_cjs_namespaceObject.CommandList, {
|
|
174
|
+
className: "max-h-72 bg-surface-overlay/40 py-1.5",
|
|
175
|
+
children: [
|
|
176
|
+
0 === filteredItems.length && /*#__PURE__*/ (0, jsx_runtime_namespaceObject.jsx)(external_command_cjs_namespaceObject.CommandEmpty, {
|
|
177
|
+
children: emptyText
|
|
178
|
+
}),
|
|
179
|
+
filteredItems.length > 0 && /*#__PURE__*/ (0, jsx_runtime_namespaceObject.jsx)(VariableRows, {
|
|
180
|
+
items: filteredItems,
|
|
181
|
+
filtering: query.trim().length > 0,
|
|
182
|
+
expandedIds: expandedIds,
|
|
183
|
+
onToggle: toggleExpanded,
|
|
184
|
+
onSelect: onSelect,
|
|
185
|
+
insertLabel: insertLabel
|
|
186
|
+
})
|
|
187
|
+
]
|
|
188
|
+
})
|
|
189
|
+
]
|
|
190
|
+
});
|
|
191
|
+
}
|
|
192
|
+
function VariablePicker({ children, align = 'end', disabled = false, open: controlledOpen, onOpenChange, triggerLabel = 'Insert', triggerAriaLabel = 'Insert variable', className, onSelect, ...contentProps }) {
|
|
193
|
+
const [uncontrolledOpen, setUncontrolledOpen] = (0, external_react_namespaceObject.useState)(false);
|
|
194
|
+
const open = controlledOpen ?? uncontrolledOpen;
|
|
195
|
+
const setOpen = (nextOpen)=>{
|
|
196
|
+
if (void 0 === controlledOpen) setUncontrolledOpen(nextOpen);
|
|
197
|
+
onOpenChange?.(nextOpen);
|
|
198
|
+
};
|
|
199
|
+
const selectItem = (item)=>{
|
|
200
|
+
onSelect(item);
|
|
201
|
+
setOpen(false);
|
|
202
|
+
};
|
|
203
|
+
return /*#__PURE__*/ (0, jsx_runtime_namespaceObject.jsxs)(external_popover_cjs_namespaceObject.Popover, {
|
|
204
|
+
open: open,
|
|
205
|
+
onOpenChange: setOpen,
|
|
206
|
+
children: [
|
|
207
|
+
/*#__PURE__*/ (0, jsx_runtime_namespaceObject.jsx)(external_popover_cjs_namespaceObject.PopoverTrigger, {
|
|
208
|
+
asChild: true,
|
|
209
|
+
disabled: disabled,
|
|
210
|
+
children: children ?? /*#__PURE__*/ (0, jsx_runtime_namespaceObject.jsxs)("button", {
|
|
211
|
+
type: "button",
|
|
212
|
+
"aria-label": triggerAriaLabel,
|
|
213
|
+
className: "flex h-7 items-center gap-1 rounded-lg px-2 text-[11px] text-foreground-subtle transition hover:bg-surface-overlay hover:text-foreground disabled:pointer-events-none disabled:opacity-50",
|
|
214
|
+
children: [
|
|
215
|
+
/*#__PURE__*/ (0, jsx_runtime_namespaceObject.jsx)(external_lucide_react_namespaceObject.Braces, {
|
|
216
|
+
size: 12
|
|
217
|
+
}),
|
|
218
|
+
/*#__PURE__*/ (0, jsx_runtime_namespaceObject.jsx)("span", {
|
|
219
|
+
children: triggerLabel
|
|
220
|
+
}),
|
|
221
|
+
/*#__PURE__*/ (0, jsx_runtime_namespaceObject.jsx)(external_lucide_react_namespaceObject.ChevronDown, {
|
|
222
|
+
size: 9
|
|
223
|
+
})
|
|
224
|
+
]
|
|
225
|
+
})
|
|
226
|
+
}),
|
|
227
|
+
/*#__PURE__*/ (0, jsx_runtime_namespaceObject.jsx)(external_popover_cjs_namespaceObject.PopoverContent, {
|
|
228
|
+
align: align,
|
|
229
|
+
className: (0, index_cjs_namespaceObject.cn)('w-[280px] max-w-[calc(100vw-1rem)] overflow-hidden p-0', className),
|
|
230
|
+
children: /*#__PURE__*/ (0, jsx_runtime_namespaceObject.jsx)(VariablePickerContent, {
|
|
231
|
+
...contentProps,
|
|
232
|
+
onSelect: selectItem
|
|
233
|
+
})
|
|
234
|
+
})
|
|
235
|
+
]
|
|
236
|
+
});
|
|
237
|
+
}
|
|
238
|
+
exports.VariablePicker = __webpack_exports__.VariablePicker;
|
|
239
|
+
exports.VariablePickerContent = __webpack_exports__.VariablePickerContent;
|
|
240
|
+
for(var __rspack_i in __webpack_exports__)if (-1 === [
|
|
241
|
+
"VariablePicker",
|
|
242
|
+
"VariablePickerContent"
|
|
243
|
+
].indexOf(__rspack_i)) exports[__rspack_i] = __webpack_exports__[__rspack_i];
|
|
244
|
+
Object.defineProperty(exports, '__esModule', {
|
|
245
|
+
value: true
|
|
246
|
+
});
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import type { ReactElement, ReactNode } from 'react';
|
|
2
|
+
export interface VariablePickerItem {
|
|
3
|
+
id: string;
|
|
4
|
+
label: string;
|
|
5
|
+
value?: string;
|
|
6
|
+
children?: VariablePickerItem[];
|
|
7
|
+
disabled?: boolean;
|
|
8
|
+
/** Branches are selectable when this is true or when they provide a value. */
|
|
9
|
+
selectable?: boolean;
|
|
10
|
+
icon?: ReactNode;
|
|
11
|
+
/** Consumer-defined type name. Known primitive types use the standard compact badge. */
|
|
12
|
+
type?: string;
|
|
13
|
+
/** Optional content rendered at the trailing edge, such as a type label or status chip. */
|
|
14
|
+
trailingAdornment?: ReactNode;
|
|
15
|
+
metadata?: unknown;
|
|
16
|
+
}
|
|
17
|
+
export interface VariablePickerContentProps {
|
|
18
|
+
items: VariablePickerItem[];
|
|
19
|
+
onSelect: (item: VariablePickerItem) => void;
|
|
20
|
+
placeholder?: string;
|
|
21
|
+
emptyText?: string;
|
|
22
|
+
query?: string;
|
|
23
|
+
initialQuery?: string;
|
|
24
|
+
onQueryChange?: (query: string) => void;
|
|
25
|
+
defaultExpandedIds?: Iterable<string>;
|
|
26
|
+
insertLabel?: string;
|
|
27
|
+
className?: string;
|
|
28
|
+
}
|
|
29
|
+
export interface VariablePickerProps extends VariablePickerContentProps {
|
|
30
|
+
/** A single element that Radix can use as the popover trigger. */
|
|
31
|
+
children?: ReactElement;
|
|
32
|
+
align?: 'start' | 'center' | 'end';
|
|
33
|
+
disabled?: boolean;
|
|
34
|
+
open?: boolean;
|
|
35
|
+
onOpenChange?: (open: boolean) => void;
|
|
36
|
+
triggerLabel?: string;
|
|
37
|
+
triggerAriaLabel?: string;
|
|
38
|
+
}
|
|
39
|
+
/** Search and tree content for embedding in a consumer-owned popover or caret-anchored surface. */
|
|
40
|
+
export declare function VariablePickerContent({ items, onSelect, placeholder, emptyText, query: controlledQuery, initialQuery, onQueryChange, defaultExpandedIds, insertLabel, className, }: VariablePickerContentProps): import("react/jsx-runtime").JSX.Element;
|
|
41
|
+
/** Popover-wrapped convenience picker for inserting a variable into a consumer-owned value. */
|
|
42
|
+
export declare function VariablePicker({ children, align, disabled, open: controlledOpen, onOpenChange, triggerLabel, triggerAriaLabel, className, onSelect, ...contentProps }: VariablePickerProps): import("react/jsx-runtime").JSX.Element;
|
|
@@ -0,0 +1,209 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
3
|
+
import { Braces, ChevronDown, SquareArrowRightEnter } from "lucide-react";
|
|
4
|
+
import { useMemo, useState } from "react";
|
|
5
|
+
import { Command, CommandEmpty, CommandInput, CommandItem, CommandList } from "../command.js";
|
|
6
|
+
import { Popover, PopoverContent, PopoverTrigger } from "../popover.js";
|
|
7
|
+
import { cn } from "../../../lib/index.js";
|
|
8
|
+
const TYPE_LABEL = {
|
|
9
|
+
string: 'T',
|
|
10
|
+
number: '#',
|
|
11
|
+
boolean: '?',
|
|
12
|
+
object: '{}',
|
|
13
|
+
array: '[]',
|
|
14
|
+
null: '∅'
|
|
15
|
+
};
|
|
16
|
+
function VariableTypeBadge({ item }) {
|
|
17
|
+
const type = item.type ?? (item.children?.length ? 'object' : 'string');
|
|
18
|
+
return /*#__PURE__*/ jsx("span", {
|
|
19
|
+
"aria-hidden": "true",
|
|
20
|
+
className: "inline-flex h-[18px] min-w-[18px] shrink-0 items-center justify-center rounded border border-border bg-surface-overlay px-0.5 font-mono text-[9px] font-semibold leading-none text-foreground-muted [&_svg]:size-2.75",
|
|
21
|
+
children: item.icon ?? TYPE_LABEL[type] ?? type
|
|
22
|
+
});
|
|
23
|
+
}
|
|
24
|
+
function itemMatches(item, normalizedQuery) {
|
|
25
|
+
return item.label.toLowerCase().includes(normalizedQuery) || item.value?.toLowerCase().includes(normalizedQuery) === true;
|
|
26
|
+
}
|
|
27
|
+
function filterItems(items, query) {
|
|
28
|
+
const normalizedQuery = query.trim().toLowerCase();
|
|
29
|
+
if (!normalizedQuery) return items;
|
|
30
|
+
return items.flatMap((item)=>{
|
|
31
|
+
if (itemMatches(item, normalizedQuery)) return [
|
|
32
|
+
item
|
|
33
|
+
];
|
|
34
|
+
const children = filterItems(item.children ?? [], normalizedQuery);
|
|
35
|
+
return children.length ? [
|
|
36
|
+
{
|
|
37
|
+
...item,
|
|
38
|
+
children
|
|
39
|
+
}
|
|
40
|
+
] : [];
|
|
41
|
+
});
|
|
42
|
+
}
|
|
43
|
+
function VariableRows({ items, filtering, expandedIds, onToggle, onSelect, insertLabel, depth = 0 }) {
|
|
44
|
+
return items.map((item)=>{
|
|
45
|
+
const hasChildren = !!item.children?.length;
|
|
46
|
+
const selectable = item.selectable ?? (!hasChildren || void 0 !== item.value);
|
|
47
|
+
const expanded = filtering || expandedIds.has(item.id);
|
|
48
|
+
const handleKeyDown = (event)=>{
|
|
49
|
+
if (!hasChildren || 'ArrowLeft' !== event.key && 'ArrowRight' !== event.key) return;
|
|
50
|
+
const shouldExpand = 'ArrowRight' === event.key;
|
|
51
|
+
if (expandedIds.has(item.id) !== shouldExpand) onToggle(item.id);
|
|
52
|
+
event.preventDefault();
|
|
53
|
+
};
|
|
54
|
+
return /*#__PURE__*/ jsxs("div", {
|
|
55
|
+
role: "none",
|
|
56
|
+
children: [
|
|
57
|
+
/*#__PURE__*/ jsxs(CommandItem, {
|
|
58
|
+
value: item.id,
|
|
59
|
+
"aria-label": item.label,
|
|
60
|
+
disabled: item.disabled,
|
|
61
|
+
onKeyDown: handleKeyDown,
|
|
62
|
+
onSelect: ()=>hasChildren ? onToggle(item.id) : selectable && onSelect(item),
|
|
63
|
+
"data-expanded": hasChildren ? expanded : void 0,
|
|
64
|
+
className: "group min-h-0 gap-2 rounded-none py-1 pr-3.5 text-xs hover:bg-surface-overlay data-[selected=true]:bg-surface-overlay data-[selected=true]:text-foreground",
|
|
65
|
+
style: {
|
|
66
|
+
paddingLeft: `${8 + 16 * depth}px`
|
|
67
|
+
},
|
|
68
|
+
children: [
|
|
69
|
+
hasChildren ? /*#__PURE__*/ jsx("span", {
|
|
70
|
+
className: "grid size-3 shrink-0 place-items-center",
|
|
71
|
+
children: /*#__PURE__*/ jsx(ChevronDown, {
|
|
72
|
+
size: 10,
|
|
73
|
+
className: cn('!size-2.5 text-foreground-subtle transition-transform duration-100', !expanded && '-rotate-90')
|
|
74
|
+
})
|
|
75
|
+
}) : /*#__PURE__*/ jsx("span", {
|
|
76
|
+
className: "size-3 shrink-0"
|
|
77
|
+
}),
|
|
78
|
+
/*#__PURE__*/ jsx(VariableTypeBadge, {
|
|
79
|
+
item: item
|
|
80
|
+
}),
|
|
81
|
+
/*#__PURE__*/ jsx("span", {
|
|
82
|
+
className: "min-w-0 flex-1 truncate font-mono text-foreground",
|
|
83
|
+
children: item.label
|
|
84
|
+
}),
|
|
85
|
+
item.trailingAdornment,
|
|
86
|
+
selectable && /*#__PURE__*/ jsx("button", {
|
|
87
|
+
type: "button",
|
|
88
|
+
"aria-label": `${insertLabel}: ${item.label}`,
|
|
89
|
+
disabled: item.disabled,
|
|
90
|
+
onClick: (event)=>{
|
|
91
|
+
event.stopPropagation();
|
|
92
|
+
onSelect(item);
|
|
93
|
+
},
|
|
94
|
+
className: "grid size-5 shrink-0 place-items-center text-foreground-muted opacity-0 transition-opacity hover:text-foreground group-hover:opacity-100 group-data-[selected=true]:opacity-100 focus-visible:opacity-100",
|
|
95
|
+
children: /*#__PURE__*/ jsx(SquareArrowRightEnter, {
|
|
96
|
+
className: "!size-3.5"
|
|
97
|
+
})
|
|
98
|
+
})
|
|
99
|
+
]
|
|
100
|
+
}),
|
|
101
|
+
hasChildren && expanded && /*#__PURE__*/ jsx(VariableRows, {
|
|
102
|
+
items: item.children,
|
|
103
|
+
filtering: filtering,
|
|
104
|
+
expandedIds: expandedIds,
|
|
105
|
+
onToggle: onToggle,
|
|
106
|
+
onSelect: onSelect,
|
|
107
|
+
insertLabel: insertLabel,
|
|
108
|
+
depth: depth + 1
|
|
109
|
+
})
|
|
110
|
+
]
|
|
111
|
+
}, item.id);
|
|
112
|
+
});
|
|
113
|
+
}
|
|
114
|
+
function VariablePickerContent({ items, onSelect, placeholder = 'Search variables...', emptyText = 'No variables found.', query: controlledQuery, initialQuery = '', onQueryChange, defaultExpandedIds, insertLabel = 'Insert variable', className }) {
|
|
115
|
+
const [uncontrolledQuery, setUncontrolledQuery] = useState(initialQuery);
|
|
116
|
+
const [expandedIds, setExpandedIds] = useState(()=>new Set(defaultExpandedIds ?? items.slice(0, 1).map((item)=>item.id)));
|
|
117
|
+
const query = controlledQuery ?? uncontrolledQuery;
|
|
118
|
+
const filteredItems = useMemo(()=>filterItems(items, query), [
|
|
119
|
+
items,
|
|
120
|
+
query
|
|
121
|
+
]);
|
|
122
|
+
const setQuery = (nextQuery)=>{
|
|
123
|
+
if (void 0 === controlledQuery) setUncontrolledQuery(nextQuery);
|
|
124
|
+
onQueryChange?.(nextQuery);
|
|
125
|
+
};
|
|
126
|
+
const toggleExpanded = (id)=>{
|
|
127
|
+
setExpandedIds((current)=>{
|
|
128
|
+
const next = new Set(current);
|
|
129
|
+
if (next.has(id)) next.delete(id);
|
|
130
|
+
else next.add(id);
|
|
131
|
+
return next;
|
|
132
|
+
});
|
|
133
|
+
};
|
|
134
|
+
return /*#__PURE__*/ jsxs(Command, {
|
|
135
|
+
shouldFilter: false,
|
|
136
|
+
className: className,
|
|
137
|
+
children: [
|
|
138
|
+
/*#__PURE__*/ jsx(CommandInput, {
|
|
139
|
+
value: query,
|
|
140
|
+
onValueChange: setQuery,
|
|
141
|
+
placeholder: placeholder,
|
|
142
|
+
autoFocus: true
|
|
143
|
+
}),
|
|
144
|
+
/*#__PURE__*/ jsxs(CommandList, {
|
|
145
|
+
className: "max-h-72 bg-surface-overlay/40 py-1.5",
|
|
146
|
+
children: [
|
|
147
|
+
0 === filteredItems.length && /*#__PURE__*/ jsx(CommandEmpty, {
|
|
148
|
+
children: emptyText
|
|
149
|
+
}),
|
|
150
|
+
filteredItems.length > 0 && /*#__PURE__*/ jsx(VariableRows, {
|
|
151
|
+
items: filteredItems,
|
|
152
|
+
filtering: query.trim().length > 0,
|
|
153
|
+
expandedIds: expandedIds,
|
|
154
|
+
onToggle: toggleExpanded,
|
|
155
|
+
onSelect: onSelect,
|
|
156
|
+
insertLabel: insertLabel
|
|
157
|
+
})
|
|
158
|
+
]
|
|
159
|
+
})
|
|
160
|
+
]
|
|
161
|
+
});
|
|
162
|
+
}
|
|
163
|
+
function VariablePicker({ children, align = 'end', disabled = false, open: controlledOpen, onOpenChange, triggerLabel = 'Insert', triggerAriaLabel = 'Insert variable', className, onSelect, ...contentProps }) {
|
|
164
|
+
const [uncontrolledOpen, setUncontrolledOpen] = useState(false);
|
|
165
|
+
const open = controlledOpen ?? uncontrolledOpen;
|
|
166
|
+
const setOpen = (nextOpen)=>{
|
|
167
|
+
if (void 0 === controlledOpen) setUncontrolledOpen(nextOpen);
|
|
168
|
+
onOpenChange?.(nextOpen);
|
|
169
|
+
};
|
|
170
|
+
const selectItem = (item)=>{
|
|
171
|
+
onSelect(item);
|
|
172
|
+
setOpen(false);
|
|
173
|
+
};
|
|
174
|
+
return /*#__PURE__*/ jsxs(Popover, {
|
|
175
|
+
open: open,
|
|
176
|
+
onOpenChange: setOpen,
|
|
177
|
+
children: [
|
|
178
|
+
/*#__PURE__*/ jsx(PopoverTrigger, {
|
|
179
|
+
asChild: true,
|
|
180
|
+
disabled: disabled,
|
|
181
|
+
children: children ?? /*#__PURE__*/ jsxs("button", {
|
|
182
|
+
type: "button",
|
|
183
|
+
"aria-label": triggerAriaLabel,
|
|
184
|
+
className: "flex h-7 items-center gap-1 rounded-lg px-2 text-[11px] text-foreground-subtle transition hover:bg-surface-overlay hover:text-foreground disabled:pointer-events-none disabled:opacity-50",
|
|
185
|
+
children: [
|
|
186
|
+
/*#__PURE__*/ jsx(Braces, {
|
|
187
|
+
size: 12
|
|
188
|
+
}),
|
|
189
|
+
/*#__PURE__*/ jsx("span", {
|
|
190
|
+
children: triggerLabel
|
|
191
|
+
}),
|
|
192
|
+
/*#__PURE__*/ jsx(ChevronDown, {
|
|
193
|
+
size: 9
|
|
194
|
+
})
|
|
195
|
+
]
|
|
196
|
+
})
|
|
197
|
+
}),
|
|
198
|
+
/*#__PURE__*/ jsx(PopoverContent, {
|
|
199
|
+
align: align,
|
|
200
|
+
className: cn('w-[280px] max-w-[calc(100vw-1rem)] overflow-hidden p-0', className),
|
|
201
|
+
children: /*#__PURE__*/ jsx(VariablePickerContent, {
|
|
202
|
+
...contentProps,
|
|
203
|
+
onSelect: selectItem
|
|
204
|
+
})
|
|
205
|
+
})
|
|
206
|
+
]
|
|
207
|
+
});
|
|
208
|
+
}
|
|
209
|
+
export { VariablePicker, VariablePickerContent };
|