@xenosystem/blocks 0.11.2 → 0.11.4

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.
@@ -3038,270 +3038,7 @@ var InspectorPanelController = class {
3038
3038
 
3039
3039
  // src/edit/inspector/react/InspectorPanelView.tsx
3040
3040
  import { useCallback as useCallback3, useSyncExternalStore as useSyncExternalStore2 } from "react";
3041
-
3042
- // src/edit/inspector/react/styles.ts
3043
- var S2 = {
3044
- // ── Shell ──────────────────────────────────────────────────────────────────
3045
- root: {
3046
- display: "flex",
3047
- flexDirection: "column",
3048
- height: "100%",
3049
- minHeight: 0,
3050
- fontSize: 11,
3051
- color: "var(--xeno-text)",
3052
- background: "var(--xeno-canvas)"
3053
- },
3054
- header: {
3055
- display: "flex",
3056
- alignItems: "center",
3057
- gap: 6,
3058
- padding: "4px 6px",
3059
- background: "var(--xeno-panel-header)",
3060
- flex: "0 0 auto"
3061
- },
3062
- search: {
3063
- flex: "1 1 auto",
3064
- minWidth: 0,
3065
- height: 18,
3066
- background: "var(--xeno-canvas)",
3067
- color: "inherit",
3068
- border: "1px solid var(--xeno-border)",
3069
- borderRadius: 2,
3070
- fontSize: 11,
3071
- padding: "0 6px",
3072
- outline: "none"
3073
- },
3074
- targetChip: {
3075
- fontSize: 9,
3076
- color: "var(--xeno-muted)",
3077
- whiteSpace: "nowrap",
3078
- flex: "0 0 auto"
3079
- },
3080
- banner: {
3081
- padding: "3px 6px",
3082
- fontSize: 9,
3083
- color: "var(--xeno-muted)",
3084
- background: "var(--xeno-border-subtle)",
3085
- flex: "0 0 auto"
3086
- },
3087
- scroll: { flex: "1 1 auto", minHeight: 0, overflowY: "auto", overflowX: "hidden", outline: "none" },
3088
- empty: { padding: 12, fontSize: 10, opacity: 0.4, textTransform: "uppercase", letterSpacing: "0.08em" },
3089
- // ── Section ────────────────────────────────────────────────────────────────
3090
- sectionHeader: {
3091
- display: "flex",
3092
- alignItems: "center",
3093
- gap: 4,
3094
- height: 20,
3095
- padding: "0 6px",
3096
- background: "var(--xeno-border-subtle)",
3097
- cursor: "default",
3098
- userSelect: "none"
3099
- },
3100
- sectionTitle: {
3101
- fontSize: 9,
3102
- fontWeight: 600,
3103
- letterSpacing: "0.06em",
3104
- textTransform: "uppercase",
3105
- color: "var(--xeno-muted)",
3106
- flex: "1 1 auto",
3107
- minWidth: 0,
3108
- overflow: "hidden",
3109
- textOverflow: "ellipsis",
3110
- whiteSpace: "nowrap"
3111
- },
3112
- sectionBadge: {
3113
- fontSize: 8,
3114
- padding: "0 3px",
3115
- height: 12,
3116
- lineHeight: "12px",
3117
- borderRadius: 2,
3118
- background: "var(--xeno-border)",
3119
- color: "var(--xeno-muted)",
3120
- flex: "0 0 auto"
3121
- },
3122
- sectionBody: { padding: "3px 0" },
3123
- sectionBodyOff: { opacity: 0.4, pointerEvents: "none" },
3124
- emptyHint: { padding: "4px 8px", fontSize: 10, color: "var(--xeno-muted)" },
3125
- // ── Field row ──────────────────────────────────────────────────────────────
3126
- fieldRow: {
3127
- display: "flex",
3128
- alignItems: "center",
3129
- gap: 4,
3130
- minHeight: 20,
3131
- padding: "1px 6px",
3132
- boxSizing: "border-box"
3133
- },
3134
- fieldRowFocused: { background: "var(--xeno-border-subtle)" },
3135
- fieldLabel: {
3136
- fontSize: 10,
3137
- color: "var(--xeno-muted)",
3138
- flex: "0 0 auto",
3139
- overflow: "hidden",
3140
- textOverflow: "ellipsis",
3141
- whiteSpace: "nowrap"
3142
- },
3143
- fieldControl: { flex: "1 1 auto", minWidth: 0, display: "flex", alignItems: "center", gap: 3 },
3144
- description: { fontSize: 9, color: "var(--xeno-muted)", opacity: 0.8, padding: "0 6px 3px" },
3145
- // ── Inputs ─────────────────────────────────────────────────────────────────
3146
- input: {
3147
- width: "100%",
3148
- minWidth: 0,
3149
- height: 18,
3150
- background: "var(--xeno-canvas)",
3151
- color: "inherit",
3152
- border: "1px solid var(--xeno-border)",
3153
- borderRadius: 2,
3154
- fontSize: 11,
3155
- padding: "0 4px",
3156
- outline: "none",
3157
- fontVariantNumeric: "tabular-nums",
3158
- boxSizing: "border-box"
3159
- },
3160
- mixedInput: { fontStyle: "italic", color: "var(--xeno-muted)" },
3161
- readOnlyInput: { background: "transparent", border: "1px solid transparent", cursor: "default" },
3162
- textarea: { height: "auto", minHeight: 34, padding: "3px 4px", resize: "vertical", lineHeight: 1.4 },
3163
- mono: { fontFamily: "var(--xeno-font-mono)", fontSize: 10 },
3164
- numberCell: { display: "flex", alignItems: "center", gap: 2, flex: "1 1 0", minWidth: 0, position: "relative" },
3165
- axisLabel: {
3166
- fontSize: 9,
3167
- color: "var(--xeno-muted)",
3168
- width: 9,
3169
- textAlign: "center",
3170
- flex: "0 0 auto",
3171
- userSelect: "none"
3172
- },
3173
- sliderTrack: {
3174
- position: "absolute",
3175
- left: 0,
3176
- right: 0,
3177
- bottom: 0,
3178
- height: 1,
3179
- background: "var(--xeno-border)",
3180
- pointerEvents: "none"
3181
- },
3182
- sliderFill: { display: "block", height: "100%", background: "var(--xeno-active)" },
3183
- vectorRow: { display: "flex", alignItems: "center", gap: 3, flex: "1 1 auto", minWidth: 0 },
3184
- // ── Toggle (rectangle track + square knob) ─────────────────────────────────
3185
- toggleTrack: {
3186
- width: 22,
3187
- height: 12,
3188
- borderRadius: 2,
3189
- border: "none",
3190
- padding: 1,
3191
- cursor: "pointer",
3192
- flex: "0 0 auto",
3193
- display: "flex",
3194
- alignItems: "center"
3195
- },
3196
- toggleKnob: {
3197
- width: 10,
3198
- height: 10,
3199
- background: "var(--xeno-text)",
3200
- display: "block",
3201
- transition: "transform 80ms ease, border-radius 80ms ease"
3202
- },
3203
- // ── Segmented ──────────────────────────────────────────────────────────────
3204
- segmented: { display: "flex", gap: 1, flex: "1 1 auto", minWidth: 0 },
3205
- segment: {
3206
- flex: "1 1 0",
3207
- minWidth: 0,
3208
- height: 18,
3209
- background: "var(--xeno-border-subtle)",
3210
- color: "inherit",
3211
- border: "none",
3212
- borderRadius: 2,
3213
- fontSize: 10,
3214
- cursor: "pointer",
3215
- padding: "0 4px",
3216
- overflow: "hidden",
3217
- textOverflow: "ellipsis",
3218
- whiteSpace: "nowrap"
3219
- },
3220
- segmentActive: { background: "var(--xeno-control)" },
3221
- // ── Color ──────────────────────────────────────────────────────────────────
3222
- colorCell: {
3223
- display: "flex",
3224
- alignItems: "center",
3225
- gap: 4,
3226
- flex: "1 1 auto",
3227
- minWidth: 0,
3228
- height: 18,
3229
- background: "var(--xeno-canvas)",
3230
- border: "1px solid var(--xeno-border)",
3231
- borderRadius: 2,
3232
- padding: "0 4px",
3233
- color: "inherit",
3234
- cursor: "pointer"
3235
- },
3236
- swatch: { width: 10, height: 10, borderRadius: 2, flex: "0 0 auto" },
3237
- colorText: { fontSize: 10, fontVariantNumeric: "tabular-nums", overflow: "hidden", textOverflow: "ellipsis" },
3238
- // ── List ───────────────────────────────────────────────────────────────────
3239
- list: { display: "flex", flexDirection: "column", gap: 2, flex: "1 1 auto", minWidth: 0 },
3240
- listRow: { display: "flex", alignItems: "center", gap: 2 },
3241
- listLabel: { flex: "1 1 auto", minWidth: 0, overflow: "hidden", textOverflow: "ellipsis", whiteSpace: "nowrap", fontSize: 10 },
3242
- infoValue: { fontSize: 10, color: "var(--xeno-text)", overflow: "hidden", textOverflow: "ellipsis" },
3243
- // ── Chrome ─────────────────────────────────────────────────────────────────
3244
- iconBtn: {
3245
- display: "flex",
3246
- alignItems: "center",
3247
- justifyContent: "center",
3248
- width: 14,
3249
- height: 14,
3250
- padding: 0,
3251
- border: "none",
3252
- borderRadius: 2,
3253
- background: "transparent",
3254
- color: "inherit",
3255
- cursor: "pointer",
3256
- flex: "0 0 auto"
3257
- },
3258
- miniBtn: {
3259
- width: 14,
3260
- height: 14,
3261
- padding: 0,
3262
- border: "none",
3263
- borderRadius: 2,
3264
- background: "var(--xeno-border-subtle)",
3265
- color: "inherit",
3266
- cursor: "pointer",
3267
- fontSize: 9,
3268
- flex: "0 0 auto"
3269
- },
3270
- textBtn: {
3271
- background: "transparent",
3272
- border: "none",
3273
- color: "var(--xeno-muted)",
3274
- cursor: "pointer",
3275
- fontSize: 10,
3276
- padding: 0,
3277
- textAlign: "left"
3278
- },
3279
- chip: {
3280
- fontSize: 8,
3281
- padding: "0 3px",
3282
- height: 12,
3283
- lineHeight: "12px",
3284
- borderRadius: 2,
3285
- background: "var(--xeno-border-subtle)",
3286
- color: "var(--xeno-muted)",
3287
- flex: "0 0 auto"
3288
- },
3289
- tokenChip: {
3290
- fontSize: 9,
3291
- padding: "0 4px",
3292
- height: 16,
3293
- lineHeight: "16px",
3294
- borderRadius: 2,
3295
- background: "var(--xeno-border)",
3296
- color: "inherit",
3297
- flex: "1 1 auto",
3298
- minWidth: 0,
3299
- overflow: "hidden",
3300
- textOverflow: "ellipsis",
3301
- whiteSpace: "nowrap"
3302
- },
3303
- keyframeRow: { display: "flex", alignItems: "center", gap: 1, flex: "0 0 auto" }
3304
- };
3041
+ import { Badge, Column, EmptyState, Field, FieldGroup, IconButton as IconButton2, ScrollArea, SearchField, Section, Select as Select2, Stack as Stack2, Text as Text2 } from "@xenosystem/components/chrome";
3305
3042
 
3306
3043
  // src/edit/inspector/react/icons.tsx
3307
3044
  import { jsx as jsx4, jsxs as jsxs3 } from "react/jsx-runtime";
@@ -3316,9 +3053,6 @@ var base2 = (size) => ({
3316
3053
  strokeLinejoin: "round",
3317
3054
  "aria-hidden": true
3318
3055
  });
3319
- function ChevronIcon2({ size = 11 }) {
3320
- return /* @__PURE__ */ jsx4("svg", { ...base2(size), children: /* @__PURE__ */ jsx4("path", { d: "m9 18 6-6-6-6" }) });
3321
- }
3322
3056
  function StopwatchIcon({ size = 11 }) {
3323
3057
  return /* @__PURE__ */ jsxs3("svg", { ...base2(size), children: [
3324
3058
  /* @__PURE__ */ jsx4("path", { d: "M10 2h4" }),
@@ -3687,243 +3421,81 @@ function InspectorPanelView({ controller }) {
3687
3421
  );
3688
3422
  const multi = targets.length > 1;
3689
3423
  const blocked = multi && !controller.canEditTargets();
3690
- return /* @__PURE__ */ jsxs5("div", { style: S2.root, className: "xeno-inspector-panel", children: [
3691
- controller.isSearchShown() && /* @__PURE__ */ jsxs5("div", { style: S2.header, children: [
3692
- /* @__PURE__ */ jsx6(
3693
- "input",
3694
- {
3695
- type: "search",
3696
- value: controller.getFilter(),
3697
- placeholder: "Search properties",
3698
- onChange: (e) => controller.setFilter(e.target.value),
3699
- style: S2.search,
3700
- "aria-label": "Search properties",
3701
- spellCheck: false
3702
- }
3703
- ),
3704
- targets.length > 0 && /* @__PURE__ */ jsx6("span", { style: S2.targetChip, children: multi ? `${targets.length} selected` : targets[0]?.label ?? targets[0]?.id })
3705
- ] }),
3706
- multi && /* @__PURE__ */ jsx6("div", { style: S2.banner, children: blocked ? `${targets.length} selected \u2014 multi-editing is disabled` : `${targets.length} selected \xB7 shared values shown` }),
3707
- /* @__PURE__ */ jsxs5("div", { style: S2.scroll, onKeyDown, tabIndex: 0, role: "group", "aria-label": "Properties", children: [
3424
+ return /* @__PURE__ */ jsxs5(Column, { className: "xeno-inspector-panel", children: [
3425
+ controller.isSearchShown() ? /* @__PURE__ */ jsxs5(Stack2, { direction: "row", gap: 6, children: [
3426
+ /* @__PURE__ */ jsx6(SearchField, { value: controller.getFilter(), onChange: (v) => controller.setFilter(v), placeholder: "Search properties", label: "Search properties" }),
3427
+ targets.length > 0 ? /* @__PURE__ */ jsx6(Badge, { children: multi ? `${targets.length} selected` : targets[0]?.label ?? targets[0]?.id }) : null
3428
+ ] }) : null,
3429
+ multi ? /* @__PURE__ */ jsx6(Stack2, { pad: "inset", children: /* @__PURE__ */ jsx6(Text2, { role: "caption", children: blocked ? `${targets.length} selected \u2014 multi-editing is disabled` : `${targets.length} selected \xB7 shared values shown` }) }) : null,
3430
+ /* @__PURE__ */ jsx6(ScrollArea, { children: /* @__PURE__ */ jsxs5("div", { onKeyDown, tabIndex: 0, role: "group", "aria-label": "Properties", className: "xeno-inspector-properties", children: [
3708
3431
  sections.map((projected) => /* @__PURE__ */ jsx6(SectionView, { projected, controller }, projected.section.id)),
3709
- sections.length === 0 && /* @__PURE__ */ jsx6("div", { style: S2.empty, children: targets.length === 0 ? "Nothing selected" : "No properties" })
3710
- ] })
3432
+ sections.length === 0 ? /* @__PURE__ */ jsx6(EmptyState, { title: targets.length === 0 ? "Nothing selected" : "No properties" }) : null
3433
+ ] }) })
3711
3434
  ] });
3712
3435
  }
3713
- function SectionView({
3714
- projected,
3715
- controller
3716
- }) {
3717
- const { section, fields, collapsed, disabledByToggle, empty } = projected;
3718
- return /* @__PURE__ */ jsxs5("div", { children: [
3719
- /* @__PURE__ */ jsxs5("div", { style: S2.sectionHeader, children: [
3720
- section.collapsible && /* @__PURE__ */ jsx6(
3721
- "button",
3722
- {
3723
- type: "button",
3724
- style: { ...S2.iconBtn, transform: collapsed ? "none" : "rotate(90deg)" },
3725
- onClick: () => controller.toggleSectionCollapsed(section.id),
3726
- "aria-label": collapsed ? "Expand section" : "Collapse section",
3727
- "aria-expanded": !collapsed,
3728
- children: /* @__PURE__ */ jsx6(ChevronIcon2, {})
3729
- }
3730
- ),
3731
- section.enabled && /* @__PURE__ */ jsx6(
3732
- "button",
3733
- {
3734
- type: "button",
3735
- role: "switch",
3736
- "aria-checked": section.enabled.value,
3737
- "aria-label": `${section.title} enabled`,
3738
- onClick: () => controller.toggleSectionEnabled(section.id),
3739
- style: {
3740
- ...S2.toggleTrack,
3741
- width: 16,
3742
- height: 10,
3743
- background: section.enabled.value ? "var(--xeno-active)" : "var(--xeno-border)"
3744
- },
3745
- children: /* @__PURE__ */ jsx6(
3746
- "span",
3747
- {
3748
- style: {
3749
- ...S2.toggleKnob,
3750
- width: 8,
3751
- height: 8,
3752
- transform: section.enabled.value ? "translateX(6px)" : "translateX(0)"
3753
- }
3754
- }
3755
- )
3756
- }
3757
- ),
3758
- /* @__PURE__ */ jsx6("span", { style: S2.sectionTitle, children: section.title }),
3759
- section.badge && /* @__PURE__ */ jsx6("span", { style: S2.sectionBadge, children: section.badge }),
3760
- section.actions?.map((action) => /* @__PURE__ */ jsx6(
3761
- "button",
3762
- {
3763
- type: "button",
3764
- style: S2.miniBtn,
3765
- disabled: action.disabled,
3766
- onClick: () => controller.runAction(section.id, action.id),
3767
- title: action.label,
3768
- "aria-label": action.label,
3769
- children: action.label.slice(0, 1)
3770
- },
3771
- action.id
3772
- )),
3773
- section.addMenu && section.addMenu.length > 0 && /* @__PURE__ */ jsx6(AddMenu, { section, controller })
3774
- ] }),
3775
- !collapsed && /* @__PURE__ */ jsxs5("div", { style: { ...S2.sectionBody, ...disabledByToggle ? S2.sectionBodyOff : null }, children: [
3776
- empty && section.emptyHint && /* @__PURE__ */ jsx6("div", { style: S2.emptyHint, children: section.emptyHint }),
3777
- fields.map((field) => /* @__PURE__ */ jsx6(FieldRow, { field, controller }, field.id))
3778
- ] })
3779
- ] });
3780
- }
3781
- function AddMenu({
3782
- section,
3783
- controller
3784
- }) {
3436
+ function SectionView({ projected, controller }) {
3437
+ const { section, fields, collapsed, empty } = projected;
3785
3438
  return /* @__PURE__ */ jsxs5(
3786
- "select",
3439
+ Section,
3787
3440
  {
3788
- value: "",
3789
- onChange: (e) => {
3790
- if (e.target.value) controller.addItem(section.id, e.target.value);
3791
- },
3792
- style: { ...S2.miniBtn, width: "auto" },
3793
- "aria-label": `Add to ${section.title}`,
3794
- title: "Add",
3441
+ title: section.title,
3442
+ flush: true,
3443
+ collapsible: section.collapsible,
3444
+ collapsed,
3445
+ onCollapsedChange: () => controller.toggleSectionCollapsed(section.id),
3446
+ enabled: section.enabled?.value,
3447
+ onEnabledChange: section.enabled ? () => controller.toggleSectionEnabled(section.id) : void 0,
3448
+ badge: section.badge ? /* @__PURE__ */ jsx6(Badge, { children: section.badge }) : null,
3449
+ actions: /* @__PURE__ */ jsxs5(Fragment2, { children: [
3450
+ section.actions?.map((action) => /* @__PURE__ */ jsx6(IconButton2, { size: "sm", icon: /* @__PURE__ */ jsx6("span", { "aria-hidden": true, children: action.label.slice(0, 1) }), label: action.label, disabled: action.disabled, onClick: () => controller.runAction(section.id, action.id) }, action.id)),
3451
+ section.addMenu && section.addMenu.length > 0 ? /* @__PURE__ */ jsx6(AddMenu, { section, controller }) : null
3452
+ ] }),
3795
3453
  children: [
3796
- /* @__PURE__ */ jsx6("option", { value: "", children: "\uFF0B" }),
3797
- Object.entries(
3798
- (section.addMenu ?? []).reduce((groups, item) => {
3799
- const key = item.group ?? "";
3800
- (groups[key] ??= []).push(item);
3801
- return groups;
3802
- }, {})
3803
- ).map(
3804
- ([group, items]) => group ? /* @__PURE__ */ jsx6("optgroup", { label: group, children: (items ?? []).map((i) => /* @__PURE__ */ jsx6("option", { value: i.id, disabled: i.disabled, children: i.label }, i.id)) }, group) : (items ?? []).map((i) => /* @__PURE__ */ jsx6("option", { value: i.id, disabled: i.disabled, children: i.label }, i.id))
3805
- )
3454
+ empty && section.emptyHint ? /* @__PURE__ */ jsx6(Stack2, { pad: "inset", children: /* @__PURE__ */ jsx6(Text2, { role: "caption", children: section.emptyHint }) }) : null,
3455
+ /* @__PURE__ */ jsx6(FieldGroup, { labelWidth: controller.getLabelWidth(), children: fields.map((field) => /* @__PURE__ */ jsx6(FieldRow, { field, controller }, field.id)) })
3806
3456
  ]
3807
3457
  }
3808
3458
  );
3809
3459
  }
3810
- function FieldRow({
3811
- field,
3812
- controller
3813
- }) {
3460
+ function AddMenu({ section, controller }) {
3461
+ const options = (section.addMenu ?? []).map((i) => ({ value: i.id, label: i.label, disabled: i.disabled, group: i.group }));
3462
+ return /* @__PURE__ */ jsx6(Select2, { size: "sm", placeholder: "\uFF0B", options, value: "", label: `Add to ${section.title}`, onChange: (id) => controller.addItem(section.id, id) });
3463
+ }
3464
+ function FieldRow({ field, controller }) {
3814
3465
  const focused = controller.getFocused() === field.id;
3815
3466
  const bound = !!field.token?.tokenId;
3816
3467
  const anim = field.anim;
3817
3468
  const showKeyframes = controller.areKeyframesShown() && !!anim;
3469
+ const easingOptions = anim?.easingOptions ?? [];
3470
+ const easing = anim?.easing ?? "";
3471
+ const easingAll = easingOptions.some((o) => o.value === easing) ? easingOptions : [{ value: easing, label: easing || "\u2014" }, ...easingOptions];
3818
3472
  return /* @__PURE__ */ jsxs5(Fragment2, { children: [
3819
- /* @__PURE__ */ jsxs5(
3820
- "div",
3473
+ /* @__PURE__ */ jsx6(
3474
+ Field,
3821
3475
  {
3822
- style: { ...S2.fieldRow, ...focused ? S2.fieldRowFocused : null },
3823
- onContextMenu: (e) => {
3824
- e.preventDefault();
3825
- controller.requestContextMenu(field.id, e.clientX, e.clientY);
3826
- },
3827
- children: [
3828
- showKeyframes && /* @__PURE__ */ jsxs5("span", { style: S2.keyframeRow, children: [
3829
- /* @__PURE__ */ jsx6(
3830
- "button",
3831
- {
3832
- type: "button",
3833
- style: { ...S2.iconBtn, opacity: anim.animated ? 0.9 : 0.35 },
3834
- onClick: () => controller.keyframe(field.id, "toggleAnim"),
3835
- title: anim.animated ? "Disable animation" : "Animate this property",
3836
- "aria-label": "Toggle animation",
3837
- "aria-pressed": anim.animated,
3838
- children: /* @__PURE__ */ jsx6(StopwatchIcon, {})
3839
- }
3840
- ),
3841
- anim.animated && /* @__PURE__ */ jsxs5(Fragment2, { children: [
3842
- /* @__PURE__ */ jsx6(
3843
- "button",
3844
- {
3845
- type: "button",
3846
- style: { ...S2.iconBtn, width: 11, opacity: anim.canPrev === false ? 0.3 : 0.8 },
3847
- disabled: anim.canPrev === false,
3848
- onClick: () => controller.keyframe(field.id, "prev"),
3849
- "aria-label": "Previous keyframe",
3850
- children: /* @__PURE__ */ jsx6(PrevIcon, {})
3851
- }
3852
- ),
3853
- /* @__PURE__ */ jsx6(
3854
- "button",
3855
- {
3856
- type: "button",
3857
- style: S2.iconBtn,
3858
- onClick: () => controller.keyframe(field.id, anim.onKeyframe ? "remove" : "add"),
3859
- title: anim.onKeyframe ? "Remove keyframe" : "Add keyframe",
3860
- "aria-label": anim.onKeyframe ? "Remove keyframe" : "Add keyframe",
3861
- children: /* @__PURE__ */ jsx6(DiamondIcon, { filled: !!anim.onKeyframe })
3862
- }
3863
- ),
3864
- /* @__PURE__ */ jsx6(
3865
- "button",
3866
- {
3867
- type: "button",
3868
- style: { ...S2.iconBtn, width: 11, opacity: anim.canNext === false ? 0.3 : 0.8 },
3869
- disabled: anim.canNext === false,
3870
- onClick: () => controller.keyframe(field.id, "next"),
3871
- "aria-label": "Next keyframe",
3872
- children: /* @__PURE__ */ jsx6(NextIcon, {})
3873
- }
3874
- )
3875
- ] })
3876
- ] }),
3877
- /* @__PURE__ */ jsx6(
3878
- "span",
3879
- {
3880
- style: { ...S2.fieldLabel, width: controller.getLabelWidth() },
3881
- onClick: () => controller.focusField(field.id),
3882
- title: field.description ?? field.label,
3883
- children: field.label
3884
- }
3885
- ),
3886
- /* @__PURE__ */ jsx6("span", { style: S2.fieldControl, children: bound ? /* @__PURE__ */ jsx6("span", { style: S2.tokenChip, title: `Bound to ${field.token?.tokenName ?? field.token?.tokenId}`, children: field.token?.tokenName ?? field.token?.tokenId }) : /* @__PURE__ */ jsx6(FieldWidget, { field, controller }) }),
3887
- showKeyframes && anim.animated && anim.onKeyframe && /* @__PURE__ */ jsxs5(
3888
- "select",
3889
- {
3890
- value: anim.easing ?? "",
3891
- onChange: (e) => controller.keyframe(field.id, "setEasing", e.target.value),
3892
- style: { ...S2.miniBtn, width: "auto" },
3893
- "aria-label": "Easing",
3894
- children: [
3895
- !anim.easingOptions?.some((o) => o.value === (anim.easing ?? "")) && /* @__PURE__ */ jsx6("option", { value: anim.easing ?? "", children: anim.easing || "\u2014" }),
3896
- (anim.easingOptions ?? []).map((o) => /* @__PURE__ */ jsx6("option", { value: o.value, children: o.label }, o.value))
3897
- ]
3898
- }
3899
- ),
3900
- showKeyframes && /* @__PURE__ */ jsx6("span", { style: S2.chip, children: controller.keyframeChip(field.id) }),
3901
- controller.areTokensShown() && field.token?.bindable !== false && /* @__PURE__ */ jsx6(
3902
- "button",
3903
- {
3904
- type: "button",
3905
- style: { ...S2.iconBtn, opacity: bound ? 0.9 : 0.4 },
3906
- onClick: () => controller.bindToken(field.id, bound ? null : controller.getTokens()[0]?.id ?? null),
3907
- title: bound ? "Unbind token" : "Bind a design token",
3908
- "aria-label": bound ? "Unbind token" : "Bind token",
3909
- children: /* @__PURE__ */ jsx6(LinkIcon, {})
3910
- }
3911
- ),
3912
- field.defaultValue !== void 0 && isFieldEditable(field) && /* @__PURE__ */ jsx6(
3913
- "button",
3914
- {
3915
- type: "button",
3916
- style: { ...S2.iconBtn, opacity: 0.35 },
3917
- onClick: () => controller.resetField(field.id),
3918
- title: "Reset to default",
3919
- "aria-label": "Reset to default",
3920
- children: /* @__PURE__ */ jsx6(ResetIcon, {})
3921
- }
3922
- )
3923
- ]
3476
+ label: field.label,
3477
+ title: field.description ?? field.label,
3478
+ focused,
3479
+ onLabelClick: () => controller.focusField(field.id),
3480
+ onContextMenu: (x, y) => controller.requestContextMenu(field.id, x, y),
3481
+ leading: showKeyframes ? /* @__PURE__ */ jsxs5(Fragment2, { children: [
3482
+ /* @__PURE__ */ jsx6(IconButton2, { size: "sm", icon: /* @__PURE__ */ jsx6(StopwatchIcon, {}), label: "Toggle animation", active: anim.animated, onClick: () => controller.keyframe(field.id, "toggleAnim") }),
3483
+ anim.animated ? /* @__PURE__ */ jsxs5(Fragment2, { children: [
3484
+ /* @__PURE__ */ jsx6(IconButton2, { size: "sm", icon: /* @__PURE__ */ jsx6(PrevIcon, {}), label: "Previous keyframe", disabled: anim.canPrev === false, onClick: () => controller.keyframe(field.id, "prev") }),
3485
+ /* @__PURE__ */ jsx6(IconButton2, { size: "sm", icon: /* @__PURE__ */ jsx6(DiamondIcon, { filled: !!anim.onKeyframe }), label: anim.onKeyframe ? "Remove keyframe" : "Add keyframe", onClick: () => controller.keyframe(field.id, anim.onKeyframe ? "remove" : "add") }),
3486
+ /* @__PURE__ */ jsx6(IconButton2, { size: "sm", icon: /* @__PURE__ */ jsx6(NextIcon, {}), label: "Next keyframe", disabled: anim.canNext === false, onClick: () => controller.keyframe(field.id, "next") })
3487
+ ] }) : null
3488
+ ] }) : null,
3489
+ trailing: /* @__PURE__ */ jsxs5(Fragment2, { children: [
3490
+ showKeyframes && anim.animated && anim.onKeyframe ? /* @__PURE__ */ jsx6(Select2, { size: "sm", options: easingAll, value: easing, label: "Easing", onChange: (v) => controller.keyframe(field.id, "setEasing", v) }) : null,
3491
+ showKeyframes ? /* @__PURE__ */ jsx6(Badge, { size: "sm", children: controller.keyframeChip(field.id) }) : null,
3492
+ controller.areTokensShown() && field.token?.bindable !== false ? /* @__PURE__ */ jsx6(IconButton2, { size: "sm", icon: /* @__PURE__ */ jsx6(LinkIcon, {}), label: bound ? "Unbind token" : "Bind token", active: bound, onClick: () => controller.bindToken(field.id, bound ? null : controller.getTokens()[0]?.id ?? null) }) : null,
3493
+ field.defaultValue !== void 0 && isFieldEditable(field) ? /* @__PURE__ */ jsx6(IconButton2, { size: "sm", icon: /* @__PURE__ */ jsx6(ResetIcon, {}), label: "Reset to default", onClick: () => controller.resetField(field.id) }) : null
3494
+ ] }),
3495
+ children: bound ? /* @__PURE__ */ jsx6(Badge, { title: `Bound to ${field.token?.tokenName ?? field.token?.tokenId}`, children: field.token?.tokenName ?? field.token?.tokenId }) : /* @__PURE__ */ jsx6(FieldWidget, { field, controller })
3924
3496
  }
3925
3497
  ),
3926
- field.description && field.type === "info" && /* @__PURE__ */ jsx6("div", { style: S2.description, children: field.description })
3498
+ field.description && field.type === "info" ? /* @__PURE__ */ jsx6(Stack2, { pad: "inset", children: /* @__PURE__ */ jsx6(Text2, { role: "caption", children: field.description }) }) : null
3927
3499
  ] });
3928
3500
  }
3929
3501
  function FieldWidget({
@@ -4911,6 +4483,7 @@ var HistoryPanelController = class {
4911
4483
 
4912
4484
  // src/edit/history/react/HistoryPanelView.tsx
4913
4485
  import { useCallback as useCallback4, useEffect as useEffect3, useRef as useRef4, useSyncExternalStore as useSyncExternalStore3 } from "react";
4486
+ import { Badge as Badge2, Column as Column2, EmptyState as EmptyState2, IconButton as IconButton3, InlineConfirm, RowList, Row, ScrollArea as ScrollArea2, SearchField as SearchField2, StatusBar, Text as Text3, Toolbar, VirtualWindow } from "@xenosystem/components/chrome";
4914
4487
 
4915
4488
  // src/edit/history/react/icons.tsx
4916
4489
  import { jsx as jsx7, jsxs as jsxs6 } from "react/jsx-runtime";
@@ -5006,7 +4579,7 @@ function PendingGlyph({ size = 9 }) {
5006
4579
  }
5007
4580
 
5008
4581
  // src/edit/history/react/HistoryPanelView.tsx
5009
- import { jsx as jsx8, jsxs as jsxs7 } from "react/jsx-runtime";
4582
+ import { Fragment as Fragment3, jsx as jsx8, jsxs as jsxs7 } from "react/jsx-runtime";
5010
4583
  function HistoryPanelView({ controller }) {
5011
4584
  const subscribe = useCallback4((cb) => controller.subscribe(cb), [controller]);
5012
4585
  const getSnapshot = useCallback4(() => controller.getRevision(), [controller]);
@@ -5055,106 +4628,54 @@ function HistoryPanelView({ controller }) {
5055
4628
  },
5056
4629
  [controller]
5057
4630
  );
5058
- return /* @__PURE__ */ jsxs7("div", { style: S3.root, className: "xeno-history-panel", children: [
5059
- /* @__PURE__ */ jsxs7("div", { style: S3.header, children: [
5060
- /* @__PURE__ */ jsx8(
5061
- "button",
5062
- {
5063
- type: "button",
5064
- style: { ...S3.iconBtn, opacity: controller.canUndo() ? 0.8 : 0.25 },
5065
- disabled: !controller.canUndo(),
5066
- onClick: () => controller.undo(),
5067
- title: "Undo",
5068
- "aria-label": "Undo",
5069
- children: /* @__PURE__ */ jsx8(UndoIcon, {})
5070
- }
5071
- ),
5072
- /* @__PURE__ */ jsx8(
5073
- "button",
5074
- {
5075
- type: "button",
5076
- style: { ...S3.iconBtn, opacity: controller.canRedo() ? 0.8 : 0.25 },
5077
- disabled: !controller.canRedo(),
5078
- onClick: () => controller.redo(),
5079
- title: "Redo",
5080
- "aria-label": "Redo",
5081
- children: /* @__PURE__ */ jsx8(RedoIcon, {})
5082
- }
5083
- ),
5084
- controller.isSearchShown() && /* @__PURE__ */ jsx8(
5085
- "input",
5086
- {
5087
- type: "search",
5088
- value: controller.getFilter(),
5089
- placeholder: "Search history",
5090
- onChange: (e) => controller.setFilter(e.target.value),
5091
- style: S3.search,
5092
- "aria-label": "Search history",
5093
- spellCheck: false
5094
- }
5095
- ),
5096
- /* @__PURE__ */ jsxs7("span", { style: S3.counter, children: [
5097
- controller.getAppliedCount(),
5098
- " / ",
5099
- controller.getTotalCount()
5100
- ] }),
5101
- controller.isClearAllowed() && /* @__PURE__ */ jsx8(
5102
- "button",
4631
+ return /* @__PURE__ */ jsxs7(Column2, { className: "xeno-history-panel", children: [
4632
+ /* @__PURE__ */ jsx8(
4633
+ Toolbar,
4634
+ {
4635
+ left: /* @__PURE__ */ jsxs7(Fragment3, { children: [
4636
+ /* @__PURE__ */ jsx8(IconButton3, { size: "sm", icon: /* @__PURE__ */ jsx8(UndoIcon, {}), label: "Undo", disabled: !controller.canUndo(), onClick: () => controller.undo() }),
4637
+ /* @__PURE__ */ jsx8(IconButton3, { size: "sm", icon: /* @__PURE__ */ jsx8(RedoIcon, {}), label: "Redo", disabled: !controller.canRedo(), onClick: () => controller.redo() })
4638
+ ] }),
4639
+ right: /* @__PURE__ */ jsxs7(Fragment3, { children: [
4640
+ /* @__PURE__ */ jsxs7(Text3, { role: "number", children: [
4641
+ controller.getAppliedCount(),
4642
+ " / ",
4643
+ controller.getTotalCount()
4644
+ ] }),
4645
+ controller.isClearAllowed() ? /* @__PURE__ */ jsx8(IconButton3, { size: "sm", icon: /* @__PURE__ */ jsx8(TrashIcon, {}), label: "Clear history", onClick: () => controller.requestClear() }) : null
4646
+ ] }),
4647
+ children: controller.isSearchShown() ? /* @__PURE__ */ jsx8(SearchField2, { value: controller.getFilter(), onChange: (v) => controller.setFilter(v), placeholder: "Search history", label: "Search history" }) : null
4648
+ }
4649
+ ),
4650
+ controller.isConfirmingClear() ? /* @__PURE__ */ jsx8(InlineConfirm, { message: "Clear all history?", label: "Confirm clear history", confirmLabel: "Clear", onConfirm: () => controller.confirmClearNow(), onCancel: () => controller.cancelClear() }) : null,
4651
+ controller.isPruned() ? /* @__PURE__ */ jsx8(Text3, { role: "caption", children: "Earlier history discarded (limit reached)" }) : null,
4652
+ /* @__PURE__ */ jsxs7(ScrollArea2, { ref: scrollRef, onScroll, onKeyDown, onMouseLeave: () => controller.setHovered(null), tabIndex: 0, children: [
4653
+ /* @__PURE__ */ jsx8(RowList, { role: "listbox", "aria-label": "History", children: /* @__PURE__ */ jsx8(VirtualWindow, { totalHeight: window_.totalHeight, offsetTop: window_.offsetTop, children: windowRows.map((row) => /* @__PURE__ */ jsx8(
4654
+ HistoryRowView,
5103
4655
  {
5104
- type: "button",
5105
- style: S3.iconBtn,
5106
- onClick: () => controller.requestClear(),
5107
- title: "Clear history",
5108
- "aria-label": "Clear history",
5109
- children: /* @__PURE__ */ jsx8(TrashIcon, {})
5110
- }
5111
- )
5112
- ] }),
5113
- controller.isConfirmingClear() && /* @__PURE__ */ jsxs7("div", { style: S3.confirmBar, role: "alertdialog", "aria-label": "Confirm clear history", children: [
5114
- /* @__PURE__ */ jsx8("span", { children: "Clear all history?" }),
5115
- /* @__PURE__ */ jsxs7("span", { style: S3.confirmActions, children: [
5116
- /* @__PURE__ */ jsx8("button", { type: "button", style: S3.textBtn, onClick: () => controller.confirmClearNow(), children: "Clear" }),
5117
- /* @__PURE__ */ jsx8("button", { type: "button", style: S3.textBtnDim, onClick: () => controller.cancelClear(), children: "Cancel" })
5118
- ] })
4656
+ row,
4657
+ controller,
4658
+ rowHeight,
4659
+ focused: controller.getFocused() === row.entryId
4660
+ },
4661
+ row.entryId ?? "__original__"
4662
+ )) }) }),
4663
+ rows.length === 0 ? /* @__PURE__ */ jsx8(EmptyState2, { title: "No history" }) : null
5119
4664
  ] }),
5120
- controller.isPruned() && /* @__PURE__ */ jsx8("div", { style: S3.prunedNote, children: "Earlier history discarded (limit reached)" }),
5121
- /* @__PURE__ */ jsxs7(
5122
- "div",
4665
+ memory ? /* @__PURE__ */ jsx8(
4666
+ StatusBar,
5123
4667
  {
5124
- ref: scrollRef,
5125
- style: S3.scroll,
5126
- onScroll,
5127
- onKeyDown,
5128
- onMouseLeave: () => controller.setHovered(null),
5129
- tabIndex: 0,
5130
- role: "listbox",
5131
- "aria-label": "History",
5132
- children: [
5133
- /* @__PURE__ */ jsx8("div", { style: { height: window_.totalHeight, position: "relative" }, children: /* @__PURE__ */ jsx8("div", { style: { transform: `translateY(${window_.offsetTop}px)` }, children: windowRows.map((row) => /* @__PURE__ */ jsx8(
5134
- HistoryRowView,
5135
- {
5136
- row,
5137
- controller,
5138
- rowHeight,
5139
- focused: controller.getFocused() === row.entryId
5140
- },
5141
- row.entryId ?? "__original__"
5142
- )) }) }),
5143
- rows.length === 0 && /* @__PURE__ */ jsx8("div", { style: S3.empty, children: "No history" })
5144
- ]
4668
+ left: /* @__PURE__ */ jsxs7(Text3, { role: "number", children: [
4669
+ memory.usedMB.toFixed(1),
4670
+ " MB",
4671
+ memory.limitMB ? ` / ${memory.limitMB} MB` : ""
4672
+ ] }),
4673
+ right: memory.onDiskCount !== void 0 ? /* @__PURE__ */ jsxs7(Text3, { role: "meta", children: [
4674
+ memory.onDiskCount,
4675
+ " on disk"
4676
+ ] }) : null
5145
4677
  }
5146
- ),
5147
- memory && /* @__PURE__ */ jsxs7("div", { style: S3.footer, children: [
5148
- /* @__PURE__ */ jsxs7("span", { children: [
5149
- memory.usedMB.toFixed(1),
5150
- " MB",
5151
- memory.limitMB ? ` / ${memory.limitMB} MB` : ""
5152
- ] }),
5153
- memory.onDiskCount !== void 0 && /* @__PURE__ */ jsxs7("span", { style: S3.dim, children: [
5154
- memory.onDiskCount,
5155
- " on disk"
5156
- ] })
5157
- ] })
4678
+ ) : null
5158
4679
  ] });
5159
4680
  }
5160
4681
  function HistoryRowView({ row, controller, rowHeight, focused }) {
@@ -5162,57 +4683,47 @@ function HistoryRowView({ row, controller, rowHeight, focused }) {
5162
4683
  const pending = entry?.status === "pending";
5163
4684
  const failed = entry?.status === "failed";
5164
4685
  const jumpable = controller.isJumpAllowed() && entry?.caps?.jumpable !== false;
5165
- const style = {
5166
- ...S3.row,
5167
- height: rowHeight,
5168
- background: row.current ? "var(--xeno-border)" : "transparent",
5169
- // FUTURE rows (after the cursor) are dimmed + struck through — the redoable region.
5170
- opacity: row.future ? 0.4 : 1,
5171
- textDecoration: row.future ? "line-through" : "none",
5172
- boxShadow: focused ? "inset 0 0 0 1px var(--xeno-control)" : void 0,
5173
- cursor: jumpable ? "pointer" : "default"
5174
- };
5175
- return /* @__PURE__ */ jsxs7(
5176
- "div",
4686
+ return /* @__PURE__ */ jsx8(
4687
+ Row,
5177
4688
  {
5178
- style,
5179
- role: "option",
5180
- "aria-selected": row.current,
4689
+ height: rowHeight,
4690
+ selected: row.current,
4691
+ focused,
4692
+ struck: row.future,
4693
+ noIcon: !controller.areIconsShown(),
4694
+ icon: /* @__PURE__ */ jsx8(EntryIcon, { name: row.kind === "original" ? "original" : controller.getIconName(entry?.kind) }),
4695
+ label: row.label,
4696
+ meta: row.kind === "entry" ? row.ordinal : void 0,
5181
4697
  "data-history-row": row.entryId ?? "__original__",
5182
- onClick: () => controller.jumpTo(row.entryId),
4698
+ onClick: jumpable ? () => controller.jumpTo(row.entryId) : void 0,
5183
4699
  onMouseEnter: () => controller.setHovered(row.entryId),
5184
4700
  onContextMenu: (e) => {
5185
4701
  e.preventDefault();
5186
4702
  controller.requestContextMenu(row.entryId, e.clientX, e.clientY);
5187
4703
  },
5188
4704
  title: row.label,
5189
- children: [
5190
- controller.areIconsShown() && /* @__PURE__ */ jsx8("span", { style: S3.iconCell, children: /* @__PURE__ */ jsx8(EntryIcon, { name: row.kind === "original" ? "original" : controller.getIconName(entry?.kind) }) }),
5191
- /* @__PURE__ */ jsx8("span", { style: S3.ordinal, children: row.kind === "entry" ? row.ordinal : "" }),
5192
- /* @__PURE__ */ jsx8("span", { style: S3.label, children: row.label }),
5193
- pending && /* @__PURE__ */ jsx8(PendingGlyph, {}),
5194
- failed && /* @__PURE__ */ jsx8("span", { style: S3.failed, children: "failed" }),
5195
- controller.isSourceShown() && entry?.source && entry.source !== "user" && /* @__PURE__ */ jsx8("span", { style: S3.badge, title: `Source: ${entry.source}`, children: entry.source === "agent" ? "AI" : "S" }),
5196
- entry?.coalesced && entry.coalesced > 1 && /* @__PURE__ */ jsxs7("span", { style: S3.badge, title: `${entry.coalesced} actions coalesced`, children: [
4705
+ trailing: /* @__PURE__ */ jsxs7(Fragment3, { children: [
4706
+ pending ? /* @__PURE__ */ jsx8(PendingGlyph, {}) : null,
4707
+ failed ? /* @__PURE__ */ jsx8(Badge2, { size: "sm", tone: "error", children: "failed" }) : null,
4708
+ controller.isSourceShown() && entry?.source && entry.source !== "user" ? /* @__PURE__ */ jsx8(Badge2, { size: "sm", title: `Source: ${entry.source}`, children: entry.source === "agent" ? "AI" : "S" }) : null,
4709
+ entry?.coalesced && entry.coalesced > 1 ? /* @__PURE__ */ jsxs7(Badge2, { size: "sm", title: `${entry.coalesced} actions coalesced`, children: [
5197
4710
  "\xD7",
5198
4711
  entry.coalesced
5199
- ] }),
5200
- controller.areTimestampsShown() && entry?.at !== void 0 && /* @__PURE__ */ jsx8("span", { style: S3.time, children: formatTime(entry.at) }),
5201
- pending && /* @__PURE__ */ jsx8(
5202
- "button",
4712
+ ] }) : null,
4713
+ controller.areTimestampsShown() && entry?.at !== void 0 ? /* @__PURE__ */ jsx8(Text3, { role: "meta", children: formatTime(entry.at) }) : null,
4714
+ pending ? /* @__PURE__ */ jsx8(
4715
+ IconButton3,
5203
4716
  {
5204
- type: "button",
5205
- style: S3.iconBtn,
4717
+ size: "sm",
4718
+ icon: /* @__PURE__ */ jsx8(XIcon2, {}),
4719
+ label: "Cancel operation",
5206
4720
  onClick: (e) => {
5207
4721
  e.stopPropagation();
5208
4722
  controller.cancelPending(entry?.id);
5209
- },
5210
- title: "Cancel operation",
5211
- "aria-label": "Cancel operation",
5212
- children: /* @__PURE__ */ jsx8(XIcon2, {})
4723
+ }
5213
4724
  }
5214
- )
5215
- ]
4725
+ ) : null
4726
+ ] })
5216
4727
  }
5217
4728
  );
5218
4729
  }
@@ -5221,141 +4732,6 @@ function formatTime(at) {
5221
4732
  if (Number.isNaN(date.getTime())) return typeof at === "string" ? at : "";
5222
4733
  return date.toLocaleTimeString(void 0, { hour: "2-digit", minute: "2-digit" });
5223
4734
  }
5224
- var S3 = {
5225
- root: {
5226
- display: "flex",
5227
- flexDirection: "column",
5228
- height: "100%",
5229
- minHeight: 0,
5230
- fontSize: 11,
5231
- color: "var(--xeno-text)",
5232
- background: "var(--xeno-canvas)",
5233
- userSelect: "none"
5234
- },
5235
- header: {
5236
- display: "flex",
5237
- alignItems: "center",
5238
- gap: 4,
5239
- padding: "4px 6px",
5240
- background: "var(--xeno-panel-header)",
5241
- flex: "0 0 auto"
5242
- },
5243
- search: {
5244
- flex: "1 1 auto",
5245
- minWidth: 0,
5246
- height: 18,
5247
- background: "var(--xeno-canvas)",
5248
- color: "inherit",
5249
- border: "1px solid var(--xeno-border)",
5250
- borderRadius: 2,
5251
- fontSize: 11,
5252
- padding: "0 6px",
5253
- outline: "none"
5254
- },
5255
- counter: {
5256
- fontSize: 9,
5257
- color: "var(--xeno-muted)",
5258
- fontVariantNumeric: "tabular-nums",
5259
- flex: "0 0 auto"
5260
- },
5261
- iconBtn: {
5262
- display: "flex",
5263
- alignItems: "center",
5264
- justifyContent: "center",
5265
- width: 16,
5266
- height: 16,
5267
- padding: 0,
5268
- border: "none",
5269
- borderRadius: 2,
5270
- background: "transparent",
5271
- color: "inherit",
5272
- cursor: "pointer",
5273
- flex: "0 0 auto"
5274
- },
5275
- confirmBar: {
5276
- display: "flex",
5277
- alignItems: "center",
5278
- justifyContent: "space-between",
5279
- gap: 8,
5280
- padding: "3px 6px",
5281
- fontSize: 10,
5282
- background: "var(--xeno-border-subtle)",
5283
- flex: "0 0 auto"
5284
- },
5285
- confirmActions: { display: "flex", gap: 8 },
5286
- textBtn: {
5287
- background: "transparent",
5288
- border: "none",
5289
- color: "inherit",
5290
- cursor: "pointer",
5291
- fontSize: 10,
5292
- padding: 0
5293
- },
5294
- textBtnDim: {
5295
- background: "transparent",
5296
- border: "none",
5297
- color: "var(--xeno-muted)",
5298
- cursor: "pointer",
5299
- fontSize: 10,
5300
- padding: 0
5301
- },
5302
- prunedNote: {
5303
- padding: "2px 6px",
5304
- fontSize: 9,
5305
- color: "var(--xeno-muted)",
5306
- flex: "0 0 auto"
5307
- },
5308
- scroll: { flex: "1 1 auto", minHeight: 0, overflowY: "auto", overflowX: "hidden", outline: "none" },
5309
- row: {
5310
- display: "flex",
5311
- alignItems: "center",
5312
- gap: 5,
5313
- padding: "0 6px",
5314
- boxSizing: "border-box",
5315
- overflow: "hidden"
5316
- },
5317
- iconCell: { display: "flex", alignItems: "center", width: 11, flex: "0 0 auto", opacity: 0.75 },
5318
- ordinal: {
5319
- fontSize: 9,
5320
- color: "var(--xeno-muted)",
5321
- fontVariantNumeric: "tabular-nums",
5322
- minWidth: 14,
5323
- textAlign: "right",
5324
- flex: "0 0 auto"
5325
- },
5326
- label: { flex: "1 1 auto", overflow: "hidden", textOverflow: "ellipsis", whiteSpace: "nowrap", minWidth: 0 },
5327
- badge: {
5328
- fontSize: 8,
5329
- padding: "0 3px",
5330
- height: 12,
5331
- lineHeight: "12px",
5332
- borderRadius: 2,
5333
- background: "var(--xeno-border)",
5334
- color: "var(--xeno-muted)",
5335
- flex: "0 0 auto"
5336
- },
5337
- failed: { fontSize: 9, color: "var(--xeno-danger)", flex: "0 0 auto" },
5338
- time: {
5339
- fontSize: 9,
5340
- color: "var(--xeno-muted)",
5341
- fontVariantNumeric: "tabular-nums",
5342
- flex: "0 0 auto"
5343
- },
5344
- empty: { padding: 12, fontSize: 10, opacity: 0.4, textTransform: "uppercase", letterSpacing: "0.08em" },
5345
- footer: {
5346
- display: "flex",
5347
- alignItems: "center",
5348
- justifyContent: "space-between",
5349
- gap: 8,
5350
- padding: "2px 6px",
5351
- fontSize: 9,
5352
- color: "var(--xeno-muted)",
5353
- background: "var(--xeno-panel-header)",
5354
- flex: "0 0 auto",
5355
- fontVariantNumeric: "tabular-nums"
5356
- },
5357
- dim: { opacity: 0.7 }
5358
- };
5359
4735
 
5360
4736
  // src/edit/history/panel.ts
5361
4737
  function createHistoryPanel(options = {}) {
@@ -6438,7 +5814,7 @@ function drawAlphaStrip(ctx, w, h, hsv) {
6438
5814
  }
6439
5815
 
6440
5816
  // src/edit/color/react/ColorPanelView.tsx
6441
- import { Fragment as Fragment3, jsx as jsx9, jsxs as jsxs8 } from "react/jsx-runtime";
5817
+ import { Fragment as Fragment4, jsx as jsx9, jsxs as jsxs8 } from "react/jsx-runtime";
6442
5818
  var SPACE_LABEL = {
6443
5819
  hex: "HEX",
6444
5820
  rgb: "RGB",
@@ -6543,14 +5919,14 @@ function ColorPanelView({ controller }) {
6543
5919
  );
6544
5920
  const componentLabels = COMPONENT_LABELS[space];
6545
5921
  const comps = value.components ?? [];
6546
- return /* @__PURE__ */ jsxs8("div", { style: S4.root, className: "xeno-color-panel", children: [
6547
- controller.getChannelsMode() === "fg-bg" && /* @__PURE__ */ jsxs8("div", { style: S4.channels, children: [
5922
+ return /* @__PURE__ */ jsxs8("div", { style: S2.root, className: "xeno-color-panel", children: [
5923
+ controller.getChannelsMode() === "fg-bg" && /* @__PURE__ */ jsxs8("div", { style: S2.channels, children: [
6548
5924
  /* @__PURE__ */ jsx9(
6549
5925
  "button",
6550
5926
  {
6551
5927
  type: "button",
6552
5928
  "aria-pressed": controller.getActiveChannel() === "fg",
6553
- style: { ...S4.chip, ...controller.getActiveChannel() === "fg" ? S4.chipActive : null, background: value.hex },
5929
+ style: { ...S2.chip, ...controller.getActiveChannel() === "fg" ? S2.chipActive : null, background: value.hex },
6554
5930
  onClick: () => controller.setChannel("fg"),
6555
5931
  title: "Foreground"
6556
5932
  }
@@ -6559,7 +5935,7 @@ function ColorPanelView({ controller }) {
6559
5935
  "button",
6560
5936
  {
6561
5937
  type: "button",
6562
- style: S4.swap,
5938
+ style: S2.swap,
6563
5939
  onClick: () => controller.swapChannels(),
6564
5940
  title: "Swap FG/BG (X)",
6565
5941
  children: "\u21C4"
@@ -6570,20 +5946,20 @@ function ColorPanelView({ controller }) {
6570
5946
  {
6571
5947
  type: "button",
6572
5948
  "aria-pressed": controller.getActiveChannel() === "bg",
6573
- style: { ...S4.chip, ...controller.getActiveChannel() === "bg" ? S4.chipActive : null },
5949
+ style: { ...S2.chip, ...controller.getActiveChannel() === "bg" ? S2.chipActive : null },
6574
5950
  onClick: () => controller.setChannel("bg"),
6575
5951
  title: "Background"
6576
5952
  }
6577
5953
  )
6578
5954
  ] }),
6579
- /* @__PURE__ */ jsxs8("div", { style: S4.pickerRow, children: [
5955
+ /* @__PURE__ */ jsxs8("div", { style: S2.pickerRow, children: [
6580
5956
  /* @__PURE__ */ jsx9(
6581
5957
  "canvas",
6582
5958
  {
6583
5959
  ref: spectrumRef,
6584
5960
  width: 200,
6585
5961
  height: 140,
6586
- style: { ...S4.spectrum, ...bound ? S4.disabled : null },
5962
+ style: { ...S2.spectrum, ...bound ? S2.disabled : null },
6587
5963
  onPointerDown: (e) => onSpectrumPointer(e, true),
6588
5964
  onPointerMove: (e) => onSpectrumPointer(e, false),
6589
5965
  onPointerUp: endDrag
@@ -6595,7 +5971,7 @@ function ColorPanelView({ controller }) {
6595
5971
  ref: hueRef,
6596
5972
  width: 14,
6597
5973
  height: 140,
6598
- style: { ...S4.strip, ...bound ? S4.disabled : null },
5974
+ style: { ...S2.strip, ...bound ? S2.disabled : null },
6599
5975
  onPointerDown: (e) => onHuePointer(e, true),
6600
5976
  onPointerMove: (e) => onHuePointer(e, false),
6601
5977
  onPointerUp: endDrag
@@ -6607,20 +5983,20 @@ function ColorPanelView({ controller }) {
6607
5983
  ref: alphaRef,
6608
5984
  width: 14,
6609
5985
  height: 140,
6610
- style: { ...S4.strip, ...bound ? S4.disabled : null },
5986
+ style: { ...S2.strip, ...bound ? S2.disabled : null },
6611
5987
  onPointerDown: (e) => onAlphaPointer(e, true),
6612
5988
  onPointerMove: (e) => onAlphaPointer(e, false),
6613
5989
  onPointerUp: endDrag
6614
5990
  }
6615
5991
  )
6616
5992
  ] }),
6617
- /* @__PURE__ */ jsxs8("div", { style: S4.controls, children: [
5993
+ /* @__PURE__ */ jsxs8("div", { style: S2.controls, children: [
6618
5994
  /* @__PURE__ */ jsx9(
6619
5995
  "select",
6620
5996
  {
6621
5997
  value: space,
6622
5998
  onChange: (e) => controller.setSpace(e.target.value),
6623
- style: S4.select,
5999
+ style: S2.select,
6624
6000
  "aria-label": "Color model",
6625
6001
  children: EDIT_SPACES.map((s) => /* @__PURE__ */ jsx9("option", { value: s, children: SPACE_LABEL[s] }, s))
6626
6002
  }
@@ -6632,12 +6008,12 @@ function ColorPanelView({ controller }) {
6632
6008
  value: value.hex,
6633
6009
  onChange: onHexInput,
6634
6010
  disabled: bound,
6635
- style: S4.hexInput,
6011
+ style: S2.hexInput,
6636
6012
  "aria-label": "Hex",
6637
6013
  spellCheck: false
6638
6014
  }
6639
- ) : /* @__PURE__ */ jsx9("div", { style: S4.componentRow, children: (componentLabels ?? []).map((label, i) => /* @__PURE__ */ jsxs8("label", { style: S4.componentField, children: [
6640
- /* @__PURE__ */ jsx9("span", { style: S4.componentLabel, children: label }),
6015
+ ) : /* @__PURE__ */ jsx9("div", { style: S2.componentRow, children: (componentLabels ?? []).map((label, i) => /* @__PURE__ */ jsxs8("label", { style: S2.componentField, children: [
6016
+ /* @__PURE__ */ jsx9("span", { style: S2.componentLabel, children: label }),
6641
6017
  /* @__PURE__ */ jsx9(
6642
6018
  "input",
6643
6019
  {
@@ -6645,12 +6021,12 @@ function ColorPanelView({ controller }) {
6645
6021
  value: roundForSpace(space, i, comps[i] ?? 0),
6646
6022
  onChange: (e) => onComponentInput(i, e.target.value),
6647
6023
  disabled: bound,
6648
- style: S4.numInput
6024
+ style: S2.numInput
6649
6025
  }
6650
6026
  )
6651
6027
  ] }, label)) }),
6652
- controller.isAlphaShown() && /* @__PURE__ */ jsxs8("label", { style: S4.alphaField, children: [
6653
- /* @__PURE__ */ jsx9("span", { style: S4.componentLabel, children: "A" }),
6028
+ controller.isAlphaShown() && /* @__PURE__ */ jsxs8("label", { style: S2.alphaField, children: [
6029
+ /* @__PURE__ */ jsx9("span", { style: S2.componentLabel, children: "A" }),
6654
6030
  /* @__PURE__ */ jsx9(
6655
6031
  "input",
6656
6032
  {
@@ -6660,20 +6036,20 @@ function ColorPanelView({ controller }) {
6660
6036
  value: Math.round(value.alpha * 100),
6661
6037
  onChange: (e) => controller.setAlpha(Number(e.target.value) / 100, { commit: true }),
6662
6038
  disabled: bound,
6663
- style: S4.numInput
6039
+ style: S2.numInput
6664
6040
  }
6665
6041
  )
6666
6042
  ] }),
6667
- /* @__PURE__ */ jsx9("button", { type: "button", style: S4.iconBtn, title: "Pick from screen", onClick: () => controller.requestEyedropper(), children: "\u29BF" })
6043
+ /* @__PURE__ */ jsx9("button", { type: "button", style: S2.iconBtn, title: "Pick from screen", onClick: () => controller.requestEyedropper(), children: "\u29BF" })
6668
6044
  ] }),
6669
- controller.hasTokens() && /* @__PURE__ */ jsxs8("div", { style: S4.tokenRow, children: [
6670
- /* @__PURE__ */ jsx9("span", { style: S4.componentLabel, children: "Token" }),
6045
+ controller.hasTokens() && /* @__PURE__ */ jsxs8("div", { style: S2.tokenRow, children: [
6046
+ /* @__PURE__ */ jsx9("span", { style: S2.componentLabel, children: "Token" }),
6671
6047
  /* @__PURE__ */ jsxs8(
6672
6048
  "select",
6673
6049
  {
6674
6050
  value: controller.getBoundTokenId() ?? "",
6675
6051
  onChange: (e) => e.target.value ? controller.bindToken(e.target.value) : controller.unbindToken(),
6676
- style: S4.select,
6052
+ style: S2.select,
6677
6053
  "aria-label": "Bind token",
6678
6054
  children: [
6679
6055
  /* @__PURE__ */ jsx9("option", { value: "", children: "\u2014 raw \u2014" }),
@@ -6681,17 +6057,17 @@ function ColorPanelView({ controller }) {
6681
6057
  ]
6682
6058
  }
6683
6059
  ),
6684
- bound && /* @__PURE__ */ jsx9("button", { type: "button", style: S4.textBtn, onClick: () => controller.unbindToken(), children: "Unbind" })
6060
+ bound && /* @__PURE__ */ jsx9("button", { type: "button", style: S2.textBtn, onClick: () => controller.unbindToken(), children: "Unbind" })
6685
6061
  ] }),
6686
- /* @__PURE__ */ jsxs8("div", { style: S4.swatchHeader, children: [
6687
- /* @__PURE__ */ jsx9("span", { style: S4.sectionLabel, children: "Swatches" }),
6688
- /* @__PURE__ */ jsx9("button", { type: "button", style: S4.textBtn, onClick: () => void controller.addSwatch(), children: "+ Save" })
6062
+ /* @__PURE__ */ jsxs8("div", { style: S2.swatchHeader, children: [
6063
+ /* @__PURE__ */ jsx9("span", { style: S2.sectionLabel, children: "Swatches" }),
6064
+ /* @__PURE__ */ jsx9("button", { type: "button", style: S2.textBtn, onClick: () => void controller.addSwatch(), children: "+ Save" })
6689
6065
  ] }),
6690
- /* @__PURE__ */ jsx9("div", { style: S4.swatchGrid, children: controller.getSwatches().map((hex) => /* @__PURE__ */ jsx9(
6066
+ /* @__PURE__ */ jsx9("div", { style: S2.swatchGrid, children: controller.getSwatches().map((hex) => /* @__PURE__ */ jsx9(
6691
6067
  "button",
6692
6068
  {
6693
6069
  type: "button",
6694
- style: { ...S4.swatch, background: hex },
6070
+ style: { ...S2.swatch, background: hex },
6695
6071
  title: hex,
6696
6072
  onClick: () => controller.selectColor(hex),
6697
6073
  onContextMenu: (e) => {
@@ -6701,13 +6077,13 @@ function ColorPanelView({ controller }) {
6701
6077
  },
6702
6078
  hex
6703
6079
  )) }),
6704
- controller.getRecent().length > 0 && /* @__PURE__ */ jsxs8(Fragment3, { children: [
6705
- /* @__PURE__ */ jsx9("div", { style: S4.sectionLabel, children: "Recent" }),
6706
- /* @__PURE__ */ jsx9("div", { style: S4.swatchGrid, children: controller.getRecent().map((hex, i) => /* @__PURE__ */ jsx9(
6080
+ controller.getRecent().length > 0 && /* @__PURE__ */ jsxs8(Fragment4, { children: [
6081
+ /* @__PURE__ */ jsx9("div", { style: S2.sectionLabel, children: "Recent" }),
6082
+ /* @__PURE__ */ jsx9("div", { style: S2.swatchGrid, children: controller.getRecent().map((hex, i) => /* @__PURE__ */ jsx9(
6707
6083
  "button",
6708
6084
  {
6709
6085
  type: "button",
6710
- style: { ...S4.swatch, background: hex },
6086
+ style: { ...S2.swatch, background: hex },
6711
6087
  title: hex,
6712
6088
  onClick: () => controller.selectColor(hex)
6713
6089
  },
@@ -6723,7 +6099,7 @@ function roundForSpace(space, index, v) {
6723
6099
  if (space === "oklch") return Math.round(v * 10) / 10;
6724
6100
  return Math.round(v);
6725
6101
  }
6726
- var S4 = {
6102
+ var S2 = {
6727
6103
  root: { display: "flex", flexDirection: "column", gap: 8, padding: 8, fontSize: 11, color: "var(--xeno-text)", background: "var(--xeno-canvas)", minWidth: 232, userSelect: "none" },
6728
6104
  channels: { display: "flex", alignItems: "center", gap: 6 },
6729
6105
  chip: { width: 28, height: 20, borderRadius: 2, border: "1px solid var(--xeno-control)", background: "var(--xeno-canvas)", cursor: "pointer", padding: 0 },
@@ -8020,9 +7396,9 @@ var curveManifest = {
8020
7396
 
8021
7397
  // src/edit/curve/react/CurvePanelView.tsx
8022
7398
  import { useCallback as useCallback6, useEffect as useEffect5, useRef as useRef6, useSyncExternalStore as useSyncExternalStore5 } from "react";
8023
- import { EmptyState, StatusBar, Toolbar, ToolbarGroup } from "@xenosystem/components/chrome";
7399
+ import { EmptyState as EmptyState3, StatusBar as StatusBar2, Toolbar as Toolbar2, ToolbarGroup } from "@xenosystem/components/chrome";
8024
7400
  import { formatTick } from "@xenosystem/time-core";
8025
- import { Fragment as Fragment4, jsx as jsx10, jsxs as jsxs9 } from "react/jsx-runtime";
7401
+ import { Fragment as Fragment5, jsx as jsx10, jsxs as jsxs9 } from "react/jsx-runtime";
8026
7402
  var DASHES = ["none", "4 2", "1 2", "6 2 1 2"];
8027
7403
  function CurvePanelView({ controller, showPresets = true }) {
8028
7404
  const state = useSyncExternalStore5(controller.subscribe, controller.getState, controller.getState);
@@ -8103,7 +7479,7 @@ function CurvePanelView({ controller, showPresets = true }) {
8103
7479
  const channels = state.curves?.channels ?? [];
8104
7480
  return /* @__PURE__ */ jsxs9("div", { style: SHELL, children: [
8105
7481
  /* @__PURE__ */ jsx10(
8106
- Toolbar,
7482
+ Toolbar2,
8107
7483
  {
8108
7484
  left: /* @__PURE__ */ jsx10(ToolbarGroup, { children: ["linear", "bezier", "hold", "step"].map((mode) => /* @__PURE__ */ jsx10("button", { type: "button", style: button(), onClick: () => controller.setInterpolation(mode), children: mode }, mode)) }),
8109
7485
  right: /* @__PURE__ */ jsxs9(ToolbarGroup, { end: true, children: [
@@ -8113,7 +7489,7 @@ function CurvePanelView({ controller, showPresets = true }) {
8113
7489
  }
8114
7490
  ),
8115
7491
  showPresets ? /* @__PURE__ */ jsx10(
8116
- Toolbar,
7492
+ Toolbar2,
8117
7493
  {
8118
7494
  left: /* @__PURE__ */ jsx10(ToolbarGroup, { children: EASING_PRESETS.slice(0, 6).map((preset) => /* @__PURE__ */ jsx10(
8119
7495
  "button",
@@ -8128,7 +7504,7 @@ function CurvePanelView({ controller, showPresets = true }) {
8128
7504
  )) })
8129
7505
  }
8130
7506
  ) : null,
8131
- channels.length === 0 ? /* @__PURE__ */ jsx10(EmptyState, { title: "No curves", hint: "Wire an animated property into this panel's input." }) : /* @__PURE__ */ jsx10(
7507
+ channels.length === 0 ? /* @__PURE__ */ jsx10(EmptyState3, { title: "No curves", hint: "Wire an animated property into this panel's input." }) : /* @__PURE__ */ jsx10(
8132
7508
  "div",
8133
7509
  {
8134
7510
  ref: containerRef,
@@ -8242,7 +7618,7 @@ function CurvePanelView({ controller, showPresets = true }) {
8242
7618
  }
8243
7619
  ),
8244
7620
  /* @__PURE__ */ jsx10(
8245
- StatusBar,
7621
+ StatusBar2,
8246
7622
  {
8247
7623
  left: `${channels.length} channel${channels.length === 1 ? "" : "s"}`,
8248
7624
  right: /* @__PURE__ */ jsx10("span", { className: "tabular-nums", children: state.playheadTick !== null ? formatTick(state.playheadTick, state.timebase) : "" })
@@ -8257,7 +7633,7 @@ function Handles({
8257
7633
  scale
8258
7634
  }) {
8259
7635
  const sides = ["in", "out"];
8260
- return /* @__PURE__ */ jsx10(Fragment4, { children: sides.map((side) => {
7636
+ return /* @__PURE__ */ jsx10(Fragment5, { children: sides.map((side) => {
8261
7637
  const tangent = side === "in" ? keyframe.tangentIn : keyframe.tangentOut;
8262
7638
  if (!tangent) return null;
8263
7639
  const hx = scale.tickToX(keyframe.tick + tangent.x);
@@ -8897,7 +8273,7 @@ var viewportManifest = {
8897
8273
 
8898
8274
  // src/edit/viewport/react/ViewportPanelView.tsx
8899
8275
  import { useEffect as useEffect6, useRef as useRef7, useSyncExternalStore as useSyncExternalStore6 } from "react";
8900
- import { Badge, StatusBar as StatusBar2 } from "@xenosystem/components/chrome";
8276
+ import { Badge as Badge3, StatusBar as StatusBar3 } from "@xenosystem/components/chrome";
8901
8277
  import { jsx as jsx11, jsxs as jsxs10 } from "react/jsx-runtime";
8902
8278
  var SLOT_STYLE = {
8903
8279
  "top-left": { top: 8, left: 8 },
@@ -9007,11 +8383,11 @@ function ViewportPanelView({
9007
8383
  fontSize: 11,
9008
8384
  zIndex: 20
9009
8385
  },
9010
- children: /* @__PURE__ */ jsx11(Badge, { tone: "error", children: "graphics context lost \u2014 restoring" })
8386
+ children: /* @__PURE__ */ jsx11(Badge3, { tone: "error", children: "graphics context lost \u2014 restoring" })
9011
8387
  }
9012
8388
  ) : null,
9013
8389
  showStats && state.stats ? /* @__PURE__ */ jsx11("div", { style: { position: "absolute", left: 0, right: 0, bottom: 0, zIndex: 10 }, children: /* @__PURE__ */ jsx11(
9014
- StatusBar2,
8390
+ StatusBar3,
9015
8391
  {
9016
8392
  left: state.stats.fps !== void 0 ? `${Math.round(state.stats.fps)} fps` : void 0,
9017
8393
  right: state.surface ? `${state.surface.cssWidth}\xD7${state.surface.cssHeight} @${state.surface.dpr}\xD7` : void 0
@@ -9664,17 +9040,17 @@ var findManifest = {
9664
9040
  // src/edit/find/react/FindPanelView.tsx
9665
9041
  import { useSyncExternalStore as useSyncExternalStore7 } from "react";
9666
9042
  import {
9667
- Badge as Badge2,
9668
- EmptyState as EmptyState2,
9669
- IconButton as IconButton2,
9670
- Row,
9671
- RowList,
9672
- ScrollArea,
9673
- SearchField,
9674
- Section,
9675
- StatusBar as StatusBar3,
9043
+ Badge as Badge4,
9044
+ EmptyState as EmptyState4,
9045
+ IconButton as IconButton4,
9046
+ Row as Row2,
9047
+ RowList as RowList2,
9048
+ ScrollArea as ScrollArea3,
9049
+ SearchField as SearchField3,
9050
+ Section as Section2,
9051
+ StatusBar as StatusBar4,
9676
9052
  TextButton as TextButton2,
9677
- Toolbar as Toolbar2,
9053
+ Toolbar as Toolbar3,
9678
9054
  ToolbarGroup as ToolbarGroup2
9679
9055
  } from "@xenosystem/components/chrome";
9680
9056
  import { jsx as jsx12, jsxs as jsxs11 } from "react/jsx-runtime";
@@ -9716,12 +9092,12 @@ function StatusLine({
9716
9092
  hasText
9717
9093
  }) {
9718
9094
  if (status === "invalidPattern") {
9719
- return /* @__PURE__ */ jsx12(Badge2, { tone: "error", title: message ?? void 0, children: "invalid pattern" });
9095
+ return /* @__PURE__ */ jsx12(Badge4, { tone: "error", title: message ?? void 0, children: "invalid pattern" });
9720
9096
  }
9721
9097
  if (status === "failed") {
9722
- return /* @__PURE__ */ jsx12(Badge2, { tone: "error", title: message ?? void 0, children: "search failed" });
9098
+ return /* @__PURE__ */ jsx12(Badge4, { tone: "error", title: message ?? void 0, children: "search failed" });
9723
9099
  }
9724
- if (status === "searching") return /* @__PURE__ */ jsx12(Badge2, { children: "searching\u2026" });
9100
+ if (status === "searching") return /* @__PURE__ */ jsx12(Badge4, { children: "searching\u2026" });
9725
9101
  if (!hasText || status === "idle") return null;
9726
9102
  return /* @__PURE__ */ jsxs11("span", { style: { fontVariantNumeric: "tabular-nums", fontSize: 10, opacity: 0.55 }, children: [
9727
9103
  displayIndex,
@@ -9747,7 +9123,7 @@ function FindPanelView({
9747
9123
  }
9748
9124
  };
9749
9125
  const renderMatch = (match, index) => /* @__PURE__ */ jsx12(
9750
- Row,
9126
+ Row2,
9751
9127
  {
9752
9128
  noIcon: true,
9753
9129
  selected: index === state.index,
@@ -9771,10 +9147,10 @@ function FindPanelView({
9771
9147
  let flatIndex = -1;
9772
9148
  return /* @__PURE__ */ jsxs11("div", { style: { display: "flex", flexDirection: "column", height: "100%", minHeight: 0 }, onKeyDown, children: [
9773
9149
  /* @__PURE__ */ jsx12(
9774
- Toolbar2,
9150
+ Toolbar3,
9775
9151
  {
9776
9152
  left: /* @__PURE__ */ jsx12(
9777
- SearchField,
9153
+ SearchField3,
9778
9154
  {
9779
9155
  value: state.text,
9780
9156
  onChange: (value) => controller.setText(value),
@@ -9783,7 +9159,7 @@ function FindPanelView({
9783
9159
  ),
9784
9160
  right: /* @__PURE__ */ jsxs11(ToolbarGroup2, { end: true, children: [
9785
9161
  /* @__PURE__ */ jsx12(
9786
- IconButton2,
9162
+ IconButton4,
9787
9163
  {
9788
9164
  label: "Match case",
9789
9165
  active: state.options.caseSensitive,
@@ -9792,7 +9168,7 @@ function FindPanelView({
9792
9168
  }
9793
9169
  ),
9794
9170
  /* @__PURE__ */ jsx12(
9795
- IconButton2,
9171
+ IconButton4,
9796
9172
  {
9797
9173
  label: "Whole word",
9798
9174
  active: state.options.wholeWord,
@@ -9801,7 +9177,7 @@ function FindPanelView({
9801
9177
  }
9802
9178
  ),
9803
9179
  /* @__PURE__ */ jsx12(
9804
- IconButton2,
9180
+ IconButton4,
9805
9181
  {
9806
9182
  label: "Regular expression",
9807
9183
  active: state.options.regex,
@@ -9813,7 +9189,7 @@ function FindPanelView({
9813
9189
  }
9814
9190
  ),
9815
9191
  /* @__PURE__ */ jsx12(
9816
- Toolbar2,
9192
+ Toolbar3,
9817
9193
  {
9818
9194
  divided: false,
9819
9195
  left: /* @__PURE__ */ jsx12(
@@ -9829,7 +9205,7 @@ function FindPanelView({
9829
9205
  ),
9830
9206
  right: /* @__PURE__ */ jsxs11(ToolbarGroup2, { end: true, children: [
9831
9207
  /* @__PURE__ */ jsx12(
9832
- IconButton2,
9208
+ IconButton4,
9833
9209
  {
9834
9210
  label: "Previous match",
9835
9211
  disabled: state.matches.length === 0,
@@ -9838,7 +9214,7 @@ function FindPanelView({
9838
9214
  }
9839
9215
  ),
9840
9216
  /* @__PURE__ */ jsx12(
9841
- IconButton2,
9217
+ IconButton4,
9842
9218
  {
9843
9219
  label: "Next match",
9844
9220
  disabled: state.matches.length === 0,
@@ -9852,10 +9228,10 @@ function FindPanelView({
9852
9228
  ),
9853
9229
  state.message && state.status === "invalidPattern" ? /* @__PURE__ */ jsx12("div", { style: { padding: "2px 8px 4px", fontSize: 9, opacity: 0.6 }, children: state.message }) : null,
9854
9230
  state.replaceVisible ? /* @__PURE__ */ jsx12(
9855
- Toolbar2,
9231
+ Toolbar3,
9856
9232
  {
9857
9233
  left: /* @__PURE__ */ jsx12(
9858
- SearchField,
9234
+ SearchField3,
9859
9235
  {
9860
9236
  value: state.replaceText,
9861
9237
  onChange: (value) => controller.setReplaceText(value),
@@ -9872,24 +9248,24 @@ function FindPanelView({
9872
9248
  ] })
9873
9249
  }
9874
9250
  ) : null,
9875
- showResults ? /* @__PURE__ */ jsx12(ScrollArea, { children: state.status === "idle" ? /* @__PURE__ */ jsx12(EmptyState2, { title: "Find", hint: "Type to search. Enter goes to the next match." }) : state.status === "invalidPattern" ? /* @__PURE__ */ jsx12(
9876
- EmptyState2,
9251
+ showResults ? /* @__PURE__ */ jsx12(ScrollArea3, { children: state.status === "idle" ? /* @__PURE__ */ jsx12(EmptyState4, { title: "Find", hint: "Type to search. Enter goes to the next match." }) : state.status === "invalidPattern" ? /* @__PURE__ */ jsx12(
9252
+ EmptyState4,
9877
9253
  {
9878
9254
  title: "Invalid pattern",
9879
9255
  hint: state.message ?? "The expression could not be read. Fix it to search."
9880
9256
  }
9881
- ) : state.status === "failed" ? /* @__PURE__ */ jsx12(EmptyState2, { title: "Search failed", hint: state.message ?? "The host could not complete the search." }) : state.noResults ? /* @__PURE__ */ jsx12(EmptyState2, { title: "No matches", hint: `Nothing in scope matches \u201C${state.text}\u201D.` }) : state.groups.length === 1 && state.groups[0].id === "" ? /* @__PURE__ */ jsx12(RowList, { children: state.matches.map((m) => renderMatch(m, ++flatIndex)) }) : state.groups.map((group) => /* @__PURE__ */ jsx12(
9882
- Section,
9257
+ ) : state.status === "failed" ? /* @__PURE__ */ jsx12(EmptyState4, { title: "Search failed", hint: state.message ?? "The host could not complete the search." }) : state.noResults ? /* @__PURE__ */ jsx12(EmptyState4, { title: "No matches", hint: `Nothing in scope matches \u201C${state.text}\u201D.` }) : state.groups.length === 1 && state.groups[0].id === "" ? /* @__PURE__ */ jsx12(RowList2, { children: state.matches.map((m) => renderMatch(m, ++flatIndex)) }) : state.groups.map((group) => /* @__PURE__ */ jsx12(
9258
+ Section2,
9883
9259
  {
9884
9260
  title: group.label || "Results",
9885
9261
  flush: true,
9886
- badge: /* @__PURE__ */ jsx12(Badge2, { children: group.matches.length }),
9887
- children: /* @__PURE__ */ jsx12(RowList, { children: group.matches.map((m) => renderMatch(m, ++flatIndex)) })
9262
+ badge: /* @__PURE__ */ jsx12(Badge4, { children: group.matches.length }),
9263
+ children: /* @__PURE__ */ jsx12(RowList2, { children: group.matches.map((m) => renderMatch(m, ++flatIndex)) })
9888
9264
  },
9889
9265
  group.id
9890
9266
  )) }) : null,
9891
9267
  /* @__PURE__ */ jsx12(
9892
- StatusBar3,
9268
+ StatusBar4,
9893
9269
  {
9894
9270
  left: state.truncated ? `showing first ${state.matches.length}` : void 0,
9895
9271
  right: state.options.scope
@@ -10539,17 +9915,17 @@ var commentsManifest = {
10539
9915
  // src/edit/comments/react/CommentsPanelView.tsx
10540
9916
  import { useSyncExternalStore as useSyncExternalStore8 } from "react";
10541
9917
  import {
10542
- Badge as Badge3,
10543
- EmptyState as EmptyState3,
10544
- ScrollArea as ScrollArea2,
10545
- Section as Section2,
9918
+ Badge as Badge5,
9919
+ EmptyState as EmptyState5,
9920
+ ScrollArea as ScrollArea4,
9921
+ Section as Section3,
10546
9922
  SegmentedControl as SegmentedControl2,
10547
- StatusBar as StatusBar4,
9923
+ StatusBar as StatusBar5,
10548
9924
  TextButton as TextButton3,
10549
- Toolbar as Toolbar3,
9925
+ Toolbar as Toolbar4,
10550
9926
  ToolbarGroup as ToolbarGroup3
10551
9927
  } from "@xenosystem/components/chrome";
10552
- import { Fragment as Fragment5, jsx as jsx13, jsxs as jsxs12 } from "react/jsx-runtime";
9928
+ import { Fragment as Fragment6, jsx as jsx13, jsxs as jsxs12 } from "react/jsx-runtime";
10553
9929
  var ANCHOR_BADGE = {
10554
9930
  live: null,
10555
9931
  stale: {
@@ -10589,8 +9965,8 @@ function ThreadCard({
10589
9965
  },
10590
9966
  children: /* @__PURE__ */ jsxs12("div", { style: { padding: "6px 8px", display: "flex", flexDirection: "column", gap: 4 }, children: [
10591
9967
  /* @__PURE__ */ jsxs12("div", { style: { display: "flex", alignItems: "center", gap: 4 }, children: [
10592
- badge ? /* @__PURE__ */ jsx13(Badge3, { tone: badge.tone, title: badge.title, children: badge.label }) : null,
10593
- thread.resolved ? /* @__PURE__ */ jsx13(Badge3, { children: "resolved" }) : null,
9968
+ badge ? /* @__PURE__ */ jsx13(Badge5, { tone: badge.tone, title: badge.title, children: badge.label }) : null,
9969
+ thread.resolved ? /* @__PURE__ */ jsx13(Badge5, { children: "resolved" }) : null,
10594
9970
  /* @__PURE__ */ jsx13("span", { style: { marginLeft: "auto", fontSize: 9, opacity: 0.4 }, children: formatAge(thread.createdAt, now) })
10595
9971
  ] }),
10596
9972
  thread.anchorLabel ? /* @__PURE__ */ jsx13(
@@ -10690,7 +10066,7 @@ function CommentsPanelView({
10690
10066
  const resolved = state.threads.filter((t) => t.thread.resolved);
10691
10067
  return /* @__PURE__ */ jsxs12("div", { style: { display: "flex", flexDirection: "column", height: "100%", minHeight: 0 }, children: [
10692
10068
  /* @__PURE__ */ jsx13(
10693
- Toolbar3,
10069
+ Toolbar4,
10694
10070
  {
10695
10071
  left: /* @__PURE__ */ jsx13(
10696
10072
  SegmentedControl2,
@@ -10729,23 +10105,23 @@ function CommentsPanelView({
10729
10105
  " about.",
10730
10106
  state.filter.includeOrphaned === false ? /* @__PURE__ */ jsx13(TextButton3, { onClick: () => controller.setFilter({ includeOrphaned: true }), children: "Show" }) : null
10731
10107
  ] }) : null,
10732
- /* @__PURE__ */ jsx13(ScrollArea2, { children: state.threads.length === 0 ? state.filteredEmpty ? (
10108
+ /* @__PURE__ */ jsx13(ScrollArea4, { children: state.threads.length === 0 ? state.filteredEmpty ? (
10733
10109
  // NOT "no comments". There are comments; this filter hides them, and telling a
10734
10110
  // reviewer their feedback is gone is worse than telling them nothing.
10735
10111
  /* @__PURE__ */ jsx13(
10736
- EmptyState3,
10112
+ EmptyState5,
10737
10113
  {
10738
10114
  title: "Nothing matches this filter",
10739
10115
  hint: `${state.totals.all} comment${state.totals.all === 1 ? "" : "s"} on this document.`
10740
10116
  }
10741
10117
  )
10742
10118
  ) : /* @__PURE__ */ jsx13(
10743
- EmptyState3,
10119
+ EmptyState5,
10744
10120
  {
10745
10121
  title: "No comments",
10746
10122
  hint: emptyHint ?? "Select something and add a comment."
10747
10123
  }
10748
- ) : /* @__PURE__ */ jsxs12(Fragment5, { children: [
10124
+ ) : /* @__PURE__ */ jsxs12(Fragment6, { children: [
10749
10125
  open.map((view) => /* @__PURE__ */ jsx13(
10750
10126
  ThreadCard,
10751
10127
  {
@@ -10756,7 +10132,7 @@ function CommentsPanelView({
10756
10132
  },
10757
10133
  view.thread.id
10758
10134
  )),
10759
- showResolved && resolved.length > 0 ? /* @__PURE__ */ jsx13(Section2, { title: `Resolved (${resolved.length})`, flush: true, children: resolved.map((view) => /* @__PURE__ */ jsx13(
10135
+ showResolved && resolved.length > 0 ? /* @__PURE__ */ jsx13(Section3, { title: `Resolved (${resolved.length})`, flush: true, children: resolved.map((view) => /* @__PURE__ */ jsx13(
10760
10136
  ThreadCard,
10761
10137
  {
10762
10138
  view,
@@ -10807,7 +10183,7 @@ function CommentsPanelView({
10807
10183
  ) })
10808
10184
  ] }),
10809
10185
  /* @__PURE__ */ jsx13(
10810
- StatusBar4,
10186
+ StatusBar5,
10811
10187
  {
10812
10188
  left: `${state.totals.open} open`,
10813
10189
  right: state.totals.stale > 0 ? `${state.totals.stale} edited` : void 0
@@ -11979,8 +11355,8 @@ var nodegraphManifest = {
11979
11355
 
11980
11356
  // src/edit/nodegraph/react/NodeGraphPanelView.tsx
11981
11357
  import { useCallback as useCallback7, useEffect as useEffect7, useRef as useRef8, useSyncExternalStore as useSyncExternalStore9 } from "react";
11982
- import { EmptyState as EmptyState4, StatusBar as StatusBar5, Toolbar as Toolbar4, ToolbarGroup as ToolbarGroup4 } from "@xenosystem/components/chrome";
11983
- import { Fragment as Fragment6, jsx as jsx14, jsxs as jsxs13 } from "react/jsx-runtime";
11358
+ import { EmptyState as EmptyState6, StatusBar as StatusBar6, Toolbar as Toolbar5, ToolbarGroup as ToolbarGroup4 } from "@xenosystem/components/chrome";
11359
+ import { Fragment as Fragment7, jsx as jsx14, jsxs as jsxs13 } from "react/jsx-runtime";
11984
11360
  var HEADER_H2 = 24;
11985
11361
  var PORT_ROW_H2 = 18;
11986
11362
  function NodeGraphPanelView({ controller }) {
@@ -12061,7 +11437,7 @@ function NodeGraphPanelView({ controller }) {
12061
11437
  const total = state.graph?.nodes.length ?? 0;
12062
11438
  return /* @__PURE__ */ jsxs13("div", { style: SHELL2, children: [
12063
11439
  /* @__PURE__ */ jsx14(
12064
- Toolbar4,
11440
+ Toolbar5,
12065
11441
  {
12066
11442
  right: /* @__PURE__ */ jsxs13(ToolbarGroup4, { end: true, children: [
12067
11443
  /* @__PURE__ */ jsx14("button", { type: "button", style: button2(), onClick: () => controller.fit(false), children: "Fit" }),
@@ -12069,7 +11445,7 @@ function NodeGraphPanelView({ controller }) {
12069
11445
  ] })
12070
11446
  }
12071
11447
  ),
12072
- total === 0 ? /* @__PURE__ */ jsx14(EmptyState4, { title: "Empty graph", hint: "Wire a host graph into this panel's input." }) : /* @__PURE__ */ jsxs13(
11448
+ total === 0 ? /* @__PURE__ */ jsx14(EmptyState6, { title: "Empty graph", hint: "Wire a host graph into this panel's input." }) : /* @__PURE__ */ jsxs13(
12073
11449
  "div",
12074
11450
  {
12075
11451
  ref: containerRef,
@@ -12133,7 +11509,7 @@ function NodeGraphPanelView({ controller }) {
12133
11509
  }
12134
11510
  ),
12135
11511
  /* @__PURE__ */ jsx14(
12136
- StatusBar5,
11512
+ StatusBar6,
12137
11513
  {
12138
11514
  left: `${total} node${total === 1 ? "" : "s"}`,
12139
11515
  right: /* @__PURE__ */ jsxs13("span", { className: "tabular-nums", children: [
@@ -12203,7 +11579,7 @@ function NodeRect({ node, selected, zoom }) {
12203
11579
  children: node.title
12204
11580
  }
12205
11581
  ),
12206
- node.collapsed ? null : /* @__PURE__ */ jsxs13(Fragment6, { children: [
11582
+ node.collapsed ? null : /* @__PURE__ */ jsxs13(Fragment7, { children: [
12207
11583
  node.inputs.map((port, i) => /* @__PURE__ */ jsx14(
12208
11584
  Port,
12209
11585
  {
@@ -13508,22 +12884,22 @@ var treeManifest = {
13508
12884
  // src/edit/tree/react/TreePanelView.tsx
13509
12885
  import { useCallback as useCallback8, useEffect as useEffect8, useRef as useRef9, useState as useState2, useSyncExternalStore as useSyncExternalStore10 } from "react";
13510
12886
  import {
13511
- Badge as Badge4,
13512
- EmptyState as EmptyState5,
12887
+ Badge as Badge6,
12888
+ EmptyState as EmptyState7,
13513
12889
  ErrorState,
13514
- IconButton as IconButton3,
12890
+ IconButton as IconButton5,
13515
12891
  LoadingState,
13516
- Row as Row2,
13517
- ScrollArea as ScrollArea3,
13518
- SearchField as SearchField2,
13519
- StatusBar as StatusBar6,
13520
- Toolbar as Toolbar5,
12892
+ Row as Row3,
12893
+ ScrollArea as ScrollArea5,
12894
+ SearchField as SearchField4,
12895
+ StatusBar as StatusBar7,
12896
+ Toolbar as Toolbar6,
13521
12897
  ToolbarGroup as ToolbarGroup5
13522
12898
  } from "@xenosystem/components/chrome";
13523
12899
  import { computeWindow as computeWindow3 } from "@xenosystem/tree-core";
13524
12900
 
13525
12901
  // src/edit/tree/react/icons.tsx
13526
- import { Fragment as Fragment7, jsx as jsx15, jsxs as jsxs14 } from "react/jsx-runtime";
12902
+ import { Fragment as Fragment8, jsx as jsx15, jsxs as jsxs14 } from "react/jsx-runtime";
13527
12903
  function Svg({ children, size = 11 }) {
13528
12904
  return /* @__PURE__ */ jsx15(
13529
12905
  "svg",
@@ -13576,37 +12952,37 @@ function RefreshGlyph() {
13576
12952
  }
13577
12953
  var PATHS = {
13578
12954
  folder: /* @__PURE__ */ jsx15("path", { d: "M20 20a2 2 0 0 0 2-2V8a2 2 0 0 0-2-2h-7.9a2 2 0 0 1-1.69-.9L9.6 3.9A2 2 0 0 0 7.93 3H4a2 2 0 0 0-2 2v13a2 2 0 0 0 2 2Z" }),
13579
- file: /* @__PURE__ */ jsxs14(Fragment7, { children: [
12955
+ file: /* @__PURE__ */ jsxs14(Fragment8, { children: [
13580
12956
  /* @__PURE__ */ jsx15("path", { d: "M15 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V7Z" }),
13581
12957
  /* @__PURE__ */ jsx15("path", { d: "M14 2v4a2 2 0 0 0 2 2h4" })
13582
12958
  ] }),
13583
- "folder-tree": /* @__PURE__ */ jsxs14(Fragment7, { children: [
12959
+ "folder-tree": /* @__PURE__ */ jsxs14(Fragment8, { children: [
13584
12960
  /* @__PURE__ */ jsx15("path", { d: "M20 10a1 1 0 0 0 1-1V6a1 1 0 0 0-1-1h-2.5a1 1 0 0 1-.8-.4l-.9-1.2A1 1 0 0 0 15 3h-2a1 1 0 0 0-1 1v5a1 1 0 0 0 1 1Z" }),
13585
12961
  /* @__PURE__ */ jsx15("path", { d: "M20 21a1 1 0 0 0 1-1v-3a1 1 0 0 0-1-1h-2.5a1 1 0 0 1-.8-.4l-.9-1.2a1 1 0 0 0-.8-.4h-2a1 1 0 0 0-1 1v5a1 1 0 0 0 1 1Z" }),
13586
12962
  /* @__PURE__ */ jsx15("path", { d: "M3 5a2 2 0 0 0 2 2h3" }),
13587
12963
  /* @__PURE__ */ jsx15("path", { d: "M3 3v13a2 2 0 0 0 2 2h3" })
13588
12964
  ] }),
13589
- box: /* @__PURE__ */ jsxs14(Fragment7, { children: [
12965
+ box: /* @__PURE__ */ jsxs14(Fragment8, { children: [
13590
12966
  /* @__PURE__ */ jsx15("path", { d: "M21 8a2 2 0 0 0-1-1.73l-7-4a2 2 0 0 0-2 0l-7 4A2 2 0 0 0 3 8v8a2 2 0 0 0 1 1.73l7 4a2 2 0 0 0 2 0l7-4A2 2 0 0 0 21 16Z" }),
13591
12967
  /* @__PURE__ */ jsx15("path", { d: "m3.3 7 8.7 5 8.7-5" }),
13592
12968
  /* @__PURE__ */ jsx15("path", { d: "M12 22V12" })
13593
12969
  ] }),
13594
12970
  component: /* @__PURE__ */ jsx15("path", { d: "m12 2 4 4-4 4-4-4Zm0 12 4 4-4 4-4-4ZM2 12l4-4 4 4-4 4Zm12 0 4-4 4 4-4 4Z" }),
13595
- "file-text": /* @__PURE__ */ jsxs14(Fragment7, { children: [
12971
+ "file-text": /* @__PURE__ */ jsxs14(Fragment8, { children: [
13596
12972
  /* @__PURE__ */ jsx15("path", { d: "M15 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V7Z" }),
13597
12973
  /* @__PURE__ */ jsx15("path", { d: "M14 2v4a2 2 0 0 0 2 2h4" }),
13598
12974
  /* @__PURE__ */ jsx15("path", { d: "M8 13h8M8 17h5" })
13599
12975
  ] }),
13600
- heading: /* @__PURE__ */ jsx15(Fragment7, { children: /* @__PURE__ */ jsx15("path", { d: "M6 4v16M18 4v16M6 12h12" }) }),
13601
- bot: /* @__PURE__ */ jsxs14(Fragment7, { children: [
12976
+ heading: /* @__PURE__ */ jsx15(Fragment8, { children: /* @__PURE__ */ jsx15("path", { d: "M6 4v16M18 4v16M6 12h12" }) }),
12977
+ bot: /* @__PURE__ */ jsxs14(Fragment8, { children: [
13602
12978
  /* @__PURE__ */ jsx15("rect", { x: "3", y: "8", width: "18", height: "12", rx: "2" }),
13603
12979
  /* @__PURE__ */ jsx15("path", { d: "M12 4v4M8 14h.01M16 14h.01" })
13604
12980
  ] }),
13605
- link: /* @__PURE__ */ jsxs14(Fragment7, { children: [
12981
+ link: /* @__PURE__ */ jsxs14(Fragment8, { children: [
13606
12982
  /* @__PURE__ */ jsx15("path", { d: "M10 13a5 5 0 0 0 7.5.5l3-3a5 5 0 0 0-7-7l-1.8 1.7" }),
13607
12983
  /* @__PURE__ */ jsx15("path", { d: "M14 11a5 5 0 0 0-7.5-.5l-3 3a5 5 0 0 0 7 7l1.8-1.7" })
13608
12984
  ] }),
13609
- "link-2-off": /* @__PURE__ */ jsxs14(Fragment7, { children: [
12985
+ "link-2-off": /* @__PURE__ */ jsxs14(Fragment8, { children: [
13610
12986
  /* @__PURE__ */ jsx15("path", { d: "M9 17H7A5 5 0 0 1 7 7" }),
13611
12987
  /* @__PURE__ */ jsx15("path", { d: "M15 7h2a5 5 0 0 1 4 8" }),
13612
12988
  /* @__PURE__ */ jsx15("path", { d: "M8 12h4" }),
@@ -13619,7 +12995,7 @@ function TreeIcon({ name, size = 11 }) {
13619
12995
  }
13620
12996
 
13621
12997
  // src/edit/tree/react/TreePanelView.tsx
13622
- import { Fragment as Fragment8, jsx as jsx16, jsxs as jsxs15 } from "react/jsx-runtime";
12998
+ import { Fragment as Fragment9, jsx as jsx16, jsxs as jsxs15 } from "react/jsx-runtime";
13623
12999
  function TreePanelView({
13624
13000
  controller,
13625
13001
  rowHeight = 24,
@@ -13651,7 +13027,7 @@ function TreePanelView({
13651
13027
  const sourceState = source?.sourceState ?? "idle";
13652
13028
  const body = (() => {
13653
13029
  if (!source || sourceState === "idle") {
13654
- return /* @__PURE__ */ jsx16(EmptyState5, { title: "No source", hint: emptyHint ?? "Connect a source to browse it." });
13030
+ return /* @__PURE__ */ jsx16(EmptyState7, { title: "No source", hint: emptyHint ?? "Connect a source to browse it." });
13655
13031
  }
13656
13032
  if (sourceState === "loading" && state.rows.length === 0) {
13657
13033
  return /* @__PURE__ */ jsx16(LoadingState, { label: source.sourceMessage ?? "Loading\u2026" });
@@ -13668,8 +13044,8 @@ function TreePanelView({
13668
13044
  );
13669
13045
  }
13670
13046
  if (state.rows.length === 0) {
13671
- return state.filter ? /* @__PURE__ */ jsx16(EmptyState5, { title: "No matches", hint: `Nothing matches \u201C${state.filter}\u201D.` }) : /* @__PURE__ */ jsx16(
13672
- EmptyState5,
13047
+ return state.filter ? /* @__PURE__ */ jsx16(EmptyState7, { title: "No matches", hint: `Nothing matches \u201C${state.filter}\u201D.` }) : /* @__PURE__ */ jsx16(
13048
+ EmptyState7,
13673
13049
  {
13674
13050
  title: "Nothing here",
13675
13051
  hint: emptyHint ?? source.sourceMessage ?? "This source has no items yet."
@@ -13684,7 +13060,7 @@ function TreePanelView({
13684
13060
  overscan
13685
13061
  });
13686
13062
  const slice = state.rows.slice(window2.startIndex, window2.endIndex);
13687
- return /* @__PURE__ */ jsx16(ScrollArea3, { children: /* @__PURE__ */ jsx16(
13063
+ return /* @__PURE__ */ jsx16(ScrollArea5, { children: /* @__PURE__ */ jsx16(
13688
13064
  "div",
13689
13065
  {
13690
13066
  ref: scrollRef,
@@ -13716,10 +13092,10 @@ function TreePanelView({
13716
13092
  })();
13717
13093
  return /* @__PURE__ */ jsxs15("div", { style: { display: "flex", flexDirection: "column", height: "100%", minHeight: 0 }, children: [
13718
13094
  /* @__PURE__ */ jsx16(
13719
- Toolbar5,
13095
+ Toolbar6,
13720
13096
  {
13721
13097
  left: showSearch ? /* @__PURE__ */ jsx16(
13722
- SearchField2,
13098
+ SearchField4,
13723
13099
  {
13724
13100
  value: state.filter,
13725
13101
  onChange: (term) => controller.setFilter(term),
@@ -13727,22 +13103,22 @@ function TreePanelView({
13727
13103
  }
13728
13104
  ) : void 0,
13729
13105
  right: /* @__PURE__ */ jsxs15(ToolbarGroup5, { end: true, children: [
13730
- /* @__PURE__ */ jsx16(IconButton3, { icon: /* @__PURE__ */ jsx16(ExpandGlyph, {}), label: "Expand all", onClick: () => controller.expandAll() }),
13106
+ /* @__PURE__ */ jsx16(IconButton5, { icon: /* @__PURE__ */ jsx16(ExpandGlyph, {}), label: "Expand all", onClick: () => controller.expandAll() }),
13731
13107
  /* @__PURE__ */ jsx16(
13732
- IconButton3,
13108
+ IconButton5,
13733
13109
  {
13734
13110
  icon: /* @__PURE__ */ jsx16(CollapseGlyph, {}),
13735
13111
  label: "Collapse all",
13736
13112
  onClick: () => controller.collapseAll()
13737
13113
  }
13738
13114
  ),
13739
- /* @__PURE__ */ jsx16(IconButton3, { icon: /* @__PURE__ */ jsx16(RefreshGlyph, {}), label: "Refresh", onClick: () => controller.refresh() })
13115
+ /* @__PURE__ */ jsx16(IconButton5, { icon: /* @__PURE__ */ jsx16(RefreshGlyph, {}), label: "Refresh", onClick: () => controller.refresh() })
13740
13116
  ] })
13741
13117
  }
13742
13118
  ),
13743
13119
  body,
13744
13120
  /* @__PURE__ */ jsx16(
13745
- StatusBar6,
13121
+ StatusBar7,
13746
13122
  {
13747
13123
  left: `${state.rows.length} item${state.rows.length === 1 ? "" : "s"}`,
13748
13124
  right: state.selection.length > 0 ? `${state.selection.length} selected` : void 0
@@ -13801,7 +13177,7 @@ function TreeRowView({
13801
13177
  },
13802
13178
  title: drop?.reason,
13803
13179
  children: /* @__PURE__ */ jsx16(
13804
- Row2,
13180
+ Row3,
13805
13181
  {
13806
13182
  role: "treeitem",
13807
13183
  "aria-expanded": row.container ? row.expanded : void 0,
@@ -13836,7 +13212,7 @@ function TreeRowView({
13836
13212
  onPointerUp: () => {
13837
13213
  if (state.drag) controller.endDrag();
13838
13214
  },
13839
- icon: /* @__PURE__ */ jsxs15(Fragment8, { children: [
13215
+ icon: /* @__PURE__ */ jsxs15(Fragment9, { children: [
13840
13216
  twisty,
13841
13217
  /* @__PURE__ */ jsx16(NodeIcon, { icon: node.icon ?? defaultIconFor(node.kind) })
13842
13218
  ] }),
@@ -13866,15 +13242,15 @@ function TreeRowView({
13866
13242
  }
13867
13243
  ) : node.label,
13868
13244
  meta: /* @__PURE__ */ jsx16(ChildStateChip, { row, controller }),
13869
- trailing: /* @__PURE__ */ jsxs15(Fragment8, { children: [
13245
+ trailing: /* @__PURE__ */ jsxs15(Fragment9, { children: [
13870
13246
  columns?.map((columnId) => /* @__PURE__ */ jsx16("span", { style: { opacity: 0.7, fontVariantNumeric: "tabular-nums" }, children: node.columns?.[columnId] ?? "" }, columnId)),
13871
13247
  node.glyphs?.map((glyph) => /* @__PURE__ */ jsx16("span", { title: glyph.title, style: { display: "flex", opacity: 0.7 }, children: /* @__PURE__ */ jsx16(NodeIcon, { icon: glyph.icon }) }, glyph.id)),
13872
13248
  node.badges?.map((badge) => (
13873
13249
  // Opaque: the host formatted the text, the panel only places it.
13874
- /* @__PURE__ */ jsx16(Badge4, { tone: badge.tone, className: badge.title ? void 0 : void 0, children: badge.text }, badge.id)
13250
+ /* @__PURE__ */ jsx16(Badge6, { tone: badge.tone, className: badge.title ? void 0 : void 0, children: badge.text }, badge.id)
13875
13251
  )),
13876
13252
  node.actions?.map((action) => /* @__PURE__ */ jsx16(
13877
- IconButton3,
13253
+ IconButton5,
13878
13254
  {
13879
13255
  size: "sm",
13880
13256
  icon: /* @__PURE__ */ jsx16(NodeIcon, { icon: action.icon }),
@@ -13900,7 +13276,7 @@ function ChildStateChip({
13900
13276
  }
13901
13277
  if (row.childState === "error") {
13902
13278
  const error = row.node.error;
13903
- return /* @__PURE__ */ jsx16(Badge4, { tone: "error", children: error?.code === "denied" ? "no access" : error?.code ?? "failed" });
13279
+ return /* @__PURE__ */ jsx16(Badge6, { tone: "error", children: error?.code === "denied" ? "no access" : error?.code ?? "failed" });
13904
13280
  }
13905
13281
  if (row.node.hasMore && row.expanded) {
13906
13282
  return /* @__PURE__ */ jsx16(
@@ -13917,7 +13293,7 @@ function ChildStateChip({
13917
13293
  );
13918
13294
  }
13919
13295
  if (row.node.truncatedAt !== void 0) {
13920
- return /* @__PURE__ */ jsx16(Badge4, { tone: "warning", children: `first ${row.node.truncatedAt}` });
13296
+ return /* @__PURE__ */ jsx16(Badge6, { tone: "warning", children: `first ${row.node.truncatedAt}` });
13921
13297
  }
13922
13298
  if (row.expanded && isEmptyContainer(row.node)) {
13923
13299
  return /* @__PURE__ */ jsx16("span", { style: { opacity: 0.4, fontSize: 9 }, children: "empty" });