@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.
Files changed (44) hide show
  1. package/CHANGELOG.md +642 -0
  2. package/dist/index.cjs.js +878 -447
  3. package/dist/index.cjs.js.map +1 -1
  4. package/dist/index.css +279 -88
  5. package/dist/index.es.js +864 -442
  6. package/dist/index.es.js.map +1 -1
  7. package/dist/src/domains/traces/components/format-hierarchical-spans.d.ts +7 -1
  8. package/dist/src/domains/traces/components/index.d.ts +1 -0
  9. package/dist/src/domains/traces/components/span-data-panel-view.d.ts +7 -1
  10. package/dist/src/domains/traces/components/trace-data-panel-view.d.ts +7 -1
  11. package/dist/src/domains/traces/components/traces-list-mode-toggle.d.ts +12 -0
  12. package/dist/src/domains/traces/components/traces-list-view.d.ts +8 -1
  13. package/dist/src/domains/traces/components/traces-toolbar.d.ts +5 -1
  14. package/dist/src/domains/traces/hooks/index.d.ts +2 -0
  15. package/dist/src/domains/traces/hooks/use-branch.d.ts +52 -0
  16. package/dist/src/domains/traces/hooks/use-trace-list-navigation.d.ts +7 -2
  17. package/dist/src/domains/traces/hooks/use-trace-or-branch-spans.d.ts +25 -0
  18. package/dist/src/domains/traces/hooks/use-trace-url-state.d.ts +12 -1
  19. package/dist/src/domains/traces/trace-filters.d.ts +3 -0
  20. package/dist/src/ds/components/Button/Button.d.ts +1 -1
  21. package/dist/src/ds/components/ButtonsGroup/buttons-group.d.ts +30 -5
  22. package/dist/src/ds/components/ButtonsGroup/buttons-group.stories.d.ts +5 -0
  23. package/dist/src/ds/components/Combobox/combobox-styles.d.ts +19 -11
  24. package/dist/src/ds/components/Combobox/combobox.d.ts +3 -3
  25. package/dist/src/ds/components/Combobox/combobox.stories.d.ts +1 -0
  26. package/dist/src/ds/components/Combobox/index.d.ts +1 -0
  27. package/dist/src/ds/components/Command/command.d.ts +1 -1
  28. package/dist/src/ds/components/Input/input.d.ts +2 -2
  29. package/dist/src/ds/components/InputGroup/index.d.ts +1 -0
  30. package/dist/src/ds/components/InputGroup/input-group.d.ts +44 -0
  31. package/dist/src/ds/components/InputGroup/input-group.stories.d.ts +17 -0
  32. package/dist/src/ds/components/PropertyFilter/property-filter-applied.d.ts +11 -1
  33. package/dist/src/ds/components/PropertyFilter/property-filter-creator.d.ts +7 -1
  34. package/dist/src/ds/components/ScrollArea/scroll-area.d.ts +28 -7
  35. package/dist/src/ds/components/ScrollArea/scroll-area.stories.d.ts +4 -0
  36. package/dist/src/ds/components/StatusBadge/StatusBadge.d.ts +1 -1
  37. package/dist/src/ds/components/Tabs/tabs-list.d.ts +8 -2
  38. package/dist/src/ds/components/Tabs/tabs.stories.d.ts +2 -0
  39. package/dist/src/ds/components/Textarea/textarea.d.ts +2 -2
  40. package/dist/src/index.d.ts +1 -1
  41. package/package.json +7 -8
  42. package/dist/src/ds/components/Threads/index.d.ts +0 -1
  43. package/dist/src/ds/components/Threads/threads.d.ts +0 -28
  44. 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 lucideReact = require('lucide-react');
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 RadixTabs = require('@radix-ui/react-tabs');
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 ScrollAreaPrimitive = require('@radix-ui/react-scroll-area');
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-surface4 hover:text-neutral6 active:bg-surface5 text-neutral4",
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 — form input look, sized to mirror SelectTrigger. */
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 border-border1 bg-transparent px-2.5 text-ui-smd leading-ui-sm text-neutral4",
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
- "hover:bg-surface3 hover:text-neutral6 hover:border-border2 active:bg-surface4",
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-[500px] rounded-xl border border-border1 bg-surface3 text-neutral4",
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-2", transitions.colors),
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-4 w-4 shrink-0 text-neutral3", transitions.colors),
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-6 text-center text-ui-smd text-neutral3",
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-lg (8px) sits concentrically inside rounded-xl + p-1. */
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.5 rounded-lg px-2 py-1.5",
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
- /** Option item with selected state (single select) — quiet emphasis, no accent fill. */
6132
- itemSelected: "data-selected:text-neutral6",
6133
- /** Check indicator container */
6134
- checkContainer: "flex h-4 w-4 shrink-0 items-center justify-center",
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: cn("h-4 w-4 text-neutral6", transitions.opacity),
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-sm border",
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
- combobox.Combobox.Item,
6217
- {
6218
- value: option,
6219
- className: cn(comboboxStyles.item, comboboxStyles.itemSelected),
6220
- children: [
6221
- /* @__PURE__ */ jsxRuntime.jsx("span", { className: comboboxStyles.checkContainer, children: /* @__PURE__ */ jsxRuntime.jsx(combobox.Combobox.ItemIndicator, { children: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.Check, { className: comboboxStyles.checkIcon }) }) }),
6222
- /* @__PURE__ */ jsxRuntime.jsxs("span", { className: comboboxStyles.optionContent, children: [
6223
- option.start,
6224
- /* @__PURE__ */ jsxRuntime.jsxs("span", { className: comboboxStyles.optionText, children: [
6225
- /* @__PURE__ */ jsxRuntime.jsx("span", { className: comboboxStyles.optionLabel, children: option.label }),
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.item, children: [
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
- const [internalTab, setInternalTab] = React.useState(defaultTab);
6568
- const isControlled = value !== void 0 && onValueChange !== void 0;
6569
- const currentTab = isControlled ? value : internalTab;
6570
- const handleTabChange = (newValue) => {
6571
- const typedValue = newValue;
6572
- if (isControlled) {
6573
- onValueChange(typedValue);
6574
- } else {
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 TabList = ({ children, className }) => {
6582
- return /* @__PURE__ */ jsxRuntime.jsx("div", { className: cn("w-full overflow-x-auto", className), children: /* @__PURE__ */ jsxRuntime.jsx(
6583
- RadixTabs__namespace.List,
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
- className: cn("flex items-center relative w-max min-w-full", "text-ui-lg border-b border-border1", className),
6586
- children
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
- RadixTabs__namespace.Trigger,
6597
+ tabs.Tabs.Tab,
6594
6598
  {
6595
6599
  value,
6596
6600
  disabled,
6597
6601
  className: cn(
6598
- "py-2 px-5 text-ui-md font-normal text-neutral3 border-b-2 border-transparent",
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-[state=active]:text-neutral5 data-[state=active]:border-neutral3",
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
- RadixTabs__namespace.Content,
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.jsxs("div", { className: "p-5 w-full overflow-x-hidden", children: [
6879
- /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "text-neutral6 flex items-center gap-2", children: [
6880
- /* @__PURE__ */ jsxRuntime.jsx(Icon, { size: "lg", className: "bg-surface4 rounded-md p-1", children: icon }),
6881
- isLoading ? /* @__PURE__ */ jsxRuntime.jsx(Skeleton, { className: "h-3 w-1/3" }) : /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex min-w-0 items-center gap-4", children: /* @__PURE__ */ jsxRuntime.jsx(Txt, { variant: "header-md", as: "h2", className: "truncate font-medium", children: title }) })
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 && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "pt-2", 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 PILL_CLASS = "inline-flex";
7756
- const SHARED_LABEL_OPERATOR_CLASSES = `${formElementSizes.md} border-y-2 border-border1 px-[.75em] text-neutral3 whitespace-nowrap flex items-center`;
7757
- const LABEL_CLASS = `${SHARED_LABEL_OPERATOR_CLASSES} text-ui-md rounded-l-lg border-l-2 border-r-1`;
7758
- const OPERATOR_CLASS = `${SHARED_LABEL_OPERATOR_CLASSES} text-ui-md `;
7759
- const REMOVE_CLASS = "rounded-tl-none rounded-bl-none border-l-transparent";
7760
- const INPUT_CLASS = "rounded-none";
7761
- const VALUE_BUTTON_CLASS = "rounded-none";
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("div", { className: PILL_CLASS, children: [
7772
- /* @__PURE__ */ jsxRuntime.jsx("span", { className: LABEL_CLASS, children: field.label }),
7773
- /* @__PURE__ */ jsxRuntime.jsx("span", { className: OPERATOR_CLASS, children: "is" }),
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("div", { className: PILL_CLASS, children: [
7819
- /* @__PURE__ */ jsxRuntime.jsx("span", { className: LABEL_CLASS, children: field.label }),
7820
- /* @__PURE__ */ jsxRuntime.jsx("span", { className: OPERATOR_CLASS, children: "is" }),
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("div", { className: PILL_CLASS, children: [
7902
- /* @__PURE__ */ jsxRuntime.jsx("span", { className: LABEL_CLASS, children: field.label }),
7903
- /* @__PURE__ */ jsxRuntime.jsx("span", { className: OPERATOR_CLASS, children: "is" }),
7904
- /* @__PURE__ */ jsxRuntime.jsx("span", { className: "px-2.5 py-1.5 max-w-[20rem] truncate", children: stringifyTokenValue(token.value) }),
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(() => fields.find((f) => f.id === fieldId), [fields, fieldId]);
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: fields.length > 0 ? fields.map((f) => {
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 useScrollOverflowAttrs(ref) {
8335
- React__namespace.useEffect(() => {
8336
- const el = ref.current;
8337
- if (!el) return;
8338
- const update = () => {
8339
- const { scrollTop, scrollLeft, scrollHeight, scrollWidth, clientHeight, clientWidth } = el;
8340
- el.toggleAttribute("data-overflow-y-start", scrollTop > 0);
8341
- el.toggleAttribute("data-overflow-y-end", scrollTop + clientHeight < scrollHeight - 1);
8342
- el.toggleAttribute("data-overflow-x-start", scrollLeft > 0);
8343
- el.toggleAttribute("data-overflow-x-end", scrollLeft + clientWidth < scrollWidth - 1);
8344
- };
8345
- update();
8346
- el.addEventListener("scroll", update, { passive: true });
8347
- const ro = new ResizeObserver(update);
8348
- ro.observe(el);
8349
- const inner = el.firstElementChild;
8350
- if (inner) ro.observe(inner);
8351
- return () => {
8352
- el.removeEventListener("scroll", update);
8353
- ro.disconnect();
8354
- };
8355
- }, [ref]);
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
- showMask = false,
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
- useScrollOverflowAttrs(areaRef);
8372
- return /* @__PURE__ */ jsxRuntime.jsxs(ScrollAreaPrimitive__namespace.Root, { ref, className: cn("relative overflow-hidden", className), ...props, children: [
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
- ScrollAreaPrimitive__namespace.Viewport,
8698
+ scrollArea.ScrollArea.Viewport,
8375
8699
  {
8376
8700
  ref: areaRef,
8377
- className: cn("h-full w-full rounded-[inherit] [&>div]:block!", showMask && MASK_CLASSES, viewPortClassName),
8378
- style: maxHeight ? { maxHeight } : void 0,
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(ScrollAreaPrimitive__namespace.Corner, {})
8708
+ orientation === "both" && /* @__PURE__ */ jsxRuntime.jsx(scrollArea.ScrollArea.Corner, {})
8385
8709
  ] });
8386
8710
  }
8387
8711
  );
8388
- ScrollArea.displayName = ScrollAreaPrimitive__namespace.Root.displayName;
8712
+ ScrollArea.displayName = "ScrollArea";
8389
8713
  const ScrollBar = React__namespace.forwardRef(({ className, orientation = "vertical", ...props }, ref) => /* @__PURE__ */ jsxRuntime.jsx(
8390
- ScrollAreaPrimitive__namespace.ScrollAreaScrollbar,
8714
+ scrollArea.ScrollArea.Scrollbar,
8391
8715
  {
8392
8716
  ref,
8393
8717
  orientation,
8394
8718
  className: cn(
8395
- "flex touch-none select-none transition-all duration-normal ease-out-custom",
8396
- "opacity-0 hover:opacity-100 data-[state=visible]:opacity-100",
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(ScrollAreaPrimitive__namespace.ScrollAreaThumb, { className: "relative flex-1 rounded-full bg-neutral4/30 hover:bg-neutral4/60 transition-colors duration-normal" })
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 = ScrollAreaPrimitive__namespace.ScrollAreaScrollbar.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, { showMask: true, className: "flex-1 min-h-0", children }) });
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 inset-y-0 -left-1 -right-1 flex items-center justify-center",
15665
- "cursor-col-resize touch-none"
15666
- ),
15667
- children: /* @__PURE__ */ jsxRuntime.jsx(
15668
- "span",
15669
- {
15670
- className: cn(
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?.parentSpanId == null) {
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 hasNonDefaultFilter = filterTokens.some((token) => isNonDefaultFilter$1(token, filterFields));
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(() => spans?.find((s) => s.parentSpanId == null), [spans]);
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, trace }));
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, trace });
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, trace });
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 = "traces"
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 = "traces" }) => {
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((t) => t.traceId === featuredTraceId) : -1,
20032
- [traces, featuredTraceId]
20415
+ () => featuredTraceId ? traces.findIndex(
20416
+ (t) => t.traceId === featuredTraceId && (featuredSpanId == null || t.spanId === featuredSpanId)
20417
+ ) : -1,
20418
+ [traces, featuredTraceId, featuredSpanId]
20033
20419
  );
20034
- const handlePreviousTrace = featuredTraceIdx > 0 ? () => onTraceChange(traces[featuredTraceIdx - 1].traceId) : void 0;
20035
- const handleNextTrace = featuredTraceIdx >= 0 && featuredTraceIdx < traces.length - 1 ? () => onTraceChange(traces[featuredTraceIdx + 1].traceId) : void 0;
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 : "traces";
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
- next.delete(SPAN_ID_PARAM);
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;