@mastra/playground-ui 27.0.0-alpha.8 → 27.0.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/CHANGELOG.md +642 -0
- package/dist/index.cjs.js +878 -447
- package/dist/index.cjs.js.map +1 -1
- package/dist/index.css +279 -88
- package/dist/index.es.js +864 -442
- package/dist/index.es.js.map +1 -1
- package/dist/src/domains/traces/components/format-hierarchical-spans.d.ts +7 -1
- package/dist/src/domains/traces/components/index.d.ts +1 -0
- package/dist/src/domains/traces/components/span-data-panel-view.d.ts +7 -1
- package/dist/src/domains/traces/components/trace-data-panel-view.d.ts +7 -1
- package/dist/src/domains/traces/components/traces-list-mode-toggle.d.ts +12 -0
- package/dist/src/domains/traces/components/traces-list-view.d.ts +8 -1
- package/dist/src/domains/traces/components/traces-toolbar.d.ts +5 -1
- package/dist/src/domains/traces/hooks/index.d.ts +2 -0
- package/dist/src/domains/traces/hooks/use-branch.d.ts +52 -0
- package/dist/src/domains/traces/hooks/use-trace-list-navigation.d.ts +7 -2
- package/dist/src/domains/traces/hooks/use-trace-or-branch-spans.d.ts +25 -0
- package/dist/src/domains/traces/hooks/use-trace-url-state.d.ts +12 -1
- package/dist/src/domains/traces/trace-filters.d.ts +3 -0
- package/dist/src/ds/components/Button/Button.d.ts +1 -1
- package/dist/src/ds/components/ButtonsGroup/buttons-group.d.ts +30 -5
- package/dist/src/ds/components/ButtonsGroup/buttons-group.stories.d.ts +5 -0
- package/dist/src/ds/components/Combobox/combobox-styles.d.ts +19 -11
- package/dist/src/ds/components/Combobox/combobox.d.ts +3 -3
- package/dist/src/ds/components/Combobox/combobox.stories.d.ts +1 -0
- package/dist/src/ds/components/Combobox/index.d.ts +1 -0
- package/dist/src/ds/components/Command/command.d.ts +1 -1
- package/dist/src/ds/components/Input/input.d.ts +2 -2
- package/dist/src/ds/components/InputGroup/index.d.ts +1 -0
- package/dist/src/ds/components/InputGroup/input-group.d.ts +44 -0
- package/dist/src/ds/components/InputGroup/input-group.stories.d.ts +17 -0
- package/dist/src/ds/components/PropertyFilter/property-filter-applied.d.ts +11 -1
- package/dist/src/ds/components/PropertyFilter/property-filter-creator.d.ts +7 -1
- package/dist/src/ds/components/ScrollArea/scroll-area.d.ts +28 -7
- package/dist/src/ds/components/ScrollArea/scroll-area.stories.d.ts +4 -0
- package/dist/src/ds/components/StatusBadge/StatusBadge.d.ts +1 -1
- package/dist/src/ds/components/Tabs/tabs-list.d.ts +8 -2
- package/dist/src/ds/components/Tabs/tabs.stories.d.ts +2 -0
- package/dist/src/ds/components/Textarea/textarea.d.ts +2 -2
- package/dist/src/index.d.ts +1 -1
- package/package.json +7 -8
- package/dist/src/ds/components/Threads/index.d.ts +0 -1
- package/dist/src/ds/components/Threads/threads.d.ts +0 -28
- package/dist/src/ds/components/Threads/threads.stories.d.ts +0 -12
package/dist/index.cjs.js
CHANGED
|
@@ -3,10 +3,9 @@
|
|
|
3
3
|
Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
|
|
4
4
|
|
|
5
5
|
require('./index.css');const jsxRuntime = require('react/jsx-runtime');
|
|
6
|
-
const
|
|
6
|
+
const tokens = require('./tokens.cjs.js');
|
|
7
7
|
const React = require('react');
|
|
8
8
|
const TooltipPrimitive = require('@radix-ui/react-tooltip');
|
|
9
|
-
const tokens = require('./tokens.cjs.js');
|
|
10
9
|
const langJson = require('@codemirror/lang-json');
|
|
11
10
|
const langMarkdown = require('@codemirror/lang-markdown');
|
|
12
11
|
const language = require('@codemirror/language');
|
|
@@ -17,6 +16,7 @@ const highlight$1 = require('@lezer/highlight');
|
|
|
17
16
|
const codemirrorThemeDracula = require('@uiw/codemirror-theme-dracula');
|
|
18
17
|
const ReactCodeMirror = require('@uiw/react-codemirror');
|
|
19
18
|
const autocomplete = require('@codemirror/autocomplete');
|
|
19
|
+
const lucideReact = require('lucide-react');
|
|
20
20
|
const sonner = require('sonner');
|
|
21
21
|
const react = require('@mastra/react');
|
|
22
22
|
const AlertDialogPrimitive = require('@radix-ui/react-alert-dialog');
|
|
@@ -26,7 +26,7 @@ const combobox = require('@base-ui/react/combobox');
|
|
|
26
26
|
const cmdk = require('cmdk');
|
|
27
27
|
const DialogPrimitive = require('@radix-ui/react-dialog');
|
|
28
28
|
const SelectPrimitive = require('@radix-ui/react-select');
|
|
29
|
-
const
|
|
29
|
+
const tabs = require('@base-ui/react/tabs');
|
|
30
30
|
const DropdownMenuPrimitive = require('@radix-ui/react-dropdown-menu');
|
|
31
31
|
const VisuallyHidden = require('@radix-ui/react-visually-hidden');
|
|
32
32
|
const LabelPrimitive = require('@radix-ui/react-label');
|
|
@@ -34,7 +34,7 @@ const Markdown = require('react-markdown');
|
|
|
34
34
|
const remarkGfm = require('remark-gfm');
|
|
35
35
|
const PopoverPrimitive = require('@radix-ui/react-popover');
|
|
36
36
|
const RadioGroupPrimitive = require('@radix-ui/react-radio-group');
|
|
37
|
-
const
|
|
37
|
+
const scrollArea = require('@base-ui/react/scroll-area');
|
|
38
38
|
const useDebounce = require('use-debounce');
|
|
39
39
|
const SliderPrimitive = require('@radix-ui/react-slider');
|
|
40
40
|
const SwitchPrimitives = require('@radix-ui/react-switch');
|
|
@@ -79,60 +79,17 @@ const CheckboxPrimitive__namespace = /*#__PURE__*/_interopNamespaceDefault(Check
|
|
|
79
79
|
const CollapsiblePrimitive__namespace = /*#__PURE__*/_interopNamespaceDefault(CollapsiblePrimitive);
|
|
80
80
|
const DialogPrimitive__namespace = /*#__PURE__*/_interopNamespaceDefault(DialogPrimitive);
|
|
81
81
|
const SelectPrimitive__namespace = /*#__PURE__*/_interopNamespaceDefault(SelectPrimitive);
|
|
82
|
-
const RadixTabs__namespace = /*#__PURE__*/_interopNamespaceDefault(RadixTabs);
|
|
83
82
|
const DropdownMenuPrimitive__namespace = /*#__PURE__*/_interopNamespaceDefault(DropdownMenuPrimitive);
|
|
84
83
|
const VisuallyHidden__namespace = /*#__PURE__*/_interopNamespaceDefault(VisuallyHidden);
|
|
85
84
|
const LabelPrimitive__namespace = /*#__PURE__*/_interopNamespaceDefault(LabelPrimitive);
|
|
86
85
|
const PopoverPrimitive__namespace = /*#__PURE__*/_interopNamespaceDefault(PopoverPrimitive);
|
|
87
86
|
const RadioGroupPrimitive__namespace = /*#__PURE__*/_interopNamespaceDefault(RadioGroupPrimitive);
|
|
88
|
-
const ScrollAreaPrimitive__namespace = /*#__PURE__*/_interopNamespaceDefault(ScrollAreaPrimitive);
|
|
89
87
|
const SliderPrimitive__namespace = /*#__PURE__*/_interopNamespaceDefault(SliderPrimitive);
|
|
90
88
|
const SwitchPrimitives__namespace = /*#__PURE__*/_interopNamespaceDefault(SwitchPrimitives);
|
|
91
89
|
const HoverCard__namespace = /*#__PURE__*/_interopNamespaceDefault(HoverCard);
|
|
92
90
|
|
|
93
91
|
function r(e){var t,f,n="";if("string"==typeof e||"number"==typeof e)n+=e;else if("object"==typeof e)if(Array.isArray(e)){var o=e.length;for(t=0;t<o;t++)e[t]&&(f=r(e[t]))&&(n&&(n+=" "),n+=f);}else for(f in e)e[f]&&(n&&(n+=" "),n+=f);return n}function clsx(){for(var e,t,f=0,n="",o=arguments.length;f<o;f++)(e=arguments[f])&&(t=r(e))&&(n&&(n+=" "),n+=t);return n}
|
|
94
92
|
|
|
95
|
-
const falsyToString = (value)=>typeof value === "boolean" ? `${value}` : value === 0 ? "0" : value;
|
|
96
|
-
const cx = clsx;
|
|
97
|
-
const cva = (base, config)=>(props)=>{
|
|
98
|
-
var _config_compoundVariants;
|
|
99
|
-
if ((config === null || config === void 0 ? void 0 : config.variants) == null) return cx(base, props === null || props === void 0 ? void 0 : props.class, props === null || props === void 0 ? void 0 : props.className);
|
|
100
|
-
const { variants, defaultVariants } = config;
|
|
101
|
-
const getVariantClassNames = Object.keys(variants).map((variant)=>{
|
|
102
|
-
const variantProp = props === null || props === void 0 ? void 0 : props[variant];
|
|
103
|
-
const defaultVariantProp = defaultVariants === null || defaultVariants === void 0 ? void 0 : defaultVariants[variant];
|
|
104
|
-
if (variantProp === null) return null;
|
|
105
|
-
const variantKey = falsyToString(variantProp) || falsyToString(defaultVariantProp);
|
|
106
|
-
return variants[variant][variantKey];
|
|
107
|
-
});
|
|
108
|
-
const propsWithoutUndefined = props && Object.entries(props).reduce((acc, param)=>{
|
|
109
|
-
let [key, value] = param;
|
|
110
|
-
if (value === undefined) {
|
|
111
|
-
return acc;
|
|
112
|
-
}
|
|
113
|
-
acc[key] = value;
|
|
114
|
-
return acc;
|
|
115
|
-
}, {});
|
|
116
|
-
const getCompoundVariantClassNames = config === null || config === void 0 ? void 0 : (_config_compoundVariants = config.compoundVariants) === null || _config_compoundVariants === void 0 ? void 0 : _config_compoundVariants.reduce((acc, param)=>{
|
|
117
|
-
let { class: cvClass, className: cvClassName, ...compoundVariantOptions } = param;
|
|
118
|
-
return Object.entries(compoundVariantOptions).every((param)=>{
|
|
119
|
-
let [key, value] = param;
|
|
120
|
-
return Array.isArray(value) ? value.includes({
|
|
121
|
-
...defaultVariants,
|
|
122
|
-
...propsWithoutUndefined
|
|
123
|
-
}[key]) : ({
|
|
124
|
-
...defaultVariants,
|
|
125
|
-
...propsWithoutUndefined
|
|
126
|
-
})[key] === value;
|
|
127
|
-
}) ? [
|
|
128
|
-
...acc,
|
|
129
|
-
cvClass,
|
|
130
|
-
cvClassName
|
|
131
|
-
] : acc;
|
|
132
|
-
}, []);
|
|
133
|
-
return cx(base, getVariantClassNames, getCompoundVariantClassNames, props === null || props === void 0 ? void 0 : props.class, props === null || props === void 0 ? void 0 : props.className);
|
|
134
|
-
};
|
|
135
|
-
|
|
136
93
|
/**
|
|
137
94
|
* Concatenates two arrays faster than the array spread operator.
|
|
138
95
|
*/
|
|
@@ -3417,6 +3374,185 @@ function cn(...inputs) {
|
|
|
3417
3374
|
return twMerge(clsx(inputs));
|
|
3418
3375
|
}
|
|
3419
3376
|
|
|
3377
|
+
const variants = {
|
|
3378
|
+
// UI text sizes
|
|
3379
|
+
"ui-xs": "text-ui-xs leading-ui-xs",
|
|
3380
|
+
"ui-sm": "text-ui-sm leading-ui-sm",
|
|
3381
|
+
"ui-smd": "text-ui-smd leading-ui-smd",
|
|
3382
|
+
"ui-md": "text-ui-md leading-ui-md",
|
|
3383
|
+
"ui-lg": "text-ui-lg leading-ui-lg",
|
|
3384
|
+
// Header sizes
|
|
3385
|
+
"header-xs": "text-header-xs leading-header-xs",
|
|
3386
|
+
"header-sm": "text-header-sm leading-header-sm",
|
|
3387
|
+
"header-md": "text-header-md leading-header-md",
|
|
3388
|
+
"header-lg": "text-header-lg leading-header-lg",
|
|
3389
|
+
"header-xl": "text-header-xl leading-header-xl"
|
|
3390
|
+
};
|
|
3391
|
+
const fonts = {
|
|
3392
|
+
mono: "font-mono"
|
|
3393
|
+
};
|
|
3394
|
+
const Txt = ({ as: Root = "p", className, variant = "ui-md", font, ...props }) => {
|
|
3395
|
+
return /* @__PURE__ */ jsxRuntime.jsx(Root, { className: cn(variants[variant], font && fonts[font], className), ...props });
|
|
3396
|
+
};
|
|
3397
|
+
|
|
3398
|
+
const transitions = {
|
|
3399
|
+
// For color changes (background, text, border)
|
|
3400
|
+
colors: "transition-colors duration-normal ease-out-custom",
|
|
3401
|
+
// For transform changes (scale, translate, rotate)
|
|
3402
|
+
transform: "transition-transform duration-normal ease-out-custom",
|
|
3403
|
+
// For all property changes
|
|
3404
|
+
all: "transition-all duration-normal ease-out-custom",
|
|
3405
|
+
// For opacity changes
|
|
3406
|
+
opacity: "transition-opacity duration-normal ease-out-custom",
|
|
3407
|
+
// For shadow changes
|
|
3408
|
+
shadow: "transition-shadow duration-normal ease-out-custom",
|
|
3409
|
+
// For slower transitions (sidebar collapse, etc.)
|
|
3410
|
+
allSlow: "transition-all duration-slow ease-out-custom"
|
|
3411
|
+
};
|
|
3412
|
+
const hoverEffects = {
|
|
3413
|
+
// Subtle scale effect for buttons and cards
|
|
3414
|
+
scale: "hover:scale-[1.02] active:scale-[0.98]",
|
|
3415
|
+
// Even more subtle scale for active state only
|
|
3416
|
+
scaleSubtle: "active:scale-[0.98]",
|
|
3417
|
+
// Brightness increase
|
|
3418
|
+
brightness: "hover:brightness-110",
|
|
3419
|
+
// Background lift
|
|
3420
|
+
lift: "hover:bg-surface4"
|
|
3421
|
+
};
|
|
3422
|
+
const focusRing = {
|
|
3423
|
+
// Standard focus ring with glow
|
|
3424
|
+
default: "focus:outline-hidden focus:ring-1 focus:ring-accent1 focus:shadow-focus-ring",
|
|
3425
|
+
// Focus ring without glow
|
|
3426
|
+
simple: "focus:outline-hidden focus:ring-1 focus:ring-accent1",
|
|
3427
|
+
// Focus visible only (keyboard navigation)
|
|
3428
|
+
visible: "focus-visible:outline-hidden focus-visible:ring-1 focus-visible:ring-accent1 focus-visible:shadow-focus-ring"
|
|
3429
|
+
};
|
|
3430
|
+
|
|
3431
|
+
const sizeClasses$4 = {
|
|
3432
|
+
sm: "h-avatar-sm w-avatar-sm",
|
|
3433
|
+
md: "h-avatar-md w-avatar-md",
|
|
3434
|
+
lg: "h-avatar-lg w-avatar-lg"
|
|
3435
|
+
};
|
|
3436
|
+
const Avatar = ({ src, name, size = "sm", interactive = false }) => {
|
|
3437
|
+
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
3438
|
+
"div",
|
|
3439
|
+
{
|
|
3440
|
+
className: cn(
|
|
3441
|
+
sizeClasses$4[size],
|
|
3442
|
+
"border border-border1 bg-surface3 shrink-0 overflow-hidden rounded-full flex items-center justify-center",
|
|
3443
|
+
transitions.all,
|
|
3444
|
+
interactive && "cursor-pointer hover:scale-105 hover:border-neutral2 hover:shadow-sm"
|
|
3445
|
+
),
|
|
3446
|
+
children: src ? /* @__PURE__ */ jsxRuntime.jsx("img", { src, alt: name, className: "h-full w-full object-cover" }) : /* @__PURE__ */ jsxRuntime.jsx(Txt, { variant: "ui-md", className: "text-center text-neutral4", children: name[0].toUpperCase() })
|
|
3447
|
+
}
|
|
3448
|
+
);
|
|
3449
|
+
};
|
|
3450
|
+
|
|
3451
|
+
const sizes = {
|
|
3452
|
+
sm: "[&>svg]:h-icon-sm [&>svg]:w-icon-sm",
|
|
3453
|
+
default: "[&>svg]:h-icon-default [&>svg]:w-icon-default",
|
|
3454
|
+
lg: "[&>svg]:h-icon-lg [&>svg]:w-icon-lg"
|
|
3455
|
+
};
|
|
3456
|
+
const Icon = ({ children, className, size = "default", ...props }) => {
|
|
3457
|
+
return /* @__PURE__ */ jsxRuntime.jsx("span", { className: cn("block", sizes[size], className), ...props, children });
|
|
3458
|
+
};
|
|
3459
|
+
|
|
3460
|
+
const variantClasses = {
|
|
3461
|
+
default: "text-neutral5 bg-surface4 border-border1",
|
|
3462
|
+
success: "text-notice-success-fg bg-notice-success/20 border-notice-success/20",
|
|
3463
|
+
error: "text-notice-destructive-fg bg-notice-destructive/20 border-notice-destructive/20",
|
|
3464
|
+
info: "text-notice-info-fg bg-notice-info/20 border-notice-info/20",
|
|
3465
|
+
warning: "text-notice-warning-fg bg-notice-warning/20 border-notice-warning/20"
|
|
3466
|
+
};
|
|
3467
|
+
const Badge = ({ icon, variant = "default", className, children, ...props }) => {
|
|
3468
|
+
return /* @__PURE__ */ jsxRuntime.jsxs(
|
|
3469
|
+
"div",
|
|
3470
|
+
{
|
|
3471
|
+
className: cn(
|
|
3472
|
+
"font-mono text-ui-sm gap-1 h-badge-default inline-flex items-center rounded-full border shrink-0",
|
|
3473
|
+
transitions.colors,
|
|
3474
|
+
icon ? "pl-2 pr-2.5" : "px-2.5",
|
|
3475
|
+
variantClasses[variant],
|
|
3476
|
+
className
|
|
3477
|
+
),
|
|
3478
|
+
...props,
|
|
3479
|
+
children: [
|
|
3480
|
+
icon && /* @__PURE__ */ jsxRuntime.jsx(Icon, { size: "sm", children: icon }),
|
|
3481
|
+
children
|
|
3482
|
+
]
|
|
3483
|
+
}
|
|
3484
|
+
);
|
|
3485
|
+
};
|
|
3486
|
+
|
|
3487
|
+
const SlashIcon = (props) => /* @__PURE__ */ jsxRuntime.jsx("svg", { width: "17", height: "16", viewBox: "0 0 17 16", fill: "none", xmlns: "http://www.w3.org/2000/svg", ...props, children: /* @__PURE__ */ jsxRuntime.jsx("path", { d: "M5.25684 12.6387L10.4003 3.36133H11.7432L6.5997 12.6387H5.25684Z", fill: "currentColor" }) });
|
|
3488
|
+
|
|
3489
|
+
const Breadcrumb = ({ children, label }) => {
|
|
3490
|
+
return /* @__PURE__ */ jsxRuntime.jsx("nav", { "aria-label": label, children: /* @__PURE__ */ jsxRuntime.jsx("ol", { className: "gap-0.5 flex items-center", children }) });
|
|
3491
|
+
};
|
|
3492
|
+
const Crumb = ({ className, as, isCurrent, action, ...props }) => {
|
|
3493
|
+
const Root = as || "span";
|
|
3494
|
+
return /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
|
|
3495
|
+
/* @__PURE__ */ jsxRuntime.jsxs("li", { className: "flex h-full shrink-0 items-center gap-1", children: [
|
|
3496
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
3497
|
+
Root,
|
|
3498
|
+
{
|
|
3499
|
+
"aria-current": isCurrent ? "page" : void 0,
|
|
3500
|
+
className: cn(
|
|
3501
|
+
"text-ui-md leading-ui-md flex items-center gap-2",
|
|
3502
|
+
transitions.colors,
|
|
3503
|
+
isCurrent ? "text-white" : "text-neutral3 hover:text-neutral5",
|
|
3504
|
+
className
|
|
3505
|
+
),
|
|
3506
|
+
...props
|
|
3507
|
+
}
|
|
3508
|
+
),
|
|
3509
|
+
action
|
|
3510
|
+
] }),
|
|
3511
|
+
!isCurrent && /* @__PURE__ */ jsxRuntime.jsx("li", { role: "separator", className: "flex h-full items-center", children: /* @__PURE__ */ jsxRuntime.jsx(Icon, { className: cn("text-neutral2", transitions.colors), children: /* @__PURE__ */ jsxRuntime.jsx(SlashIcon, {}) }) })
|
|
3512
|
+
] });
|
|
3513
|
+
};
|
|
3514
|
+
|
|
3515
|
+
const falsyToString = (value)=>typeof value === "boolean" ? `${value}` : value === 0 ? "0" : value;
|
|
3516
|
+
const cx = clsx;
|
|
3517
|
+
const cva = (base, config)=>(props)=>{
|
|
3518
|
+
var _config_compoundVariants;
|
|
3519
|
+
if ((config === null || config === void 0 ? void 0 : config.variants) == null) return cx(base, props === null || props === void 0 ? void 0 : props.class, props === null || props === void 0 ? void 0 : props.className);
|
|
3520
|
+
const { variants, defaultVariants } = config;
|
|
3521
|
+
const getVariantClassNames = Object.keys(variants).map((variant)=>{
|
|
3522
|
+
const variantProp = props === null || props === void 0 ? void 0 : props[variant];
|
|
3523
|
+
const defaultVariantProp = defaultVariants === null || defaultVariants === void 0 ? void 0 : defaultVariants[variant];
|
|
3524
|
+
if (variantProp === null) return null;
|
|
3525
|
+
const variantKey = falsyToString(variantProp) || falsyToString(defaultVariantProp);
|
|
3526
|
+
return variants[variant][variantKey];
|
|
3527
|
+
});
|
|
3528
|
+
const propsWithoutUndefined = props && Object.entries(props).reduce((acc, param)=>{
|
|
3529
|
+
let [key, value] = param;
|
|
3530
|
+
if (value === undefined) {
|
|
3531
|
+
return acc;
|
|
3532
|
+
}
|
|
3533
|
+
acc[key] = value;
|
|
3534
|
+
return acc;
|
|
3535
|
+
}, {});
|
|
3536
|
+
const getCompoundVariantClassNames = config === null || config === void 0 ? void 0 : (_config_compoundVariants = config.compoundVariants) === null || _config_compoundVariants === void 0 ? void 0 : _config_compoundVariants.reduce((acc, param)=>{
|
|
3537
|
+
let { class: cvClass, className: cvClassName, ...compoundVariantOptions } = param;
|
|
3538
|
+
return Object.entries(compoundVariantOptions).every((param)=>{
|
|
3539
|
+
let [key, value] = param;
|
|
3540
|
+
return Array.isArray(value) ? value.includes({
|
|
3541
|
+
...defaultVariants,
|
|
3542
|
+
...propsWithoutUndefined
|
|
3543
|
+
}[key]) : ({
|
|
3544
|
+
...defaultVariants,
|
|
3545
|
+
...propsWithoutUndefined
|
|
3546
|
+
})[key] === value;
|
|
3547
|
+
}) ? [
|
|
3548
|
+
...acc,
|
|
3549
|
+
cvClass,
|
|
3550
|
+
cvClassName
|
|
3551
|
+
] : acc;
|
|
3552
|
+
}, []);
|
|
3553
|
+
return cx(base, getVariantClassNames, getCompoundVariantClassNames, props === null || props === void 0 ? void 0 : props.class, props === null || props === void 0 ? void 0 : props.className);
|
|
3554
|
+
};
|
|
3555
|
+
|
|
3420
3556
|
const TooltipProvider = TooltipPrimitive__namespace.Provider;
|
|
3421
3557
|
const Tooltip = TooltipPrimitive__namespace.Root;
|
|
3422
3558
|
const TooltipTrigger = TooltipPrimitive__namespace.Trigger;
|
|
@@ -3438,15 +3574,6 @@ const TooltipContent = React__namespace.forwardRef(({ className, sideOffset = 4,
|
|
|
3438
3574
|
) }));
|
|
3439
3575
|
TooltipContent.displayName = TooltipPrimitive__namespace.Content.displayName;
|
|
3440
3576
|
|
|
3441
|
-
const sizes = {
|
|
3442
|
-
sm: "[&>svg]:h-icon-sm [&>svg]:w-icon-sm",
|
|
3443
|
-
default: "[&>svg]:h-icon-default [&>svg]:w-icon-default",
|
|
3444
|
-
lg: "[&>svg]:h-icon-lg [&>svg]:w-icon-lg"
|
|
3445
|
-
};
|
|
3446
|
-
const Icon = ({ children, className, size = "default", ...props }) => {
|
|
3447
|
-
return /* @__PURE__ */ jsxRuntime.jsx("span", { className: cn("block", sizes[size], className), ...props, children });
|
|
3448
|
-
};
|
|
3449
|
-
|
|
3450
3577
|
const formElementSizes = {
|
|
3451
3578
|
sm: "h-form-sm",
|
|
3452
3579
|
md: "h-form-md",
|
|
@@ -3479,7 +3606,7 @@ const buttonVariants = cva(
|
|
|
3479
3606
|
default: "bg-surface3 border border-border1 hover:bg-surface5 hover:text-neutral6 active:bg-surface6 text-neutral6",
|
|
3480
3607
|
primary: "bg-surface4 border border-border2 hover:bg-surface5 hover:text-neutral6 active:bg-surface6 text-neutral6",
|
|
3481
3608
|
cta: "bg-accent1 border border-transparent hover:bg-accent1/90 hover:shadow-glow-accent1 disabled:hover:shadow-none text-surface1 font-medium",
|
|
3482
|
-
ghost: "bg-transparent border border-transparent hover:bg-
|
|
3609
|
+
ghost: "bg-transparent border border-transparent hover:bg-surface3 hover:text-neutral6 active:bg-surface4 text-neutral4",
|
|
3483
3610
|
outline: "bg-transparent border border-border1 hover:bg-surface3 hover:text-neutral6 active:bg-surface4 text-neutral5",
|
|
3484
3611
|
link: "inline-flex justify-start rounded-none h-auto px-0 bg-transparent text-neutral3 hover:text-neutral4 gap-1 [&>svg]:mx-0 w-auto [&>svg]:opacity-70"
|
|
3485
3612
|
},
|
|
@@ -3564,189 +3691,6 @@ const ButtonWithTooltip = React.forwardRef(
|
|
|
3564
3691
|
);
|
|
3565
3692
|
ButtonWithTooltip.displayName = "ButtonWithTooltip";
|
|
3566
3693
|
|
|
3567
|
-
const transitions = {
|
|
3568
|
-
// For color changes (background, text, border)
|
|
3569
|
-
colors: "transition-colors duration-normal ease-out-custom",
|
|
3570
|
-
// For transform changes (scale, translate, rotate)
|
|
3571
|
-
transform: "transition-transform duration-normal ease-out-custom",
|
|
3572
|
-
// For all property changes
|
|
3573
|
-
all: "transition-all duration-normal ease-out-custom",
|
|
3574
|
-
// For opacity changes
|
|
3575
|
-
opacity: "transition-opacity duration-normal ease-out-custom",
|
|
3576
|
-
// For shadow changes
|
|
3577
|
-
shadow: "transition-shadow duration-normal ease-out-custom",
|
|
3578
|
-
// For slower transitions (sidebar collapse, etc.)
|
|
3579
|
-
allSlow: "transition-all duration-slow ease-out-custom"
|
|
3580
|
-
};
|
|
3581
|
-
const hoverEffects = {
|
|
3582
|
-
// Subtle scale effect for buttons and cards
|
|
3583
|
-
scale: "hover:scale-[1.02] active:scale-[0.98]",
|
|
3584
|
-
// Even more subtle scale for active state only
|
|
3585
|
-
scaleSubtle: "active:scale-[0.98]",
|
|
3586
|
-
// Brightness increase
|
|
3587
|
-
brightness: "hover:brightness-110",
|
|
3588
|
-
// Background lift
|
|
3589
|
-
lift: "hover:bg-surface4"
|
|
3590
|
-
};
|
|
3591
|
-
const focusRing = {
|
|
3592
|
-
// Standard focus ring with glow
|
|
3593
|
-
default: "focus:outline-hidden focus:ring-1 focus:ring-accent1 focus:shadow-focus-ring",
|
|
3594
|
-
// Focus ring without glow
|
|
3595
|
-
simple: "focus:outline-hidden focus:ring-1 focus:ring-accent1",
|
|
3596
|
-
// Focus visible only (keyboard navigation)
|
|
3597
|
-
visible: "focus-visible:outline-hidden focus-visible:ring-1 focus-visible:ring-accent1 focus-visible:shadow-focus-ring"
|
|
3598
|
-
};
|
|
3599
|
-
|
|
3600
|
-
const Threads = ({ children }) => {
|
|
3601
|
-
return /* @__PURE__ */ jsxRuntime.jsx("nav", { className: "min-h-full overflow-hidden", children });
|
|
3602
|
-
};
|
|
3603
|
-
const ThreadLink = ({ children, as: Component = "a", href, className, prefetch, to }) => {
|
|
3604
|
-
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
3605
|
-
Component,
|
|
3606
|
-
{
|
|
3607
|
-
href,
|
|
3608
|
-
prefetch,
|
|
3609
|
-
to,
|
|
3610
|
-
className: cn(
|
|
3611
|
-
"text-ui-sm flex h-full w-full flex-col justify-center font-medium cursor-pointer",
|
|
3612
|
-
transitions.colors,
|
|
3613
|
-
className
|
|
3614
|
-
),
|
|
3615
|
-
children
|
|
3616
|
-
}
|
|
3617
|
-
);
|
|
3618
|
-
};
|
|
3619
|
-
const ThreadList = ({ children }) => {
|
|
3620
|
-
return /* @__PURE__ */ jsxRuntime.jsx("ol", { "data-testid": "thread-list", children });
|
|
3621
|
-
};
|
|
3622
|
-
const ThreadItem = ({ children, isActive, className }) => {
|
|
3623
|
-
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
3624
|
-
"li",
|
|
3625
|
-
{
|
|
3626
|
-
className: cn(
|
|
3627
|
-
"border-b border-border1 group flex h-[54px] items-center justify-between gap-2 px-3 py-2",
|
|
3628
|
-
transitions.colors,
|
|
3629
|
-
"hover:bg-surface3",
|
|
3630
|
-
isActive && "bg-accent1Dark",
|
|
3631
|
-
className
|
|
3632
|
-
),
|
|
3633
|
-
children
|
|
3634
|
-
}
|
|
3635
|
-
);
|
|
3636
|
-
};
|
|
3637
|
-
const ThreadDeleteButton = ({ onClick }) => {
|
|
3638
|
-
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
3639
|
-
Button,
|
|
3640
|
-
{
|
|
3641
|
-
variant: "ghost",
|
|
3642
|
-
className: cn(
|
|
3643
|
-
"shrink-0 opacity-0",
|
|
3644
|
-
transitions.all,
|
|
3645
|
-
"group-focus-within:opacity-100 group-hover:opacity-100",
|
|
3646
|
-
"hover:bg-surface4 hover:text-accent2"
|
|
3647
|
-
),
|
|
3648
|
-
onClick,
|
|
3649
|
-
children: /* @__PURE__ */ jsxRuntime.jsx(Icon, { children: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.X, { "aria-label": "delete thread", className: "text-neutral3 hover:text-accent2 transition-colors" }) })
|
|
3650
|
-
}
|
|
3651
|
-
);
|
|
3652
|
-
};
|
|
3653
|
-
|
|
3654
|
-
const variants = {
|
|
3655
|
-
// UI text sizes
|
|
3656
|
-
"ui-xs": "text-ui-xs leading-ui-xs",
|
|
3657
|
-
"ui-sm": "text-ui-sm leading-ui-sm",
|
|
3658
|
-
"ui-smd": "text-ui-smd leading-ui-smd",
|
|
3659
|
-
"ui-md": "text-ui-md leading-ui-md",
|
|
3660
|
-
"ui-lg": "text-ui-lg leading-ui-lg",
|
|
3661
|
-
// Header sizes
|
|
3662
|
-
"header-xs": "text-header-xs leading-header-xs",
|
|
3663
|
-
"header-sm": "text-header-sm leading-header-sm",
|
|
3664
|
-
"header-md": "text-header-md leading-header-md",
|
|
3665
|
-
"header-lg": "text-header-lg leading-header-lg",
|
|
3666
|
-
"header-xl": "text-header-xl leading-header-xl"
|
|
3667
|
-
};
|
|
3668
|
-
const fonts = {
|
|
3669
|
-
mono: "font-mono"
|
|
3670
|
-
};
|
|
3671
|
-
const Txt = ({ as: Root = "p", className, variant = "ui-md", font, ...props }) => {
|
|
3672
|
-
return /* @__PURE__ */ jsxRuntime.jsx(Root, { className: cn(variants[variant], font && fonts[font], className), ...props });
|
|
3673
|
-
};
|
|
3674
|
-
|
|
3675
|
-
const sizeClasses$4 = {
|
|
3676
|
-
sm: "h-avatar-sm w-avatar-sm",
|
|
3677
|
-
md: "h-avatar-md w-avatar-md",
|
|
3678
|
-
lg: "h-avatar-lg w-avatar-lg"
|
|
3679
|
-
};
|
|
3680
|
-
const Avatar = ({ src, name, size = "sm", interactive = false }) => {
|
|
3681
|
-
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
3682
|
-
"div",
|
|
3683
|
-
{
|
|
3684
|
-
className: cn(
|
|
3685
|
-
sizeClasses$4[size],
|
|
3686
|
-
"border border-border1 bg-surface3 shrink-0 overflow-hidden rounded-full flex items-center justify-center",
|
|
3687
|
-
transitions.all,
|
|
3688
|
-
interactive && "cursor-pointer hover:scale-105 hover:border-neutral2 hover:shadow-sm"
|
|
3689
|
-
),
|
|
3690
|
-
children: src ? /* @__PURE__ */ jsxRuntime.jsx("img", { src, alt: name, className: "h-full w-full object-cover" }) : /* @__PURE__ */ jsxRuntime.jsx(Txt, { variant: "ui-md", className: "text-center text-neutral4", children: name[0].toUpperCase() })
|
|
3691
|
-
}
|
|
3692
|
-
);
|
|
3693
|
-
};
|
|
3694
|
-
|
|
3695
|
-
const variantClasses = {
|
|
3696
|
-
default: "text-neutral5 bg-surface4 border-border1",
|
|
3697
|
-
success: "text-notice-success-fg bg-notice-success/20 border-notice-success/20",
|
|
3698
|
-
error: "text-notice-destructive-fg bg-notice-destructive/20 border-notice-destructive/20",
|
|
3699
|
-
info: "text-notice-info-fg bg-notice-info/20 border-notice-info/20",
|
|
3700
|
-
warning: "text-notice-warning-fg bg-notice-warning/20 border-notice-warning/20"
|
|
3701
|
-
};
|
|
3702
|
-
const Badge = ({ icon, variant = "default", className, children, ...props }) => {
|
|
3703
|
-
return /* @__PURE__ */ jsxRuntime.jsxs(
|
|
3704
|
-
"div",
|
|
3705
|
-
{
|
|
3706
|
-
className: cn(
|
|
3707
|
-
"font-mono text-ui-sm gap-1 h-badge-default inline-flex items-center rounded-full border shrink-0",
|
|
3708
|
-
transitions.colors,
|
|
3709
|
-
icon ? "pl-2 pr-2.5" : "px-2.5",
|
|
3710
|
-
variantClasses[variant],
|
|
3711
|
-
className
|
|
3712
|
-
),
|
|
3713
|
-
...props,
|
|
3714
|
-
children: [
|
|
3715
|
-
icon && /* @__PURE__ */ jsxRuntime.jsx(Icon, { size: "sm", children: icon }),
|
|
3716
|
-
children
|
|
3717
|
-
]
|
|
3718
|
-
}
|
|
3719
|
-
);
|
|
3720
|
-
};
|
|
3721
|
-
|
|
3722
|
-
const SlashIcon = (props) => /* @__PURE__ */ jsxRuntime.jsx("svg", { width: "17", height: "16", viewBox: "0 0 17 16", fill: "none", xmlns: "http://www.w3.org/2000/svg", ...props, children: /* @__PURE__ */ jsxRuntime.jsx("path", { d: "M5.25684 12.6387L10.4003 3.36133H11.7432L6.5997 12.6387H5.25684Z", fill: "currentColor" }) });
|
|
3723
|
-
|
|
3724
|
-
const Breadcrumb = ({ children, label }) => {
|
|
3725
|
-
return /* @__PURE__ */ jsxRuntime.jsx("nav", { "aria-label": label, children: /* @__PURE__ */ jsxRuntime.jsx("ol", { className: "gap-0.5 flex items-center", children }) });
|
|
3726
|
-
};
|
|
3727
|
-
const Crumb = ({ className, as, isCurrent, action, ...props }) => {
|
|
3728
|
-
const Root = as || "span";
|
|
3729
|
-
return /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
|
|
3730
|
-
/* @__PURE__ */ jsxRuntime.jsxs("li", { className: "flex h-full shrink-0 items-center gap-1", children: [
|
|
3731
|
-
/* @__PURE__ */ jsxRuntime.jsx(
|
|
3732
|
-
Root,
|
|
3733
|
-
{
|
|
3734
|
-
"aria-current": isCurrent ? "page" : void 0,
|
|
3735
|
-
className: cn(
|
|
3736
|
-
"text-ui-md leading-ui-md flex items-center gap-2",
|
|
3737
|
-
transitions.colors,
|
|
3738
|
-
isCurrent ? "text-white" : "text-neutral3 hover:text-neutral5",
|
|
3739
|
-
className
|
|
3740
|
-
),
|
|
3741
|
-
...props
|
|
3742
|
-
}
|
|
3743
|
-
),
|
|
3744
|
-
action
|
|
3745
|
-
] }),
|
|
3746
|
-
!isCurrent && /* @__PURE__ */ jsxRuntime.jsx("li", { role: "separator", className: "flex h-full items-center", children: /* @__PURE__ */ jsxRuntime.jsx(Icon, { className: cn("text-neutral2", transitions.colors), children: /* @__PURE__ */ jsxRuntime.jsx(SlashIcon, {}) }) })
|
|
3747
|
-
] });
|
|
3748
|
-
};
|
|
3749
|
-
|
|
3750
3694
|
function flattenSchemaToVariables(schema, maxDepth = 5) {
|
|
3751
3695
|
if (!schema?.properties) {
|
|
3752
3696
|
return [];
|
|
@@ -6078,16 +6022,29 @@ CollapsibleContent.displayName = CollapsiblePrimitive__namespace.CollapsibleCont
|
|
|
6078
6022
|
const comboboxStyles = {
|
|
6079
6023
|
/** Root wrapper */
|
|
6080
6024
|
root: "flex flex-col gap-1.5",
|
|
6081
|
-
/** Trigger —
|
|
6025
|
+
/** Trigger base — shared layout/typography for all variants. */
|
|
6082
6026
|
trigger: cn(
|
|
6083
|
-
"inline-flex w-full min-w-32 select-none items-center justify-between gap-1.5 whitespace-nowrap",
|
|
6084
|
-
"rounded-lg border
|
|
6027
|
+
"inline-flex w-full min-w-32 select-none items-center justify-between gap-1.5 whitespace-nowrap cursor-pointer",
|
|
6028
|
+
"rounded-lg border bg-transparent px-2.5 text-ui-smd leading-ui-sm text-neutral4",
|
|
6085
6029
|
"outline-none transition-colors duration-normal ease-out-custom",
|
|
6086
|
-
"
|
|
6087
|
-
"focus:outline-none focus-visible:outline-none focus-visible:border-border2",
|
|
6088
|
-
"data-[popup-open]:bg-surface3 data-[popup-open]:text-neutral6 data-[popup-open]:border-border2",
|
|
6030
|
+
"focus:outline-none focus-visible:outline-none",
|
|
6089
6031
|
"disabled:cursor-not-allowed disabled:opacity-50"
|
|
6090
6032
|
),
|
|
6033
|
+
/** Variant: default — bordered form input look. */
|
|
6034
|
+
triggerDefault: cn(
|
|
6035
|
+
"border-border1",
|
|
6036
|
+
"hover:bg-surface2 hover:text-neutral6 hover:border-border2 active:bg-surface3",
|
|
6037
|
+
"focus-visible:border-border2",
|
|
6038
|
+
"data-[popup-open]:bg-surface3 data-[popup-open]:text-neutral6 data-[popup-open]:border-border2"
|
|
6039
|
+
),
|
|
6040
|
+
/** Variant: ghost — borderless, hover-only surface. */
|
|
6041
|
+
triggerGhost: cn(
|
|
6042
|
+
"border-transparent",
|
|
6043
|
+
"hover:bg-surface2 hover:text-neutral6 active:bg-surface3",
|
|
6044
|
+
"data-[popup-open]:bg-surface3 data-[popup-open]:text-neutral6"
|
|
6045
|
+
),
|
|
6046
|
+
/** Variant: link — text-only trigger. */
|
|
6047
|
+
triggerLink: cn("border-transparent px-0", "hover:text-neutral6", "data-[popup-open]:text-neutral6"),
|
|
6091
6048
|
/** Trigger with error state */
|
|
6092
6049
|
triggerError: "border-accent2 hover:border-accent2 focus-visible:border-accent2",
|
|
6093
6050
|
/** Chevron icon in trigger */
|
|
@@ -6096,7 +6053,7 @@ const comboboxStyles = {
|
|
|
6096
6053
|
placeholder: "text-neutral3",
|
|
6097
6054
|
/** Popup container — concentric with rounded-xl + p-1 (8px items inside 12px container). */
|
|
6098
6055
|
popup: cn(
|
|
6099
|
-
"min-w-(--anchor-width) w-max max-w-
|
|
6056
|
+
"min-w-(--anchor-width) w-max max-w-(--available-width) rounded-xl border border-border1 bg-surface3 text-neutral4",
|
|
6100
6057
|
"shadow-dialog",
|
|
6101
6058
|
"origin-(--transform-origin)",
|
|
6102
6059
|
"transition-[transform,scale,opacity] duration-150 ease-out",
|
|
@@ -6106,9 +6063,9 @@ const comboboxStyles = {
|
|
|
6106
6063
|
/** Positioner */
|
|
6107
6064
|
positioner: "z-50 pointer-events-auto",
|
|
6108
6065
|
/** Search input container — borderless top section, hairline divider below. */
|
|
6109
|
-
searchContainer: cn("flex items-center border-b border-border1 px-2.5 py-
|
|
6066
|
+
searchContainer: cn("flex items-center border-b border-border1 px-2.5 py-1.5", transitions.colors),
|
|
6110
6067
|
/** Search icon */
|
|
6111
|
-
searchIcon: cn("mr-2 h-
|
|
6068
|
+
searchIcon: cn("mr-2 h-3.5 w-3.5 shrink-0 text-neutral3", transitions.colors),
|
|
6112
6069
|
/** Search input */
|
|
6113
6070
|
searchInput: cn(
|
|
6114
6071
|
"flex h-7 w-full rounded-md bg-transparent py-1 text-ui-smd leading-ui-sm text-neutral6",
|
|
@@ -6117,25 +6074,37 @@ const comboboxStyles = {
|
|
|
6117
6074
|
transitions.colors
|
|
6118
6075
|
),
|
|
6119
6076
|
/** Empty state */
|
|
6120
|
-
empty: "not-empty:block hidden py-
|
|
6077
|
+
empty: "not-empty:block hidden py-4 text-center text-ui-smd text-neutral3",
|
|
6121
6078
|
/** Options list */
|
|
6122
6079
|
list: "max-h-dropdown-max-height overflow-y-auto overflow-x-hidden p-1",
|
|
6123
|
-
/** Option item base — rounded-
|
|
6080
|
+
/** Option item base — rounded-md sits concentrically inside rounded-xl + p-1. */
|
|
6124
6081
|
item: cn(
|
|
6125
|
-
"relative flex cursor-pointer select-none items-center gap-2
|
|
6082
|
+
"group/item relative flex cursor-pointer select-none items-center gap-2 rounded-md",
|
|
6083
|
+
"pl-2.5 pr-2 py-1.5 min-h-8",
|
|
6126
6084
|
"text-ui-smd leading-ui-sm text-neutral4",
|
|
6127
6085
|
"outline-none focus:outline-none focus-visible:outline-none",
|
|
6128
6086
|
transitions.colors,
|
|
6129
|
-
"data-highlighted:bg-surface4 data-highlighted:text-neutral6"
|
|
6087
|
+
"data-highlighted:bg-surface4 data-highlighted:text-neutral6",
|
|
6088
|
+
"data-selected:text-neutral6"
|
|
6130
6089
|
),
|
|
6131
|
-
/**
|
|
6132
|
-
|
|
6133
|
-
|
|
6134
|
-
|
|
6090
|
+
/** Multi-select item — keeps the left checkbox slot, no right indicator. */
|
|
6091
|
+
itemMulti: cn(
|
|
6092
|
+
"relative flex cursor-pointer select-none items-center gap-2.5 rounded-md",
|
|
6093
|
+
"pl-2 pr-2.5 py-1.5 min-h-8",
|
|
6094
|
+
"text-ui-smd leading-ui-sm text-neutral4",
|
|
6095
|
+
"outline-none focus:outline-none focus-visible:outline-none",
|
|
6096
|
+
transitions.colors,
|
|
6097
|
+
"data-highlighted:bg-surface4 data-highlighted:text-neutral6",
|
|
6098
|
+
"data-selected:text-neutral6"
|
|
6099
|
+
),
|
|
6100
|
+
/** Right-aligned slot grouping end content + selection check. */
|
|
6101
|
+
itemRightSlot: "ml-auto flex items-center gap-2 shrink-0",
|
|
6102
|
+
/** Check indicator container — inline, fixed 16x16, shown only when item is selected. */
|
|
6103
|
+
checkContainer: "flex h-4 w-4 shrink-0 items-center justify-center text-accent1",
|
|
6135
6104
|
/** Check icon (single select) */
|
|
6136
|
-
checkIcon:
|
|
6105
|
+
checkIcon: "h-3.5 w-3.5",
|
|
6137
6106
|
/** Checkbox container (multi select) */
|
|
6138
|
-
checkbox: "flex h-4 w-4 shrink-0 items-center justify-center rounded-
|
|
6107
|
+
checkbox: "flex h-4 w-4 shrink-0 items-center justify-center rounded-[4px] border",
|
|
6139
6108
|
/** Checkbox selected state */
|
|
6140
6109
|
checkboxSelected: "bg-accent1 border-accent1",
|
|
6141
6110
|
/** Checkbox unselected state */
|
|
@@ -6150,12 +6119,17 @@ const comboboxStyles = {
|
|
|
6150
6119
|
optionLabel: "truncate",
|
|
6151
6120
|
/** Option description */
|
|
6152
6121
|
optionDescription: "text-ui-sm text-neutral3 truncate",
|
|
6153
|
-
/** Option end slot */
|
|
6154
|
-
optionEnd: "ml-auto",
|
|
6122
|
+
/** Option end slot — `ml-auto` makes it push right inside flex containers (used by multi-select). */
|
|
6123
|
+
optionEnd: "ml-auto flex items-center shrink-0",
|
|
6155
6124
|
/** Error message */
|
|
6156
6125
|
error: "text-ui-sm text-accent2"
|
|
6157
6126
|
};
|
|
6158
6127
|
|
|
6128
|
+
const triggerVariantStyles = {
|
|
6129
|
+
default: comboboxStyles.triggerDefault,
|
|
6130
|
+
ghost: comboboxStyles.triggerGhost,
|
|
6131
|
+
link: comboboxStyles.triggerLink
|
|
6132
|
+
};
|
|
6159
6133
|
function Combobox({
|
|
6160
6134
|
options,
|
|
6161
6135
|
value,
|
|
@@ -6165,6 +6139,7 @@ function Combobox({
|
|
|
6165
6139
|
emptyText = "No option found.",
|
|
6166
6140
|
className,
|
|
6167
6141
|
disabled = false,
|
|
6142
|
+
variant = "default",
|
|
6168
6143
|
size = "default",
|
|
6169
6144
|
open,
|
|
6170
6145
|
onOpenChange,
|
|
@@ -6193,6 +6168,7 @@ function Combobox({
|
|
|
6193
6168
|
{
|
|
6194
6169
|
className: cn(
|
|
6195
6170
|
comboboxStyles.trigger,
|
|
6171
|
+
triggerVariantStyles[variant],
|
|
6196
6172
|
formElementSizes[size],
|
|
6197
6173
|
error && comboboxStyles.triggerError,
|
|
6198
6174
|
className
|
|
@@ -6212,25 +6188,17 @@ function Combobox({
|
|
|
6212
6188
|
/* @__PURE__ */ jsxRuntime.jsx(combobox.Combobox.Input, { className: comboboxStyles.searchInput, placeholder: searchPlaceholder })
|
|
6213
6189
|
] }),
|
|
6214
6190
|
/* @__PURE__ */ jsxRuntime.jsx(combobox.Combobox.Empty, { className: comboboxStyles.empty, children: emptyText }),
|
|
6215
|
-
/* @__PURE__ */ jsxRuntime.jsx(combobox.Combobox.List, { className: comboboxStyles.list, children: (option) => /* @__PURE__ */ jsxRuntime.jsxs(
|
|
6216
|
-
|
|
6217
|
-
{
|
|
6218
|
-
|
|
6219
|
-
className:
|
|
6220
|
-
|
|
6221
|
-
|
|
6222
|
-
|
|
6223
|
-
|
|
6224
|
-
|
|
6225
|
-
|
|
6226
|
-
option.description && /* @__PURE__ */ jsxRuntime.jsx("span", { className: comboboxStyles.optionDescription, children: option.description })
|
|
6227
|
-
] }),
|
|
6228
|
-
option.end ? /* @__PURE__ */ jsxRuntime.jsx("div", { className: comboboxStyles.optionEnd, children: option.end }) : null
|
|
6229
|
-
] })
|
|
6230
|
-
]
|
|
6231
|
-
},
|
|
6232
|
-
option.value
|
|
6233
|
-
) })
|
|
6191
|
+
/* @__PURE__ */ jsxRuntime.jsx(combobox.Combobox.List, { className: comboboxStyles.list, children: (option) => /* @__PURE__ */ jsxRuntime.jsxs(combobox.Combobox.Item, { value: option, className: comboboxStyles.item, children: [
|
|
6192
|
+
option.start,
|
|
6193
|
+
/* @__PURE__ */ jsxRuntime.jsxs("span", { className: comboboxStyles.optionText, children: [
|
|
6194
|
+
/* @__PURE__ */ jsxRuntime.jsx("span", { className: comboboxStyles.optionLabel, children: option.label }),
|
|
6195
|
+
option.description && /* @__PURE__ */ jsxRuntime.jsx("span", { className: comboboxStyles.optionDescription, children: option.description })
|
|
6196
|
+
] }),
|
|
6197
|
+
/* @__PURE__ */ jsxRuntime.jsxs("span", { className: comboboxStyles.itemRightSlot, children: [
|
|
6198
|
+
option.end ? /* @__PURE__ */ jsxRuntime.jsx("div", { className: comboboxStyles.optionEnd, children: option.end }) : null,
|
|
6199
|
+
/* @__PURE__ */ jsxRuntime.jsx("span", { className: comboboxStyles.checkContainer, children: /* @__PURE__ */ jsxRuntime.jsx(combobox.Combobox.ItemIndicator, { children: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.Check, { className: comboboxStyles.checkIcon }) }) })
|
|
6200
|
+
] })
|
|
6201
|
+
] }, option.value) })
|
|
6234
6202
|
] }) }) })
|
|
6235
6203
|
]
|
|
6236
6204
|
}
|
|
@@ -6296,7 +6264,7 @@ function MultiCombobox({
|
|
|
6296
6264
|
/* @__PURE__ */ jsxRuntime.jsx(combobox.Combobox.Empty, { className: comboboxStyles.empty, children: emptyText }),
|
|
6297
6265
|
/* @__PURE__ */ jsxRuntime.jsx(combobox.Combobox.List, { className: comboboxStyles.list, children: (option) => {
|
|
6298
6266
|
const isSelected = value.includes(option.value);
|
|
6299
|
-
return /* @__PURE__ */ jsxRuntime.jsxs(combobox.Combobox.Item, { value: option, className: comboboxStyles.
|
|
6267
|
+
return /* @__PURE__ */ jsxRuntime.jsxs(combobox.Combobox.Item, { value: option, className: comboboxStyles.itemMulti, children: [
|
|
6300
6268
|
/* @__PURE__ */ jsxRuntime.jsx(
|
|
6301
6269
|
"span",
|
|
6302
6270
|
{
|
|
@@ -6564,44 +6532,91 @@ const SelectItem = React__namespace.forwardRef(({ className, children, ...props
|
|
|
6564
6532
|
SelectItem.displayName = SelectPrimitive__namespace.Item.displayName;
|
|
6565
6533
|
|
|
6566
6534
|
const Tabs = ({ children, defaultTab, value, onValueChange, className }) => {
|
|
6567
|
-
|
|
6568
|
-
|
|
6569
|
-
|
|
6570
|
-
|
|
6571
|
-
|
|
6572
|
-
|
|
6573
|
-
|
|
6574
|
-
|
|
6575
|
-
setInternalTab(typedValue);
|
|
6535
|
+
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
6536
|
+
tabs.Tabs.Root,
|
|
6537
|
+
{
|
|
6538
|
+
defaultValue: defaultTab,
|
|
6539
|
+
value,
|
|
6540
|
+
onValueChange: onValueChange ? (next) => onValueChange(next) : void 0,
|
|
6541
|
+
className: cn("overflow-y-auto", className),
|
|
6542
|
+
children
|
|
6576
6543
|
}
|
|
6577
|
-
|
|
6578
|
-
return /* @__PURE__ */ jsxRuntime.jsx(RadixTabs__namespace.Root, { value: currentTab, onValueChange: handleTabChange, className: cn("overflow-y-auto", className), children });
|
|
6544
|
+
);
|
|
6579
6545
|
};
|
|
6580
6546
|
|
|
6581
|
-
const
|
|
6582
|
-
|
|
6583
|
-
|
|
6547
|
+
const tabListVariants = cva("flex items-center relative text-ui-lg", {
|
|
6548
|
+
variants: {
|
|
6549
|
+
variant: {
|
|
6550
|
+
line: "w-max min-w-full border-b border-border1",
|
|
6551
|
+
pill: "w-fit gap-1 rounded-full bg-surface2 p-1",
|
|
6552
|
+
"pill-ghost": "w-fit gap-1 rounded-full p-1"
|
|
6553
|
+
}
|
|
6554
|
+
},
|
|
6555
|
+
defaultVariants: {
|
|
6556
|
+
variant: "line"
|
|
6557
|
+
}
|
|
6558
|
+
});
|
|
6559
|
+
const TabList = ({ children, className, variant, sticky }) => {
|
|
6560
|
+
const resolvedVariant = variant ?? "line";
|
|
6561
|
+
return /* @__PURE__ */ jsxRuntime.jsx("div", { className: cn("w-full overflow-x-auto", sticky && "sticky top-0 z-10 bg-surface2"), children: /* @__PURE__ */ jsxRuntime.jsxs(
|
|
6562
|
+
tabs.Tabs.List,
|
|
6584
6563
|
{
|
|
6585
|
-
|
|
6586
|
-
|
|
6564
|
+
"data-variant": resolvedVariant,
|
|
6565
|
+
className: cn("group/tabs-list", tabListVariants({ variant: resolvedVariant }), className),
|
|
6566
|
+
children: [
|
|
6567
|
+
children,
|
|
6568
|
+
resolvedVariant === "line" && /* @__PURE__ */ jsxRuntime.jsx(
|
|
6569
|
+
tabs.Tabs.Indicator,
|
|
6570
|
+
{
|
|
6571
|
+
className: cn(
|
|
6572
|
+
"absolute bottom-0 left-0 bg-neutral3",
|
|
6573
|
+
"w-[var(--active-tab-width)] h-0.5",
|
|
6574
|
+
"transition-all duration-200 ease-in-out"
|
|
6575
|
+
),
|
|
6576
|
+
style: { transform: "translateX(var(--active-tab-left))" }
|
|
6577
|
+
}
|
|
6578
|
+
),
|
|
6579
|
+
(resolvedVariant === "pill" || resolvedVariant === "pill-ghost") && /* @__PURE__ */ jsxRuntime.jsx(
|
|
6580
|
+
tabs.Tabs.Indicator,
|
|
6581
|
+
{
|
|
6582
|
+
className: cn(
|
|
6583
|
+
"absolute top-1/2 left-0 z-0 rounded-full bg-surface4",
|
|
6584
|
+
"w-[var(--active-tab-width)] h-[calc(100%-0.5rem)]",
|
|
6585
|
+
"transition-all duration-200 ease-in-out"
|
|
6586
|
+
),
|
|
6587
|
+
style: { transform: "translateY(-50%) translateX(var(--active-tab-left))" }
|
|
6588
|
+
}
|
|
6589
|
+
)
|
|
6590
|
+
]
|
|
6587
6591
|
}
|
|
6588
6592
|
) });
|
|
6589
6593
|
};
|
|
6590
6594
|
|
|
6591
6595
|
const Tab = ({ children, value, onClick, onClose, disabled, className }) => {
|
|
6592
6596
|
return /* @__PURE__ */ jsxRuntime.jsxs(
|
|
6593
|
-
|
|
6597
|
+
tabs.Tabs.Tab,
|
|
6594
6598
|
{
|
|
6595
6599
|
value,
|
|
6596
6600
|
disabled,
|
|
6597
6601
|
className: cn(
|
|
6598
|
-
"
|
|
6602
|
+
"text-ui-md font-normal text-neutral3",
|
|
6599
6603
|
"whitespace-nowrap shrink-0 flex items-center justify-center gap-1.5 outline-none cursor-pointer",
|
|
6600
6604
|
transitions.colors,
|
|
6601
6605
|
focusRing.visible,
|
|
6602
6606
|
"hover:text-neutral4",
|
|
6603
|
-
"data-[
|
|
6607
|
+
"data-[active]:text-neutral5",
|
|
6604
6608
|
"data-[disabled]:cursor-not-allowed data-[disabled]:opacity-50 data-[disabled]:hover:text-neutral3",
|
|
6609
|
+
// Line variant (default) — active state drawn by <Tabs.Indicator> in TabList
|
|
6610
|
+
"group-data-[variant=line]/tabs-list:py-2 group-data-[variant=line]/tabs-list:px-5",
|
|
6611
|
+
"group-data-[variant=line]/tabs-list:border-b-2 group-data-[variant=line]/tabs-list:border-transparent",
|
|
6612
|
+
// Pill variant
|
|
6613
|
+
"group-data-[variant=pill]/tabs-list:relative group-data-[variant=pill]/tabs-list:z-10",
|
|
6614
|
+
"group-data-[variant=pill]/tabs-list:py-1 group-data-[variant=pill]/tabs-list:px-3",
|
|
6615
|
+
"group-data-[variant=pill]/tabs-list:rounded-full",
|
|
6616
|
+
// Pill-ghost variant (pill without list background)
|
|
6617
|
+
"group-data-[variant=pill-ghost]/tabs-list:relative group-data-[variant=pill-ghost]/tabs-list:z-10",
|
|
6618
|
+
"group-data-[variant=pill-ghost]/tabs-list:py-1 group-data-[variant=pill-ghost]/tabs-list:px-3",
|
|
6619
|
+
"group-data-[variant=pill-ghost]/tabs-list:rounded-full",
|
|
6605
6620
|
className
|
|
6606
6621
|
),
|
|
6607
6622
|
onClick,
|
|
@@ -6626,7 +6641,7 @@ const Tab = ({ children, value, onClick, onClose, disabled, className }) => {
|
|
|
6626
6641
|
|
|
6627
6642
|
const TabContent = ({ children, value, className }) => {
|
|
6628
6643
|
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
6629
|
-
|
|
6644
|
+
tabs.Tabs.Panel,
|
|
6630
6645
|
{
|
|
6631
6646
|
value,
|
|
6632
6647
|
className: cn("grid py-3 overflow-y-auto ring-offset-background", focusRing.visible, className),
|
|
@@ -6875,13 +6890,13 @@ function Skeleton({ className, ...props }) {
|
|
|
6875
6890
|
}
|
|
6876
6891
|
|
|
6877
6892
|
const EntityHeader = ({ icon, title, isLoading, children }) => {
|
|
6878
|
-
return /* @__PURE__ */ jsxRuntime.
|
|
6879
|
-
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "text-neutral6 flex items-center gap-2", children: [
|
|
6880
|
-
/* @__PURE__ */ jsxRuntime.jsx(Icon, { size: "lg",
|
|
6881
|
-
isLoading ? /* @__PURE__ */ jsxRuntime.jsx(Skeleton, { className: "h-3 w-
|
|
6893
|
+
return /* @__PURE__ */ jsxRuntime.jsx("div", { className: "p-3 pb-1 w-full overflow-x-hidden", children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-wrap items-center justify-between gap-x-4 gap-y-3", children: [
|
|
6894
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "text-neutral6 flex min-w-0 items-center gap-2", children: [
|
|
6895
|
+
/* @__PURE__ */ jsxRuntime.jsx(Icon, { size: "lg", children: icon }),
|
|
6896
|
+
isLoading ? /* @__PURE__ */ jsxRuntime.jsx(Skeleton, { className: "h-3 w-32" }) : /* @__PURE__ */ jsxRuntime.jsx(Txt, { variant: "header-md", as: "h2", className: "truncate font-medium", children: title })
|
|
6882
6897
|
] }),
|
|
6883
|
-
children
|
|
6884
|
-
] });
|
|
6898
|
+
children
|
|
6899
|
+
] }) });
|
|
6885
6900
|
};
|
|
6886
6901
|
|
|
6887
6902
|
function FieldBlockColumn({ children, className }) {
|
|
@@ -7219,6 +7234,149 @@ function SelectFieldBlock({
|
|
|
7219
7234
|
] });
|
|
7220
7235
|
}
|
|
7221
7236
|
|
|
7237
|
+
const InputGroupSizeContext = React__namespace.createContext("md");
|
|
7238
|
+
const inputGroupClassName = cn(
|
|
7239
|
+
"group/input-group relative flex w-full min-w-0 items-stretch",
|
|
7240
|
+
"bg-surface2 border border-border1 text-neutral6",
|
|
7241
|
+
"hover:border-border2",
|
|
7242
|
+
formElementRadius,
|
|
7243
|
+
formElementFocusWithin,
|
|
7244
|
+
transitions.all,
|
|
7245
|
+
"has-[:disabled]:opacity-50 has-[:disabled]:cursor-not-allowed",
|
|
7246
|
+
"has-[[aria-invalid=true]]:border-error has-[[aria-invalid=true]]:focus-within:ring-error has-[[aria-invalid=true]]:focus-within:shadow-glow-accent2",
|
|
7247
|
+
"has-[>[data-align=block-start]]:flex-col",
|
|
7248
|
+
"has-[>[data-align=block-end]]:flex-col",
|
|
7249
|
+
"has-[>[data-align=inline-start]]:[&>[data-slot=input-group-control]]:pl-0",
|
|
7250
|
+
"has-[>[data-align=inline-end]]:[&>[data-slot=input-group-control]]:pr-0",
|
|
7251
|
+
// In flex-col, flex-1 collapses the input to basis-0. Force flex-none so `h-form-*` applies.
|
|
7252
|
+
"has-[>[data-align=block-start]]:[&>[data-slot=input-group-control]]:flex-none has-[>[data-align=block-start]]:[&>[data-slot=input-group-control]]:w-full",
|
|
7253
|
+
"has-[>[data-align=block-end]]:[&>[data-slot=input-group-control]]:flex-none has-[>[data-align=block-end]]:[&>[data-slot=input-group-control]]:w-full"
|
|
7254
|
+
);
|
|
7255
|
+
const InputGroup = React__namespace.forwardRef(({ className, size = "md", ...props }, ref) => {
|
|
7256
|
+
return /* @__PURE__ */ jsxRuntime.jsx(InputGroupSizeContext.Provider, { value: size, children: /* @__PURE__ */ jsxRuntime.jsx("div", { ref, role: "group", "data-slot": "input-group", className: cn(inputGroupClassName, className), ...props }) });
|
|
7257
|
+
});
|
|
7258
|
+
InputGroup.displayName = "InputGroup";
|
|
7259
|
+
const inputGroupAddonVariants = cva(
|
|
7260
|
+
cn(
|
|
7261
|
+
"flex items-center justify-center gap-2 text-neutral3 select-none",
|
|
7262
|
+
"group-has-[:disabled]/input-group:opacity-50",
|
|
7263
|
+
"[&>svg:not([class*='size-'])]:size-4"
|
|
7264
|
+
),
|
|
7265
|
+
{
|
|
7266
|
+
variants: {
|
|
7267
|
+
align: {
|
|
7268
|
+
"inline-start": "order-first pl-3 pr-1 has-[>button]:pl-1",
|
|
7269
|
+
"inline-end": "order-last pr-3 pl-1 has-[>button]:pr-1",
|
|
7270
|
+
"block-start": "order-first w-full justify-start px-3 pt-2 pb-1 border-b border-border1",
|
|
7271
|
+
"block-end": "order-last w-full justify-start px-3 pb-2 pt-1 border-t border-border1"
|
|
7272
|
+
}
|
|
7273
|
+
},
|
|
7274
|
+
defaultVariants: {
|
|
7275
|
+
align: "inline-start"
|
|
7276
|
+
}
|
|
7277
|
+
}
|
|
7278
|
+
);
|
|
7279
|
+
const InputGroupAddon = React__namespace.forwardRef(
|
|
7280
|
+
({ className, align = "inline-start", onClick, ...props }, ref) => {
|
|
7281
|
+
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
7282
|
+
"div",
|
|
7283
|
+
{
|
|
7284
|
+
ref,
|
|
7285
|
+
role: "group",
|
|
7286
|
+
"data-slot": "input-group-addon",
|
|
7287
|
+
"data-align": align,
|
|
7288
|
+
className: cn(inputGroupAddonVariants({ align }), className),
|
|
7289
|
+
onClick: (event) => {
|
|
7290
|
+
const target = event.target;
|
|
7291
|
+
if (!target.closest('button, input, textarea, [role="button"]')) {
|
|
7292
|
+
event.currentTarget.parentElement?.querySelector("[data-slot=input-group-control]")?.focus();
|
|
7293
|
+
}
|
|
7294
|
+
onClick?.(event);
|
|
7295
|
+
},
|
|
7296
|
+
...props
|
|
7297
|
+
}
|
|
7298
|
+
);
|
|
7299
|
+
}
|
|
7300
|
+
);
|
|
7301
|
+
InputGroupAddon.displayName = "InputGroupAddon";
|
|
7302
|
+
const inputGroupControlTextSize = {
|
|
7303
|
+
sm: "text-ui-sm",
|
|
7304
|
+
md: "text-ui-md",
|
|
7305
|
+
default: "text-ui-md",
|
|
7306
|
+
lg: "text-ui-lg"
|
|
7307
|
+
};
|
|
7308
|
+
const InputGroupInput = React__namespace.forwardRef(
|
|
7309
|
+
({ className, testId, error, type = "text", ...props }, ref) => {
|
|
7310
|
+
const size = React__namespace.useContext(InputGroupSizeContext);
|
|
7311
|
+
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
7312
|
+
"input",
|
|
7313
|
+
{
|
|
7314
|
+
ref,
|
|
7315
|
+
type,
|
|
7316
|
+
"data-slot": "input-group-control",
|
|
7317
|
+
"data-testid": testId,
|
|
7318
|
+
"aria-invalid": error,
|
|
7319
|
+
className: cn(
|
|
7320
|
+
"flex-1 min-w-0 bg-transparent text-neutral6 px-3 outline-hidden",
|
|
7321
|
+
formElementSizes[size],
|
|
7322
|
+
inputGroupControlTextSize[size],
|
|
7323
|
+
"placeholder:text-neutral2 placeholder:transition-opacity placeholder:duration-normal",
|
|
7324
|
+
"focus:placeholder:opacity-70",
|
|
7325
|
+
"disabled:cursor-not-allowed",
|
|
7326
|
+
className
|
|
7327
|
+
),
|
|
7328
|
+
...props
|
|
7329
|
+
}
|
|
7330
|
+
);
|
|
7331
|
+
}
|
|
7332
|
+
);
|
|
7333
|
+
InputGroupInput.displayName = "InputGroupInput";
|
|
7334
|
+
const InputGroupTextarea = React__namespace.forwardRef(
|
|
7335
|
+
({ className, testId, error, ...props }, ref) => {
|
|
7336
|
+
const size = React__namespace.useContext(InputGroupSizeContext);
|
|
7337
|
+
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
7338
|
+
"textarea",
|
|
7339
|
+
{
|
|
7340
|
+
ref,
|
|
7341
|
+
"data-slot": "input-group-control",
|
|
7342
|
+
"data-testid": testId,
|
|
7343
|
+
"aria-invalid": error,
|
|
7344
|
+
className: cn(
|
|
7345
|
+
"flex-1 min-w-0 min-h-[60px] resize-y bg-transparent text-neutral6 px-3 py-2 outline-hidden",
|
|
7346
|
+
inputGroupControlTextSize[size],
|
|
7347
|
+
"placeholder:text-neutral2 placeholder:transition-opacity placeholder:duration-normal",
|
|
7348
|
+
"focus:placeholder:opacity-70",
|
|
7349
|
+
"disabled:cursor-not-allowed",
|
|
7350
|
+
className
|
|
7351
|
+
),
|
|
7352
|
+
...props
|
|
7353
|
+
}
|
|
7354
|
+
);
|
|
7355
|
+
}
|
|
7356
|
+
);
|
|
7357
|
+
InputGroupTextarea.displayName = "InputGroupTextarea";
|
|
7358
|
+
const InputGroupText = React__namespace.forwardRef(({ className, ...props }, ref) => {
|
|
7359
|
+
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
7360
|
+
"span",
|
|
7361
|
+
{
|
|
7362
|
+
ref,
|
|
7363
|
+
className: cn(
|
|
7364
|
+
"flex items-center gap-2 text-ui-sm text-neutral3 [&_svg]:pointer-events-none",
|
|
7365
|
+
"[&_svg:not([class*='size-'])]:size-4",
|
|
7366
|
+
className
|
|
7367
|
+
),
|
|
7368
|
+
...props
|
|
7369
|
+
}
|
|
7370
|
+
);
|
|
7371
|
+
});
|
|
7372
|
+
InputGroupText.displayName = "InputGroupText";
|
|
7373
|
+
const InputGroupButton = React__namespace.forwardRef(
|
|
7374
|
+
({ size = "icon-sm", variant = "ghost", type = "button", ...props }, ref) => {
|
|
7375
|
+
return /* @__PURE__ */ jsxRuntime.jsx(Button, { ref, type, size, variant, ...props });
|
|
7376
|
+
}
|
|
7377
|
+
);
|
|
7378
|
+
InputGroupButton.displayName = "InputGroupButton";
|
|
7379
|
+
|
|
7222
7380
|
const themeClasses = {
|
|
7223
7381
|
light: "bg-gray-100 border-gray-300 text-gray-700 shadow-[0_1px_0_rgba(0,0,0,0.1)]",
|
|
7224
7382
|
dark: "bg-surface4 border-border1 text-neutral5 shadow-[0_1px_0_rgba(0,0,0,0.3)]"
|
|
@@ -7614,6 +7772,122 @@ function PropertyFilterActions({
|
|
|
7614
7772
|
] });
|
|
7615
7773
|
}
|
|
7616
7774
|
|
|
7775
|
+
const ButtonsGroupOrientationContext = React__namespace.createContext("horizontal");
|
|
7776
|
+
const buttonsGroupVariants = cva(
|
|
7777
|
+
// Elevate the focused child's border above its siblings so it isn't clipped in close-spacing.
|
|
7778
|
+
cn("flex", "[&>*:focus-visible]:relative [&>*:focus-visible]:z-10"),
|
|
7779
|
+
{
|
|
7780
|
+
variants: {
|
|
7781
|
+
orientation: {
|
|
7782
|
+
horizontal: "flex-row items-center",
|
|
7783
|
+
vertical: "flex-col items-stretch"
|
|
7784
|
+
},
|
|
7785
|
+
spacing: {
|
|
7786
|
+
default: "gap-2",
|
|
7787
|
+
close: "gap-0"
|
|
7788
|
+
}
|
|
7789
|
+
},
|
|
7790
|
+
compoundVariants: [
|
|
7791
|
+
{
|
|
7792
|
+
orientation: "horizontal",
|
|
7793
|
+
spacing: "close",
|
|
7794
|
+
// Skip separators when collapsing borders so they stay visible.
|
|
7795
|
+
className: cn(
|
|
7796
|
+
"[&>*:not(:last-child)]:rounded-r-none",
|
|
7797
|
+
"[&>*:not(:first-child)]:rounded-l-none",
|
|
7798
|
+
"[&>*:not([data-slot=buttons-group-separator]):not(:first-child)]:-ml-px"
|
|
7799
|
+
)
|
|
7800
|
+
},
|
|
7801
|
+
{
|
|
7802
|
+
orientation: "vertical",
|
|
7803
|
+
spacing: "close",
|
|
7804
|
+
// Children carry `rounded-full` (capsule) which looks awkward when stacked vertically.
|
|
7805
|
+
// Replace the outer corners with a regular `rounded-xl` and flatten the inner ones.
|
|
7806
|
+
className: cn(
|
|
7807
|
+
"[&>*:not(:last-child)]:rounded-b-none",
|
|
7808
|
+
"[&>*:not(:first-child)]:rounded-t-none",
|
|
7809
|
+
"[&>:first-child]:rounded-t-xl",
|
|
7810
|
+
"[&>:last-child]:rounded-b-xl",
|
|
7811
|
+
"[&>*:not([data-slot=buttons-group-separator]):not(:first-child)]:-mt-px"
|
|
7812
|
+
)
|
|
7813
|
+
}
|
|
7814
|
+
],
|
|
7815
|
+
defaultVariants: {
|
|
7816
|
+
orientation: "horizontal",
|
|
7817
|
+
spacing: "default"
|
|
7818
|
+
}
|
|
7819
|
+
}
|
|
7820
|
+
);
|
|
7821
|
+
const ButtonsGroup = React__namespace.forwardRef(
|
|
7822
|
+
({ children, className, orientation = "horizontal", spacing = "default", ...props }, ref) => {
|
|
7823
|
+
return /* @__PURE__ */ jsxRuntime.jsx(ButtonsGroupOrientationContext.Provider, { value: orientation, children: /* @__PURE__ */ jsxRuntime.jsx(
|
|
7824
|
+
"div",
|
|
7825
|
+
{
|
|
7826
|
+
ref,
|
|
7827
|
+
role: "group",
|
|
7828
|
+
"data-slot": "buttons-group",
|
|
7829
|
+
"data-orientation": orientation,
|
|
7830
|
+
className: cn(buttonsGroupVariants({ orientation, spacing }), className),
|
|
7831
|
+
...props,
|
|
7832
|
+
children
|
|
7833
|
+
}
|
|
7834
|
+
) });
|
|
7835
|
+
}
|
|
7836
|
+
);
|
|
7837
|
+
ButtonsGroup.displayName = "ButtonsGroup";
|
|
7838
|
+
const ButtonsGroupSeparator = React__namespace.forwardRef(
|
|
7839
|
+
({ className, orientation, ...props }, ref) => {
|
|
7840
|
+
const parentOrientation = React__namespace.useContext(ButtonsGroupOrientationContext);
|
|
7841
|
+
const resolved = orientation ?? (parentOrientation === "vertical" ? "horizontal" : "vertical");
|
|
7842
|
+
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
7843
|
+
"div",
|
|
7844
|
+
{
|
|
7845
|
+
ref,
|
|
7846
|
+
role: "separator",
|
|
7847
|
+
"aria-orientation": resolved,
|
|
7848
|
+
"data-slot": "buttons-group-separator",
|
|
7849
|
+
className: cn("self-stretch bg-border1", resolved === "vertical" ? "w-px" : "h-px", className),
|
|
7850
|
+
...props
|
|
7851
|
+
}
|
|
7852
|
+
);
|
|
7853
|
+
}
|
|
7854
|
+
);
|
|
7855
|
+
ButtonsGroupSeparator.displayName = "ButtonsGroupSeparator";
|
|
7856
|
+
const buttonsGroupTextVariants = cva(
|
|
7857
|
+
cn(
|
|
7858
|
+
"inline-flex items-center justify-center bg-surface3 border border-border1 text-neutral5 select-none",
|
|
7859
|
+
"rounded-full gap-[.75em] px-[1em] whitespace-nowrap shrink-0",
|
|
7860
|
+
"[&>svg]:w-[1.1em] [&>svg]:h-[1.1em] [&>svg]:opacity-50"
|
|
7861
|
+
),
|
|
7862
|
+
{
|
|
7863
|
+
variants: {
|
|
7864
|
+
size: {
|
|
7865
|
+
sm: `${formElementSizes.sm} text-ui-sm`,
|
|
7866
|
+
md: `${formElementSizes.md} text-ui-md`,
|
|
7867
|
+
default: `${formElementSizes.default} text-ui-md`,
|
|
7868
|
+
lg: `${formElementSizes.lg} text-ui-lg`
|
|
7869
|
+
}
|
|
7870
|
+
},
|
|
7871
|
+
defaultVariants: {
|
|
7872
|
+
size: "default"
|
|
7873
|
+
}
|
|
7874
|
+
}
|
|
7875
|
+
);
|
|
7876
|
+
const ButtonsGroupText = React__namespace.forwardRef(
|
|
7877
|
+
({ className, size = "default", ...props }, ref) => {
|
|
7878
|
+
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
7879
|
+
"div",
|
|
7880
|
+
{
|
|
7881
|
+
ref,
|
|
7882
|
+
"data-slot": "buttons-group-text",
|
|
7883
|
+
className: cn(buttonsGroupTextVariants({ size }), className),
|
|
7884
|
+
...props
|
|
7885
|
+
}
|
|
7886
|
+
);
|
|
7887
|
+
}
|
|
7888
|
+
);
|
|
7889
|
+
ButtonsGroupText.displayName = "ButtonsGroupText";
|
|
7890
|
+
|
|
7617
7891
|
const RadioGroup = React__namespace.forwardRef(({ className, ...props }, ref) => {
|
|
7618
7892
|
return /* @__PURE__ */ jsxRuntime.jsx(RadioGroupPrimitive__namespace.Root, { className: cn("grid gap-2", className), ...props, ref });
|
|
7619
7893
|
});
|
|
@@ -7752,13 +8026,40 @@ function stringifyTokenValue(value) {
|
|
|
7752
8026
|
if (Array.isArray(value)) return value.length === 0 ? "Any" : value.join(", ");
|
|
7753
8027
|
return value;
|
|
7754
8028
|
}
|
|
7755
|
-
const
|
|
7756
|
-
|
|
7757
|
-
|
|
7758
|
-
|
|
7759
|
-
|
|
7760
|
-
|
|
7761
|
-
|
|
8029
|
+
const DEFAULT_LOCKED_TOOLTIP = "This filter is set by the current context and cannot be removed here.";
|
|
8030
|
+
function lookupOptionLabel(field, value) {
|
|
8031
|
+
if (field.kind === "pick-multi" && field.options) {
|
|
8032
|
+
if (Array.isArray(value)) {
|
|
8033
|
+
if (value.length === 0) return "Any";
|
|
8034
|
+
return value.map((v) => field.options.find((o) => o.value === v)?.label ?? v).join(", ");
|
|
8035
|
+
}
|
|
8036
|
+
return field.options.find((o) => o.value === value)?.label ?? value;
|
|
8037
|
+
}
|
|
8038
|
+
return stringifyTokenValue(value);
|
|
8039
|
+
}
|
|
8040
|
+
function LockedTokenPill({ field, value, tooltipContent }) {
|
|
8041
|
+
const display = lookupOptionLabel(field, value);
|
|
8042
|
+
const lockA11yLabel = `${field.label} filter is locked by context`;
|
|
8043
|
+
return /* @__PURE__ */ jsxRuntime.jsx(TooltipProvider, { delayDuration: 150, children: /* @__PURE__ */ jsxRuntime.jsxs(Tooltip, { children: [
|
|
8044
|
+
/* @__PURE__ */ jsxRuntime.jsx(TooltipTrigger, { asChild: true, children: /* @__PURE__ */ jsxRuntime.jsxs(
|
|
8045
|
+
ButtonsGroup,
|
|
8046
|
+
{
|
|
8047
|
+
spacing: "close",
|
|
8048
|
+
"data-locked-field-id": field.id,
|
|
8049
|
+
"data-property-filter-pill": "locked",
|
|
8050
|
+
tabIndex: 0,
|
|
8051
|
+
"aria-label": lockA11yLabel,
|
|
8052
|
+
children: [
|
|
8053
|
+
/* @__PURE__ */ jsxRuntime.jsx(ButtonsGroupText, { size: "md", children: field.label }),
|
|
8054
|
+
/* @__PURE__ */ jsxRuntime.jsx(ButtonsGroupText, { size: "md", children: "is" }),
|
|
8055
|
+
/* @__PURE__ */ jsxRuntime.jsx(ButtonsGroupText, { size: "md", children: display }),
|
|
8056
|
+
/* @__PURE__ */ jsxRuntime.jsx(ButtonsGroupText, { size: "md", children: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.LockIcon, {}) })
|
|
8057
|
+
]
|
|
8058
|
+
}
|
|
8059
|
+
) }),
|
|
8060
|
+
/* @__PURE__ */ jsxRuntime.jsx(TooltipContent, { children: tooltipContent })
|
|
8061
|
+
] }) });
|
|
8062
|
+
}
|
|
7762
8063
|
function TextTokenPill({ field, value, onChange, onRemove, disabled, autoFocus }) {
|
|
7763
8064
|
const [draft, setDraft] = React.useState(value);
|
|
7764
8065
|
const inputRef = React.useRef(null);
|
|
@@ -7768,9 +8069,9 @@ function TextTokenPill({ field, value, onChange, onRemove, disabled, autoFocus }
|
|
|
7768
8069
|
React.useEffect(() => {
|
|
7769
8070
|
if (autoFocus) inputRef.current?.focus();
|
|
7770
8071
|
}, [autoFocus]);
|
|
7771
|
-
return /* @__PURE__ */ jsxRuntime.jsxs(
|
|
7772
|
-
/* @__PURE__ */ jsxRuntime.jsx(
|
|
7773
|
-
/* @__PURE__ */ jsxRuntime.jsx(
|
|
8072
|
+
return /* @__PURE__ */ jsxRuntime.jsxs(ButtonsGroup, { spacing: "close", children: [
|
|
8073
|
+
/* @__PURE__ */ jsxRuntime.jsx(ButtonsGroupText, { size: "md", children: field.label }),
|
|
8074
|
+
/* @__PURE__ */ jsxRuntime.jsx(ButtonsGroupText, { size: "md", children: "is" }),
|
|
7774
8075
|
/* @__PURE__ */ jsxRuntime.jsx(
|
|
7775
8076
|
Input,
|
|
7776
8077
|
{
|
|
@@ -7779,7 +8080,6 @@ function TextTokenPill({ field, value, onChange, onRemove, disabled, autoFocus }
|
|
|
7779
8080
|
disabled,
|
|
7780
8081
|
value: draft,
|
|
7781
8082
|
placeholder: field.placeholder ?? `Enter ${field.label}`,
|
|
7782
|
-
className: INPUT_CLASS,
|
|
7783
8083
|
onChange: (e) => {
|
|
7784
8084
|
const next = e.target.value;
|
|
7785
8085
|
setDraft(next);
|
|
@@ -7804,7 +8104,6 @@ function TextTokenPill({ field, value, onChange, onRemove, disabled, autoFocus }
|
|
|
7804
8104
|
type: "button",
|
|
7805
8105
|
disabled,
|
|
7806
8106
|
"aria-label": `Remove ${field.label} filter`,
|
|
7807
|
-
className: REMOVE_CLASS,
|
|
7808
8107
|
size: "md",
|
|
7809
8108
|
onMouseDown: (e) => e.preventDefault(),
|
|
7810
8109
|
onClick: onRemove,
|
|
@@ -7815,20 +8114,11 @@ function TextTokenPill({ field, value, onChange, onRemove, disabled, autoFocus }
|
|
|
7815
8114
|
}
|
|
7816
8115
|
function PickMultiTokenPill({ field, token, tokens, onChange, onRemove, disabled }) {
|
|
7817
8116
|
const [open, setOpen] = React.useState(false);
|
|
7818
|
-
return /* @__PURE__ */ jsxRuntime.jsxs(
|
|
7819
|
-
/* @__PURE__ */ jsxRuntime.jsx(
|
|
7820
|
-
/* @__PURE__ */ jsxRuntime.jsx(
|
|
8117
|
+
return /* @__PURE__ */ jsxRuntime.jsxs(ButtonsGroup, { spacing: "close", children: [
|
|
8118
|
+
/* @__PURE__ */ jsxRuntime.jsx(ButtonsGroupText, { size: "md", children: field.label }),
|
|
8119
|
+
/* @__PURE__ */ jsxRuntime.jsx(ButtonsGroupText, { size: "md", children: "is" }),
|
|
7821
8120
|
/* @__PURE__ */ jsxRuntime.jsxs(Popover, { open, onOpenChange: setOpen, children: [
|
|
7822
|
-
/* @__PURE__ */ jsxRuntime.jsx(PopoverTrigger, { asChild: true, children: /* @__PURE__ */ jsxRuntime.jsx(
|
|
7823
|
-
Button,
|
|
7824
|
-
{
|
|
7825
|
-
type: "button",
|
|
7826
|
-
disabled,
|
|
7827
|
-
size: "md",
|
|
7828
|
-
className: VALUE_BUTTON_CLASS,
|
|
7829
|
-
children: stringifyTokenValue(token.value)
|
|
7830
|
-
}
|
|
7831
|
-
) }),
|
|
8121
|
+
/* @__PURE__ */ jsxRuntime.jsx(PopoverTrigger, { asChild: true, children: /* @__PURE__ */ jsxRuntime.jsx(Button, { type: "button", disabled, size: "md", children: stringifyTokenValue(token.value) }) }),
|
|
7832
8122
|
/* @__PURE__ */ jsxRuntime.jsx(PopoverContent, { align: "start", sideOffset: 8, className: "w-64 p-2", "data-pick-multi-panel": true, children: /* @__PURE__ */ jsxRuntime.jsx(PickMultiPanel, { field, tokens, onChange }) })
|
|
7833
8123
|
] }),
|
|
7834
8124
|
/* @__PURE__ */ jsxRuntime.jsx(
|
|
@@ -7837,7 +8127,6 @@ function PickMultiTokenPill({ field, token, tokens, onChange, onRemove, disabled
|
|
|
7837
8127
|
type: "button",
|
|
7838
8128
|
disabled,
|
|
7839
8129
|
"aria-label": `Remove ${field.label} filter`,
|
|
7840
|
-
className: REMOVE_CLASS,
|
|
7841
8130
|
size: "md",
|
|
7842
8131
|
onClick: onRemove,
|
|
7843
8132
|
children: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.XIcon, {})
|
|
@@ -7850,9 +8139,12 @@ function PropertyFilterApplied({
|
|
|
7850
8139
|
tokens,
|
|
7851
8140
|
onTokensChange,
|
|
7852
8141
|
disabled,
|
|
7853
|
-
autoFocusFieldId
|
|
8142
|
+
autoFocusFieldId,
|
|
8143
|
+
lockedFieldIds,
|
|
8144
|
+
lockedTooltipContent = DEFAULT_LOCKED_TOOLTIP
|
|
7854
8145
|
}) {
|
|
7855
8146
|
if (tokens.length === 0) return null;
|
|
8147
|
+
const lockedSet = new Set(lockedFieldIds ?? []);
|
|
7856
8148
|
const replaceTokenAt = (index, next) => {
|
|
7857
8149
|
const copy = [...tokens];
|
|
7858
8150
|
copy[index] = next;
|
|
@@ -7864,6 +8156,17 @@ function PropertyFilterApplied({
|
|
|
7864
8156
|
return /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex items-center gap-2 flex-wrap", children: tokens.map((token, index) => {
|
|
7865
8157
|
const field = fields.find((f) => f.id === token.fieldId);
|
|
7866
8158
|
if (!field) return null;
|
|
8159
|
+
if (lockedSet.has(token.fieldId)) {
|
|
8160
|
+
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
8161
|
+
LockedTokenPill,
|
|
8162
|
+
{
|
|
8163
|
+
field,
|
|
8164
|
+
value: token.value,
|
|
8165
|
+
tooltipContent: lockedTooltipContent
|
|
8166
|
+
},
|
|
8167
|
+
`${token.fieldId}-${index}`
|
|
8168
|
+
);
|
|
8169
|
+
}
|
|
7867
8170
|
if (field.kind === "text" && typeof token.value === "string") {
|
|
7868
8171
|
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
7869
8172
|
TextTokenPill,
|
|
@@ -7898,10 +8201,10 @@ function PropertyFilterApplied({
|
|
|
7898
8201
|
`${token.fieldId}-${index}`
|
|
7899
8202
|
);
|
|
7900
8203
|
}
|
|
7901
|
-
return /* @__PURE__ */ jsxRuntime.jsxs(
|
|
7902
|
-
/* @__PURE__ */ jsxRuntime.jsx(
|
|
7903
|
-
/* @__PURE__ */ jsxRuntime.jsx(
|
|
7904
|
-
/* @__PURE__ */ jsxRuntime.jsx(
|
|
8204
|
+
return /* @__PURE__ */ jsxRuntime.jsxs(ButtonsGroup, { spacing: "close", children: [
|
|
8205
|
+
/* @__PURE__ */ jsxRuntime.jsx(ButtonsGroupText, { size: "md", children: field.label }),
|
|
8206
|
+
/* @__PURE__ */ jsxRuntime.jsx(ButtonsGroupText, { size: "md", children: "is" }),
|
|
8207
|
+
/* @__PURE__ */ jsxRuntime.jsx(ButtonsGroupText, { size: "md", children: stringifyTokenValue(token.value) }),
|
|
7905
8208
|
/* @__PURE__ */ jsxRuntime.jsx(
|
|
7906
8209
|
Button,
|
|
7907
8210
|
{
|
|
@@ -7909,7 +8212,6 @@ function PropertyFilterApplied({
|
|
|
7909
8212
|
disabled,
|
|
7910
8213
|
size: "md",
|
|
7911
8214
|
"aria-label": `Remove ${field.label} filter`,
|
|
7912
|
-
className: REMOVE_CLASS,
|
|
7913
8215
|
onClick: () => removeTokenAt(index),
|
|
7914
8216
|
children: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.XIcon, {})
|
|
7915
8217
|
}
|
|
@@ -7925,8 +8227,14 @@ function PropertyFilterCreator({
|
|
|
7925
8227
|
label = "Add Filter",
|
|
7926
8228
|
disabled,
|
|
7927
8229
|
size,
|
|
7928
|
-
onStartTextFilter
|
|
8230
|
+
onStartTextFilter,
|
|
8231
|
+
hiddenFieldIds
|
|
7929
8232
|
}) {
|
|
8233
|
+
const visibleFields = React.useMemo(() => {
|
|
8234
|
+
if (!hiddenFieldIds || hiddenFieldIds.length === 0) return fields;
|
|
8235
|
+
const hidden = new Set(hiddenFieldIds);
|
|
8236
|
+
return fields.filter((f) => !hidden.has(f.id));
|
|
8237
|
+
}, [fields, hiddenFieldIds]);
|
|
7930
8238
|
const [open, setOpen] = React.useState(false);
|
|
7931
8239
|
const [fieldId, setFieldId] = React.useState();
|
|
7932
8240
|
const [textValue, setTextValue] = React.useState("");
|
|
@@ -7942,7 +8250,7 @@ function PropertyFilterCreator({
|
|
|
7942
8250
|
React.useEffect(() => {
|
|
7943
8251
|
if (!open) setOpenPickMultiFieldId(void 0);
|
|
7944
8252
|
}, [open]);
|
|
7945
|
-
const selectedField = React.useMemo(() =>
|
|
8253
|
+
const selectedField = React.useMemo(() => visibleFields.find((f) => f.id === fieldId), [visibleFields, fieldId]);
|
|
7946
8254
|
const singleUseFieldIds = React.useMemo(() => {
|
|
7947
8255
|
const ids = /* @__PURE__ */ new Set();
|
|
7948
8256
|
for (const token of tokens) {
|
|
@@ -8062,7 +8370,7 @@ function PropertyFilterCreator({
|
|
|
8062
8370
|
else next = current <= 0 ? buttons.length - 1 : current - 1;
|
|
8063
8371
|
buttons[next]?.focus();
|
|
8064
8372
|
},
|
|
8065
|
-
children:
|
|
8373
|
+
children: visibleFields.length > 0 ? visibleFields.map((f) => {
|
|
8066
8374
|
const used = singleUseFieldIds.has(f.id);
|
|
8067
8375
|
if (f.kind === "pick-multi") {
|
|
8068
8376
|
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
@@ -8331,30 +8639,34 @@ const useAutoscroll = (ref, { enabled = true }) => {
|
|
|
8331
8639
|
}, [enabled, ref]);
|
|
8332
8640
|
};
|
|
8333
8641
|
|
|
8334
|
-
function
|
|
8335
|
-
|
|
8336
|
-
|
|
8337
|
-
|
|
8338
|
-
|
|
8339
|
-
|
|
8340
|
-
|
|
8341
|
-
|
|
8342
|
-
|
|
8343
|
-
|
|
8344
|
-
|
|
8345
|
-
|
|
8346
|
-
|
|
8347
|
-
|
|
8348
|
-
|
|
8349
|
-
|
|
8350
|
-
|
|
8351
|
-
|
|
8352
|
-
|
|
8353
|
-
|
|
8354
|
-
|
|
8355
|
-
|
|
8642
|
+
function resolveMask(mask, orientation) {
|
|
8643
|
+
if (mask === false) return { top: false, bottom: false, left: false, right: false };
|
|
8644
|
+
const vertical = orientation === "vertical" || orientation === "both";
|
|
8645
|
+
const horizontal = orientation === "horizontal" || orientation === "both";
|
|
8646
|
+
const sides = { top: vertical, bottom: vertical, left: horizontal, right: horizontal };
|
|
8647
|
+
if (mask === true || mask === void 0) return sides;
|
|
8648
|
+
if (mask.y !== void 0) {
|
|
8649
|
+
sides.top = mask.y;
|
|
8650
|
+
sides.bottom = mask.y;
|
|
8651
|
+
}
|
|
8652
|
+
if (mask.x !== void 0) {
|
|
8653
|
+
sides.left = mask.x;
|
|
8654
|
+
sides.right = mask.x;
|
|
8655
|
+
}
|
|
8656
|
+
if (mask.top !== void 0) sides.top = mask.top;
|
|
8657
|
+
if (mask.bottom !== void 0) sides.bottom = mask.bottom;
|
|
8658
|
+
if (mask.left !== void 0) sides.left = mask.left;
|
|
8659
|
+
if (mask.right !== void 0) sides.right = mask.right;
|
|
8660
|
+
return sides;
|
|
8661
|
+
}
|
|
8662
|
+
function maskClasses(sides) {
|
|
8663
|
+
return cn(
|
|
8664
|
+
sides.top && "data-[overflow-y-start]:mask-t-from-[calc(100%-2rem)]",
|
|
8665
|
+
sides.bottom && "data-[overflow-y-end]:mask-b-from-[calc(100%-2rem)]",
|
|
8666
|
+
sides.left && "data-[overflow-x-start]:mask-l-from-[calc(100%-2rem)]",
|
|
8667
|
+
sides.right && "data-[overflow-x-end]:mask-r-from-[calc(100%-2rem)]"
|
|
8668
|
+
);
|
|
8356
8669
|
}
|
|
8357
|
-
const MASK_CLASSES = "data-[overflow-y-start]:mask-t-from-[calc(100%-2rem)] data-[overflow-y-end]:mask-b-from-[calc(100%-2rem)] data-[overflow-x-start]:mask-l-from-[calc(100%-2rem)] data-[overflow-x-end]:mask-r-from-[calc(100%-2rem)]";
|
|
8358
8670
|
const ScrollArea = React__namespace.forwardRef(
|
|
8359
8671
|
({
|
|
8360
8672
|
className,
|
|
@@ -8363,46 +8675,58 @@ const ScrollArea = React__namespace.forwardRef(
|
|
|
8363
8675
|
maxHeight,
|
|
8364
8676
|
autoScroll = false,
|
|
8365
8677
|
orientation = "vertical",
|
|
8366
|
-
|
|
8678
|
+
mask,
|
|
8679
|
+
showMask,
|
|
8367
8680
|
...props
|
|
8368
8681
|
}, ref) => {
|
|
8369
8682
|
const areaRef = React__namespace.useRef(null);
|
|
8370
8683
|
useAutoscroll(areaRef, { enabled: autoScroll });
|
|
8371
|
-
|
|
8372
|
-
|
|
8684
|
+
const effectiveMask = mask !== void 0 ? mask : showMask;
|
|
8685
|
+
const sides = resolveMask(effectiveMask, orientation);
|
|
8686
|
+
const viewportStyle = {};
|
|
8687
|
+
if (maxHeight) viewportStyle.maxHeight = maxHeight;
|
|
8688
|
+
if (orientation === "vertical") {
|
|
8689
|
+
viewportStyle.overflowX = "hidden";
|
|
8690
|
+
viewportStyle.overflowY = "scroll";
|
|
8691
|
+
} else if (orientation === "horizontal") {
|
|
8692
|
+
viewportStyle.overflowX = "scroll";
|
|
8693
|
+
viewportStyle.overflowY = "hidden";
|
|
8694
|
+
}
|
|
8695
|
+
const contentStyle = orientation === "vertical" ? { minWidth: "0px" } : orientation === "horizontal" ? { minHeight: "0px" } : void 0;
|
|
8696
|
+
return /* @__PURE__ */ jsxRuntime.jsxs(scrollArea.ScrollArea.Root, { ref, className: cn("relative overflow-hidden", className), ...props, children: [
|
|
8373
8697
|
/* @__PURE__ */ jsxRuntime.jsx(
|
|
8374
|
-
|
|
8698
|
+
scrollArea.ScrollArea.Viewport,
|
|
8375
8699
|
{
|
|
8376
8700
|
ref: areaRef,
|
|
8377
|
-
className: cn("h-full w-full rounded-[inherit]
|
|
8378
|
-
style:
|
|
8379
|
-
children
|
|
8701
|
+
className: cn("h-full w-full rounded-[inherit]", maskClasses(sides), viewPortClassName),
|
|
8702
|
+
style: viewportStyle,
|
|
8703
|
+
children: /* @__PURE__ */ jsxRuntime.jsx(scrollArea.ScrollArea.Content, { style: contentStyle, children })
|
|
8380
8704
|
}
|
|
8381
8705
|
),
|
|
8382
8706
|
(orientation === "vertical" || orientation === "both") && /* @__PURE__ */ jsxRuntime.jsx(ScrollBar, { orientation: "vertical" }),
|
|
8383
8707
|
(orientation === "horizontal" || orientation === "both") && /* @__PURE__ */ jsxRuntime.jsx(ScrollBar, { orientation: "horizontal" }),
|
|
8384
|
-
orientation === "both" && /* @__PURE__ */ jsxRuntime.jsx(
|
|
8708
|
+
orientation === "both" && /* @__PURE__ */ jsxRuntime.jsx(scrollArea.ScrollArea.Corner, {})
|
|
8385
8709
|
] });
|
|
8386
8710
|
}
|
|
8387
8711
|
);
|
|
8388
|
-
ScrollArea.displayName =
|
|
8712
|
+
ScrollArea.displayName = "ScrollArea";
|
|
8389
8713
|
const ScrollBar = React__namespace.forwardRef(({ className, orientation = "vertical", ...props }, ref) => /* @__PURE__ */ jsxRuntime.jsx(
|
|
8390
|
-
|
|
8714
|
+
scrollArea.ScrollArea.Scrollbar,
|
|
8391
8715
|
{
|
|
8392
8716
|
ref,
|
|
8393
8717
|
orientation,
|
|
8394
8718
|
className: cn(
|
|
8395
|
-
"flex touch-none select-none transition-
|
|
8396
|
-
"opacity-0
|
|
8719
|
+
"flex touch-none select-none transition-opacity duration-normal ease-out-custom",
|
|
8720
|
+
"opacity-0 data-[hovering]:opacity-100 data-[scrolling]:opacity-100 data-[scrolling]:duration-0",
|
|
8397
8721
|
orientation === "vertical" && "h-full w-1.5 p-px",
|
|
8398
8722
|
orientation === "horizontal" && "h-1.5 w-full flex-col p-px",
|
|
8399
8723
|
className
|
|
8400
8724
|
),
|
|
8401
8725
|
...props,
|
|
8402
|
-
children: /* @__PURE__ */ jsxRuntime.jsx(
|
|
8726
|
+
children: /* @__PURE__ */ jsxRuntime.jsx(scrollArea.ScrollArea.Thumb, { className: "relative flex-1 rounded-full bg-neutral4/30 hover:bg-neutral4/60 transition-colors duration-normal" })
|
|
8403
8727
|
}
|
|
8404
8728
|
));
|
|
8405
|
-
ScrollBar.displayName =
|
|
8729
|
+
ScrollBar.displayName = "ScrollBar";
|
|
8406
8730
|
|
|
8407
8731
|
const searchbarSizeClasses = {
|
|
8408
8732
|
sm: formElementSizes.sm,
|
|
@@ -8699,22 +9023,6 @@ function Truncate({
|
|
|
8699
9023
|
] });
|
|
8700
9024
|
}
|
|
8701
9025
|
|
|
8702
|
-
function ButtonsGroup({ children, className, spacing = "default" }) {
|
|
8703
|
-
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
8704
|
-
"div",
|
|
8705
|
-
{
|
|
8706
|
-
className: cn(
|
|
8707
|
-
`flex gap-2 items-center`,
|
|
8708
|
-
{
|
|
8709
|
-
"gap-0 [&>*:not(:last-child)]:rounded-r-none [&>*:not(:first-child)]:rounded-l-none [&>*:not(:first-child)]:-ml-px": spacing === "close"
|
|
8710
|
-
},
|
|
8711
|
-
className
|
|
8712
|
-
),
|
|
8713
|
-
children
|
|
8714
|
-
}
|
|
8715
|
-
);
|
|
8716
|
-
}
|
|
8717
|
-
|
|
8718
9026
|
function MainContentLayout({
|
|
8719
9027
|
children,
|
|
8720
9028
|
className,
|
|
@@ -10264,7 +10572,7 @@ function MainSidebarNav({
|
|
|
10264
10572
|
className,
|
|
10265
10573
|
...props
|
|
10266
10574
|
}) {
|
|
10267
|
-
return /* @__PURE__ */ jsxRuntime.jsx("nav", { "aria-label": ariaLabel, className: cn("flex flex-col flex-1 min-h-0", className), ...props, children: /* @__PURE__ */ jsxRuntime.jsx(ScrollArea, {
|
|
10575
|
+
return /* @__PURE__ */ jsxRuntime.jsx("nav", { "aria-label": ariaLabel, className: cn("flex flex-col flex-1 min-h-0", className), ...props, children: /* @__PURE__ */ jsxRuntime.jsx(ScrollArea, { className: "flex-1 min-h-0", children }) });
|
|
10268
10576
|
}
|
|
10269
10577
|
|
|
10270
10578
|
function MainSidebarNavSeparator({ className, ...props }) {
|
|
@@ -15656,29 +15964,20 @@ const PanelSeparator = () => {
|
|
|
15656
15964
|
"group/separator relative w-0 bg-transparent z-10",
|
|
15657
15965
|
"focus:outline-hidden focus-visible:outline-hidden"
|
|
15658
15966
|
),
|
|
15659
|
-
children: /* @__PURE__ */ jsxRuntime.jsx(
|
|
15967
|
+
children: /* @__PURE__ */ jsxRuntime.jsx("span", { "aria-hidden": true, className: cn("absolute inset-y-0 -left-1 -right-1", "cursor-col-resize touch-none"), children: /* @__PURE__ */ jsxRuntime.jsx(
|
|
15660
15968
|
"span",
|
|
15661
15969
|
{
|
|
15662
|
-
"aria-hidden": true,
|
|
15663
15970
|
className: cn(
|
|
15664
|
-
"absolute
|
|
15665
|
-
"
|
|
15666
|
-
|
|
15667
|
-
|
|
15668
|
-
"
|
|
15669
|
-
|
|
15670
|
-
|
|
15671
|
-
"block h-full w-px bg-border1 pointer-events-none",
|
|
15672
|
-
"transition-[width,background-color] duration-150 ease-out motion-reduce:transition-none",
|
|
15673
|
-
"group-hover/separator:w-0.5 group-hover/separator:bg-surface5",
|
|
15674
|
-
"group-data-[separator='hover']/separator:w-0.5 group-data-[separator='hover']/separator:bg-surface5",
|
|
15675
|
-
"group-data-[separator='active']/separator:w-0.5 group-data-[separator='active']/separator:bg-accent1",
|
|
15676
|
-
"group-focus-visible/separator:w-0.5 group-focus-visible/separator:bg-accent1"
|
|
15677
|
-
)
|
|
15678
|
-
}
|
|
15971
|
+
"absolute top-1/2 left-1/2 -translate-x-1/2 -translate-y-1/2",
|
|
15972
|
+
"h-10 w-0.5 bg-surface5 pointer-events-none rounded-full",
|
|
15973
|
+
"transition-all duration-150 ease-out motion-reduce:transition-none",
|
|
15974
|
+
"group-hover/separator:h-12 group-hover/separator:w-1 group-hover/separator:bg-surface5",
|
|
15975
|
+
"group-data-[separator='hover']/separator:h-12 group-data-[separator='hover']/separator:w-1 group-data-[separator='hover']/separator:bg-surface5",
|
|
15976
|
+
"group-data-[separator='active']/separator:h-12 group-data-[separator='active']/separator:w-1 group-data-[separator='active']/separator:bg-accent1",
|
|
15977
|
+
"group-focus-visible/separator:h-12 group-focus-visible/separator:w-1 group-focus-visible/separator:bg-accent1"
|
|
15679
15978
|
)
|
|
15680
15979
|
}
|
|
15681
|
-
)
|
|
15980
|
+
) })
|
|
15682
15981
|
}
|
|
15683
15982
|
);
|
|
15684
15983
|
};
|
|
@@ -17694,6 +17993,7 @@ const TRACE_SYNTHETIC_FILTER_FIELD_IDS = ["rootEntityType", "status"];
|
|
|
17694
17993
|
const TRACE_ROOT_ENTITY_TYPE_PARAM = "rootEntityType";
|
|
17695
17994
|
const TRACE_STATUS_PARAM = "status";
|
|
17696
17995
|
const TRACE_LIST_MODE_PARAM = "listMode";
|
|
17996
|
+
const TRACE_ANCHOR_SPAN_ID_PARAM = "anchorSpanId";
|
|
17697
17997
|
const TRACE_LIST_MODE_VALUES = /* @__PURE__ */ new Set(["traces", "branches"]);
|
|
17698
17998
|
const TRACE_DATE_PRESET_PARAM = "datePreset";
|
|
17699
17999
|
const TRACE_DATE_FROM_PARAM = "dateFrom";
|
|
@@ -18179,7 +18479,7 @@ function useDrilldown() {
|
|
|
18179
18479
|
return { getTracesHref, getLogsHref, getBucketTracesHref };
|
|
18180
18480
|
}
|
|
18181
18481
|
|
|
18182
|
-
const formatHierarchicalSpans = (spans) => {
|
|
18482
|
+
const formatHierarchicalSpans = (spans, anchorSpanId) => {
|
|
18183
18483
|
if (!spans || spans.length === 0) {
|
|
18184
18484
|
return [];
|
|
18185
18485
|
}
|
|
@@ -18207,9 +18507,10 @@ const formatHierarchicalSpans = (spans) => {
|
|
|
18207
18507
|
};
|
|
18208
18508
|
spanMap.set(spanRecord.spanId, uiSpan);
|
|
18209
18509
|
});
|
|
18510
|
+
const isAnchor = (spanRecord) => anchorSpanId ? spanRecord.spanId === anchorSpanId : spanRecord?.parentSpanId == null;
|
|
18210
18511
|
spans.forEach((spanRecord) => {
|
|
18211
18512
|
const uiSpan = spanMap.get(spanRecord.spanId);
|
|
18212
|
-
if (spanRecord
|
|
18513
|
+
if (isAnchor(spanRecord)) {
|
|
18213
18514
|
if (overallEndDate && uiSpan.endTime && overallEndDate > new Date(uiSpan.endTime)) {
|
|
18214
18515
|
uiSpan.endTime = overallEndDate.toISOString();
|
|
18215
18516
|
const overallEndTime = new Date(overallEndDate).getTime();
|
|
@@ -18218,7 +18519,7 @@ const formatHierarchicalSpans = (spans) => {
|
|
|
18218
18519
|
}
|
|
18219
18520
|
rootSpans.push(uiSpan);
|
|
18220
18521
|
} else {
|
|
18221
|
-
const parent = spanMap.get(spanRecord.parentSpanId);
|
|
18522
|
+
const parent = spanRecord.parentSpanId ? spanMap.get(spanRecord.parentSpanId) : void 0;
|
|
18222
18523
|
if (parent) {
|
|
18223
18524
|
parent.spans.push(uiSpan);
|
|
18224
18525
|
} else {
|
|
@@ -18931,10 +19232,15 @@ function TracesToolbar({
|
|
|
18931
19232
|
filterFields,
|
|
18932
19233
|
filterTokens,
|
|
18933
19234
|
onFilterTokensChange,
|
|
18934
|
-
autoFocusFilterFieldId
|
|
19235
|
+
autoFocusFilterFieldId,
|
|
19236
|
+
lockedFieldIds,
|
|
19237
|
+
lockedTooltipContent
|
|
18935
19238
|
}) {
|
|
18936
19239
|
const hasActiveFilters = filterTokens.length > 0;
|
|
18937
|
-
const
|
|
19240
|
+
const lockedSet = new Set(lockedFieldIds ?? []);
|
|
19241
|
+
const editableTokens = filterTokens.filter((t) => !lockedSet.has(t.fieldId));
|
|
19242
|
+
const hasNonDefaultFilter = editableTokens.some((token) => isNonDefaultFilter$1(token, filterFields));
|
|
19243
|
+
const hasEditableFilters = editableTokens.length > 0;
|
|
18938
19244
|
return (
|
|
18939
19245
|
// 1fr | auto — pills wrap in the first column; Clear stays pinned to the
|
|
18940
19246
|
// top of the second column regardless of how many pill rows render.
|
|
@@ -18946,10 +19252,12 @@ function TracesToolbar({
|
|
|
18946
19252
|
tokens: filterTokens,
|
|
18947
19253
|
onTokensChange: onFilterTokensChange,
|
|
18948
19254
|
disabled: isLoading,
|
|
18949
|
-
autoFocusFieldId: autoFocusFilterFieldId
|
|
19255
|
+
autoFocusFieldId: autoFocusFilterFieldId,
|
|
19256
|
+
lockedFieldIds,
|
|
19257
|
+
lockedTooltipContent
|
|
18950
19258
|
}
|
|
18951
19259
|
),
|
|
18952
|
-
hasActiveFilters && /* @__PURE__ */ jsxRuntime.jsx(
|
|
19260
|
+
hasActiveFilters && hasEditableFilters && /* @__PURE__ */ jsxRuntime.jsx(
|
|
18953
19261
|
PropertyFilterActions,
|
|
18954
19262
|
{
|
|
18955
19263
|
disabled: isLoading,
|
|
@@ -18994,7 +19302,8 @@ function TraceDataPanelView({
|
|
|
18994
19302
|
placement,
|
|
18995
19303
|
timelineChartWidth = "default",
|
|
18996
19304
|
LinkComponent,
|
|
18997
|
-
traceHref
|
|
19305
|
+
traceHref,
|
|
19306
|
+
anchorSpanId
|
|
18998
19307
|
}) {
|
|
18999
19308
|
const isOnTracePage = placement === "trace-page";
|
|
19000
19309
|
const [internalCollapsed, setInternalCollapsed] = React.useState(false);
|
|
@@ -19023,14 +19332,17 @@ function TraceDataPanelView({
|
|
|
19023
19332
|
const el = contentRef.current.querySelector(`[data-span-id="${selectedSpanId}"]`);
|
|
19024
19333
|
el?.scrollIntoView({ block: "nearest" });
|
|
19025
19334
|
}, [selectedSpanId]);
|
|
19026
|
-
const hierarchicalSpans = React.useMemo(() => formatHierarchicalSpans(spans ?? []), [spans]);
|
|
19335
|
+
const hierarchicalSpans = React.useMemo(() => formatHierarchicalSpans(spans ?? [], anchorSpanId), [spans, anchorSpanId]);
|
|
19027
19336
|
const [expandedSpanIds, setExpandedSpanIds] = React.useState([]);
|
|
19028
19337
|
React.useEffect(() => {
|
|
19029
19338
|
if (hierarchicalSpans.length > 0) {
|
|
19030
19339
|
setExpandedSpanIds(getAllSpanIds(hierarchicalSpans));
|
|
19031
19340
|
}
|
|
19032
19341
|
}, [hierarchicalSpans]);
|
|
19033
|
-
const rootSpan = React.useMemo(
|
|
19342
|
+
const rootSpan = React.useMemo(
|
|
19343
|
+
() => anchorSpanId ? spans?.find((s) => s.spanId === anchorSpanId) : spans?.find((s) => s.parentSpanId == null),
|
|
19344
|
+
[spans, anchorSpanId]
|
|
19345
|
+
);
|
|
19034
19346
|
const handleSpanClick = (id) => {
|
|
19035
19347
|
const newId = selectedSpanId === id ? void 0 : id;
|
|
19036
19348
|
setSelectedSpanId(newId);
|
|
@@ -19195,7 +19507,8 @@ function SpanDataPanelView({
|
|
|
19195
19507
|
scoringTabSlot,
|
|
19196
19508
|
scoringTabBadge,
|
|
19197
19509
|
feedbackTabSlot,
|
|
19198
|
-
feedbackTabBadge
|
|
19510
|
+
feedbackTabBadge,
|
|
19511
|
+
isAnchor
|
|
19199
19512
|
}) {
|
|
19200
19513
|
return /* @__PURE__ */ jsxRuntime.jsxs(DataPanel, { children: [
|
|
19201
19514
|
/* @__PURE__ */ jsxRuntime.jsxs(DataPanel.Header, { children: [
|
|
@@ -19230,7 +19543,8 @@ function SpanDataPanelView({
|
|
|
19230
19543
|
scoringTabSlot,
|
|
19231
19544
|
scoringTabBadge,
|
|
19232
19545
|
feedbackTabSlot,
|
|
19233
|
-
feedbackTabBadge
|
|
19546
|
+
feedbackTabBadge,
|
|
19547
|
+
isAnchor
|
|
19234
19548
|
}
|
|
19235
19549
|
)
|
|
19236
19550
|
] });
|
|
@@ -19244,7 +19558,8 @@ function SpanDataPanelContent({
|
|
|
19244
19558
|
scoringTabSlot,
|
|
19245
19559
|
scoringTabBadge,
|
|
19246
19560
|
feedbackTabSlot,
|
|
19247
|
-
feedbackTabBadge
|
|
19561
|
+
feedbackTabBadge,
|
|
19562
|
+
isAnchor
|
|
19248
19563
|
}) {
|
|
19249
19564
|
const durationMs = span.startedAt && span.endedAt ? new Date(span.endedAt).getTime() - new Date(span.startedAt).getTime() : null;
|
|
19250
19565
|
const usage = span.attributes?.usage;
|
|
@@ -19252,7 +19567,7 @@ function SpanDataPanelContent({
|
|
|
19252
19567
|
isTokenLimitExceeded(span) && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "mb-3", children: /* @__PURE__ */ jsxRuntime.jsx(Notice, { variant: "warning", title: "Token Limit Exceeded", children: /* @__PURE__ */ jsxRuntime.jsx(Notice.Message, { children: getTokenLimitMessage(span) }) }) }),
|
|
19253
19568
|
usage && /* @__PURE__ */ jsxRuntime.jsx(SpanTokenUsage, { usage, className: "mb-3" }),
|
|
19254
19569
|
/* @__PURE__ */ jsxRuntime.jsxs(DataKeysAndValues, { children: [
|
|
19255
|
-
span.parentSpanId == null && /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
|
|
19570
|
+
(isAnchor ?? span.parentSpanId == null) && /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
|
|
19256
19571
|
span.traceId && /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
|
|
19257
19572
|
/* @__PURE__ */ jsxRuntime.jsx(DataKeysAndValues.Key, { children: "Trace Id" }),
|
|
19258
19573
|
/* @__PURE__ */ jsxRuntime.jsx(DataKeysAndValues.ValueWithCopyBtn, { copyTooltip: "Copy Trace Id to clipboard", copyValue: span.traceId, children: span.traceId })
|
|
@@ -19604,6 +19919,7 @@ function TracesListView({
|
|
|
19604
19919
|
setEndOfListElement,
|
|
19605
19920
|
filtersApplied,
|
|
19606
19921
|
featuredTraceId,
|
|
19922
|
+
featuredSpanId,
|
|
19607
19923
|
onTraceClick,
|
|
19608
19924
|
groupByThread,
|
|
19609
19925
|
threadTitles
|
|
@@ -19612,7 +19928,7 @@ function TracesListView({
|
|
|
19612
19928
|
const items = React.useMemo(() => {
|
|
19613
19929
|
if (traces.length === 0) return [];
|
|
19614
19930
|
if (!groupByThread) {
|
|
19615
|
-
return traces.map((trace) => ({ kind: "row", key: trace.traceId
|
|
19931
|
+
return traces.map((trace) => ({ kind: "row", key: `${trace.traceId}:${trace.spanId ?? ""}`, trace }));
|
|
19616
19932
|
}
|
|
19617
19933
|
const { groups, ungrouped } = groupTracesByThread(traces);
|
|
19618
19934
|
const result = [];
|
|
@@ -19639,7 +19955,7 @@ function TracesListView({
|
|
|
19639
19955
|
] })
|
|
19640
19956
|
});
|
|
19641
19957
|
for (const trace of group.traces) {
|
|
19642
|
-
result.push({ kind: "row", key: trace.traceId
|
|
19958
|
+
result.push({ kind: "row", key: `${trace.traceId}:${trace.spanId ?? ""}`, trace });
|
|
19643
19959
|
}
|
|
19644
19960
|
}
|
|
19645
19961
|
if (ungrouped.length > 0) {
|
|
@@ -19656,7 +19972,7 @@ function TracesListView({
|
|
|
19656
19972
|
] })
|
|
19657
19973
|
});
|
|
19658
19974
|
for (const trace of ungrouped) {
|
|
19659
|
-
result.push({ kind: "row", key: trace.traceId
|
|
19975
|
+
result.push({ kind: "row", key: `${trace.traceId}:${trace.spanId ?? ""}`, trace });
|
|
19660
19976
|
}
|
|
19661
19977
|
}
|
|
19662
19978
|
return result;
|
|
@@ -19705,7 +20021,7 @@ function TracesListView({
|
|
|
19705
20021
|
return /* @__PURE__ */ jsxRuntime.jsx(TracesDataList.Subheader, { ref: virtualizer.measureElement, "data-index": vi.index, children: item.node }, item.key);
|
|
19706
20022
|
}
|
|
19707
20023
|
const trace = item.trace;
|
|
19708
|
-
const isFeatured = trace.traceId === featuredTraceId;
|
|
20024
|
+
const isFeatured = trace.traceId === featuredTraceId && (featuredSpanId == null || trace.spanId === featuredSpanId);
|
|
19709
20025
|
const displayDate = trace.startedAt ?? trace.createdAt;
|
|
19710
20026
|
const entityName = trace.entityName || trace.entityId || trace.attributes?.agentId || trace.attributes?.workflowId;
|
|
19711
20027
|
return /* @__PURE__ */ jsxRuntime.jsxs(
|
|
@@ -19741,6 +20057,23 @@ function TracesListView({
|
|
|
19741
20057
|
] });
|
|
19742
20058
|
}
|
|
19743
20059
|
|
|
20060
|
+
const TRACES_LIST_MODE_LABELS = {
|
|
20061
|
+
traces: "Top-level traces only",
|
|
20062
|
+
branches: "All traces, nested too"
|
|
20063
|
+
};
|
|
20064
|
+
function TracesListModeToggle({ value, onChange, disabled }) {
|
|
20065
|
+
return /* @__PURE__ */ jsxRuntime.jsxs(DropdownMenu, { children: [
|
|
20066
|
+
/* @__PURE__ */ jsxRuntime.jsx(DropdownMenu.Trigger, { asChild: true, children: /* @__PURE__ */ jsxRuntime.jsxs(Button, { size: "md", variant: "default", disabled, children: [
|
|
20067
|
+
TRACES_LIST_MODE_LABELS[value],
|
|
20068
|
+
/* @__PURE__ */ jsxRuntime.jsx(lucideReact.ChevronDownIcon, {})
|
|
20069
|
+
] }) }),
|
|
20070
|
+
/* @__PURE__ */ jsxRuntime.jsx(DropdownMenu.Content, { align: "start", children: /* @__PURE__ */ jsxRuntime.jsxs(DropdownMenu.RadioGroup, { value, onValueChange: (v) => onChange(v), children: [
|
|
20071
|
+
/* @__PURE__ */ jsxRuntime.jsx(DropdownMenu.RadioItem, { value: "traces", children: TRACES_LIST_MODE_LABELS.traces }),
|
|
20072
|
+
/* @__PURE__ */ jsxRuntime.jsx(DropdownMenu.RadioItem, { value: "branches", children: TRACES_LIST_MODE_LABELS.branches })
|
|
20073
|
+
] }) })
|
|
20074
|
+
] });
|
|
20075
|
+
}
|
|
20076
|
+
|
|
19744
20077
|
function TracesErrorContent({ error, resource, errorTitle }) {
|
|
19745
20078
|
if (is401UnauthorizedError(error)) return /* @__PURE__ */ jsxRuntime.jsx(SessionExpired, {});
|
|
19746
20079
|
if (is403ForbiddenError(error)) return /* @__PURE__ */ jsxRuntime.jsx(PermissionDenied, { resource });
|
|
@@ -19807,6 +20140,26 @@ const NoTracesInfo = ({ datePreset, dateFrom, dateTo } = {}) => {
|
|
|
19807
20140
|
) });
|
|
19808
20141
|
};
|
|
19809
20142
|
|
|
20143
|
+
const IMMUTABLE_CACHE_TIME$2 = 1e3 * 60 * 60 * 24 * 30;
|
|
20144
|
+
function useBranch({ traceId, spanId, depth }) {
|
|
20145
|
+
const client = react.useMastraClient();
|
|
20146
|
+
return reactQuery.useQuery({
|
|
20147
|
+
queryKey: ["branch", traceId, spanId, depth],
|
|
20148
|
+
queryFn: async () => {
|
|
20149
|
+
if (!traceId || !spanId) {
|
|
20150
|
+
throw new Error("traceId and spanId are required");
|
|
20151
|
+
}
|
|
20152
|
+
return client.getBranch({ traceId, spanId, depth });
|
|
20153
|
+
},
|
|
20154
|
+
enabled: !!traceId && !!spanId,
|
|
20155
|
+
staleTime: (query) => {
|
|
20156
|
+
const data = query.state.data;
|
|
20157
|
+
const isFinished = data?.spans.every((s) => Boolean(s.endedAt));
|
|
20158
|
+
return isFinished ? IMMUTABLE_CACHE_TIME$2 : 0;
|
|
20159
|
+
}
|
|
20160
|
+
});
|
|
20161
|
+
}
|
|
20162
|
+
|
|
19810
20163
|
const IMMUTABLE_CACHE_TIME$1 = 1e3 * 60 * 60 * 24 * 30;
|
|
19811
20164
|
function useSpanDetail(traceId, spanId) {
|
|
19812
20165
|
const client = react.useMastraClient();
|
|
@@ -19853,6 +20206,37 @@ function useTraceLightSpans(traceId) {
|
|
|
19853
20206
|
});
|
|
19854
20207
|
}
|
|
19855
20208
|
|
|
20209
|
+
function useTraceOrBranchSpans({
|
|
20210
|
+
traceId,
|
|
20211
|
+
anchorSpanId,
|
|
20212
|
+
listMode,
|
|
20213
|
+
depth
|
|
20214
|
+
}) {
|
|
20215
|
+
const isBranches = listMode === "branches";
|
|
20216
|
+
const traceQuery = useTraceLightSpans(isBranches ? null : traceId);
|
|
20217
|
+
const branchQuery = useBranch({
|
|
20218
|
+
traceId: isBranches ? traceId : null,
|
|
20219
|
+
spanId: isBranches ? anchorSpanId : null,
|
|
20220
|
+
depth
|
|
20221
|
+
});
|
|
20222
|
+
if (isBranches) {
|
|
20223
|
+
return {
|
|
20224
|
+
spans: branchQuery.data?.spans,
|
|
20225
|
+
anchorSpanId: anchorSpanId ?? void 0,
|
|
20226
|
+
isLoading: branchQuery.isLoading,
|
|
20227
|
+
isError: branchQuery.isError,
|
|
20228
|
+
error: branchQuery.error
|
|
20229
|
+
};
|
|
20230
|
+
}
|
|
20231
|
+
return {
|
|
20232
|
+
spans: traceQuery.data?.spans,
|
|
20233
|
+
anchorSpanId: void 0,
|
|
20234
|
+
isLoading: traceQuery.isLoading,
|
|
20235
|
+
isError: traceQuery.isError,
|
|
20236
|
+
error: traceQuery.error
|
|
20237
|
+
};
|
|
20238
|
+
}
|
|
20239
|
+
|
|
19856
20240
|
function useTraceSpans(traceId) {
|
|
19857
20241
|
const client = react.useMastraClient();
|
|
19858
20242
|
return reactQuery.useQuery({
|
|
@@ -19873,7 +20257,7 @@ const fetchTracesFn = async ({
|
|
|
19873
20257
|
page,
|
|
19874
20258
|
perPage,
|
|
19875
20259
|
filters,
|
|
19876
|
-
listMode = "
|
|
20260
|
+
listMode = "branches"
|
|
19877
20261
|
}) => {
|
|
19878
20262
|
const params = {
|
|
19879
20263
|
pagination: {
|
|
@@ -19914,7 +20298,7 @@ function selectUniqueTraces(data) {
|
|
|
19914
20298
|
}
|
|
19915
20299
|
return { spans, threadTitles };
|
|
19916
20300
|
}
|
|
19917
|
-
const useTraces = ({ filters, listMode = "
|
|
20301
|
+
const useTraces = ({ filters, listMode = "branches" }) => {
|
|
19918
20302
|
const client = react.useMastraClient();
|
|
19919
20303
|
const { inView: isEndOfListInView, setRef: setEndOfListElement } = useInView();
|
|
19920
20304
|
const query = reactQuery.useInfiniteQuery({
|
|
@@ -20026,13 +20410,17 @@ function useTraceSpanNavigation(lightSpans, featuredSpanId, onSpanChange) {
|
|
|
20026
20410
|
return { handlePreviousSpan, handleNextSpan, timelineSpanIds };
|
|
20027
20411
|
}
|
|
20028
20412
|
|
|
20029
|
-
function useTraceListNavigation(traces, featuredTraceId, onTraceChange) {
|
|
20413
|
+
function useTraceListNavigation(traces, featuredTraceId, featuredSpanId, onTraceChange) {
|
|
20030
20414
|
const featuredTraceIdx = React.useMemo(
|
|
20031
|
-
() => featuredTraceId ? traces.findIndex(
|
|
20032
|
-
|
|
20415
|
+
() => featuredTraceId ? traces.findIndex(
|
|
20416
|
+
(t) => t.traceId === featuredTraceId && (featuredSpanId == null || t.spanId === featuredSpanId)
|
|
20417
|
+
) : -1,
|
|
20418
|
+
[traces, featuredTraceId, featuredSpanId]
|
|
20033
20419
|
);
|
|
20034
|
-
const
|
|
20035
|
-
const
|
|
20420
|
+
const passSpanId = featuredSpanId != null;
|
|
20421
|
+
const navigateTo = (row) => onTraceChange(row.traceId, passSpanId ? row.spanId ?? void 0 : void 0);
|
|
20422
|
+
const handlePreviousTrace = featuredTraceIdx > 0 ? () => navigateTo(traces[featuredTraceIdx - 1]) : void 0;
|
|
20423
|
+
const handleNextTrace = featuredTraceIdx >= 0 && featuredTraceIdx < traces.length - 1 ? () => navigateTo(traces[featuredTraceIdx + 1]) : void 0;
|
|
20036
20424
|
return { featuredTraceIdx, handlePreviousTrace, handleNextTrace };
|
|
20037
20425
|
}
|
|
20038
20426
|
|
|
@@ -20051,6 +20439,7 @@ const PRESET_MS$1 = {
|
|
|
20051
20439
|
function clearSelectionParams$1(params) {
|
|
20052
20440
|
params.delete(TRACE_ID_PARAM);
|
|
20053
20441
|
params.delete(SPAN_ID_PARAM);
|
|
20442
|
+
params.delete(TRACE_ANCHOR_SPAN_ID_PARAM);
|
|
20054
20443
|
params.delete(TAB_PARAM);
|
|
20055
20444
|
params.delete(SCORE_ID_PARAM);
|
|
20056
20445
|
}
|
|
@@ -20081,12 +20470,13 @@ function useTraceUrlState(searchParams, setSearchParams, options) {
|
|
|
20081
20470
|
datePresetRef.current = datePreset;
|
|
20082
20471
|
const traceIdParam = searchParams.get(TRACE_ID_PARAM) || void 0;
|
|
20083
20472
|
const spanIdParam = searchParams.get(SPAN_ID_PARAM) || void 0;
|
|
20473
|
+
const anchorSpanIdParam = searchParams.get(TRACE_ANCHOR_SPAN_ID_PARAM) || void 0;
|
|
20084
20474
|
const tabParam = searchParams.get(TAB_PARAM);
|
|
20085
20475
|
const spanTabParam = tabParam === "scoring" ? "scoring" : tabParam === "feedback" ? "feedback" : tabParam === "details" ? "details" : void 0;
|
|
20086
20476
|
const scoreIdParam = searchParams.get(SCORE_ID_PARAM) || void 0;
|
|
20087
20477
|
const listMode = React.useMemo(() => {
|
|
20088
20478
|
const value = searchParams.get(TRACE_LIST_MODE_PARAM);
|
|
20089
|
-
return value && TRACE_LIST_MODE_VALUES.has(value) ? value : "
|
|
20479
|
+
return value && TRACE_LIST_MODE_VALUES.has(value) ? value : "branches";
|
|
20090
20480
|
}, [searchParams]);
|
|
20091
20481
|
const selectedEntityOption = React.useMemo(
|
|
20092
20482
|
() => ROOT_ENTITY_TYPE_OPTIONS.find((option) => option.entityType === searchParams.get(TRACE_ROOT_ENTITY_TYPE_PARAM)),
|
|
@@ -20098,7 +20488,7 @@ function useTraceUrlState(searchParams, setSearchParams, options) {
|
|
|
20098
20488
|
}, [searchParams]);
|
|
20099
20489
|
const filterTokens = React.useMemo(() => getTracePropertyFilterTokens(searchParams), [searchParams]);
|
|
20100
20490
|
const handleTraceClick = React.useCallback(
|
|
20101
|
-
(traceId) => {
|
|
20491
|
+
(traceId, spanId, anchorSpanId) => {
|
|
20102
20492
|
setSearchParams(
|
|
20103
20493
|
(prev) => {
|
|
20104
20494
|
const next = new URLSearchParams(prev);
|
|
@@ -20107,7 +20497,16 @@ function useTraceUrlState(searchParams, setSearchParams, options) {
|
|
|
20107
20497
|
} else {
|
|
20108
20498
|
next.delete(TRACE_ID_PARAM);
|
|
20109
20499
|
}
|
|
20110
|
-
|
|
20500
|
+
if (spanId) {
|
|
20501
|
+
next.set(SPAN_ID_PARAM, spanId);
|
|
20502
|
+
} else {
|
|
20503
|
+
next.delete(SPAN_ID_PARAM);
|
|
20504
|
+
}
|
|
20505
|
+
if (anchorSpanId) {
|
|
20506
|
+
next.set(TRACE_ANCHOR_SPAN_ID_PARAM, anchorSpanId);
|
|
20507
|
+
} else {
|
|
20508
|
+
next.delete(TRACE_ANCHOR_SPAN_ID_PARAM);
|
|
20509
|
+
}
|
|
20111
20510
|
next.delete(TAB_PARAM);
|
|
20112
20511
|
next.delete(SCORE_ID_PARAM);
|
|
20113
20512
|
return next;
|
|
@@ -20239,6 +20638,24 @@ function useTraceUrlState(searchParams, setSearchParams, options) {
|
|
|
20239
20638
|
},
|
|
20240
20639
|
[setSearchParams]
|
|
20241
20640
|
);
|
|
20641
|
+
const handleListModeChange = React.useCallback(
|
|
20642
|
+
(mode) => {
|
|
20643
|
+
setSearchParams(
|
|
20644
|
+
(prev) => {
|
|
20645
|
+
const next = new URLSearchParams(prev);
|
|
20646
|
+
if (mode === "branches") {
|
|
20647
|
+
next.delete(TRACE_LIST_MODE_PARAM);
|
|
20648
|
+
} else {
|
|
20649
|
+
next.set(TRACE_LIST_MODE_PARAM, mode);
|
|
20650
|
+
}
|
|
20651
|
+
clearSelectionParams$1(next);
|
|
20652
|
+
return next;
|
|
20653
|
+
},
|
|
20654
|
+
{ replace: true }
|
|
20655
|
+
);
|
|
20656
|
+
},
|
|
20657
|
+
[setSearchParams]
|
|
20658
|
+
);
|
|
20242
20659
|
const handleRemoveAll = React.useCallback(() => {
|
|
20243
20660
|
setSearchParams(
|
|
20244
20661
|
(prev) => {
|
|
@@ -20265,6 +20682,7 @@ function useTraceUrlState(searchParams, setSearchParams, options) {
|
|
|
20265
20682
|
datePresetRef,
|
|
20266
20683
|
traceIdParam,
|
|
20267
20684
|
spanIdParam,
|
|
20685
|
+
anchorSpanIdParam,
|
|
20268
20686
|
spanTabParam,
|
|
20269
20687
|
scoreIdParam,
|
|
20270
20688
|
listMode,
|
|
@@ -20277,6 +20695,7 @@ function useTraceUrlState(searchParams, setSearchParams, options) {
|
|
|
20277
20695
|
handleSpanClose,
|
|
20278
20696
|
handleSpanTabChange,
|
|
20279
20697
|
handleScoreChange,
|
|
20698
|
+
handleListModeChange,
|
|
20280
20699
|
handleFilterTokensChange,
|
|
20281
20700
|
handleDateChange,
|
|
20282
20701
|
handleDatePresetChange,
|
|
@@ -21050,6 +21469,10 @@ exports.LineHeights = tokens.LineHeights;
|
|
|
21050
21469
|
exports.Shadows = tokens.Shadows;
|
|
21051
21470
|
exports.Sizes = tokens.Sizes;
|
|
21052
21471
|
exports.Spacings = tokens.Spacings;
|
|
21472
|
+
Object.defineProperty(exports, "ComboboxPrimitive", {
|
|
21473
|
+
enumerable: true,
|
|
21474
|
+
get: () => combobox.Combobox
|
|
21475
|
+
});
|
|
21053
21476
|
exports.AddField = AddField;
|
|
21054
21477
|
exports.AgentCoinIcon = AgentCoinIcon;
|
|
21055
21478
|
exports.AgentIcon = AgentIcon;
|
|
@@ -21070,6 +21493,8 @@ exports.Breadcrumb = Breadcrumb;
|
|
|
21070
21493
|
exports.Button = Button;
|
|
21071
21494
|
exports.ButtonWithTooltip = ButtonWithTooltip;
|
|
21072
21495
|
exports.ButtonsGroup = ButtonsGroup;
|
|
21496
|
+
exports.ButtonsGroupSeparator = ButtonsGroupSeparator;
|
|
21497
|
+
exports.ButtonsGroupText = ButtonsGroupText;
|
|
21073
21498
|
exports.CHART_COLORS = CHART_COLORS;
|
|
21074
21499
|
exports.CONTEXT_FIELD_IDS = CONTEXT_FIELD_IDS;
|
|
21075
21500
|
exports.Card = Card;
|
|
@@ -21190,6 +21615,12 @@ exports.HoverPopover = HoverPopover;
|
|
|
21190
21615
|
exports.Icon = Icon;
|
|
21191
21616
|
exports.InfoIcon = InfoIcon;
|
|
21192
21617
|
exports.Input = Input;
|
|
21618
|
+
exports.InputGroup = InputGroup;
|
|
21619
|
+
exports.InputGroupAddon = InputGroupAddon;
|
|
21620
|
+
exports.InputGroupButton = InputGroupButton;
|
|
21621
|
+
exports.InputGroupInput = InputGroupInput;
|
|
21622
|
+
exports.InputGroupText = InputGroupText;
|
|
21623
|
+
exports.InputGroupTextarea = InputGroupTextarea;
|
|
21193
21624
|
exports.ItemList = ItemList;
|
|
21194
21625
|
exports.ItemListSkeleton = ItemListSkeleton;
|
|
21195
21626
|
exports.JSONSchemaForm = JSONSchemaForm;
|
|
@@ -21323,6 +21754,7 @@ exports.StackedRunsBars = StackedRunsBars;
|
|
|
21323
21754
|
exports.StatusBadge = StatusBadge;
|
|
21324
21755
|
exports.SubSectionRoot = SubSectionRoot;
|
|
21325
21756
|
exports.Switch = Switch;
|
|
21757
|
+
exports.TRACE_ANCHOR_SPAN_ID_PARAM = TRACE_ANCHOR_SPAN_ID_PARAM;
|
|
21326
21758
|
exports.TRACE_DATE_FROM_PARAM = TRACE_DATE_FROM_PARAM;
|
|
21327
21759
|
exports.TRACE_DATE_PRESET_PARAM = TRACE_DATE_PRESET_PARAM;
|
|
21328
21760
|
exports.TRACE_DATE_PRESET_VALUES = TRACE_DATE_PRESET_VALUES;
|
|
@@ -21349,11 +21781,6 @@ exports.Th = Th;
|
|
|
21349
21781
|
exports.Thead = Thead;
|
|
21350
21782
|
exports.ThemeProvider = ThemeProvider;
|
|
21351
21783
|
exports.ThemeToggle = ThemeToggle;
|
|
21352
|
-
exports.ThreadDeleteButton = ThreadDeleteButton;
|
|
21353
|
-
exports.ThreadItem = ThreadItem;
|
|
21354
|
-
exports.ThreadLink = ThreadLink;
|
|
21355
|
-
exports.ThreadList = ThreadList;
|
|
21356
|
-
exports.Threads = Threads;
|
|
21357
21784
|
exports.TimePicker = TimePicker;
|
|
21358
21785
|
exports.TimelineExpandCol = TimelineExpandCol;
|
|
21359
21786
|
exports.TimelineNameCol = TimelineNameCol;
|
|
@@ -21376,6 +21803,7 @@ exports.TraceTimelineSpan = TraceTimelineSpan;
|
|
|
21376
21803
|
exports.TracesDataList = TracesDataList;
|
|
21377
21804
|
exports.TracesErrorContent = TracesErrorContent;
|
|
21378
21805
|
exports.TracesLayout = TracesLayout;
|
|
21806
|
+
exports.TracesListModeToggle = TracesListModeToggle;
|
|
21379
21807
|
exports.TracesListView = TracesListView;
|
|
21380
21808
|
exports.TracesToolbar = TracesToolbar;
|
|
21381
21809
|
exports.TracesVolumeCardView = TracesVolumeCardView;
|
|
@@ -21398,6 +21826,7 @@ exports.buildMetricsDimensionalFilter = buildMetricsDimensionalFilter;
|
|
|
21398
21826
|
exports.buildTraceListFilters = buildTraceListFilters;
|
|
21399
21827
|
exports.buildTracesDrilldownUrl = buildTracesDrilldownUrl;
|
|
21400
21828
|
exports.buttonVariants = buttonVariants;
|
|
21829
|
+
exports.buttonsGroupVariants = buttonsGroupVariants;
|
|
21401
21830
|
exports.clearSavedLogsFilters = clearSavedLogsFilters;
|
|
21402
21831
|
exports.clearSavedMetricsFilters = clearSavedMetricsFilters;
|
|
21403
21832
|
exports.clearSavedTraceFilters = clearSavedTraceFilters;
|
|
@@ -21494,6 +21923,7 @@ exports.useActiveResourcesKpiMetrics = useActiveResourcesKpiMetrics;
|
|
|
21494
21923
|
exports.useActiveThreadsKpiMetrics = useActiveThreadsKpiMetrics;
|
|
21495
21924
|
exports.useAgentRunsKpiMetrics = useAgentRunsKpiMetrics;
|
|
21496
21925
|
exports.useAutoscroll = useAutoscroll;
|
|
21926
|
+
exports.useBranch = useBranch;
|
|
21497
21927
|
exports.useCodemirrorTheme = useCodemirrorTheme$3;
|
|
21498
21928
|
exports.useCopyToClipboard = useCopyToClipboard;
|
|
21499
21929
|
exports.useDrilldown = useDrilldown;
|
|
@@ -21528,6 +21958,7 @@ exports.useTotalTokensKpiMetrics = useTotalTokensKpiMetrics;
|
|
|
21528
21958
|
exports.useTraceFilterPersistence = useTraceFilterPersistence;
|
|
21529
21959
|
exports.useTraceLightSpans = useTraceLightSpans;
|
|
21530
21960
|
exports.useTraceListNavigation = useTraceListNavigation;
|
|
21961
|
+
exports.useTraceOrBranchSpans = useTraceOrBranchSpans;
|
|
21531
21962
|
exports.useTraceSpanNavigation = useTraceSpanNavigation;
|
|
21532
21963
|
exports.useTraceSpans = useTraceSpans;
|
|
21533
21964
|
exports.useTraceUrlState = useTraceUrlState;
|