@inf-monkeys-tech/monkeys-design 1.0.56 → 1.0.60
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/{WorkbenchRadarMatrix-3f0daea32926.d.ts → WorkbenchRadarMatrix-2ec5e4970f24.d.ts} +40 -3
- package/dist/{WorkbenchRadarMatrix-3b2384181e2d.d.mts → WorkbenchRadarMatrix-b50483af5a5d.d.mts} +40 -3
- package/dist/components/dropdown/index.d.mts +89 -0
- package/dist/components/dropdown/index.d.ts +89 -0
- package/dist/components/dropdown/index.js +382 -0
- package/dist/components/dropdown/index.js.map +1 -0
- package/dist/components/dropdown/index.mjs +360 -0
- package/dist/components/dropdown/index.mjs.map +1 -0
- package/dist/components/workbench/index.d.mts +1 -1
- package/dist/components/workbench/index.d.ts +1 -1
- package/dist/components/workbench/index.js +169 -24
- package/dist/components/workbench/index.js.map +1 -1
- package/dist/components/workbench/index.mjs +169 -25
- package/dist/components/workbench/index.mjs.map +1 -1
- package/dist/index.d.mts +2 -1
- package/dist/index.d.ts +2 -1
- package/dist/index.js +529 -37
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +528 -38
- package/dist/index.mjs.map +1 -1
- package/dist/styles.css +1 -1
- package/package.json +6 -1
|
@@ -0,0 +1,360 @@
|
|
|
1
|
+
import * as PopoverPrimitive from '@radix-ui/react-popover';
|
|
2
|
+
import { ChevronDown, Search, Circle, Check } from 'lucide-react';
|
|
3
|
+
import { forwardRef, useMemo, useId, useRef, useState, useEffect } from 'react';
|
|
4
|
+
import { twMerge } from 'tailwind-merge';
|
|
5
|
+
import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
|
|
6
|
+
|
|
7
|
+
// src/components/dropdown/UnifiedDropdown.tsx
|
|
8
|
+
function cn(...parts) {
|
|
9
|
+
return twMerge(parts.filter(Boolean).join(" "));
|
|
10
|
+
}
|
|
11
|
+
var placementMap = {
|
|
12
|
+
"bottom-start": { side: "bottom", align: "start" },
|
|
13
|
+
"bottom-end": { side: "bottom", align: "end" },
|
|
14
|
+
"top-start": { side: "top", align: "start" },
|
|
15
|
+
"top-end": { side: "top", align: "end" }
|
|
16
|
+
};
|
|
17
|
+
function flattenOptions(options, depth = 0) {
|
|
18
|
+
return options.flatMap((option) => [
|
|
19
|
+
{ ...option, depth },
|
|
20
|
+
...option.children ? flattenOptions(option.children, depth + 1) : []
|
|
21
|
+
]);
|
|
22
|
+
}
|
|
23
|
+
function validateOptions(options) {
|
|
24
|
+
const values = /* @__PURE__ */ new Set();
|
|
25
|
+
flattenOptions(options).forEach((option) => {
|
|
26
|
+
if (!option || typeof option !== "object") {
|
|
27
|
+
throw new TypeError("UnifiedDropdown options must contain objects.");
|
|
28
|
+
}
|
|
29
|
+
if (typeof option.value !== "string" || !option.value.trim()) {
|
|
30
|
+
throw new TypeError("UnifiedDropdown option value must be a non-empty string.");
|
|
31
|
+
}
|
|
32
|
+
if (values.has(option.value)) {
|
|
33
|
+
throw new TypeError(`UnifiedDropdown option value "${option.value}" must be unique.`);
|
|
34
|
+
}
|
|
35
|
+
values.add(option.value);
|
|
36
|
+
});
|
|
37
|
+
}
|
|
38
|
+
function normalizeValues(value) {
|
|
39
|
+
const values = Array.isArray(value) ? value : value === void 0 ? [] : [value];
|
|
40
|
+
return [...new Set(values.filter((item) => typeof item === "string"))];
|
|
41
|
+
}
|
|
42
|
+
function getOptionText(option) {
|
|
43
|
+
if (option.textValue) return option.textValue;
|
|
44
|
+
return typeof option.label === "string" ? option.label : option.value;
|
|
45
|
+
}
|
|
46
|
+
function isMultiMode(mode) {
|
|
47
|
+
return mode === "multi" || mode === "checkbox";
|
|
48
|
+
}
|
|
49
|
+
function matchesSearch(option, query) {
|
|
50
|
+
return getOptionText(option).toLocaleLowerCase().includes(query.toLocaleLowerCase());
|
|
51
|
+
}
|
|
52
|
+
function validateValueShape(mode, value, name) {
|
|
53
|
+
if (value === void 0) return;
|
|
54
|
+
if (isMultiMode(mode) ? !Array.isArray(value) : typeof value !== "string") {
|
|
55
|
+
throw new TypeError(
|
|
56
|
+
`UnifiedDropdown ${name} must be ${isMultiMode(mode) ? "a string array" : "a string"} in ${mode} mode.`
|
|
57
|
+
);
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
var UnifiedDropdown = forwardRef(
|
|
61
|
+
function UnifiedDropdown2({
|
|
62
|
+
mode,
|
|
63
|
+
options = [],
|
|
64
|
+
groups = [],
|
|
65
|
+
value,
|
|
66
|
+
defaultValue,
|
|
67
|
+
placeholder = "Select\u2026",
|
|
68
|
+
trigger,
|
|
69
|
+
triggerLabel,
|
|
70
|
+
searchPlaceholder = "Search\u2026",
|
|
71
|
+
emptyLabel = "No options",
|
|
72
|
+
loadingLabel = "Loading\u2026",
|
|
73
|
+
clearLabel = "Clear selection",
|
|
74
|
+
retryLabel = "Retry",
|
|
75
|
+
loading = false,
|
|
76
|
+
error,
|
|
77
|
+
searchable = mode === "searchable",
|
|
78
|
+
clearable = false,
|
|
79
|
+
maxSelections,
|
|
80
|
+
disabled = false,
|
|
81
|
+
invalid = false,
|
|
82
|
+
open: controlledOpen,
|
|
83
|
+
defaultOpen = false,
|
|
84
|
+
placement = "bottom-start",
|
|
85
|
+
closeOnSelect = mode !== "multi" && mode !== "checkbox",
|
|
86
|
+
portal = true,
|
|
87
|
+
size = "default",
|
|
88
|
+
width = "trigger",
|
|
89
|
+
appearance,
|
|
90
|
+
className,
|
|
91
|
+
classNames,
|
|
92
|
+
slots,
|
|
93
|
+
style,
|
|
94
|
+
onOpenChange,
|
|
95
|
+
onValueChange,
|
|
96
|
+
onSelect,
|
|
97
|
+
onAction,
|
|
98
|
+
onClear,
|
|
99
|
+
onRetry,
|
|
100
|
+
...rootProps
|
|
101
|
+
}, ref) {
|
|
102
|
+
if (!["single", "multi", "searchable", "radio", "checkbox", "tree", "action"].includes(mode)) {
|
|
103
|
+
throw new TypeError(`UnifiedDropdown mode "${String(mode)}" is not supported.`);
|
|
104
|
+
}
|
|
105
|
+
const groupedOptions = useMemo(
|
|
106
|
+
() => groups.reduce((result, group) => {
|
|
107
|
+
const groupName = typeof group.label === "string" ? group.label : group.value;
|
|
108
|
+
result.push(...group.options.map((option) => ({ ...option, group: option.group ?? groupName })));
|
|
109
|
+
return result;
|
|
110
|
+
}, [...options]),
|
|
111
|
+
[groups, options]
|
|
112
|
+
);
|
|
113
|
+
validateOptions(groupedOptions);
|
|
114
|
+
if (maxSelections !== void 0 && (!Number.isFinite(maxSelections) || maxSelections < 0)) {
|
|
115
|
+
throw new TypeError("UnifiedDropdown maxSelections must be a non-negative finite number.");
|
|
116
|
+
}
|
|
117
|
+
if (mode === "action" && (value !== void 0 || defaultValue !== void 0)) {
|
|
118
|
+
throw new TypeError("UnifiedDropdown action mode does not accept a value.");
|
|
119
|
+
}
|
|
120
|
+
if (mode !== "action") {
|
|
121
|
+
validateValueShape(mode, value, "value");
|
|
122
|
+
validateValueShape(mode, defaultValue, "defaultValue");
|
|
123
|
+
}
|
|
124
|
+
const id = useId();
|
|
125
|
+
const triggerId = `${id}-trigger`;
|
|
126
|
+
const listId = `${id}-listbox`;
|
|
127
|
+
const searchId = `${id}-search`;
|
|
128
|
+
const triggerRef = useRef(null);
|
|
129
|
+
const itemRefs = useRef([]);
|
|
130
|
+
const [uncontrolledOpen, setUncontrolledOpen] = useState(defaultOpen);
|
|
131
|
+
const [uncontrolledValue, setUncontrolledValue] = useState(
|
|
132
|
+
defaultValue ?? (isMultiMode(mode) ? [] : "")
|
|
133
|
+
);
|
|
134
|
+
const [query, setQuery] = useState("");
|
|
135
|
+
const [activeIndex, setActiveIndex] = useState(0);
|
|
136
|
+
const isControlled = controlledOpen !== void 0;
|
|
137
|
+
const open = isControlled ? controlledOpen : uncontrolledOpen;
|
|
138
|
+
const selectedValues = normalizeValues(value ?? uncontrolledValue);
|
|
139
|
+
const flattened = useMemo(() => flattenOptions(groupedOptions), [groupedOptions]);
|
|
140
|
+
const visibleOptions = useMemo(
|
|
141
|
+
() => searchable ? flattened.filter((option) => matchesSearch(option, query)) : flattened,
|
|
142
|
+
[flattened, query, searchable]
|
|
143
|
+
);
|
|
144
|
+
const selectedSet = useMemo(() => new Set(selectedValues), [selectedValues]);
|
|
145
|
+
const selectedOptions = flattened.filter((option) => selectedSet.has(option.value));
|
|
146
|
+
const selectedLabel = selectedOptions.map(getOptionText).join(", ");
|
|
147
|
+
const resolvedTriggerLabel = triggerLabel ?? (selectedLabel || placeholder);
|
|
148
|
+
const isPlaceholder = selectedOptions.length === 0 && !triggerLabel;
|
|
149
|
+
const { side, align } = placementMap[placement];
|
|
150
|
+
const isMenu = mode === "action";
|
|
151
|
+
const usesCheckedMenu = mode === "radio" || mode === "checkbox";
|
|
152
|
+
const contentRole = isMenu || usesCheckedMenu ? "menu" : "listbox";
|
|
153
|
+
useEffect(() => {
|
|
154
|
+
if (open) setActiveIndex(0);
|
|
155
|
+
}, [open, query]);
|
|
156
|
+
const setOpen = (nextOpen) => {
|
|
157
|
+
if (disabled) return;
|
|
158
|
+
if (!isControlled) setUncontrolledOpen(nextOpen);
|
|
159
|
+
onOpenChange?.(nextOpen);
|
|
160
|
+
};
|
|
161
|
+
const commitValue = (nextValue) => {
|
|
162
|
+
if (value === void 0) setUncontrolledValue(nextValue);
|
|
163
|
+
onValueChange?.(nextValue);
|
|
164
|
+
};
|
|
165
|
+
const selectOption = (option) => {
|
|
166
|
+
if (disabled || option.disabled) return;
|
|
167
|
+
onSelect?.(option);
|
|
168
|
+
if (mode === "action") {
|
|
169
|
+
if (closeOnSelect) setOpen(false);
|
|
170
|
+
if (onAction) queueMicrotask(() => onAction(option));
|
|
171
|
+
return;
|
|
172
|
+
}
|
|
173
|
+
if (isMultiMode(mode)) {
|
|
174
|
+
const nextValues = selectedSet.has(option.value) ? selectedValues.filter((item) => item !== option.value) : maxSelections !== void 0 && selectedValues.length >= maxSelections ? selectedValues : [...selectedValues, option.value];
|
|
175
|
+
commitValue(nextValues);
|
|
176
|
+
} else {
|
|
177
|
+
commitValue(option.value);
|
|
178
|
+
}
|
|
179
|
+
if (closeOnSelect && !isMultiMode(mode)) setOpen(false);
|
|
180
|
+
};
|
|
181
|
+
const handleTriggerKeyDown = (event) => {
|
|
182
|
+
if (disabled) return;
|
|
183
|
+
if (event.key === "ArrowDown" || event.key === "ArrowUp") {
|
|
184
|
+
event.preventDefault();
|
|
185
|
+
if (!open) setOpen(true);
|
|
186
|
+
const direction = event.key === "ArrowDown" ? 1 : -1;
|
|
187
|
+
setActiveIndex((index) => Math.max(0, Math.min(visibleOptions.length - 1, index + direction)));
|
|
188
|
+
}
|
|
189
|
+
};
|
|
190
|
+
const handleContentKeyDown = (event) => {
|
|
191
|
+
if (event.key === "ArrowDown" || event.key === "ArrowUp") {
|
|
192
|
+
event.preventDefault();
|
|
193
|
+
const direction = event.key === "ArrowDown" ? 1 : -1;
|
|
194
|
+
setActiveIndex((index) => {
|
|
195
|
+
const next = index + direction;
|
|
196
|
+
return Math.max(0, Math.min(visibleOptions.length - 1, next));
|
|
197
|
+
});
|
|
198
|
+
}
|
|
199
|
+
if (event.key === "Enter" && visibleOptions[activeIndex]) {
|
|
200
|
+
event.preventDefault();
|
|
201
|
+
selectOption(visibleOptions[activeIndex]);
|
|
202
|
+
}
|
|
203
|
+
};
|
|
204
|
+
useEffect(() => {
|
|
205
|
+
if (!open) return;
|
|
206
|
+
itemRefs.current[activeIndex]?.scrollIntoView({ block: "nearest" });
|
|
207
|
+
}, [activeIndex, open]);
|
|
208
|
+
const clearSelection = () => {
|
|
209
|
+
commitValue(isMultiMode(mode) ? [] : "");
|
|
210
|
+
onClear?.();
|
|
211
|
+
};
|
|
212
|
+
return /* @__PURE__ */ jsx(PopoverPrimitive.Root, { open, onOpenChange: setOpen, children: /* @__PURE__ */ jsxs(
|
|
213
|
+
"div",
|
|
214
|
+
{
|
|
215
|
+
...rootProps,
|
|
216
|
+
ref,
|
|
217
|
+
className: cn("relative inline-flex min-w-0", className),
|
|
218
|
+
style,
|
|
219
|
+
"data-monkeys-component": "unified-dropdown",
|
|
220
|
+
"data-mode": mode,
|
|
221
|
+
"data-state": open ? "open" : "closed",
|
|
222
|
+
"data-invalid": invalid || void 0,
|
|
223
|
+
"data-disabled": disabled || void 0,
|
|
224
|
+
"data-appearance-preset": appearance?.preset,
|
|
225
|
+
"data-appearance-variant": appearance?.variant,
|
|
226
|
+
"data-appearance-density": appearance?.density,
|
|
227
|
+
"data-appearance-radius": appearance?.radius,
|
|
228
|
+
children: [
|
|
229
|
+
/* @__PURE__ */ jsx(PopoverPrimitive.Trigger, { asChild: true, children: /* @__PURE__ */ jsxs(
|
|
230
|
+
"button",
|
|
231
|
+
{
|
|
232
|
+
ref: triggerRef,
|
|
233
|
+
id: triggerId,
|
|
234
|
+
type: "button",
|
|
235
|
+
disabled,
|
|
236
|
+
"aria-expanded": open,
|
|
237
|
+
"aria-haspopup": isMenu || usesCheckedMenu ? "menu" : "listbox",
|
|
238
|
+
"aria-controls": open ? listId : void 0,
|
|
239
|
+
"aria-invalid": invalid || void 0,
|
|
240
|
+
onKeyDown: handleTriggerKeyDown,
|
|
241
|
+
className: cn(
|
|
242
|
+
"flex min-w-0 items-center justify-between gap-2 rounded-md border border-input bg-control-surface px-3 text-left text-sm text-foreground shadow-sm outline-none transition-colors",
|
|
243
|
+
"focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 focus-visible:ring-offset-control-surface",
|
|
244
|
+
"disabled:cursor-not-allowed disabled:opacity-50",
|
|
245
|
+
size === "sm" ? "h-8 py-1 text-xs" : "h-10 py-2",
|
|
246
|
+
invalid && "border-destructive focus-visible:ring-destructive",
|
|
247
|
+
width === "responsive" && "w-full sm:w-auto",
|
|
248
|
+
classNames?.trigger
|
|
249
|
+
),
|
|
250
|
+
children: [
|
|
251
|
+
trigger ? /* @__PURE__ */ jsx("span", { className: "min-w-0 shrink-0", children: trigger }) : null,
|
|
252
|
+
/* @__PURE__ */ jsx("span", { className: cn("min-w-0 flex-1 truncate", isPlaceholder && "text-muted-foreground"), children: resolvedTriggerLabel }),
|
|
253
|
+
/* @__PURE__ */ jsx(ChevronDown, { "aria-hidden": "true", className: "h-4 w-4 shrink-0 opacity-60" })
|
|
254
|
+
]
|
|
255
|
+
}
|
|
256
|
+
) }),
|
|
257
|
+
(() => {
|
|
258
|
+
const content = /* @__PURE__ */ jsxs(
|
|
259
|
+
PopoverPrimitive.Content,
|
|
260
|
+
{
|
|
261
|
+
id: listId,
|
|
262
|
+
side,
|
|
263
|
+
align,
|
|
264
|
+
sideOffset: 6,
|
|
265
|
+
collisionPadding: 8,
|
|
266
|
+
avoidCollisions: true,
|
|
267
|
+
onKeyDown: handleContentKeyDown,
|
|
268
|
+
onOpenAutoFocus: (event) => {
|
|
269
|
+
event.preventDefault();
|
|
270
|
+
const target = searchable ? document.getElementById(searchId) : itemRefs.current[0];
|
|
271
|
+
target?.focus();
|
|
272
|
+
},
|
|
273
|
+
tabIndex: -1,
|
|
274
|
+
className: cn(
|
|
275
|
+
"z-50 max-h-[min(24rem,calc(100vh-1rem))] max-w-[calc(100vw-1rem)] overflow-y-auto rounded-md border bg-menu-surface p-1 text-popover-foreground shadow-md outline-none",
|
|
276
|
+
width === "trigger" && "w-[var(--radix-popover-trigger-width)] min-w-[12rem]",
|
|
277
|
+
width === "content" && "min-w-[12rem] max-w-[min(32rem,calc(100vw-1rem))]",
|
|
278
|
+
width === "responsive" && "w-[min(var(--radix-popover-trigger-width),calc(100vw-1rem))] min-w-[12rem]",
|
|
279
|
+
classNames?.content
|
|
280
|
+
),
|
|
281
|
+
children: [
|
|
282
|
+
searchable ? /* @__PURE__ */ jsxs("div", { className: "relative mb-1", children: [
|
|
283
|
+
/* @__PURE__ */ jsx(Search, { "aria-hidden": "true", className: "pointer-events-none absolute left-2 top-1/2 h-4 w-4 -translate-y-1/2 text-muted-foreground" }),
|
|
284
|
+
/* @__PURE__ */ jsx(
|
|
285
|
+
"input",
|
|
286
|
+
{
|
|
287
|
+
id: searchId,
|
|
288
|
+
value: query,
|
|
289
|
+
onChange: (event) => setQuery(event.target.value),
|
|
290
|
+
placeholder: searchPlaceholder,
|
|
291
|
+
"aria-label": searchPlaceholder,
|
|
292
|
+
className: cn("h-9 w-full rounded-sm border-0 bg-transparent pl-8 pr-2 text-sm outline-none ring-0 placeholder:text-muted-foreground focus-visible:ring-2 focus-visible:ring-ring", classNames?.search)
|
|
293
|
+
}
|
|
294
|
+
)
|
|
295
|
+
] }) : null,
|
|
296
|
+
clearable && selectedOptions.length > 0 ? /* @__PURE__ */ jsx("button", { type: "button", className: "mb-1 w-full rounded-sm px-2 py-1 text-left text-xs text-muted-foreground hover:bg-accent", onClick: clearSelection, children: clearLabel }) : null,
|
|
297
|
+
loading && visibleOptions.length === 0 ? slots?.loading ? slots.loading() : /* @__PURE__ */ jsx("div", { role: "status", className: cn("px-2 py-6 text-center text-sm text-muted-foreground", classNames?.empty), children: loadingLabel }) : error && visibleOptions.length === 0 ? slots?.error ? slots.error() : /* @__PURE__ */ jsxs("div", { role: "alert", className: cn("px-2 py-6 text-center text-sm text-destructive-text", classNames?.empty), children: [
|
|
298
|
+
error,
|
|
299
|
+
onRetry ? /* @__PURE__ */ jsx("button", { type: "button", className: "mt-2 block w-full text-center text-foreground underline", onClick: onRetry, children: retryLabel }) : null
|
|
300
|
+
] }) : visibleOptions.length === 0 ? slots?.empty ? slots.empty() : /* @__PURE__ */ jsx("div", { role: "status", className: cn("px-2 py-6 text-center text-sm text-muted-foreground", classNames?.empty), children: emptyLabel }) : /* @__PURE__ */ jsx("div", { role: mode === "tree" ? "tree" : contentRole, "aria-multiselectable": mode === "multi" || void 0, children: visibleOptions.map((option, index) => {
|
|
301
|
+
const selected = selectedSet.has(option.value);
|
|
302
|
+
const indicator = mode === "radio" ? /* @__PURE__ */ jsx(Circle, { "aria-hidden": "true", className: cn("h-3.5 w-3.5", selected && "fill-current") }) : /* @__PURE__ */ jsx(Check, { "aria-hidden": "true", className: "h-4 w-4" });
|
|
303
|
+
return /* @__PURE__ */ jsxs("div", { children: [
|
|
304
|
+
option.group && (index === 0 || visibleOptions[index - 1]?.group !== option.group) ? /* @__PURE__ */ jsx("div", { role: "presentation", className: cn("px-2 pb-1 pt-2 text-xs font-medium text-muted-foreground", classNames?.groupLabel), children: option.group }) : null,
|
|
305
|
+
/* @__PURE__ */ jsxs(
|
|
306
|
+
"button",
|
|
307
|
+
{
|
|
308
|
+
ref: (node) => {
|
|
309
|
+
itemRefs.current[index] = node;
|
|
310
|
+
},
|
|
311
|
+
type: "button",
|
|
312
|
+
role: mode === "tree" ? "treeitem" : mode === "radio" ? "menuitemradio" : mode === "checkbox" ? "menuitemcheckbox" : isMenu ? "menuitem" : "option",
|
|
313
|
+
"aria-level": mode === "tree" ? option.depth + 1 : void 0,
|
|
314
|
+
"aria-selected": !isMenu && !usesCheckedMenu ? selected : void 0,
|
|
315
|
+
"aria-checked": usesCheckedMenu ? selected : void 0,
|
|
316
|
+
disabled: option.disabled,
|
|
317
|
+
"data-highlighted": index === activeIndex || void 0,
|
|
318
|
+
"data-state": selected ? "checked" : "unchecked",
|
|
319
|
+
onMouseEnter: () => setActiveIndex(index),
|
|
320
|
+
onClick: () => selectOption(option),
|
|
321
|
+
className: cn(
|
|
322
|
+
"relative flex min-h-9 w-full items-center gap-2 rounded-sm px-2 py-1.5 text-left text-sm outline-none transition-colors",
|
|
323
|
+
"hover:bg-accent hover:text-accent-foreground focus-visible:bg-accent focus-visible:text-accent-foreground",
|
|
324
|
+
"disabled:pointer-events-none disabled:opacity-50",
|
|
325
|
+
index === activeIndex && "bg-accent text-accent-foreground",
|
|
326
|
+
selected && "font-medium",
|
|
327
|
+
option.danger && "text-destructive-text",
|
|
328
|
+
mode !== "action" && "pl-8",
|
|
329
|
+
classNames?.item
|
|
330
|
+
),
|
|
331
|
+
style: mode === "tree" ? { paddingInlineStart: `${8 + option.depth * 16}px` } : void 0,
|
|
332
|
+
children: [
|
|
333
|
+
mode !== "action" ? /* @__PURE__ */ jsx("span", { className: "absolute left-2 flex h-4 w-4 items-center justify-center", children: selected ? indicator : null }) : null,
|
|
334
|
+
slots?.option ? slots.option({ option, selected, highlighted: index === activeIndex }) : /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
335
|
+
option.icon ? /* @__PURE__ */ jsx("span", { className: "shrink-0", children: option.icon }) : null,
|
|
336
|
+
/* @__PURE__ */ jsx("span", { className: cn("min-w-0 flex-1 truncate", classNames?.itemLabel), children: option.label }),
|
|
337
|
+
option.description ? /* @__PURE__ */ jsx("span", { className: cn("max-w-[45%] truncate text-xs text-muted-foreground", classNames?.itemDescription), children: option.description }) : null
|
|
338
|
+
] })
|
|
339
|
+
]
|
|
340
|
+
}
|
|
341
|
+
)
|
|
342
|
+
] }, option.value);
|
|
343
|
+
}) }),
|
|
344
|
+
error && visibleOptions.length > 0 ? /* @__PURE__ */ jsx("div", { role: "status", className: "px-2 py-1 text-xs text-destructive-text", children: error }) : null,
|
|
345
|
+
loading && visibleOptions.length > 0 ? /* @__PURE__ */ jsx("div", { role: "status", className: "px-2 py-1 text-xs text-muted-foreground", children: loadingLabel }) : null,
|
|
346
|
+
slots?.footer ? slots.footer() : null
|
|
347
|
+
]
|
|
348
|
+
}
|
|
349
|
+
);
|
|
350
|
+
return portal ? /* @__PURE__ */ jsx(PopoverPrimitive.Portal, { children: content }) : content;
|
|
351
|
+
})()
|
|
352
|
+
]
|
|
353
|
+
}
|
|
354
|
+
) });
|
|
355
|
+
}
|
|
356
|
+
);
|
|
357
|
+
|
|
358
|
+
export { UnifiedDropdown };
|
|
359
|
+
//# sourceMappingURL=index.mjs.map
|
|
360
|
+
//# sourceMappingURL=index.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/components/base/utils.ts","../../../src/components/dropdown/UnifiedDropdown.tsx"],"names":["UnifiedDropdown"],"mappings":"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","file":"index.mjs","sourcesContent":["import type { ReactNode } from 'react';\nimport { twMerge } from 'tailwind-merge';\n\nexport function cn(...parts: Array<string | false | null | undefined>) {\n return twMerge(parts.filter(Boolean).join(' '));\n}\n\nexport function hasRenderableNode(node: ReactNode) {\n return node !== undefined && node !== null && typeof node !== 'boolean';\n}\n\nexport function hasNonEmptyRenderableNode(node: ReactNode) {\n if (typeof node === 'string') return node.trim().length > 0;\n return hasRenderableNode(node);\n}\n","import * as PopoverPrimitive from '@radix-ui/react-popover';\nimport { Check, ChevronDown, Circle, Search } from 'lucide-react';\nimport {\n forwardRef,\n useEffect,\n useId,\n useMemo,\n useRef,\n useState,\n type KeyboardEvent,\n} from 'react';\n\nimport { cn } from '../base/utils';\nimport type {\n UnifiedDropdownMode,\n UnifiedDropdownGroup,\n UnifiedDropdownOption,\n UnifiedDropdownPlacement,\n UnifiedDropdownProps,\n UnifiedDropdownValue,\n} from './types';\n\nconst placementMap: Record<\n UnifiedDropdownPlacement,\n { side: 'top' | 'bottom'; align: 'start' | 'end' }\n> = {\n 'bottom-start': { side: 'bottom', align: 'start' },\n 'bottom-end': { side: 'bottom', align: 'end' },\n 'top-start': { side: 'top', align: 'start' },\n 'top-end': { side: 'top', align: 'end' },\n};\n\nfunction flattenOptions(\n options: readonly UnifiedDropdownOption[],\n depth = 0,\n): Array<UnifiedDropdownOption & { depth: number }> {\n return options.flatMap((option) => [\n { ...option, depth },\n ...(option.children ? flattenOptions(option.children, depth + 1) : []),\n ]);\n}\n\nfunction validateOptions(options: readonly UnifiedDropdownOption[]) {\n const values = new Set<string>();\n flattenOptions(options).forEach((option) => {\n if (!option || typeof option !== 'object') {\n throw new TypeError('UnifiedDropdown options must contain objects.');\n }\n if (typeof option.value !== 'string' || !option.value.trim()) {\n throw new TypeError('UnifiedDropdown option value must be a non-empty string.');\n }\n if (values.has(option.value)) {\n throw new TypeError(`UnifiedDropdown option value \"${option.value}\" must be unique.`);\n }\n values.add(option.value);\n });\n}\n\nfunction normalizeValues(value: UnifiedDropdownValue | undefined) {\n const values = Array.isArray(value) ? value : value === undefined ? [] : [value];\n return [...new Set(values.filter((item): item is string => typeof item === 'string'))];\n}\n\nfunction getOptionText(option: UnifiedDropdownOption) {\n if (option.textValue) return option.textValue;\n return typeof option.label === 'string' ? option.label : option.value;\n}\n\nfunction isMultiMode(mode: UnifiedDropdownMode) {\n return mode === 'multi' || mode === 'checkbox';\n}\n\nfunction matchesSearch(option: UnifiedDropdownOption, query: string) {\n return getOptionText(option).toLocaleLowerCase().includes(query.toLocaleLowerCase());\n}\n\nfunction validateValueShape(\n mode: UnifiedDropdownMode,\n value: UnifiedDropdownValue | undefined,\n name: 'value' | 'defaultValue',\n) {\n if (value === undefined) return;\n if (isMultiMode(mode) ? !Array.isArray(value) : typeof value !== 'string') {\n throw new TypeError(\n `UnifiedDropdown ${name} must be ${isMultiMode(mode) ? 'a string array' : 'a string'} in ${mode} mode.`,\n );\n }\n}\n\nexport const UnifiedDropdown = forwardRef<HTMLDivElement, UnifiedDropdownProps>(\n function UnifiedDropdown(\n {\n mode,\n options = [],\n groups = [],\n value,\n defaultValue,\n placeholder = 'Select…',\n trigger,\n triggerLabel,\n searchPlaceholder = 'Search…',\n emptyLabel = 'No options',\n loadingLabel = 'Loading…',\n clearLabel = 'Clear selection',\n retryLabel = 'Retry',\n loading = false,\n error,\n searchable = mode === 'searchable',\n clearable = false,\n maxSelections,\n disabled = false,\n invalid = false,\n open: controlledOpen,\n defaultOpen = false,\n placement = 'bottom-start',\n closeOnSelect = mode !== 'multi' && mode !== 'checkbox',\n portal = true,\n size = 'default',\n width = 'trigger',\n appearance,\n className,\n classNames,\n slots,\n style,\n onOpenChange,\n onValueChange,\n onSelect,\n onAction,\n onClear,\n onRetry,\n ...rootProps\n },\n ref,\n ) {\n if (!['single', 'multi', 'searchable', 'radio', 'checkbox', 'tree', 'action'].includes(mode)) {\n throw new TypeError(`UnifiedDropdown mode \"${String(mode)}\" is not supported.`);\n }\n const groupedOptions = useMemo(\n () => groups.reduce<UnifiedDropdownOption[]>((result, group: UnifiedDropdownGroup) => {\n const groupName = typeof group.label === 'string' ? group.label : group.value;\n result.push(...group.options.map((option) => ({ ...option, group: option.group ?? groupName })));\n return result;\n }, [...options]),\n [groups, options],\n );\n validateOptions(groupedOptions);\n if (maxSelections !== undefined && (!Number.isFinite(maxSelections) || maxSelections < 0)) {\n throw new TypeError('UnifiedDropdown maxSelections must be a non-negative finite number.');\n }\n if (mode === 'action' && (value !== undefined || defaultValue !== undefined)) {\n throw new TypeError('UnifiedDropdown action mode does not accept a value.');\n }\n if (mode !== 'action') {\n validateValueShape(mode, value, 'value');\n validateValueShape(mode, defaultValue, 'defaultValue');\n }\n\n const id = useId();\n const triggerId = `${id}-trigger`;\n const listId = `${id}-listbox`;\n const searchId = `${id}-search`;\n const triggerRef = useRef<HTMLButtonElement | null>(null);\n const itemRefs = useRef<Array<HTMLButtonElement | null>>([]);\n const [uncontrolledOpen, setUncontrolledOpen] = useState(defaultOpen);\n const [uncontrolledValue, setUncontrolledValue] = useState<UnifiedDropdownValue>(\n defaultValue ?? (isMultiMode(mode) ? [] : ''),\n );\n const [query, setQuery] = useState('');\n const [activeIndex, setActiveIndex] = useState(0);\n const isControlled = controlledOpen !== undefined;\n const open = isControlled ? controlledOpen : uncontrolledOpen;\n const selectedValues = normalizeValues(value ?? uncontrolledValue);\n const flattened = useMemo(() => flattenOptions(groupedOptions), [groupedOptions]);\n const visibleOptions = useMemo(\n () => (searchable ? flattened.filter((option) => matchesSearch(option, query)) : flattened),\n [flattened, query, searchable],\n );\n const selectedSet = useMemo(() => new Set(selectedValues), [selectedValues]);\n const selectedOptions = flattened.filter((option) => selectedSet.has(option.value));\n const selectedLabel = selectedOptions.map(getOptionText).join(', ');\n const resolvedTriggerLabel = triggerLabel ?? (selectedLabel || placeholder);\n const isPlaceholder = selectedOptions.length === 0 && !triggerLabel;\n const { side, align } = placementMap[placement];\n const isMenu = mode === 'action';\n const usesCheckedMenu = mode === 'radio' || mode === 'checkbox';\n const contentRole = isMenu || usesCheckedMenu ? 'menu' : 'listbox';\n\n useEffect(() => {\n if (open) setActiveIndex(0);\n }, [open, query]);\n\n const setOpen = (nextOpen: boolean) => {\n if (disabled) return;\n if (!isControlled) setUncontrolledOpen(nextOpen);\n onOpenChange?.(nextOpen);\n };\n\n const commitValue = (nextValue: UnifiedDropdownValue) => {\n if (value === undefined) setUncontrolledValue(nextValue);\n onValueChange?.(nextValue);\n };\n\n const selectOption = (option: UnifiedDropdownOption) => {\n if (disabled || option.disabled) return;\n onSelect?.(option);\n if (mode === 'action') {\n if (closeOnSelect) setOpen(false);\n if (onAction) queueMicrotask(() => onAction(option));\n return;\n }\n if (isMultiMode(mode)) {\n const nextValues = selectedSet.has(option.value)\n ? selectedValues.filter((item) => item !== option.value)\n : maxSelections !== undefined && selectedValues.length >= maxSelections\n ? selectedValues\n : [...selectedValues, option.value];\n commitValue(nextValues);\n } else {\n commitValue(option.value);\n }\n if (closeOnSelect && !isMultiMode(mode)) setOpen(false);\n };\n\n const handleTriggerKeyDown = (event: KeyboardEvent<HTMLButtonElement>) => {\n if (disabled) return;\n if (event.key === 'ArrowDown' || event.key === 'ArrowUp') {\n event.preventDefault();\n if (!open) setOpen(true);\n const direction = event.key === 'ArrowDown' ? 1 : -1;\n setActiveIndex((index) => Math.max(0, Math.min(visibleOptions.length - 1, index + direction)));\n }\n };\n\n const handleContentKeyDown = (event: KeyboardEvent<HTMLDivElement>) => {\n if (event.key === 'ArrowDown' || event.key === 'ArrowUp') {\n event.preventDefault();\n const direction = event.key === 'ArrowDown' ? 1 : -1;\n setActiveIndex((index) => {\n const next = index + direction;\n return Math.max(0, Math.min(visibleOptions.length - 1, next));\n });\n }\n if (event.key === 'Enter' && visibleOptions[activeIndex]) {\n event.preventDefault();\n selectOption(visibleOptions[activeIndex]!);\n }\n };\n\n useEffect(() => {\n if (!open) return;\n itemRefs.current[activeIndex]?.scrollIntoView({ block: 'nearest' });\n }, [activeIndex, open]);\n\n const clearSelection = () => {\n commitValue(isMultiMode(mode) ? [] : '');\n onClear?.();\n };\n\n return (\n <PopoverPrimitive.Root open={open} onOpenChange={setOpen}>\n <div\n {...rootProps}\n ref={ref}\n className={cn('relative inline-flex min-w-0', className)}\n style={style}\n data-monkeys-component=\"unified-dropdown\"\n data-mode={mode}\n data-state={open ? 'open' : 'closed'}\n data-invalid={invalid || undefined}\n data-disabled={disabled || undefined}\n data-appearance-preset={appearance?.preset}\n data-appearance-variant={appearance?.variant}\n data-appearance-density={appearance?.density}\n data-appearance-radius={appearance?.radius}\n >\n <PopoverPrimitive.Trigger asChild>\n <button\n ref={triggerRef}\n id={triggerId}\n type=\"button\"\n disabled={disabled}\n aria-expanded={open}\n aria-haspopup={isMenu || usesCheckedMenu ? 'menu' : 'listbox'}\n aria-controls={open ? listId : undefined}\n aria-invalid={invalid || undefined}\n onKeyDown={handleTriggerKeyDown}\n className={cn(\n 'flex min-w-0 items-center justify-between gap-2 rounded-md border border-input bg-control-surface px-3 text-left text-sm text-foreground shadow-sm outline-none transition-colors',\n 'focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 focus-visible:ring-offset-control-surface',\n 'disabled:cursor-not-allowed disabled:opacity-50',\n size === 'sm' ? 'h-8 py-1 text-xs' : 'h-10 py-2',\n invalid && 'border-destructive focus-visible:ring-destructive',\n width === 'responsive' && 'w-full sm:w-auto',\n classNames?.trigger,\n )}\n >\n {trigger ? <span className=\"min-w-0 shrink-0\">{trigger}</span> : null}\n <span className={cn('min-w-0 flex-1 truncate', isPlaceholder && 'text-muted-foreground')}>\n {resolvedTriggerLabel}\n </span>\n <ChevronDown aria-hidden=\"true\" className=\"h-4 w-4 shrink-0 opacity-60\" />\n </button>\n </PopoverPrimitive.Trigger>\n {(() => {\n const content = (\n <PopoverPrimitive.Content\n id={listId}\n side={side}\n align={align}\n sideOffset={6}\n collisionPadding={8}\n avoidCollisions\n onKeyDown={handleContentKeyDown}\n onOpenAutoFocus={(event) => {\n event.preventDefault();\n const target = searchable\n ? document.getElementById(searchId)\n : itemRefs.current[0];\n target?.focus();\n }}\n tabIndex={-1}\n className={cn(\n 'z-50 max-h-[min(24rem,calc(100vh-1rem))] max-w-[calc(100vw-1rem)] overflow-y-auto rounded-md border bg-menu-surface p-1 text-popover-foreground shadow-md outline-none',\n width === 'trigger' && 'w-[var(--radix-popover-trigger-width)] min-w-[12rem]',\n width === 'content' && 'min-w-[12rem] max-w-[min(32rem,calc(100vw-1rem))]',\n width === 'responsive' && 'w-[min(var(--radix-popover-trigger-width),calc(100vw-1rem))] min-w-[12rem]',\n classNames?.content,\n )}\n >\n {searchable ? (\n <div className=\"relative mb-1\">\n <Search aria-hidden=\"true\" className=\"pointer-events-none absolute left-2 top-1/2 h-4 w-4 -translate-y-1/2 text-muted-foreground\" />\n <input\n id={searchId}\n value={query}\n onChange={(event) => setQuery(event.target.value)}\n placeholder={searchPlaceholder}\n aria-label={searchPlaceholder}\n className={cn('h-9 w-full rounded-sm border-0 bg-transparent pl-8 pr-2 text-sm outline-none ring-0 placeholder:text-muted-foreground focus-visible:ring-2 focus-visible:ring-ring', classNames?.search)}\n />\n </div>\n ) : null}\n {clearable && selectedOptions.length > 0 ? (\n <button type=\"button\" className=\"mb-1 w-full rounded-sm px-2 py-1 text-left text-xs text-muted-foreground hover:bg-accent\" onClick={clearSelection}>\n {clearLabel}\n </button>\n ) : null}\n {loading && visibleOptions.length === 0 ? (\n slots?.loading ? slots.loading() : <div role=\"status\" className={cn('px-2 py-6 text-center text-sm text-muted-foreground', classNames?.empty)}>{loadingLabel}</div>\n ) : error && visibleOptions.length === 0 ? (\n slots?.error ? slots.error() : <div role=\"alert\" className={cn('px-2 py-6 text-center text-sm text-destructive-text', classNames?.empty)}>{error}{onRetry ? <button type=\"button\" className=\"mt-2 block w-full text-center text-foreground underline\" onClick={onRetry}>{retryLabel}</button> : null}</div>\n ) : visibleOptions.length === 0 ? (\n slots?.empty ? slots.empty() : <div role=\"status\" className={cn('px-2 py-6 text-center text-sm text-muted-foreground', classNames?.empty)}>{emptyLabel}</div>\n ) : (\n <div role={mode === 'tree' ? 'tree' : contentRole} aria-multiselectable={mode === 'multi' || undefined}>\n {visibleOptions.map((option, index) => {\n const selected = selectedSet.has(option.value);\n const indicator = mode === 'radio' ? <Circle aria-hidden=\"true\" className={cn('h-3.5 w-3.5', selected && 'fill-current')} /> : <Check aria-hidden=\"true\" className=\"h-4 w-4\" />;\n return (\n <div key={option.value}>\n {option.group && (index === 0 || visibleOptions[index - 1]?.group !== option.group) ? (\n <div role=\"presentation\" className={cn('px-2 pb-1 pt-2 text-xs font-medium text-muted-foreground', classNames?.groupLabel)}>{option.group}</div>\n ) : null}\n <button\n ref={(node) => { itemRefs.current[index] = node; }}\n type=\"button\"\n role={mode === 'tree' ? 'treeitem' : mode === 'radio' ? 'menuitemradio' : mode === 'checkbox' ? 'menuitemcheckbox' : isMenu ? 'menuitem' : 'option'}\n aria-level={mode === 'tree' ? option.depth + 1 : undefined}\n aria-selected={!isMenu && !usesCheckedMenu ? selected : undefined}\n aria-checked={usesCheckedMenu ? selected : undefined}\n disabled={option.disabled}\n data-highlighted={index === activeIndex || undefined}\n data-state={selected ? 'checked' : 'unchecked'}\n onMouseEnter={() => setActiveIndex(index)}\n onClick={() => selectOption(option)}\n className={cn(\n 'relative flex min-h-9 w-full items-center gap-2 rounded-sm px-2 py-1.5 text-left text-sm outline-none transition-colors',\n 'hover:bg-accent hover:text-accent-foreground focus-visible:bg-accent focus-visible:text-accent-foreground',\n 'disabled:pointer-events-none disabled:opacity-50',\n index === activeIndex && 'bg-accent text-accent-foreground',\n selected && 'font-medium',\n option.danger && 'text-destructive-text',\n mode !== 'action' && 'pl-8',\n classNames?.item,\n )}\n style={mode === 'tree' ? { paddingInlineStart: `${8 + option.depth * 16}px` } : undefined}\n >\n {mode !== 'action' ? <span className=\"absolute left-2 flex h-4 w-4 items-center justify-center\">{selected ? indicator : null}</span> : null}\n {slots?.option ? slots.option({ option, selected, highlighted: index === activeIndex }) : <>\n {option.icon ? <span className=\"shrink-0\">{option.icon}</span> : null}\n <span className={cn('min-w-0 flex-1 truncate', classNames?.itemLabel)}>{option.label}</span>\n {option.description ? <span className={cn('max-w-[45%] truncate text-xs text-muted-foreground', classNames?.itemDescription)}>{option.description}</span> : null}\n </>}\n </button>\n </div>\n );\n })}\n </div>\n )}\n {error && visibleOptions.length > 0 ? <div role=\"status\" className=\"px-2 py-1 text-xs text-destructive-text\">{error}</div> : null}\n {loading && visibleOptions.length > 0 ? <div role=\"status\" className=\"px-2 py-1 text-xs text-muted-foreground\">{loadingLabel}</div> : null}\n {slots?.footer ? slots.footer() : null}\n </PopoverPrimitive.Content>\n );\n return portal ? <PopoverPrimitive.Portal>{content}</PopoverPrimitive.Portal> : content;\n })()}\n </div>\n </PopoverPrimitive.Root>\n );\n },\n);\n"]}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
export { I as InteractiveTable, a as InteractiveTableClassNames, b as InteractiveTableColumn, c as InteractiveTableColumnMenuLabels, d as InteractiveTableEditableTextCell, e as InteractiveTableEditableTextCellProps, f as InteractiveTableHeaderContext, g as InteractiveTableHeaderProps, h as InteractiveTableProps, i as InteractiveTableReadonlyCell, j as InteractiveTableReadonlyCellProps, k as InteractiveTableRenderContext, l as InteractiveTableRowState, m as InteractiveTableSelectCell, n as InteractiveTableSelectCellProps, o as InteractiveTableSelectOption, W as WorkbenchAssetGallery, p as WorkbenchAssetGalleryItem, q as WorkbenchAssetGalleryProps, r as WorkbenchCollection,
|
|
1
|
+
export { I as InteractiveTable, a as InteractiveTableClassNames, b as InteractiveTableColumn, c as InteractiveTableColumnMenuLabels, d as InteractiveTableEditableTextCell, e as InteractiveTableEditableTextCellProps, f as InteractiveTableHeaderContext, g as InteractiveTableHeaderProps, h as InteractiveTableProps, i as InteractiveTableReadonlyCell, j as InteractiveTableReadonlyCellProps, k as InteractiveTableRenderContext, l as InteractiveTableRowState, m as InteractiveTableSelectCell, n as InteractiveTableSelectCellProps, o as InteractiveTableSelectOption, W as WorkbenchAssetGallery, p as WorkbenchAssetGalleryItem, q as WorkbenchAssetGalleryProps, r as WorkbenchCollection, bD as WorkbenchCollectionActionsPlacement, bE as WorkbenchCollectionActionsVisibility, s as WorkbenchCollectionActivationEvent, t as WorkbenchCollectionAppearanceConfig, u as WorkbenchCollectionCallbacks, v as WorkbenchCollectionClassNames, w as WorkbenchCollectionConfig, x as WorkbenchCollectionGroupContext, y as WorkbenchCollectionGroupingConfig, z as WorkbenchCollectionHoverEffect, bF as WorkbenchCollectionItemActionsConfig, bG as WorkbenchCollectionItemAlign, A as WorkbenchCollectionItemConfig, B as WorkbenchCollectionItemContext, C as WorkbenchCollectionItemSize, D as WorkbenchCollectionItemSlotName, E as WorkbenchCollectionItemSlots, F as WorkbenchCollectionItemStatus, G as WorkbenchCollectionItemTitleConfig, H as WorkbenchCollectionKey, J as WorkbenchCollectionLabels, K as WorkbenchCollectionLayoutConfig, L as WorkbenchCollectionLayoutContext, M as WorkbenchCollectionLayoutMode, N as WorkbenchCollectionLayoutSnapshot, O as WorkbenchCollectionLoadingConfig, P as WorkbenchCollectionLoadingVariant, Q as WorkbenchCollectionProps, R as WorkbenchCollectionResponsive, S as WorkbenchCollectionSelectionBehavior, T as WorkbenchCollectionSelectionConfig, U as WorkbenchCollectionSelectionMode, V as WorkbenchCollectionSkeletonConfig, X as WorkbenchCollectionSlotContext, Y as WorkbenchCollectionSlots, Z as WorkbenchCollectionStateConfig, _ as WorkbenchCollectionTitlePlacement, $ as WorkbenchCollectionTitleVisibility, a0 as WorkbenchCollectionVirtualizationAdapter, a1 as WorkbenchCollectionVirtualizationConfig, a2 as WorkbenchCollectionVirtualizationRenderOptions, a3 as WorkbenchContentPane, a4 as WorkbenchContentPaneBodyProps, a5 as WorkbenchContentPaneClassNames, a6 as WorkbenchContentPaneProps, a7 as WorkbenchContentToolbar, a8 as WorkbenchContentToolbarClassNames, a9 as WorkbenchContentToolbarProps, aa as WorkbenchContentToolbarViewModeOption, ab as WorkbenchDetailSidebar, ac as WorkbenchDetailSidebarBodyProps, ad as WorkbenchDetailSidebarClassNames, ae as WorkbenchDetailSidebarField, af as WorkbenchDetailSidebarProps, ag as WorkbenchDetailSidebarRenderContext, ah as WorkbenchDetailSidebarSection, ai as WorkbenchEvidenceItem, aj as WorkbenchEvidenceList, ak as WorkbenchEvidenceListProps, al as WorkbenchGalleryCard, am as WorkbenchGalleryCardMetaContext, an as WorkbenchGalleryCardProps, ao as WorkbenchGalleryCardRenderContext, ap as WorkbenchGalleryColumn, aq as WorkbenchGalleryLabels, ar as WorkbenchGalleryRecordVisual, as as WorkbenchGallerySettingsButton, at as WorkbenchGallerySettingsButtonClassNames, au as WorkbenchGallerySettingsButtonProps, av as WorkbenchGallerySettingsLabels, aw as WorkbenchGallerySettingsOption, ax as WorkbenchGallerySettingsPanel, ay as WorkbenchGallerySettingsPanelClassNames, az as WorkbenchGallerySettingsPanelProps, aA as WorkbenchGallerySettingsValue, aB as WorkbenchGalleryView, aC as WorkbenchGalleryViewProps, aD as WorkbenchJourneyItem, aE as WorkbenchJourneyItemState, aF as WorkbenchJourneyNavigation, aG as WorkbenchJourneyNavigationProps, aH as WorkbenchLaneClassNames, aI as WorkbenchLaneColumn, aJ as WorkbenchLaneRenderCardContext, aK as WorkbenchLaneView, aL as WorkbenchLaneViewProps, aM as WorkbenchMasonryItemSize, aN as WorkbenchMasonryLayout, aO as WorkbenchMasonryLayoutContext, aP as WorkbenchMasonryLayoutProps, aQ as WorkbenchMetricGrid, aR as WorkbenchMetricGridDensity, aS as WorkbenchMetricGridProps, aT as WorkbenchMetricGridVariant, aU as WorkbenchMetricItem, aV as WorkbenchRadarFilterChip, aW as WorkbenchRadarFilterChipProps, aX as WorkbenchRadarFilterRow, aY as WorkbenchRadarFilterRowDisclosureBase, aZ as WorkbenchRadarFilterRowIntegratedDisclosure, a_ as WorkbenchRadarFilterRowProps, a$ as WorkbenchRadarFilterRowSeparateDisclosure, b0 as WorkbenchRadarInspectorSection, b1 as WorkbenchRadarLegendItem, b2 as WorkbenchRadarMatrix, b3 as WorkbenchRadarMatrixProps, b4 as WorkbenchRadarNavigation, b5 as WorkbenchRadarNavigationChild, b6 as WorkbenchRadarNavigationItem, b7 as WorkbenchRadarNavigationProps, b8 as WorkbenchRadarQuadrant, b9 as WorkbenchRadarWorkspace, ba as WorkbenchRadarWorkspaceProps, bb as WorkbenchRankedList, bc as WorkbenchRankedListItem, bd as WorkbenchRankedListMetric, be as WorkbenchRankedListProps, bf as WorkbenchRelationshipEdge, bg as WorkbenchRelationshipGraph, bh as WorkbenchRelationshipGraphProps, bi as WorkbenchRelationshipNode, bj as WorkbenchResizableSidebar, bk as WorkbenchResizableSidebarClassNames, bl as WorkbenchResizableSidebarItem, bm as WorkbenchResizableSidebarProps, bn as WorkbenchResizableSidebarSection, bo as WorkbenchScatterAxis, bp as WorkbenchScatterPlot, bq as WorkbenchScatterPlotProps, br as WorkbenchScatterPoint, bs as WorkbenchScatterThresholds, bt as WorkbenchSelectionTray, bu as WorkbenchSelectionTrayItem, bv as WorkbenchSelectionTrayProps, bw as WorkbenchTableView, bx as WorkbenchTableViewClassNames, by as WorkbenchTableViewColumn, bz as WorkbenchTableViewHeaderContext, bA as WorkbenchTableViewProps, bB as WorkbenchTableViewRenderContext, bC as WorkbenchVisualizationTone } from '../../WorkbenchRadarMatrix-b50483af5a5d.mjs';
|
|
2
2
|
import * as react_jsx_runtime from 'react/jsx-runtime';
|
|
3
3
|
import { HTMLAttributes } from 'react';
|
|
4
4
|
import '../../types-c6ec8b90925b.mjs';
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
export { I as InteractiveTable, a as InteractiveTableClassNames, b as InteractiveTableColumn, c as InteractiveTableColumnMenuLabels, d as InteractiveTableEditableTextCell, e as InteractiveTableEditableTextCellProps, f as InteractiveTableHeaderContext, g as InteractiveTableHeaderProps, h as InteractiveTableProps, i as InteractiveTableReadonlyCell, j as InteractiveTableReadonlyCellProps, k as InteractiveTableRenderContext, l as InteractiveTableRowState, m as InteractiveTableSelectCell, n as InteractiveTableSelectCellProps, o as InteractiveTableSelectOption, W as WorkbenchAssetGallery, p as WorkbenchAssetGalleryItem, q as WorkbenchAssetGalleryProps, r as WorkbenchCollection,
|
|
1
|
+
export { I as InteractiveTable, a as InteractiveTableClassNames, b as InteractiveTableColumn, c as InteractiveTableColumnMenuLabels, d as InteractiveTableEditableTextCell, e as InteractiveTableEditableTextCellProps, f as InteractiveTableHeaderContext, g as InteractiveTableHeaderProps, h as InteractiveTableProps, i as InteractiveTableReadonlyCell, j as InteractiveTableReadonlyCellProps, k as InteractiveTableRenderContext, l as InteractiveTableRowState, m as InteractiveTableSelectCell, n as InteractiveTableSelectCellProps, o as InteractiveTableSelectOption, W as WorkbenchAssetGallery, p as WorkbenchAssetGalleryItem, q as WorkbenchAssetGalleryProps, r as WorkbenchCollection, bD as WorkbenchCollectionActionsPlacement, bE as WorkbenchCollectionActionsVisibility, s as WorkbenchCollectionActivationEvent, t as WorkbenchCollectionAppearanceConfig, u as WorkbenchCollectionCallbacks, v as WorkbenchCollectionClassNames, w as WorkbenchCollectionConfig, x as WorkbenchCollectionGroupContext, y as WorkbenchCollectionGroupingConfig, z as WorkbenchCollectionHoverEffect, bF as WorkbenchCollectionItemActionsConfig, bG as WorkbenchCollectionItemAlign, A as WorkbenchCollectionItemConfig, B as WorkbenchCollectionItemContext, C as WorkbenchCollectionItemSize, D as WorkbenchCollectionItemSlotName, E as WorkbenchCollectionItemSlots, F as WorkbenchCollectionItemStatus, G as WorkbenchCollectionItemTitleConfig, H as WorkbenchCollectionKey, J as WorkbenchCollectionLabels, K as WorkbenchCollectionLayoutConfig, L as WorkbenchCollectionLayoutContext, M as WorkbenchCollectionLayoutMode, N as WorkbenchCollectionLayoutSnapshot, O as WorkbenchCollectionLoadingConfig, P as WorkbenchCollectionLoadingVariant, Q as WorkbenchCollectionProps, R as WorkbenchCollectionResponsive, S as WorkbenchCollectionSelectionBehavior, T as WorkbenchCollectionSelectionConfig, U as WorkbenchCollectionSelectionMode, V as WorkbenchCollectionSkeletonConfig, X as WorkbenchCollectionSlotContext, Y as WorkbenchCollectionSlots, Z as WorkbenchCollectionStateConfig, _ as WorkbenchCollectionTitlePlacement, $ as WorkbenchCollectionTitleVisibility, a0 as WorkbenchCollectionVirtualizationAdapter, a1 as WorkbenchCollectionVirtualizationConfig, a2 as WorkbenchCollectionVirtualizationRenderOptions, a3 as WorkbenchContentPane, a4 as WorkbenchContentPaneBodyProps, a5 as WorkbenchContentPaneClassNames, a6 as WorkbenchContentPaneProps, a7 as WorkbenchContentToolbar, a8 as WorkbenchContentToolbarClassNames, a9 as WorkbenchContentToolbarProps, aa as WorkbenchContentToolbarViewModeOption, ab as WorkbenchDetailSidebar, ac as WorkbenchDetailSidebarBodyProps, ad as WorkbenchDetailSidebarClassNames, ae as WorkbenchDetailSidebarField, af as WorkbenchDetailSidebarProps, ag as WorkbenchDetailSidebarRenderContext, ah as WorkbenchDetailSidebarSection, ai as WorkbenchEvidenceItem, aj as WorkbenchEvidenceList, ak as WorkbenchEvidenceListProps, al as WorkbenchGalleryCard, am as WorkbenchGalleryCardMetaContext, an as WorkbenchGalleryCardProps, ao as WorkbenchGalleryCardRenderContext, ap as WorkbenchGalleryColumn, aq as WorkbenchGalleryLabels, ar as WorkbenchGalleryRecordVisual, as as WorkbenchGallerySettingsButton, at as WorkbenchGallerySettingsButtonClassNames, au as WorkbenchGallerySettingsButtonProps, av as WorkbenchGallerySettingsLabels, aw as WorkbenchGallerySettingsOption, ax as WorkbenchGallerySettingsPanel, ay as WorkbenchGallerySettingsPanelClassNames, az as WorkbenchGallerySettingsPanelProps, aA as WorkbenchGallerySettingsValue, aB as WorkbenchGalleryView, aC as WorkbenchGalleryViewProps, aD as WorkbenchJourneyItem, aE as WorkbenchJourneyItemState, aF as WorkbenchJourneyNavigation, aG as WorkbenchJourneyNavigationProps, aH as WorkbenchLaneClassNames, aI as WorkbenchLaneColumn, aJ as WorkbenchLaneRenderCardContext, aK as WorkbenchLaneView, aL as WorkbenchLaneViewProps, aM as WorkbenchMasonryItemSize, aN as WorkbenchMasonryLayout, aO as WorkbenchMasonryLayoutContext, aP as WorkbenchMasonryLayoutProps, aQ as WorkbenchMetricGrid, aR as WorkbenchMetricGridDensity, aS as WorkbenchMetricGridProps, aT as WorkbenchMetricGridVariant, aU as WorkbenchMetricItem, aV as WorkbenchRadarFilterChip, aW as WorkbenchRadarFilterChipProps, aX as WorkbenchRadarFilterRow, aY as WorkbenchRadarFilterRowDisclosureBase, aZ as WorkbenchRadarFilterRowIntegratedDisclosure, a_ as WorkbenchRadarFilterRowProps, a$ as WorkbenchRadarFilterRowSeparateDisclosure, b0 as WorkbenchRadarInspectorSection, b1 as WorkbenchRadarLegendItem, b2 as WorkbenchRadarMatrix, b3 as WorkbenchRadarMatrixProps, b4 as WorkbenchRadarNavigation, b5 as WorkbenchRadarNavigationChild, b6 as WorkbenchRadarNavigationItem, b7 as WorkbenchRadarNavigationProps, b8 as WorkbenchRadarQuadrant, b9 as WorkbenchRadarWorkspace, ba as WorkbenchRadarWorkspaceProps, bb as WorkbenchRankedList, bc as WorkbenchRankedListItem, bd as WorkbenchRankedListMetric, be as WorkbenchRankedListProps, bf as WorkbenchRelationshipEdge, bg as WorkbenchRelationshipGraph, bh as WorkbenchRelationshipGraphProps, bi as WorkbenchRelationshipNode, bj as WorkbenchResizableSidebar, bk as WorkbenchResizableSidebarClassNames, bl as WorkbenchResizableSidebarItem, bm as WorkbenchResizableSidebarProps, bn as WorkbenchResizableSidebarSection, bo as WorkbenchScatterAxis, bp as WorkbenchScatterPlot, bq as WorkbenchScatterPlotProps, br as WorkbenchScatterPoint, bs as WorkbenchScatterThresholds, bt as WorkbenchSelectionTray, bu as WorkbenchSelectionTrayItem, bv as WorkbenchSelectionTrayProps, bw as WorkbenchTableView, bx as WorkbenchTableViewClassNames, by as WorkbenchTableViewColumn, bz as WorkbenchTableViewHeaderContext, bA as WorkbenchTableViewProps, bB as WorkbenchTableViewRenderContext, bC as WorkbenchVisualizationTone } from '../../WorkbenchRadarMatrix-2ec5e4970f24.js';
|
|
2
2
|
import * as react_jsx_runtime from 'react/jsx-runtime';
|
|
3
3
|
import { HTMLAttributes } from 'react';
|
|
4
4
|
import '../../types-c6ec8b90925b.js';
|