@xenosystem/blocks 0.11.2 → 0.11.3

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.
@@ -1482,6 +1482,12 @@ declare function ariaSliderProps(field: XenoInspectorField, value: number | null
1482
1482
  interface InspectorPanelViewProps {
1483
1483
  controller: InspectorPanelController;
1484
1484
  }
1485
+ /**
1486
+ * The inspector shell over the chrome family: search, the target chip, the multi-select banner,
1487
+ * sections with an enable switch / badge / actions / add menu, and one `Field` row per property with
1488
+ * the keyframe cluster leading and bind-token / reset / easing trailing. The keyboard model and every
1489
+ * intent stay in the controller.
1490
+ */
1485
1491
  declare function InspectorPanelView({ controller }: InspectorPanelViewProps): ReactElement;
1486
1492
 
1487
1493
  /**
@@ -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
- ] })
3711
- ] });
3712
- }
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
- ] })
3432
+ sections.length === 0 ? /* @__PURE__ */ jsx6(EmptyState, { title: targets.length === 0 ? "Nothing selected" : "No properties" }) : null
3433
+ ] }) })
3779
3434
  ] });
3780
3435
  }
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({
@@ -5055,13 +4627,13 @@ function HistoryPanelView({ controller }) {
5055
4627
  },
5056
4628
  [controller]
5057
4629
  );
5058
- return /* @__PURE__ */ jsxs7("div", { style: S3.root, className: "xeno-history-panel", children: [
5059
- /* @__PURE__ */ jsxs7("div", { style: S3.header, children: [
4630
+ return /* @__PURE__ */ jsxs7("div", { style: S2.root, className: "xeno-history-panel", children: [
4631
+ /* @__PURE__ */ jsxs7("div", { style: S2.header, children: [
5060
4632
  /* @__PURE__ */ jsx8(
5061
4633
  "button",
5062
4634
  {
5063
4635
  type: "button",
5064
- style: { ...S3.iconBtn, opacity: controller.canUndo() ? 0.8 : 0.25 },
4636
+ style: { ...S2.iconBtn, opacity: controller.canUndo() ? 0.8 : 0.25 },
5065
4637
  disabled: !controller.canUndo(),
5066
4638
  onClick: () => controller.undo(),
5067
4639
  title: "Undo",
@@ -5073,7 +4645,7 @@ function HistoryPanelView({ controller }) {
5073
4645
  "button",
5074
4646
  {
5075
4647
  type: "button",
5076
- style: { ...S3.iconBtn, opacity: controller.canRedo() ? 0.8 : 0.25 },
4648
+ style: { ...S2.iconBtn, opacity: controller.canRedo() ? 0.8 : 0.25 },
5077
4649
  disabled: !controller.canRedo(),
5078
4650
  onClick: () => controller.redo(),
5079
4651
  title: "Redo",
@@ -5088,12 +4660,12 @@ function HistoryPanelView({ controller }) {
5088
4660
  value: controller.getFilter(),
5089
4661
  placeholder: "Search history",
5090
4662
  onChange: (e) => controller.setFilter(e.target.value),
5091
- style: S3.search,
4663
+ style: S2.search,
5092
4664
  "aria-label": "Search history",
5093
4665
  spellCheck: false
5094
4666
  }
5095
4667
  ),
5096
- /* @__PURE__ */ jsxs7("span", { style: S3.counter, children: [
4668
+ /* @__PURE__ */ jsxs7("span", { style: S2.counter, children: [
5097
4669
  controller.getAppliedCount(),
5098
4670
  " / ",
5099
4671
  controller.getTotalCount()
@@ -5102,7 +4674,7 @@ function HistoryPanelView({ controller }) {
5102
4674
  "button",
5103
4675
  {
5104
4676
  type: "button",
5105
- style: S3.iconBtn,
4677
+ style: S2.iconBtn,
5106
4678
  onClick: () => controller.requestClear(),
5107
4679
  title: "Clear history",
5108
4680
  "aria-label": "Clear history",
@@ -5110,19 +4682,19 @@ function HistoryPanelView({ controller }) {
5110
4682
  }
5111
4683
  )
5112
4684
  ] }),
5113
- controller.isConfirmingClear() && /* @__PURE__ */ jsxs7("div", { style: S3.confirmBar, role: "alertdialog", "aria-label": "Confirm clear history", children: [
4685
+ controller.isConfirmingClear() && /* @__PURE__ */ jsxs7("div", { style: S2.confirmBar, role: "alertdialog", "aria-label": "Confirm clear history", children: [
5114
4686
  /* @__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" })
4687
+ /* @__PURE__ */ jsxs7("span", { style: S2.confirmActions, children: [
4688
+ /* @__PURE__ */ jsx8("button", { type: "button", style: S2.textBtn, onClick: () => controller.confirmClearNow(), children: "Clear" }),
4689
+ /* @__PURE__ */ jsx8("button", { type: "button", style: S2.textBtnDim, onClick: () => controller.cancelClear(), children: "Cancel" })
5118
4690
  ] })
5119
4691
  ] }),
5120
- controller.isPruned() && /* @__PURE__ */ jsx8("div", { style: S3.prunedNote, children: "Earlier history discarded (limit reached)" }),
4692
+ controller.isPruned() && /* @__PURE__ */ jsx8("div", { style: S2.prunedNote, children: "Earlier history discarded (limit reached)" }),
5121
4693
  /* @__PURE__ */ jsxs7(
5122
4694
  "div",
5123
4695
  {
5124
4696
  ref: scrollRef,
5125
- style: S3.scroll,
4697
+ style: S2.scroll,
5126
4698
  onScroll,
5127
4699
  onKeyDown,
5128
4700
  onMouseLeave: () => controller.setHovered(null),
@@ -5140,17 +4712,17 @@ function HistoryPanelView({ controller }) {
5140
4712
  },
5141
4713
  row.entryId ?? "__original__"
5142
4714
  )) }) }),
5143
- rows.length === 0 && /* @__PURE__ */ jsx8("div", { style: S3.empty, children: "No history" })
4715
+ rows.length === 0 && /* @__PURE__ */ jsx8("div", { style: S2.empty, children: "No history" })
5144
4716
  ]
5145
4717
  }
5146
4718
  ),
5147
- memory && /* @__PURE__ */ jsxs7("div", { style: S3.footer, children: [
4719
+ memory && /* @__PURE__ */ jsxs7("div", { style: S2.footer, children: [
5148
4720
  /* @__PURE__ */ jsxs7("span", { children: [
5149
4721
  memory.usedMB.toFixed(1),
5150
4722
  " MB",
5151
4723
  memory.limitMB ? ` / ${memory.limitMB} MB` : ""
5152
4724
  ] }),
5153
- memory.onDiskCount !== void 0 && /* @__PURE__ */ jsxs7("span", { style: S3.dim, children: [
4725
+ memory.onDiskCount !== void 0 && /* @__PURE__ */ jsxs7("span", { style: S2.dim, children: [
5154
4726
  memory.onDiskCount,
5155
4727
  " on disk"
5156
4728
  ] })
@@ -5163,7 +4735,7 @@ function HistoryRowView({ row, controller, rowHeight, focused }) {
5163
4735
  const failed = entry?.status === "failed";
5164
4736
  const jumpable = controller.isJumpAllowed() && entry?.caps?.jumpable !== false;
5165
4737
  const style = {
5166
- ...S3.row,
4738
+ ...S2.row,
5167
4739
  height: rowHeight,
5168
4740
  background: row.current ? "var(--xeno-border)" : "transparent",
5169
4741
  // FUTURE rows (after the cursor) are dimmed + struck through — the redoable region.
@@ -5187,22 +4759,22 @@ function HistoryRowView({ row, controller, rowHeight, focused }) {
5187
4759
  },
5188
4760
  title: row.label,
5189
4761
  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 }),
4762
+ controller.areIconsShown() && /* @__PURE__ */ jsx8("span", { style: S2.iconCell, children: /* @__PURE__ */ jsx8(EntryIcon, { name: row.kind === "original" ? "original" : controller.getIconName(entry?.kind) }) }),
4763
+ /* @__PURE__ */ jsx8("span", { style: S2.ordinal, children: row.kind === "entry" ? row.ordinal : "" }),
4764
+ /* @__PURE__ */ jsx8("span", { style: S2.label, children: row.label }),
5193
4765
  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: [
4766
+ failed && /* @__PURE__ */ jsx8("span", { style: S2.failed, children: "failed" }),
4767
+ controller.isSourceShown() && entry?.source && entry.source !== "user" && /* @__PURE__ */ jsx8("span", { style: S2.badge, title: `Source: ${entry.source}`, children: entry.source === "agent" ? "AI" : "S" }),
4768
+ entry?.coalesced && entry.coalesced > 1 && /* @__PURE__ */ jsxs7("span", { style: S2.badge, title: `${entry.coalesced} actions coalesced`, children: [
5197
4769
  "\xD7",
5198
4770
  entry.coalesced
5199
4771
  ] }),
5200
- controller.areTimestampsShown() && entry?.at !== void 0 && /* @__PURE__ */ jsx8("span", { style: S3.time, children: formatTime(entry.at) }),
4772
+ controller.areTimestampsShown() && entry?.at !== void 0 && /* @__PURE__ */ jsx8("span", { style: S2.time, children: formatTime(entry.at) }),
5201
4773
  pending && /* @__PURE__ */ jsx8(
5202
4774
  "button",
5203
4775
  {
5204
4776
  type: "button",
5205
- style: S3.iconBtn,
4777
+ style: S2.iconBtn,
5206
4778
  onClick: (e) => {
5207
4779
  e.stopPropagation();
5208
4780
  controller.cancelPending(entry?.id);
@@ -5221,7 +4793,7 @@ function formatTime(at) {
5221
4793
  if (Number.isNaN(date.getTime())) return typeof at === "string" ? at : "";
5222
4794
  return date.toLocaleTimeString(void 0, { hour: "2-digit", minute: "2-digit" });
5223
4795
  }
5224
- var S3 = {
4796
+ var S2 = {
5225
4797
  root: {
5226
4798
  display: "flex",
5227
4799
  flexDirection: "column",
@@ -6543,14 +6115,14 @@ function ColorPanelView({ controller }) {
6543
6115
  );
6544
6116
  const componentLabels = COMPONENT_LABELS[space];
6545
6117
  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: [
6118
+ return /* @__PURE__ */ jsxs8("div", { style: S3.root, className: "xeno-color-panel", children: [
6119
+ controller.getChannelsMode() === "fg-bg" && /* @__PURE__ */ jsxs8("div", { style: S3.channels, children: [
6548
6120
  /* @__PURE__ */ jsx9(
6549
6121
  "button",
6550
6122
  {
6551
6123
  type: "button",
6552
6124
  "aria-pressed": controller.getActiveChannel() === "fg",
6553
- style: { ...S4.chip, ...controller.getActiveChannel() === "fg" ? S4.chipActive : null, background: value.hex },
6125
+ style: { ...S3.chip, ...controller.getActiveChannel() === "fg" ? S3.chipActive : null, background: value.hex },
6554
6126
  onClick: () => controller.setChannel("fg"),
6555
6127
  title: "Foreground"
6556
6128
  }
@@ -6559,7 +6131,7 @@ function ColorPanelView({ controller }) {
6559
6131
  "button",
6560
6132
  {
6561
6133
  type: "button",
6562
- style: S4.swap,
6134
+ style: S3.swap,
6563
6135
  onClick: () => controller.swapChannels(),
6564
6136
  title: "Swap FG/BG (X)",
6565
6137
  children: "\u21C4"
@@ -6570,20 +6142,20 @@ function ColorPanelView({ controller }) {
6570
6142
  {
6571
6143
  type: "button",
6572
6144
  "aria-pressed": controller.getActiveChannel() === "bg",
6573
- style: { ...S4.chip, ...controller.getActiveChannel() === "bg" ? S4.chipActive : null },
6145
+ style: { ...S3.chip, ...controller.getActiveChannel() === "bg" ? S3.chipActive : null },
6574
6146
  onClick: () => controller.setChannel("bg"),
6575
6147
  title: "Background"
6576
6148
  }
6577
6149
  )
6578
6150
  ] }),
6579
- /* @__PURE__ */ jsxs8("div", { style: S4.pickerRow, children: [
6151
+ /* @__PURE__ */ jsxs8("div", { style: S3.pickerRow, children: [
6580
6152
  /* @__PURE__ */ jsx9(
6581
6153
  "canvas",
6582
6154
  {
6583
6155
  ref: spectrumRef,
6584
6156
  width: 200,
6585
6157
  height: 140,
6586
- style: { ...S4.spectrum, ...bound ? S4.disabled : null },
6158
+ style: { ...S3.spectrum, ...bound ? S3.disabled : null },
6587
6159
  onPointerDown: (e) => onSpectrumPointer(e, true),
6588
6160
  onPointerMove: (e) => onSpectrumPointer(e, false),
6589
6161
  onPointerUp: endDrag
@@ -6595,7 +6167,7 @@ function ColorPanelView({ controller }) {
6595
6167
  ref: hueRef,
6596
6168
  width: 14,
6597
6169
  height: 140,
6598
- style: { ...S4.strip, ...bound ? S4.disabled : null },
6170
+ style: { ...S3.strip, ...bound ? S3.disabled : null },
6599
6171
  onPointerDown: (e) => onHuePointer(e, true),
6600
6172
  onPointerMove: (e) => onHuePointer(e, false),
6601
6173
  onPointerUp: endDrag
@@ -6607,20 +6179,20 @@ function ColorPanelView({ controller }) {
6607
6179
  ref: alphaRef,
6608
6180
  width: 14,
6609
6181
  height: 140,
6610
- style: { ...S4.strip, ...bound ? S4.disabled : null },
6182
+ style: { ...S3.strip, ...bound ? S3.disabled : null },
6611
6183
  onPointerDown: (e) => onAlphaPointer(e, true),
6612
6184
  onPointerMove: (e) => onAlphaPointer(e, false),
6613
6185
  onPointerUp: endDrag
6614
6186
  }
6615
6187
  )
6616
6188
  ] }),
6617
- /* @__PURE__ */ jsxs8("div", { style: S4.controls, children: [
6189
+ /* @__PURE__ */ jsxs8("div", { style: S3.controls, children: [
6618
6190
  /* @__PURE__ */ jsx9(
6619
6191
  "select",
6620
6192
  {
6621
6193
  value: space,
6622
6194
  onChange: (e) => controller.setSpace(e.target.value),
6623
- style: S4.select,
6195
+ style: S3.select,
6624
6196
  "aria-label": "Color model",
6625
6197
  children: EDIT_SPACES.map((s) => /* @__PURE__ */ jsx9("option", { value: s, children: SPACE_LABEL[s] }, s))
6626
6198
  }
@@ -6632,12 +6204,12 @@ function ColorPanelView({ controller }) {
6632
6204
  value: value.hex,
6633
6205
  onChange: onHexInput,
6634
6206
  disabled: bound,
6635
- style: S4.hexInput,
6207
+ style: S3.hexInput,
6636
6208
  "aria-label": "Hex",
6637
6209
  spellCheck: false
6638
6210
  }
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 }),
6211
+ ) : /* @__PURE__ */ jsx9("div", { style: S3.componentRow, children: (componentLabels ?? []).map((label, i) => /* @__PURE__ */ jsxs8("label", { style: S3.componentField, children: [
6212
+ /* @__PURE__ */ jsx9("span", { style: S3.componentLabel, children: label }),
6641
6213
  /* @__PURE__ */ jsx9(
6642
6214
  "input",
6643
6215
  {
@@ -6645,12 +6217,12 @@ function ColorPanelView({ controller }) {
6645
6217
  value: roundForSpace(space, i, comps[i] ?? 0),
6646
6218
  onChange: (e) => onComponentInput(i, e.target.value),
6647
6219
  disabled: bound,
6648
- style: S4.numInput
6220
+ style: S3.numInput
6649
6221
  }
6650
6222
  )
6651
6223
  ] }, label)) }),
6652
- controller.isAlphaShown() && /* @__PURE__ */ jsxs8("label", { style: S4.alphaField, children: [
6653
- /* @__PURE__ */ jsx9("span", { style: S4.componentLabel, children: "A" }),
6224
+ controller.isAlphaShown() && /* @__PURE__ */ jsxs8("label", { style: S3.alphaField, children: [
6225
+ /* @__PURE__ */ jsx9("span", { style: S3.componentLabel, children: "A" }),
6654
6226
  /* @__PURE__ */ jsx9(
6655
6227
  "input",
6656
6228
  {
@@ -6660,20 +6232,20 @@ function ColorPanelView({ controller }) {
6660
6232
  value: Math.round(value.alpha * 100),
6661
6233
  onChange: (e) => controller.setAlpha(Number(e.target.value) / 100, { commit: true }),
6662
6234
  disabled: bound,
6663
- style: S4.numInput
6235
+ style: S3.numInput
6664
6236
  }
6665
6237
  )
6666
6238
  ] }),
6667
- /* @__PURE__ */ jsx9("button", { type: "button", style: S4.iconBtn, title: "Pick from screen", onClick: () => controller.requestEyedropper(), children: "\u29BF" })
6239
+ /* @__PURE__ */ jsx9("button", { type: "button", style: S3.iconBtn, title: "Pick from screen", onClick: () => controller.requestEyedropper(), children: "\u29BF" })
6668
6240
  ] }),
6669
- controller.hasTokens() && /* @__PURE__ */ jsxs8("div", { style: S4.tokenRow, children: [
6670
- /* @__PURE__ */ jsx9("span", { style: S4.componentLabel, children: "Token" }),
6241
+ controller.hasTokens() && /* @__PURE__ */ jsxs8("div", { style: S3.tokenRow, children: [
6242
+ /* @__PURE__ */ jsx9("span", { style: S3.componentLabel, children: "Token" }),
6671
6243
  /* @__PURE__ */ jsxs8(
6672
6244
  "select",
6673
6245
  {
6674
6246
  value: controller.getBoundTokenId() ?? "",
6675
6247
  onChange: (e) => e.target.value ? controller.bindToken(e.target.value) : controller.unbindToken(),
6676
- style: S4.select,
6248
+ style: S3.select,
6677
6249
  "aria-label": "Bind token",
6678
6250
  children: [
6679
6251
  /* @__PURE__ */ jsx9("option", { value: "", children: "\u2014 raw \u2014" }),
@@ -6681,17 +6253,17 @@ function ColorPanelView({ controller }) {
6681
6253
  ]
6682
6254
  }
6683
6255
  ),
6684
- bound && /* @__PURE__ */ jsx9("button", { type: "button", style: S4.textBtn, onClick: () => controller.unbindToken(), children: "Unbind" })
6256
+ bound && /* @__PURE__ */ jsx9("button", { type: "button", style: S3.textBtn, onClick: () => controller.unbindToken(), children: "Unbind" })
6685
6257
  ] }),
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" })
6258
+ /* @__PURE__ */ jsxs8("div", { style: S3.swatchHeader, children: [
6259
+ /* @__PURE__ */ jsx9("span", { style: S3.sectionLabel, children: "Swatches" }),
6260
+ /* @__PURE__ */ jsx9("button", { type: "button", style: S3.textBtn, onClick: () => void controller.addSwatch(), children: "+ Save" })
6689
6261
  ] }),
6690
- /* @__PURE__ */ jsx9("div", { style: S4.swatchGrid, children: controller.getSwatches().map((hex) => /* @__PURE__ */ jsx9(
6262
+ /* @__PURE__ */ jsx9("div", { style: S3.swatchGrid, children: controller.getSwatches().map((hex) => /* @__PURE__ */ jsx9(
6691
6263
  "button",
6692
6264
  {
6693
6265
  type: "button",
6694
- style: { ...S4.swatch, background: hex },
6266
+ style: { ...S3.swatch, background: hex },
6695
6267
  title: hex,
6696
6268
  onClick: () => controller.selectColor(hex),
6697
6269
  onContextMenu: (e) => {
@@ -6702,12 +6274,12 @@ function ColorPanelView({ controller }) {
6702
6274
  hex
6703
6275
  )) }),
6704
6276
  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(
6277
+ /* @__PURE__ */ jsx9("div", { style: S3.sectionLabel, children: "Recent" }),
6278
+ /* @__PURE__ */ jsx9("div", { style: S3.swatchGrid, children: controller.getRecent().map((hex, i) => /* @__PURE__ */ jsx9(
6707
6279
  "button",
6708
6280
  {
6709
6281
  type: "button",
6710
- style: { ...S4.swatch, background: hex },
6282
+ style: { ...S3.swatch, background: hex },
6711
6283
  title: hex,
6712
6284
  onClick: () => controller.selectColor(hex)
6713
6285
  },
@@ -6723,7 +6295,7 @@ function roundForSpace(space, index, v) {
6723
6295
  if (space === "oklch") return Math.round(v * 10) / 10;
6724
6296
  return Math.round(v);
6725
6297
  }
6726
- var S4 = {
6298
+ var S3 = {
6727
6299
  root: { display: "flex", flexDirection: "column", gap: 8, padding: 8, fontSize: 11, color: "var(--xeno-text)", background: "var(--xeno-canvas)", minWidth: 232, userSelect: "none" },
6728
6300
  channels: { display: "flex", alignItems: "center", gap: 6 },
6729
6301
  chip: { width: 28, height: 20, borderRadius: 2, border: "1px solid var(--xeno-control)", background: "var(--xeno-canvas)", cursor: "pointer", padding: 0 },
@@ -8020,7 +7592,7 @@ var curveManifest = {
8020
7592
 
8021
7593
  // src/edit/curve/react/CurvePanelView.tsx
8022
7594
  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";
7595
+ import { EmptyState as EmptyState2, StatusBar, Toolbar, ToolbarGroup } from "@xenosystem/components/chrome";
8024
7596
  import { formatTick } from "@xenosystem/time-core";
8025
7597
  import { Fragment as Fragment4, jsx as jsx10, jsxs as jsxs9 } from "react/jsx-runtime";
8026
7598
  var DASHES = ["none", "4 2", "1 2", "6 2 1 2"];
@@ -8128,7 +7700,7 @@ function CurvePanelView({ controller, showPresets = true }) {
8128
7700
  )) })
8129
7701
  }
8130
7702
  ) : null,
8131
- channels.length === 0 ? /* @__PURE__ */ jsx10(EmptyState, { title: "No curves", hint: "Wire an animated property into this panel's input." }) : /* @__PURE__ */ jsx10(
7703
+ channels.length === 0 ? /* @__PURE__ */ jsx10(EmptyState2, { title: "No curves", hint: "Wire an animated property into this panel's input." }) : /* @__PURE__ */ jsx10(
8132
7704
  "div",
8133
7705
  {
8134
7706
  ref: containerRef,
@@ -8897,7 +8469,7 @@ var viewportManifest = {
8897
8469
 
8898
8470
  // src/edit/viewport/react/ViewportPanelView.tsx
8899
8471
  import { useEffect as useEffect6, useRef as useRef7, useSyncExternalStore as useSyncExternalStore6 } from "react";
8900
- import { Badge, StatusBar as StatusBar2 } from "@xenosystem/components/chrome";
8472
+ import { Badge as Badge2, StatusBar as StatusBar2 } from "@xenosystem/components/chrome";
8901
8473
  import { jsx as jsx11, jsxs as jsxs10 } from "react/jsx-runtime";
8902
8474
  var SLOT_STYLE = {
8903
8475
  "top-left": { top: 8, left: 8 },
@@ -9007,7 +8579,7 @@ function ViewportPanelView({
9007
8579
  fontSize: 11,
9008
8580
  zIndex: 20
9009
8581
  },
9010
- children: /* @__PURE__ */ jsx11(Badge, { tone: "error", children: "graphics context lost \u2014 restoring" })
8582
+ children: /* @__PURE__ */ jsx11(Badge2, { tone: "error", children: "graphics context lost \u2014 restoring" })
9011
8583
  }
9012
8584
  ) : null,
9013
8585
  showStats && state.stats ? /* @__PURE__ */ jsx11("div", { style: { position: "absolute", left: 0, right: 0, bottom: 0, zIndex: 10 }, children: /* @__PURE__ */ jsx11(
@@ -9664,14 +9236,14 @@ var findManifest = {
9664
9236
  // src/edit/find/react/FindPanelView.tsx
9665
9237
  import { useSyncExternalStore as useSyncExternalStore7 } from "react";
9666
9238
  import {
9667
- Badge as Badge2,
9668
- EmptyState as EmptyState2,
9669
- IconButton as IconButton2,
9239
+ Badge as Badge3,
9240
+ EmptyState as EmptyState3,
9241
+ IconButton as IconButton3,
9670
9242
  Row,
9671
9243
  RowList,
9672
- ScrollArea,
9673
- SearchField,
9674
- Section,
9244
+ ScrollArea as ScrollArea2,
9245
+ SearchField as SearchField2,
9246
+ Section as Section2,
9675
9247
  StatusBar as StatusBar3,
9676
9248
  TextButton as TextButton2,
9677
9249
  Toolbar as Toolbar2,
@@ -9716,12 +9288,12 @@ function StatusLine({
9716
9288
  hasText
9717
9289
  }) {
9718
9290
  if (status === "invalidPattern") {
9719
- return /* @__PURE__ */ jsx12(Badge2, { tone: "error", title: message ?? void 0, children: "invalid pattern" });
9291
+ return /* @__PURE__ */ jsx12(Badge3, { tone: "error", title: message ?? void 0, children: "invalid pattern" });
9720
9292
  }
9721
9293
  if (status === "failed") {
9722
- return /* @__PURE__ */ jsx12(Badge2, { tone: "error", title: message ?? void 0, children: "search failed" });
9294
+ return /* @__PURE__ */ jsx12(Badge3, { tone: "error", title: message ?? void 0, children: "search failed" });
9723
9295
  }
9724
- if (status === "searching") return /* @__PURE__ */ jsx12(Badge2, { children: "searching\u2026" });
9296
+ if (status === "searching") return /* @__PURE__ */ jsx12(Badge3, { children: "searching\u2026" });
9725
9297
  if (!hasText || status === "idle") return null;
9726
9298
  return /* @__PURE__ */ jsxs11("span", { style: { fontVariantNumeric: "tabular-nums", fontSize: 10, opacity: 0.55 }, children: [
9727
9299
  displayIndex,
@@ -9774,7 +9346,7 @@ function FindPanelView({
9774
9346
  Toolbar2,
9775
9347
  {
9776
9348
  left: /* @__PURE__ */ jsx12(
9777
- SearchField,
9349
+ SearchField2,
9778
9350
  {
9779
9351
  value: state.text,
9780
9352
  onChange: (value) => controller.setText(value),
@@ -9783,7 +9355,7 @@ function FindPanelView({
9783
9355
  ),
9784
9356
  right: /* @__PURE__ */ jsxs11(ToolbarGroup2, { end: true, children: [
9785
9357
  /* @__PURE__ */ jsx12(
9786
- IconButton2,
9358
+ IconButton3,
9787
9359
  {
9788
9360
  label: "Match case",
9789
9361
  active: state.options.caseSensitive,
@@ -9792,7 +9364,7 @@ function FindPanelView({
9792
9364
  }
9793
9365
  ),
9794
9366
  /* @__PURE__ */ jsx12(
9795
- IconButton2,
9367
+ IconButton3,
9796
9368
  {
9797
9369
  label: "Whole word",
9798
9370
  active: state.options.wholeWord,
@@ -9801,7 +9373,7 @@ function FindPanelView({
9801
9373
  }
9802
9374
  ),
9803
9375
  /* @__PURE__ */ jsx12(
9804
- IconButton2,
9376
+ IconButton3,
9805
9377
  {
9806
9378
  label: "Regular expression",
9807
9379
  active: state.options.regex,
@@ -9829,7 +9401,7 @@ function FindPanelView({
9829
9401
  ),
9830
9402
  right: /* @__PURE__ */ jsxs11(ToolbarGroup2, { end: true, children: [
9831
9403
  /* @__PURE__ */ jsx12(
9832
- IconButton2,
9404
+ IconButton3,
9833
9405
  {
9834
9406
  label: "Previous match",
9835
9407
  disabled: state.matches.length === 0,
@@ -9838,7 +9410,7 @@ function FindPanelView({
9838
9410
  }
9839
9411
  ),
9840
9412
  /* @__PURE__ */ jsx12(
9841
- IconButton2,
9413
+ IconButton3,
9842
9414
  {
9843
9415
  label: "Next match",
9844
9416
  disabled: state.matches.length === 0,
@@ -9855,7 +9427,7 @@ function FindPanelView({
9855
9427
  Toolbar2,
9856
9428
  {
9857
9429
  left: /* @__PURE__ */ jsx12(
9858
- SearchField,
9430
+ SearchField2,
9859
9431
  {
9860
9432
  value: state.replaceText,
9861
9433
  onChange: (value) => controller.setReplaceText(value),
@@ -9872,18 +9444,18 @@ function FindPanelView({
9872
9444
  ] })
9873
9445
  }
9874
9446
  ) : 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,
9447
+ showResults ? /* @__PURE__ */ jsx12(ScrollArea2, { children: state.status === "idle" ? /* @__PURE__ */ jsx12(EmptyState3, { title: "Find", hint: "Type to search. Enter goes to the next match." }) : state.status === "invalidPattern" ? /* @__PURE__ */ jsx12(
9448
+ EmptyState3,
9877
9449
  {
9878
9450
  title: "Invalid pattern",
9879
9451
  hint: state.message ?? "The expression could not be read. Fix it to search."
9880
9452
  }
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,
9453
+ ) : state.status === "failed" ? /* @__PURE__ */ jsx12(EmptyState3, { title: "Search failed", hint: state.message ?? "The host could not complete the search." }) : state.noResults ? /* @__PURE__ */ jsx12(EmptyState3, { 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(
9454
+ Section2,
9883
9455
  {
9884
9456
  title: group.label || "Results",
9885
9457
  flush: true,
9886
- badge: /* @__PURE__ */ jsx12(Badge2, { children: group.matches.length }),
9458
+ badge: /* @__PURE__ */ jsx12(Badge3, { children: group.matches.length }),
9887
9459
  children: /* @__PURE__ */ jsx12(RowList, { children: group.matches.map((m) => renderMatch(m, ++flatIndex)) })
9888
9460
  },
9889
9461
  group.id
@@ -10539,10 +10111,10 @@ var commentsManifest = {
10539
10111
  // src/edit/comments/react/CommentsPanelView.tsx
10540
10112
  import { useSyncExternalStore as useSyncExternalStore8 } from "react";
10541
10113
  import {
10542
- Badge as Badge3,
10543
- EmptyState as EmptyState3,
10544
- ScrollArea as ScrollArea2,
10545
- Section as Section2,
10114
+ Badge as Badge4,
10115
+ EmptyState as EmptyState4,
10116
+ ScrollArea as ScrollArea3,
10117
+ Section as Section3,
10546
10118
  SegmentedControl as SegmentedControl2,
10547
10119
  StatusBar as StatusBar4,
10548
10120
  TextButton as TextButton3,
@@ -10589,8 +10161,8 @@ function ThreadCard({
10589
10161
  },
10590
10162
  children: /* @__PURE__ */ jsxs12("div", { style: { padding: "6px 8px", display: "flex", flexDirection: "column", gap: 4 }, children: [
10591
10163
  /* @__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,
10164
+ badge ? /* @__PURE__ */ jsx13(Badge4, { tone: badge.tone, title: badge.title, children: badge.label }) : null,
10165
+ thread.resolved ? /* @__PURE__ */ jsx13(Badge4, { children: "resolved" }) : null,
10594
10166
  /* @__PURE__ */ jsx13("span", { style: { marginLeft: "auto", fontSize: 9, opacity: 0.4 }, children: formatAge(thread.createdAt, now) })
10595
10167
  ] }),
10596
10168
  thread.anchorLabel ? /* @__PURE__ */ jsx13(
@@ -10729,18 +10301,18 @@ function CommentsPanelView({
10729
10301
  " about.",
10730
10302
  state.filter.includeOrphaned === false ? /* @__PURE__ */ jsx13(TextButton3, { onClick: () => controller.setFilter({ includeOrphaned: true }), children: "Show" }) : null
10731
10303
  ] }) : null,
10732
- /* @__PURE__ */ jsx13(ScrollArea2, { children: state.threads.length === 0 ? state.filteredEmpty ? (
10304
+ /* @__PURE__ */ jsx13(ScrollArea3, { children: state.threads.length === 0 ? state.filteredEmpty ? (
10733
10305
  // NOT "no comments". There are comments; this filter hides them, and telling a
10734
10306
  // reviewer their feedback is gone is worse than telling them nothing.
10735
10307
  /* @__PURE__ */ jsx13(
10736
- EmptyState3,
10308
+ EmptyState4,
10737
10309
  {
10738
10310
  title: "Nothing matches this filter",
10739
10311
  hint: `${state.totals.all} comment${state.totals.all === 1 ? "" : "s"} on this document.`
10740
10312
  }
10741
10313
  )
10742
10314
  ) : /* @__PURE__ */ jsx13(
10743
- EmptyState3,
10315
+ EmptyState4,
10744
10316
  {
10745
10317
  title: "No comments",
10746
10318
  hint: emptyHint ?? "Select something and add a comment."
@@ -10756,7 +10328,7 @@ function CommentsPanelView({
10756
10328
  },
10757
10329
  view.thread.id
10758
10330
  )),
10759
- showResolved && resolved.length > 0 ? /* @__PURE__ */ jsx13(Section2, { title: `Resolved (${resolved.length})`, flush: true, children: resolved.map((view) => /* @__PURE__ */ jsx13(
10331
+ showResolved && resolved.length > 0 ? /* @__PURE__ */ jsx13(Section3, { title: `Resolved (${resolved.length})`, flush: true, children: resolved.map((view) => /* @__PURE__ */ jsx13(
10760
10332
  ThreadCard,
10761
10333
  {
10762
10334
  view,
@@ -11979,7 +11551,7 @@ var nodegraphManifest = {
11979
11551
 
11980
11552
  // src/edit/nodegraph/react/NodeGraphPanelView.tsx
11981
11553
  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";
11554
+ import { EmptyState as EmptyState5, StatusBar as StatusBar5, Toolbar as Toolbar4, ToolbarGroup as ToolbarGroup4 } from "@xenosystem/components/chrome";
11983
11555
  import { Fragment as Fragment6, jsx as jsx14, jsxs as jsxs13 } from "react/jsx-runtime";
11984
11556
  var HEADER_H2 = 24;
11985
11557
  var PORT_ROW_H2 = 18;
@@ -12069,7 +11641,7 @@ function NodeGraphPanelView({ controller }) {
12069
11641
  ] })
12070
11642
  }
12071
11643
  ),
12072
- total === 0 ? /* @__PURE__ */ jsx14(EmptyState4, { title: "Empty graph", hint: "Wire a host graph into this panel's input." }) : /* @__PURE__ */ jsxs13(
11644
+ total === 0 ? /* @__PURE__ */ jsx14(EmptyState5, { title: "Empty graph", hint: "Wire a host graph into this panel's input." }) : /* @__PURE__ */ jsxs13(
12073
11645
  "div",
12074
11646
  {
12075
11647
  ref: containerRef,
@@ -13508,14 +13080,14 @@ var treeManifest = {
13508
13080
  // src/edit/tree/react/TreePanelView.tsx
13509
13081
  import { useCallback as useCallback8, useEffect as useEffect8, useRef as useRef9, useState as useState2, useSyncExternalStore as useSyncExternalStore10 } from "react";
13510
13082
  import {
13511
- Badge as Badge4,
13512
- EmptyState as EmptyState5,
13083
+ Badge as Badge5,
13084
+ EmptyState as EmptyState6,
13513
13085
  ErrorState,
13514
- IconButton as IconButton3,
13086
+ IconButton as IconButton4,
13515
13087
  LoadingState,
13516
13088
  Row as Row2,
13517
- ScrollArea as ScrollArea3,
13518
- SearchField as SearchField2,
13089
+ ScrollArea as ScrollArea4,
13090
+ SearchField as SearchField3,
13519
13091
  StatusBar as StatusBar6,
13520
13092
  Toolbar as Toolbar5,
13521
13093
  ToolbarGroup as ToolbarGroup5
@@ -13651,7 +13223,7 @@ function TreePanelView({
13651
13223
  const sourceState = source?.sourceState ?? "idle";
13652
13224
  const body = (() => {
13653
13225
  if (!source || sourceState === "idle") {
13654
- return /* @__PURE__ */ jsx16(EmptyState5, { title: "No source", hint: emptyHint ?? "Connect a source to browse it." });
13226
+ return /* @__PURE__ */ jsx16(EmptyState6, { title: "No source", hint: emptyHint ?? "Connect a source to browse it." });
13655
13227
  }
13656
13228
  if (sourceState === "loading" && state.rows.length === 0) {
13657
13229
  return /* @__PURE__ */ jsx16(LoadingState, { label: source.sourceMessage ?? "Loading\u2026" });
@@ -13668,8 +13240,8 @@ function TreePanelView({
13668
13240
  );
13669
13241
  }
13670
13242
  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,
13243
+ return state.filter ? /* @__PURE__ */ jsx16(EmptyState6, { title: "No matches", hint: `Nothing matches \u201C${state.filter}\u201D.` }) : /* @__PURE__ */ jsx16(
13244
+ EmptyState6,
13673
13245
  {
13674
13246
  title: "Nothing here",
13675
13247
  hint: emptyHint ?? source.sourceMessage ?? "This source has no items yet."
@@ -13684,7 +13256,7 @@ function TreePanelView({
13684
13256
  overscan
13685
13257
  });
13686
13258
  const slice = state.rows.slice(window2.startIndex, window2.endIndex);
13687
- return /* @__PURE__ */ jsx16(ScrollArea3, { children: /* @__PURE__ */ jsx16(
13259
+ return /* @__PURE__ */ jsx16(ScrollArea4, { children: /* @__PURE__ */ jsx16(
13688
13260
  "div",
13689
13261
  {
13690
13262
  ref: scrollRef,
@@ -13719,7 +13291,7 @@ function TreePanelView({
13719
13291
  Toolbar5,
13720
13292
  {
13721
13293
  left: showSearch ? /* @__PURE__ */ jsx16(
13722
- SearchField2,
13294
+ SearchField3,
13723
13295
  {
13724
13296
  value: state.filter,
13725
13297
  onChange: (term) => controller.setFilter(term),
@@ -13727,16 +13299,16 @@ function TreePanelView({
13727
13299
  }
13728
13300
  ) : void 0,
13729
13301
  right: /* @__PURE__ */ jsxs15(ToolbarGroup5, { end: true, children: [
13730
- /* @__PURE__ */ jsx16(IconButton3, { icon: /* @__PURE__ */ jsx16(ExpandGlyph, {}), label: "Expand all", onClick: () => controller.expandAll() }),
13302
+ /* @__PURE__ */ jsx16(IconButton4, { icon: /* @__PURE__ */ jsx16(ExpandGlyph, {}), label: "Expand all", onClick: () => controller.expandAll() }),
13731
13303
  /* @__PURE__ */ jsx16(
13732
- IconButton3,
13304
+ IconButton4,
13733
13305
  {
13734
13306
  icon: /* @__PURE__ */ jsx16(CollapseGlyph, {}),
13735
13307
  label: "Collapse all",
13736
13308
  onClick: () => controller.collapseAll()
13737
13309
  }
13738
13310
  ),
13739
- /* @__PURE__ */ jsx16(IconButton3, { icon: /* @__PURE__ */ jsx16(RefreshGlyph, {}), label: "Refresh", onClick: () => controller.refresh() })
13311
+ /* @__PURE__ */ jsx16(IconButton4, { icon: /* @__PURE__ */ jsx16(RefreshGlyph, {}), label: "Refresh", onClick: () => controller.refresh() })
13740
13312
  ] })
13741
13313
  }
13742
13314
  ),
@@ -13871,10 +13443,10 @@ function TreeRowView({
13871
13443
  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
13444
  node.badges?.map((badge) => (
13873
13445
  // 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)
13446
+ /* @__PURE__ */ jsx16(Badge5, { tone: badge.tone, className: badge.title ? void 0 : void 0, children: badge.text }, badge.id)
13875
13447
  )),
13876
13448
  node.actions?.map((action) => /* @__PURE__ */ jsx16(
13877
- IconButton3,
13449
+ IconButton4,
13878
13450
  {
13879
13451
  size: "sm",
13880
13452
  icon: /* @__PURE__ */ jsx16(NodeIcon, { icon: action.icon }),
@@ -13900,7 +13472,7 @@ function ChildStateChip({
13900
13472
  }
13901
13473
  if (row.childState === "error") {
13902
13474
  const error = row.node.error;
13903
- return /* @__PURE__ */ jsx16(Badge4, { tone: "error", children: error?.code === "denied" ? "no access" : error?.code ?? "failed" });
13475
+ return /* @__PURE__ */ jsx16(Badge5, { tone: "error", children: error?.code === "denied" ? "no access" : error?.code ?? "failed" });
13904
13476
  }
13905
13477
  if (row.node.hasMore && row.expanded) {
13906
13478
  return /* @__PURE__ */ jsx16(
@@ -13917,7 +13489,7 @@ function ChildStateChip({
13917
13489
  );
13918
13490
  }
13919
13491
  if (row.node.truncatedAt !== void 0) {
13920
- return /* @__PURE__ */ jsx16(Badge4, { tone: "warning", children: `first ${row.node.truncatedAt}` });
13492
+ return /* @__PURE__ */ jsx16(Badge5, { tone: "warning", children: `first ${row.node.truncatedAt}` });
13921
13493
  }
13922
13494
  if (row.expanded && isEmptyContainer(row.node)) {
13923
13495
  return /* @__PURE__ */ jsx16("span", { style: { opacity: 0.4, fontSize: 9 }, children: "empty" });
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@xenosystem/blocks",
3
- "version": "0.11.2",
3
+ "version": "0.11.3",
4
4
  "description": "XENO Blocks — rung 3 of the front ladder: components composed into a contract-bearing unit (manifest: ports, intents, commands, agent surface), rendered by @xenosystem/workbench. ONE package, one subpath per family (/auth, /edit, /data, /time, /ops, /trust, /agent), one named export per block — XENO PACKAGE NAMING - STANDARD.md.",
5
5
  "license": "UNLICENSED",
6
6
  "type": "module",
@@ -60,7 +60,7 @@
60
60
  "peerDependencies": {
61
61
  "@duckdb/duckdb-wasm": ">=1.28.0",
62
62
  "@xenosystem/block-sdk": "^0.3.0",
63
- "@xenosystem/components": ">=0.11.2 <1",
63
+ "@xenosystem/components": ">=0.12.0 <1",
64
64
  "@xenosystem/data-core": "^0.1.0",
65
65
  "@xenosystem/elements-react": ">=0.0.1",
66
66
  "@xenosystem/time-core": "^0.1.0",
@@ -76,7 +76,7 @@
76
76
  "@types/react": "^19.0.0",
77
77
  "@types/react-dom": "^19.0.0",
78
78
  "@xenosystem/block-sdk": "^0.3.1",
79
- "@xenosystem/components": "^0.11.2",
79
+ "@xenosystem/components": "^0.12.0",
80
80
  "@xenosystem/data-core": "^0.1.0",
81
81
  "@xenosystem/elements-react": "0.0.1",
82
82
  "@xenosystem/time-core": "^0.1.0",