@xenosystem/blocks 0.11.3 → 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.
@@ -1948,9 +1948,10 @@ declare function resolveIconName(kind: string | undefined, hostMap?: Record<stri
1948
1948
  * `useSyncExternalStore` and forwards interactions. No projection logic, no intent construction and
1949
1949
  * no virtualization math live here.
1950
1950
  *
1951
- * Layout per DESIGN_SYSTEM: dense 22px rows, monochrome, inline lucide-geometry icons at
1952
- * strokeWidth 1.5, rectangles with small corner radius, compact header/footer, no shadows.
1953
- * Future entries (after the cursor) are dimmed and struck through — Photoshop's affordance.
1951
+ * Rendered over the chrome family: a `Toolbar` of undo/redo/search/count/clear, an `InlineConfirm`
1952
+ * for clearing, a `ScrollArea` the virtualizer measures, a `VirtualWindow` of `Row`s (the current
1953
+ * row `selected`, the keyboard row `focused`, future entries `struck` — Photoshop's affordance),
1954
+ * and a `StatusBar` for memory. The window math and the keyboard model stay in the controller.
1954
1955
  *
1955
1956
  * @module
1956
1957
  */
@@ -4483,6 +4483,7 @@ var HistoryPanelController = class {
4483
4483
 
4484
4484
  // src/edit/history/react/HistoryPanelView.tsx
4485
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";
4486
4487
 
4487
4488
  // src/edit/history/react/icons.tsx
4488
4489
  import { jsx as jsx7, jsxs as jsxs6 } from "react/jsx-runtime";
@@ -4578,7 +4579,7 @@ function PendingGlyph({ size = 9 }) {
4578
4579
  }
4579
4580
 
4580
4581
  // src/edit/history/react/HistoryPanelView.tsx
4581
- 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";
4582
4583
  function HistoryPanelView({ controller }) {
4583
4584
  const subscribe = useCallback4((cb) => controller.subscribe(cb), [controller]);
4584
4585
  const getSnapshot = useCallback4(() => controller.getRevision(), [controller]);
@@ -4627,106 +4628,54 @@ function HistoryPanelView({ controller }) {
4627
4628
  },
4628
4629
  [controller]
4629
4630
  );
4630
- return /* @__PURE__ */ jsxs7("div", { style: S2.root, className: "xeno-history-panel", children: [
4631
- /* @__PURE__ */ jsxs7("div", { style: S2.header, children: [
4632
- /* @__PURE__ */ jsx8(
4633
- "button",
4634
- {
4635
- type: "button",
4636
- style: { ...S2.iconBtn, opacity: controller.canUndo() ? 0.8 : 0.25 },
4637
- disabled: !controller.canUndo(),
4638
- onClick: () => controller.undo(),
4639
- title: "Undo",
4640
- "aria-label": "Undo",
4641
- children: /* @__PURE__ */ jsx8(UndoIcon, {})
4642
- }
4643
- ),
4644
- /* @__PURE__ */ jsx8(
4645
- "button",
4646
- {
4647
- type: "button",
4648
- style: { ...S2.iconBtn, opacity: controller.canRedo() ? 0.8 : 0.25 },
4649
- disabled: !controller.canRedo(),
4650
- onClick: () => controller.redo(),
4651
- title: "Redo",
4652
- "aria-label": "Redo",
4653
- children: /* @__PURE__ */ jsx8(RedoIcon, {})
4654
- }
4655
- ),
4656
- controller.isSearchShown() && /* @__PURE__ */ jsx8(
4657
- "input",
4658
- {
4659
- type: "search",
4660
- value: controller.getFilter(),
4661
- placeholder: "Search history",
4662
- onChange: (e) => controller.setFilter(e.target.value),
4663
- style: S2.search,
4664
- "aria-label": "Search history",
4665
- spellCheck: false
4666
- }
4667
- ),
4668
- /* @__PURE__ */ jsxs7("span", { style: S2.counter, children: [
4669
- controller.getAppliedCount(),
4670
- " / ",
4671
- controller.getTotalCount()
4672
- ] }),
4673
- controller.isClearAllowed() && /* @__PURE__ */ jsx8(
4674
- "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,
4675
4655
  {
4676
- type: "button",
4677
- style: S2.iconBtn,
4678
- onClick: () => controller.requestClear(),
4679
- title: "Clear history",
4680
- "aria-label": "Clear history",
4681
- children: /* @__PURE__ */ jsx8(TrashIcon, {})
4682
- }
4683
- )
4684
- ] }),
4685
- controller.isConfirmingClear() && /* @__PURE__ */ jsxs7("div", { style: S2.confirmBar, role: "alertdialog", "aria-label": "Confirm clear history", children: [
4686
- /* @__PURE__ */ jsx8("span", { children: "Clear all history?" }),
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" })
4690
- ] })
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
4691
4664
  ] }),
4692
- controller.isPruned() && /* @__PURE__ */ jsx8("div", { style: S2.prunedNote, children: "Earlier history discarded (limit reached)" }),
4693
- /* @__PURE__ */ jsxs7(
4694
- "div",
4665
+ memory ? /* @__PURE__ */ jsx8(
4666
+ StatusBar,
4695
4667
  {
4696
- ref: scrollRef,
4697
- style: S2.scroll,
4698
- onScroll,
4699
- onKeyDown,
4700
- onMouseLeave: () => controller.setHovered(null),
4701
- tabIndex: 0,
4702
- role: "listbox",
4703
- "aria-label": "History",
4704
- children: [
4705
- /* @__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(
4706
- HistoryRowView,
4707
- {
4708
- row,
4709
- controller,
4710
- rowHeight,
4711
- focused: controller.getFocused() === row.entryId
4712
- },
4713
- row.entryId ?? "__original__"
4714
- )) }) }),
4715
- rows.length === 0 && /* @__PURE__ */ jsx8("div", { style: S2.empty, children: "No history" })
4716
- ]
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
4717
4677
  }
4718
- ),
4719
- memory && /* @__PURE__ */ jsxs7("div", { style: S2.footer, children: [
4720
- /* @__PURE__ */ jsxs7("span", { children: [
4721
- memory.usedMB.toFixed(1),
4722
- " MB",
4723
- memory.limitMB ? ` / ${memory.limitMB} MB` : ""
4724
- ] }),
4725
- memory.onDiskCount !== void 0 && /* @__PURE__ */ jsxs7("span", { style: S2.dim, children: [
4726
- memory.onDiskCount,
4727
- " on disk"
4728
- ] })
4729
- ] })
4678
+ ) : null
4730
4679
  ] });
4731
4680
  }
4732
4681
  function HistoryRowView({ row, controller, rowHeight, focused }) {
@@ -4734,57 +4683,47 @@ function HistoryRowView({ row, controller, rowHeight, focused }) {
4734
4683
  const pending = entry?.status === "pending";
4735
4684
  const failed = entry?.status === "failed";
4736
4685
  const jumpable = controller.isJumpAllowed() && entry?.caps?.jumpable !== false;
4737
- const style = {
4738
- ...S2.row,
4739
- height: rowHeight,
4740
- background: row.current ? "var(--xeno-border)" : "transparent",
4741
- // FUTURE rows (after the cursor) are dimmed + struck through — the redoable region.
4742
- opacity: row.future ? 0.4 : 1,
4743
- textDecoration: row.future ? "line-through" : "none",
4744
- boxShadow: focused ? "inset 0 0 0 1px var(--xeno-control)" : void 0,
4745
- cursor: jumpable ? "pointer" : "default"
4746
- };
4747
- return /* @__PURE__ */ jsxs7(
4748
- "div",
4686
+ return /* @__PURE__ */ jsx8(
4687
+ Row,
4749
4688
  {
4750
- style,
4751
- role: "option",
4752
- "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,
4753
4697
  "data-history-row": row.entryId ?? "__original__",
4754
- onClick: () => controller.jumpTo(row.entryId),
4698
+ onClick: jumpable ? () => controller.jumpTo(row.entryId) : void 0,
4755
4699
  onMouseEnter: () => controller.setHovered(row.entryId),
4756
4700
  onContextMenu: (e) => {
4757
4701
  e.preventDefault();
4758
4702
  controller.requestContextMenu(row.entryId, e.clientX, e.clientY);
4759
4703
  },
4760
4704
  title: row.label,
4761
- children: [
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 }),
4765
- pending && /* @__PURE__ */ jsx8(PendingGlyph, {}),
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: [
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: [
4769
4710
  "\xD7",
4770
4711
  entry.coalesced
4771
- ] }),
4772
- controller.areTimestampsShown() && entry?.at !== void 0 && /* @__PURE__ */ jsx8("span", { style: S2.time, children: formatTime(entry.at) }),
4773
- pending && /* @__PURE__ */ jsx8(
4774
- "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,
4775
4716
  {
4776
- type: "button",
4777
- style: S2.iconBtn,
4717
+ size: "sm",
4718
+ icon: /* @__PURE__ */ jsx8(XIcon2, {}),
4719
+ label: "Cancel operation",
4778
4720
  onClick: (e) => {
4779
4721
  e.stopPropagation();
4780
4722
  controller.cancelPending(entry?.id);
4781
- },
4782
- title: "Cancel operation",
4783
- "aria-label": "Cancel operation",
4784
- children: /* @__PURE__ */ jsx8(XIcon2, {})
4723
+ }
4785
4724
  }
4786
- )
4787
- ]
4725
+ ) : null
4726
+ ] })
4788
4727
  }
4789
4728
  );
4790
4729
  }
@@ -4793,141 +4732,6 @@ function formatTime(at) {
4793
4732
  if (Number.isNaN(date.getTime())) return typeof at === "string" ? at : "";
4794
4733
  return date.toLocaleTimeString(void 0, { hour: "2-digit", minute: "2-digit" });
4795
4734
  }
4796
- var S2 = {
4797
- root: {
4798
- display: "flex",
4799
- flexDirection: "column",
4800
- height: "100%",
4801
- minHeight: 0,
4802
- fontSize: 11,
4803
- color: "var(--xeno-text)",
4804
- background: "var(--xeno-canvas)",
4805
- userSelect: "none"
4806
- },
4807
- header: {
4808
- display: "flex",
4809
- alignItems: "center",
4810
- gap: 4,
4811
- padding: "4px 6px",
4812
- background: "var(--xeno-panel-header)",
4813
- flex: "0 0 auto"
4814
- },
4815
- search: {
4816
- flex: "1 1 auto",
4817
- minWidth: 0,
4818
- height: 18,
4819
- background: "var(--xeno-canvas)",
4820
- color: "inherit",
4821
- border: "1px solid var(--xeno-border)",
4822
- borderRadius: 2,
4823
- fontSize: 11,
4824
- padding: "0 6px",
4825
- outline: "none"
4826
- },
4827
- counter: {
4828
- fontSize: 9,
4829
- color: "var(--xeno-muted)",
4830
- fontVariantNumeric: "tabular-nums",
4831
- flex: "0 0 auto"
4832
- },
4833
- iconBtn: {
4834
- display: "flex",
4835
- alignItems: "center",
4836
- justifyContent: "center",
4837
- width: 16,
4838
- height: 16,
4839
- padding: 0,
4840
- border: "none",
4841
- borderRadius: 2,
4842
- background: "transparent",
4843
- color: "inherit",
4844
- cursor: "pointer",
4845
- flex: "0 0 auto"
4846
- },
4847
- confirmBar: {
4848
- display: "flex",
4849
- alignItems: "center",
4850
- justifyContent: "space-between",
4851
- gap: 8,
4852
- padding: "3px 6px",
4853
- fontSize: 10,
4854
- background: "var(--xeno-border-subtle)",
4855
- flex: "0 0 auto"
4856
- },
4857
- confirmActions: { display: "flex", gap: 8 },
4858
- textBtn: {
4859
- background: "transparent",
4860
- border: "none",
4861
- color: "inherit",
4862
- cursor: "pointer",
4863
- fontSize: 10,
4864
- padding: 0
4865
- },
4866
- textBtnDim: {
4867
- background: "transparent",
4868
- border: "none",
4869
- color: "var(--xeno-muted)",
4870
- cursor: "pointer",
4871
- fontSize: 10,
4872
- padding: 0
4873
- },
4874
- prunedNote: {
4875
- padding: "2px 6px",
4876
- fontSize: 9,
4877
- color: "var(--xeno-muted)",
4878
- flex: "0 0 auto"
4879
- },
4880
- scroll: { flex: "1 1 auto", minHeight: 0, overflowY: "auto", overflowX: "hidden", outline: "none" },
4881
- row: {
4882
- display: "flex",
4883
- alignItems: "center",
4884
- gap: 5,
4885
- padding: "0 6px",
4886
- boxSizing: "border-box",
4887
- overflow: "hidden"
4888
- },
4889
- iconCell: { display: "flex", alignItems: "center", width: 11, flex: "0 0 auto", opacity: 0.75 },
4890
- ordinal: {
4891
- fontSize: 9,
4892
- color: "var(--xeno-muted)",
4893
- fontVariantNumeric: "tabular-nums",
4894
- minWidth: 14,
4895
- textAlign: "right",
4896
- flex: "0 0 auto"
4897
- },
4898
- label: { flex: "1 1 auto", overflow: "hidden", textOverflow: "ellipsis", whiteSpace: "nowrap", minWidth: 0 },
4899
- badge: {
4900
- fontSize: 8,
4901
- padding: "0 3px",
4902
- height: 12,
4903
- lineHeight: "12px",
4904
- borderRadius: 2,
4905
- background: "var(--xeno-border)",
4906
- color: "var(--xeno-muted)",
4907
- flex: "0 0 auto"
4908
- },
4909
- failed: { fontSize: 9, color: "var(--xeno-danger)", flex: "0 0 auto" },
4910
- time: {
4911
- fontSize: 9,
4912
- color: "var(--xeno-muted)",
4913
- fontVariantNumeric: "tabular-nums",
4914
- flex: "0 0 auto"
4915
- },
4916
- empty: { padding: 12, fontSize: 10, opacity: 0.4, textTransform: "uppercase", letterSpacing: "0.08em" },
4917
- footer: {
4918
- display: "flex",
4919
- alignItems: "center",
4920
- justifyContent: "space-between",
4921
- gap: 8,
4922
- padding: "2px 6px",
4923
- fontSize: 9,
4924
- color: "var(--xeno-muted)",
4925
- background: "var(--xeno-panel-header)",
4926
- flex: "0 0 auto",
4927
- fontVariantNumeric: "tabular-nums"
4928
- },
4929
- dim: { opacity: 0.7 }
4930
- };
4931
4735
 
4932
4736
  // src/edit/history/panel.ts
4933
4737
  function createHistoryPanel(options = {}) {
@@ -6010,7 +5814,7 @@ function drawAlphaStrip(ctx, w, h, hsv) {
6010
5814
  }
6011
5815
 
6012
5816
  // src/edit/color/react/ColorPanelView.tsx
6013
- 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";
6014
5818
  var SPACE_LABEL = {
6015
5819
  hex: "HEX",
6016
5820
  rgb: "RGB",
@@ -6115,14 +5919,14 @@ function ColorPanelView({ controller }) {
6115
5919
  );
6116
5920
  const componentLabels = COMPONENT_LABELS[space];
6117
5921
  const comps = value.components ?? [];
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: [
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: [
6120
5924
  /* @__PURE__ */ jsx9(
6121
5925
  "button",
6122
5926
  {
6123
5927
  type: "button",
6124
5928
  "aria-pressed": controller.getActiveChannel() === "fg",
6125
- style: { ...S3.chip, ...controller.getActiveChannel() === "fg" ? S3.chipActive : null, background: value.hex },
5929
+ style: { ...S2.chip, ...controller.getActiveChannel() === "fg" ? S2.chipActive : null, background: value.hex },
6126
5930
  onClick: () => controller.setChannel("fg"),
6127
5931
  title: "Foreground"
6128
5932
  }
@@ -6131,7 +5935,7 @@ function ColorPanelView({ controller }) {
6131
5935
  "button",
6132
5936
  {
6133
5937
  type: "button",
6134
- style: S3.swap,
5938
+ style: S2.swap,
6135
5939
  onClick: () => controller.swapChannels(),
6136
5940
  title: "Swap FG/BG (X)",
6137
5941
  children: "\u21C4"
@@ -6142,20 +5946,20 @@ function ColorPanelView({ controller }) {
6142
5946
  {
6143
5947
  type: "button",
6144
5948
  "aria-pressed": controller.getActiveChannel() === "bg",
6145
- style: { ...S3.chip, ...controller.getActiveChannel() === "bg" ? S3.chipActive : null },
5949
+ style: { ...S2.chip, ...controller.getActiveChannel() === "bg" ? S2.chipActive : null },
6146
5950
  onClick: () => controller.setChannel("bg"),
6147
5951
  title: "Background"
6148
5952
  }
6149
5953
  )
6150
5954
  ] }),
6151
- /* @__PURE__ */ jsxs8("div", { style: S3.pickerRow, children: [
5955
+ /* @__PURE__ */ jsxs8("div", { style: S2.pickerRow, children: [
6152
5956
  /* @__PURE__ */ jsx9(
6153
5957
  "canvas",
6154
5958
  {
6155
5959
  ref: spectrumRef,
6156
5960
  width: 200,
6157
5961
  height: 140,
6158
- style: { ...S3.spectrum, ...bound ? S3.disabled : null },
5962
+ style: { ...S2.spectrum, ...bound ? S2.disabled : null },
6159
5963
  onPointerDown: (e) => onSpectrumPointer(e, true),
6160
5964
  onPointerMove: (e) => onSpectrumPointer(e, false),
6161
5965
  onPointerUp: endDrag
@@ -6167,7 +5971,7 @@ function ColorPanelView({ controller }) {
6167
5971
  ref: hueRef,
6168
5972
  width: 14,
6169
5973
  height: 140,
6170
- style: { ...S3.strip, ...bound ? S3.disabled : null },
5974
+ style: { ...S2.strip, ...bound ? S2.disabled : null },
6171
5975
  onPointerDown: (e) => onHuePointer(e, true),
6172
5976
  onPointerMove: (e) => onHuePointer(e, false),
6173
5977
  onPointerUp: endDrag
@@ -6179,20 +5983,20 @@ function ColorPanelView({ controller }) {
6179
5983
  ref: alphaRef,
6180
5984
  width: 14,
6181
5985
  height: 140,
6182
- style: { ...S3.strip, ...bound ? S3.disabled : null },
5986
+ style: { ...S2.strip, ...bound ? S2.disabled : null },
6183
5987
  onPointerDown: (e) => onAlphaPointer(e, true),
6184
5988
  onPointerMove: (e) => onAlphaPointer(e, false),
6185
5989
  onPointerUp: endDrag
6186
5990
  }
6187
5991
  )
6188
5992
  ] }),
6189
- /* @__PURE__ */ jsxs8("div", { style: S3.controls, children: [
5993
+ /* @__PURE__ */ jsxs8("div", { style: S2.controls, children: [
6190
5994
  /* @__PURE__ */ jsx9(
6191
5995
  "select",
6192
5996
  {
6193
5997
  value: space,
6194
5998
  onChange: (e) => controller.setSpace(e.target.value),
6195
- style: S3.select,
5999
+ style: S2.select,
6196
6000
  "aria-label": "Color model",
6197
6001
  children: EDIT_SPACES.map((s) => /* @__PURE__ */ jsx9("option", { value: s, children: SPACE_LABEL[s] }, s))
6198
6002
  }
@@ -6204,12 +6008,12 @@ function ColorPanelView({ controller }) {
6204
6008
  value: value.hex,
6205
6009
  onChange: onHexInput,
6206
6010
  disabled: bound,
6207
- style: S3.hexInput,
6011
+ style: S2.hexInput,
6208
6012
  "aria-label": "Hex",
6209
6013
  spellCheck: false
6210
6014
  }
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 }),
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 }),
6213
6017
  /* @__PURE__ */ jsx9(
6214
6018
  "input",
6215
6019
  {
@@ -6217,12 +6021,12 @@ function ColorPanelView({ controller }) {
6217
6021
  value: roundForSpace(space, i, comps[i] ?? 0),
6218
6022
  onChange: (e) => onComponentInput(i, e.target.value),
6219
6023
  disabled: bound,
6220
- style: S3.numInput
6024
+ style: S2.numInput
6221
6025
  }
6222
6026
  )
6223
6027
  ] }, label)) }),
6224
- controller.isAlphaShown() && /* @__PURE__ */ jsxs8("label", { style: S3.alphaField, children: [
6225
- /* @__PURE__ */ jsx9("span", { style: S3.componentLabel, children: "A" }),
6028
+ controller.isAlphaShown() && /* @__PURE__ */ jsxs8("label", { style: S2.alphaField, children: [
6029
+ /* @__PURE__ */ jsx9("span", { style: S2.componentLabel, children: "A" }),
6226
6030
  /* @__PURE__ */ jsx9(
6227
6031
  "input",
6228
6032
  {
@@ -6232,20 +6036,20 @@ function ColorPanelView({ controller }) {
6232
6036
  value: Math.round(value.alpha * 100),
6233
6037
  onChange: (e) => controller.setAlpha(Number(e.target.value) / 100, { commit: true }),
6234
6038
  disabled: bound,
6235
- style: S3.numInput
6039
+ style: S2.numInput
6236
6040
  }
6237
6041
  )
6238
6042
  ] }),
6239
- /* @__PURE__ */ jsx9("button", { type: "button", style: S3.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" })
6240
6044
  ] }),
6241
- controller.hasTokens() && /* @__PURE__ */ jsxs8("div", { style: S3.tokenRow, children: [
6242
- /* @__PURE__ */ jsx9("span", { style: S3.componentLabel, children: "Token" }),
6045
+ controller.hasTokens() && /* @__PURE__ */ jsxs8("div", { style: S2.tokenRow, children: [
6046
+ /* @__PURE__ */ jsx9("span", { style: S2.componentLabel, children: "Token" }),
6243
6047
  /* @__PURE__ */ jsxs8(
6244
6048
  "select",
6245
6049
  {
6246
6050
  value: controller.getBoundTokenId() ?? "",
6247
6051
  onChange: (e) => e.target.value ? controller.bindToken(e.target.value) : controller.unbindToken(),
6248
- style: S3.select,
6052
+ style: S2.select,
6249
6053
  "aria-label": "Bind token",
6250
6054
  children: [
6251
6055
  /* @__PURE__ */ jsx9("option", { value: "", children: "\u2014 raw \u2014" }),
@@ -6253,17 +6057,17 @@ function ColorPanelView({ controller }) {
6253
6057
  ]
6254
6058
  }
6255
6059
  ),
6256
- bound && /* @__PURE__ */ jsx9("button", { type: "button", style: S3.textBtn, onClick: () => controller.unbindToken(), children: "Unbind" })
6060
+ bound && /* @__PURE__ */ jsx9("button", { type: "button", style: S2.textBtn, onClick: () => controller.unbindToken(), children: "Unbind" })
6257
6061
  ] }),
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" })
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" })
6261
6065
  ] }),
6262
- /* @__PURE__ */ jsx9("div", { style: S3.swatchGrid, children: controller.getSwatches().map((hex) => /* @__PURE__ */ jsx9(
6066
+ /* @__PURE__ */ jsx9("div", { style: S2.swatchGrid, children: controller.getSwatches().map((hex) => /* @__PURE__ */ jsx9(
6263
6067
  "button",
6264
6068
  {
6265
6069
  type: "button",
6266
- style: { ...S3.swatch, background: hex },
6070
+ style: { ...S2.swatch, background: hex },
6267
6071
  title: hex,
6268
6072
  onClick: () => controller.selectColor(hex),
6269
6073
  onContextMenu: (e) => {
@@ -6273,13 +6077,13 @@ function ColorPanelView({ controller }) {
6273
6077
  },
6274
6078
  hex
6275
6079
  )) }),
6276
- controller.getRecent().length > 0 && /* @__PURE__ */ jsxs8(Fragment3, { children: [
6277
- /* @__PURE__ */ jsx9("div", { style: S3.sectionLabel, children: "Recent" }),
6278
- /* @__PURE__ */ jsx9("div", { style: S3.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(
6279
6083
  "button",
6280
6084
  {
6281
6085
  type: "button",
6282
- style: { ...S3.swatch, background: hex },
6086
+ style: { ...S2.swatch, background: hex },
6283
6087
  title: hex,
6284
6088
  onClick: () => controller.selectColor(hex)
6285
6089
  },
@@ -6295,7 +6099,7 @@ function roundForSpace(space, index, v) {
6295
6099
  if (space === "oklch") return Math.round(v * 10) / 10;
6296
6100
  return Math.round(v);
6297
6101
  }
6298
- var S3 = {
6102
+ var S2 = {
6299
6103
  root: { display: "flex", flexDirection: "column", gap: 8, padding: 8, fontSize: 11, color: "var(--xeno-text)", background: "var(--xeno-canvas)", minWidth: 232, userSelect: "none" },
6300
6104
  channels: { display: "flex", alignItems: "center", gap: 6 },
6301
6105
  chip: { width: 28, height: 20, borderRadius: 2, border: "1px solid var(--xeno-control)", background: "var(--xeno-canvas)", cursor: "pointer", padding: 0 },
@@ -7592,9 +7396,9 @@ var curveManifest = {
7592
7396
 
7593
7397
  // src/edit/curve/react/CurvePanelView.tsx
7594
7398
  import { useCallback as useCallback6, useEffect as useEffect5, useRef as useRef6, useSyncExternalStore as useSyncExternalStore5 } from "react";
7595
- import { EmptyState as EmptyState2, StatusBar, Toolbar, ToolbarGroup } from "@xenosystem/components/chrome";
7399
+ import { EmptyState as EmptyState3, StatusBar as StatusBar2, Toolbar as Toolbar2, ToolbarGroup } from "@xenosystem/components/chrome";
7596
7400
  import { formatTick } from "@xenosystem/time-core";
7597
- 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";
7598
7402
  var DASHES = ["none", "4 2", "1 2", "6 2 1 2"];
7599
7403
  function CurvePanelView({ controller, showPresets = true }) {
7600
7404
  const state = useSyncExternalStore5(controller.subscribe, controller.getState, controller.getState);
@@ -7675,7 +7479,7 @@ function CurvePanelView({ controller, showPresets = true }) {
7675
7479
  const channels = state.curves?.channels ?? [];
7676
7480
  return /* @__PURE__ */ jsxs9("div", { style: SHELL, children: [
7677
7481
  /* @__PURE__ */ jsx10(
7678
- Toolbar,
7482
+ Toolbar2,
7679
7483
  {
7680
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)) }),
7681
7485
  right: /* @__PURE__ */ jsxs9(ToolbarGroup, { end: true, children: [
@@ -7685,7 +7489,7 @@ function CurvePanelView({ controller, showPresets = true }) {
7685
7489
  }
7686
7490
  ),
7687
7491
  showPresets ? /* @__PURE__ */ jsx10(
7688
- Toolbar,
7492
+ Toolbar2,
7689
7493
  {
7690
7494
  left: /* @__PURE__ */ jsx10(ToolbarGroup, { children: EASING_PRESETS.slice(0, 6).map((preset) => /* @__PURE__ */ jsx10(
7691
7495
  "button",
@@ -7700,7 +7504,7 @@ function CurvePanelView({ controller, showPresets = true }) {
7700
7504
  )) })
7701
7505
  }
7702
7506
  ) : null,
7703
- channels.length === 0 ? /* @__PURE__ */ jsx10(EmptyState2, { 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(
7704
7508
  "div",
7705
7509
  {
7706
7510
  ref: containerRef,
@@ -7814,7 +7618,7 @@ function CurvePanelView({ controller, showPresets = true }) {
7814
7618
  }
7815
7619
  ),
7816
7620
  /* @__PURE__ */ jsx10(
7817
- StatusBar,
7621
+ StatusBar2,
7818
7622
  {
7819
7623
  left: `${channels.length} channel${channels.length === 1 ? "" : "s"}`,
7820
7624
  right: /* @__PURE__ */ jsx10("span", { className: "tabular-nums", children: state.playheadTick !== null ? formatTick(state.playheadTick, state.timebase) : "" })
@@ -7829,7 +7633,7 @@ function Handles({
7829
7633
  scale
7830
7634
  }) {
7831
7635
  const sides = ["in", "out"];
7832
- return /* @__PURE__ */ jsx10(Fragment4, { children: sides.map((side) => {
7636
+ return /* @__PURE__ */ jsx10(Fragment5, { children: sides.map((side) => {
7833
7637
  const tangent = side === "in" ? keyframe.tangentIn : keyframe.tangentOut;
7834
7638
  if (!tangent) return null;
7835
7639
  const hx = scale.tickToX(keyframe.tick + tangent.x);
@@ -8469,7 +8273,7 @@ var viewportManifest = {
8469
8273
 
8470
8274
  // src/edit/viewport/react/ViewportPanelView.tsx
8471
8275
  import { useEffect as useEffect6, useRef as useRef7, useSyncExternalStore as useSyncExternalStore6 } from "react";
8472
- import { Badge as Badge2, StatusBar as StatusBar2 } from "@xenosystem/components/chrome";
8276
+ import { Badge as Badge3, StatusBar as StatusBar3 } from "@xenosystem/components/chrome";
8473
8277
  import { jsx as jsx11, jsxs as jsxs10 } from "react/jsx-runtime";
8474
8278
  var SLOT_STYLE = {
8475
8279
  "top-left": { top: 8, left: 8 },
@@ -8579,11 +8383,11 @@ function ViewportPanelView({
8579
8383
  fontSize: 11,
8580
8384
  zIndex: 20
8581
8385
  },
8582
- children: /* @__PURE__ */ jsx11(Badge2, { tone: "error", children: "graphics context lost \u2014 restoring" })
8386
+ children: /* @__PURE__ */ jsx11(Badge3, { tone: "error", children: "graphics context lost \u2014 restoring" })
8583
8387
  }
8584
8388
  ) : null,
8585
8389
  showStats && state.stats ? /* @__PURE__ */ jsx11("div", { style: { position: "absolute", left: 0, right: 0, bottom: 0, zIndex: 10 }, children: /* @__PURE__ */ jsx11(
8586
- StatusBar2,
8390
+ StatusBar3,
8587
8391
  {
8588
8392
  left: state.stats.fps !== void 0 ? `${Math.round(state.stats.fps)} fps` : void 0,
8589
8393
  right: state.surface ? `${state.surface.cssWidth}\xD7${state.surface.cssHeight} @${state.surface.dpr}\xD7` : void 0
@@ -9236,17 +9040,17 @@ var findManifest = {
9236
9040
  // src/edit/find/react/FindPanelView.tsx
9237
9041
  import { useSyncExternalStore as useSyncExternalStore7 } from "react";
9238
9042
  import {
9239
- Badge as Badge3,
9240
- EmptyState as EmptyState3,
9241
- IconButton as IconButton3,
9242
- Row,
9243
- RowList,
9244
- ScrollArea as ScrollArea2,
9245
- SearchField as SearchField2,
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,
9246
9050
  Section as Section2,
9247
- StatusBar as StatusBar3,
9051
+ StatusBar as StatusBar4,
9248
9052
  TextButton as TextButton2,
9249
- Toolbar as Toolbar2,
9053
+ Toolbar as Toolbar3,
9250
9054
  ToolbarGroup as ToolbarGroup2
9251
9055
  } from "@xenosystem/components/chrome";
9252
9056
  import { jsx as jsx12, jsxs as jsxs11 } from "react/jsx-runtime";
@@ -9288,12 +9092,12 @@ function StatusLine({
9288
9092
  hasText
9289
9093
  }) {
9290
9094
  if (status === "invalidPattern") {
9291
- return /* @__PURE__ */ jsx12(Badge3, { tone: "error", title: message ?? void 0, children: "invalid pattern" });
9095
+ return /* @__PURE__ */ jsx12(Badge4, { tone: "error", title: message ?? void 0, children: "invalid pattern" });
9292
9096
  }
9293
9097
  if (status === "failed") {
9294
- return /* @__PURE__ */ jsx12(Badge3, { tone: "error", title: message ?? void 0, children: "search failed" });
9098
+ return /* @__PURE__ */ jsx12(Badge4, { tone: "error", title: message ?? void 0, children: "search failed" });
9295
9099
  }
9296
- if (status === "searching") return /* @__PURE__ */ jsx12(Badge3, { children: "searching\u2026" });
9100
+ if (status === "searching") return /* @__PURE__ */ jsx12(Badge4, { children: "searching\u2026" });
9297
9101
  if (!hasText || status === "idle") return null;
9298
9102
  return /* @__PURE__ */ jsxs11("span", { style: { fontVariantNumeric: "tabular-nums", fontSize: 10, opacity: 0.55 }, children: [
9299
9103
  displayIndex,
@@ -9319,7 +9123,7 @@ function FindPanelView({
9319
9123
  }
9320
9124
  };
9321
9125
  const renderMatch = (match, index) => /* @__PURE__ */ jsx12(
9322
- Row,
9126
+ Row2,
9323
9127
  {
9324
9128
  noIcon: true,
9325
9129
  selected: index === state.index,
@@ -9343,10 +9147,10 @@ function FindPanelView({
9343
9147
  let flatIndex = -1;
9344
9148
  return /* @__PURE__ */ jsxs11("div", { style: { display: "flex", flexDirection: "column", height: "100%", minHeight: 0 }, onKeyDown, children: [
9345
9149
  /* @__PURE__ */ jsx12(
9346
- Toolbar2,
9150
+ Toolbar3,
9347
9151
  {
9348
9152
  left: /* @__PURE__ */ jsx12(
9349
- SearchField2,
9153
+ SearchField3,
9350
9154
  {
9351
9155
  value: state.text,
9352
9156
  onChange: (value) => controller.setText(value),
@@ -9355,7 +9159,7 @@ function FindPanelView({
9355
9159
  ),
9356
9160
  right: /* @__PURE__ */ jsxs11(ToolbarGroup2, { end: true, children: [
9357
9161
  /* @__PURE__ */ jsx12(
9358
- IconButton3,
9162
+ IconButton4,
9359
9163
  {
9360
9164
  label: "Match case",
9361
9165
  active: state.options.caseSensitive,
@@ -9364,7 +9168,7 @@ function FindPanelView({
9364
9168
  }
9365
9169
  ),
9366
9170
  /* @__PURE__ */ jsx12(
9367
- IconButton3,
9171
+ IconButton4,
9368
9172
  {
9369
9173
  label: "Whole word",
9370
9174
  active: state.options.wholeWord,
@@ -9373,7 +9177,7 @@ function FindPanelView({
9373
9177
  }
9374
9178
  ),
9375
9179
  /* @__PURE__ */ jsx12(
9376
- IconButton3,
9180
+ IconButton4,
9377
9181
  {
9378
9182
  label: "Regular expression",
9379
9183
  active: state.options.regex,
@@ -9385,7 +9189,7 @@ function FindPanelView({
9385
9189
  }
9386
9190
  ),
9387
9191
  /* @__PURE__ */ jsx12(
9388
- Toolbar2,
9192
+ Toolbar3,
9389
9193
  {
9390
9194
  divided: false,
9391
9195
  left: /* @__PURE__ */ jsx12(
@@ -9401,7 +9205,7 @@ function FindPanelView({
9401
9205
  ),
9402
9206
  right: /* @__PURE__ */ jsxs11(ToolbarGroup2, { end: true, children: [
9403
9207
  /* @__PURE__ */ jsx12(
9404
- IconButton3,
9208
+ IconButton4,
9405
9209
  {
9406
9210
  label: "Previous match",
9407
9211
  disabled: state.matches.length === 0,
@@ -9410,7 +9214,7 @@ function FindPanelView({
9410
9214
  }
9411
9215
  ),
9412
9216
  /* @__PURE__ */ jsx12(
9413
- IconButton3,
9217
+ IconButton4,
9414
9218
  {
9415
9219
  label: "Next match",
9416
9220
  disabled: state.matches.length === 0,
@@ -9424,10 +9228,10 @@ function FindPanelView({
9424
9228
  ),
9425
9229
  state.message && state.status === "invalidPattern" ? /* @__PURE__ */ jsx12("div", { style: { padding: "2px 8px 4px", fontSize: 9, opacity: 0.6 }, children: state.message }) : null,
9426
9230
  state.replaceVisible ? /* @__PURE__ */ jsx12(
9427
- Toolbar2,
9231
+ Toolbar3,
9428
9232
  {
9429
9233
  left: /* @__PURE__ */ jsx12(
9430
- SearchField2,
9234
+ SearchField3,
9431
9235
  {
9432
9236
  value: state.replaceText,
9433
9237
  onChange: (value) => controller.setReplaceText(value),
@@ -9444,24 +9248,24 @@ function FindPanelView({
9444
9248
  ] })
9445
9249
  }
9446
9250
  ) : null,
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,
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,
9449
9253
  {
9450
9254
  title: "Invalid pattern",
9451
9255
  hint: state.message ?? "The expression could not be read. Fix it to search."
9452
9256
  }
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(
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(
9454
9258
  Section2,
9455
9259
  {
9456
9260
  title: group.label || "Results",
9457
9261
  flush: true,
9458
- badge: /* @__PURE__ */ jsx12(Badge3, { children: group.matches.length }),
9459
- 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)) })
9460
9264
  },
9461
9265
  group.id
9462
9266
  )) }) : null,
9463
9267
  /* @__PURE__ */ jsx12(
9464
- StatusBar3,
9268
+ StatusBar4,
9465
9269
  {
9466
9270
  left: state.truncated ? `showing first ${state.matches.length}` : void 0,
9467
9271
  right: state.options.scope
@@ -10111,17 +9915,17 @@ var commentsManifest = {
10111
9915
  // src/edit/comments/react/CommentsPanelView.tsx
10112
9916
  import { useSyncExternalStore as useSyncExternalStore8 } from "react";
10113
9917
  import {
10114
- Badge as Badge4,
10115
- EmptyState as EmptyState4,
10116
- ScrollArea as ScrollArea3,
9918
+ Badge as Badge5,
9919
+ EmptyState as EmptyState5,
9920
+ ScrollArea as ScrollArea4,
10117
9921
  Section as Section3,
10118
9922
  SegmentedControl as SegmentedControl2,
10119
- StatusBar as StatusBar4,
9923
+ StatusBar as StatusBar5,
10120
9924
  TextButton as TextButton3,
10121
- Toolbar as Toolbar3,
9925
+ Toolbar as Toolbar4,
10122
9926
  ToolbarGroup as ToolbarGroup3
10123
9927
  } from "@xenosystem/components/chrome";
10124
- 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";
10125
9929
  var ANCHOR_BADGE = {
10126
9930
  live: null,
10127
9931
  stale: {
@@ -10161,8 +9965,8 @@ function ThreadCard({
10161
9965
  },
10162
9966
  children: /* @__PURE__ */ jsxs12("div", { style: { padding: "6px 8px", display: "flex", flexDirection: "column", gap: 4 }, children: [
10163
9967
  /* @__PURE__ */ jsxs12("div", { style: { display: "flex", alignItems: "center", gap: 4 }, children: [
10164
- badge ? /* @__PURE__ */ jsx13(Badge4, { tone: badge.tone, title: badge.title, children: badge.label }) : null,
10165
- thread.resolved ? /* @__PURE__ */ jsx13(Badge4, { 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,
10166
9970
  /* @__PURE__ */ jsx13("span", { style: { marginLeft: "auto", fontSize: 9, opacity: 0.4 }, children: formatAge(thread.createdAt, now) })
10167
9971
  ] }),
10168
9972
  thread.anchorLabel ? /* @__PURE__ */ jsx13(
@@ -10262,7 +10066,7 @@ function CommentsPanelView({
10262
10066
  const resolved = state.threads.filter((t) => t.thread.resolved);
10263
10067
  return /* @__PURE__ */ jsxs12("div", { style: { display: "flex", flexDirection: "column", height: "100%", minHeight: 0 }, children: [
10264
10068
  /* @__PURE__ */ jsx13(
10265
- Toolbar3,
10069
+ Toolbar4,
10266
10070
  {
10267
10071
  left: /* @__PURE__ */ jsx13(
10268
10072
  SegmentedControl2,
@@ -10301,23 +10105,23 @@ function CommentsPanelView({
10301
10105
  " about.",
10302
10106
  state.filter.includeOrphaned === false ? /* @__PURE__ */ jsx13(TextButton3, { onClick: () => controller.setFilter({ includeOrphaned: true }), children: "Show" }) : null
10303
10107
  ] }) : null,
10304
- /* @__PURE__ */ jsx13(ScrollArea3, { children: state.threads.length === 0 ? state.filteredEmpty ? (
10108
+ /* @__PURE__ */ jsx13(ScrollArea4, { children: state.threads.length === 0 ? state.filteredEmpty ? (
10305
10109
  // NOT "no comments". There are comments; this filter hides them, and telling a
10306
10110
  // reviewer their feedback is gone is worse than telling them nothing.
10307
10111
  /* @__PURE__ */ jsx13(
10308
- EmptyState4,
10112
+ EmptyState5,
10309
10113
  {
10310
10114
  title: "Nothing matches this filter",
10311
10115
  hint: `${state.totals.all} comment${state.totals.all === 1 ? "" : "s"} on this document.`
10312
10116
  }
10313
10117
  )
10314
10118
  ) : /* @__PURE__ */ jsx13(
10315
- EmptyState4,
10119
+ EmptyState5,
10316
10120
  {
10317
10121
  title: "No comments",
10318
10122
  hint: emptyHint ?? "Select something and add a comment."
10319
10123
  }
10320
- ) : /* @__PURE__ */ jsxs12(Fragment5, { children: [
10124
+ ) : /* @__PURE__ */ jsxs12(Fragment6, { children: [
10321
10125
  open.map((view) => /* @__PURE__ */ jsx13(
10322
10126
  ThreadCard,
10323
10127
  {
@@ -10379,7 +10183,7 @@ function CommentsPanelView({
10379
10183
  ) })
10380
10184
  ] }),
10381
10185
  /* @__PURE__ */ jsx13(
10382
- StatusBar4,
10186
+ StatusBar5,
10383
10187
  {
10384
10188
  left: `${state.totals.open} open`,
10385
10189
  right: state.totals.stale > 0 ? `${state.totals.stale} edited` : void 0
@@ -11551,8 +11355,8 @@ var nodegraphManifest = {
11551
11355
 
11552
11356
  // src/edit/nodegraph/react/NodeGraphPanelView.tsx
11553
11357
  import { useCallback as useCallback7, useEffect as useEffect7, useRef as useRef8, useSyncExternalStore as useSyncExternalStore9 } from "react";
11554
- import { EmptyState as EmptyState5, StatusBar as StatusBar5, Toolbar as Toolbar4, ToolbarGroup as ToolbarGroup4 } from "@xenosystem/components/chrome";
11555
- 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";
11556
11360
  var HEADER_H2 = 24;
11557
11361
  var PORT_ROW_H2 = 18;
11558
11362
  function NodeGraphPanelView({ controller }) {
@@ -11633,7 +11437,7 @@ function NodeGraphPanelView({ controller }) {
11633
11437
  const total = state.graph?.nodes.length ?? 0;
11634
11438
  return /* @__PURE__ */ jsxs13("div", { style: SHELL2, children: [
11635
11439
  /* @__PURE__ */ jsx14(
11636
- Toolbar4,
11440
+ Toolbar5,
11637
11441
  {
11638
11442
  right: /* @__PURE__ */ jsxs13(ToolbarGroup4, { end: true, children: [
11639
11443
  /* @__PURE__ */ jsx14("button", { type: "button", style: button2(), onClick: () => controller.fit(false), children: "Fit" }),
@@ -11641,7 +11445,7 @@ function NodeGraphPanelView({ controller }) {
11641
11445
  ] })
11642
11446
  }
11643
11447
  ),
11644
- total === 0 ? /* @__PURE__ */ jsx14(EmptyState5, { 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(
11645
11449
  "div",
11646
11450
  {
11647
11451
  ref: containerRef,
@@ -11705,7 +11509,7 @@ function NodeGraphPanelView({ controller }) {
11705
11509
  }
11706
11510
  ),
11707
11511
  /* @__PURE__ */ jsx14(
11708
- StatusBar5,
11512
+ StatusBar6,
11709
11513
  {
11710
11514
  left: `${total} node${total === 1 ? "" : "s"}`,
11711
11515
  right: /* @__PURE__ */ jsxs13("span", { className: "tabular-nums", children: [
@@ -11775,7 +11579,7 @@ function NodeRect({ node, selected, zoom }) {
11775
11579
  children: node.title
11776
11580
  }
11777
11581
  ),
11778
- node.collapsed ? null : /* @__PURE__ */ jsxs13(Fragment6, { children: [
11582
+ node.collapsed ? null : /* @__PURE__ */ jsxs13(Fragment7, { children: [
11779
11583
  node.inputs.map((port, i) => /* @__PURE__ */ jsx14(
11780
11584
  Port,
11781
11585
  {
@@ -13080,22 +12884,22 @@ var treeManifest = {
13080
12884
  // src/edit/tree/react/TreePanelView.tsx
13081
12885
  import { useCallback as useCallback8, useEffect as useEffect8, useRef as useRef9, useState as useState2, useSyncExternalStore as useSyncExternalStore10 } from "react";
13082
12886
  import {
13083
- Badge as Badge5,
13084
- EmptyState as EmptyState6,
12887
+ Badge as Badge6,
12888
+ EmptyState as EmptyState7,
13085
12889
  ErrorState,
13086
- IconButton as IconButton4,
12890
+ IconButton as IconButton5,
13087
12891
  LoadingState,
13088
- Row as Row2,
13089
- ScrollArea as ScrollArea4,
13090
- SearchField as SearchField3,
13091
- StatusBar as StatusBar6,
13092
- Toolbar as Toolbar5,
12892
+ Row as Row3,
12893
+ ScrollArea as ScrollArea5,
12894
+ SearchField as SearchField4,
12895
+ StatusBar as StatusBar7,
12896
+ Toolbar as Toolbar6,
13093
12897
  ToolbarGroup as ToolbarGroup5
13094
12898
  } from "@xenosystem/components/chrome";
13095
12899
  import { computeWindow as computeWindow3 } from "@xenosystem/tree-core";
13096
12900
 
13097
12901
  // src/edit/tree/react/icons.tsx
13098
- 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";
13099
12903
  function Svg({ children, size = 11 }) {
13100
12904
  return /* @__PURE__ */ jsx15(
13101
12905
  "svg",
@@ -13148,37 +12952,37 @@ function RefreshGlyph() {
13148
12952
  }
13149
12953
  var PATHS = {
13150
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" }),
13151
- file: /* @__PURE__ */ jsxs14(Fragment7, { children: [
12955
+ file: /* @__PURE__ */ jsxs14(Fragment8, { children: [
13152
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" }),
13153
12957
  /* @__PURE__ */ jsx15("path", { d: "M14 2v4a2 2 0 0 0 2 2h4" })
13154
12958
  ] }),
13155
- "folder-tree": /* @__PURE__ */ jsxs14(Fragment7, { children: [
12959
+ "folder-tree": /* @__PURE__ */ jsxs14(Fragment8, { children: [
13156
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" }),
13157
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" }),
13158
12962
  /* @__PURE__ */ jsx15("path", { d: "M3 5a2 2 0 0 0 2 2h3" }),
13159
12963
  /* @__PURE__ */ jsx15("path", { d: "M3 3v13a2 2 0 0 0 2 2h3" })
13160
12964
  ] }),
13161
- box: /* @__PURE__ */ jsxs14(Fragment7, { children: [
12965
+ box: /* @__PURE__ */ jsxs14(Fragment8, { children: [
13162
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" }),
13163
12967
  /* @__PURE__ */ jsx15("path", { d: "m3.3 7 8.7 5 8.7-5" }),
13164
12968
  /* @__PURE__ */ jsx15("path", { d: "M12 22V12" })
13165
12969
  ] }),
13166
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" }),
13167
- "file-text": /* @__PURE__ */ jsxs14(Fragment7, { children: [
12971
+ "file-text": /* @__PURE__ */ jsxs14(Fragment8, { children: [
13168
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" }),
13169
12973
  /* @__PURE__ */ jsx15("path", { d: "M14 2v4a2 2 0 0 0 2 2h4" }),
13170
12974
  /* @__PURE__ */ jsx15("path", { d: "M8 13h8M8 17h5" })
13171
12975
  ] }),
13172
- heading: /* @__PURE__ */ jsx15(Fragment7, { children: /* @__PURE__ */ jsx15("path", { d: "M6 4v16M18 4v16M6 12h12" }) }),
13173
- 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: [
13174
12978
  /* @__PURE__ */ jsx15("rect", { x: "3", y: "8", width: "18", height: "12", rx: "2" }),
13175
12979
  /* @__PURE__ */ jsx15("path", { d: "M12 4v4M8 14h.01M16 14h.01" })
13176
12980
  ] }),
13177
- link: /* @__PURE__ */ jsxs14(Fragment7, { children: [
12981
+ link: /* @__PURE__ */ jsxs14(Fragment8, { children: [
13178
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" }),
13179
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" })
13180
12984
  ] }),
13181
- "link-2-off": /* @__PURE__ */ jsxs14(Fragment7, { children: [
12985
+ "link-2-off": /* @__PURE__ */ jsxs14(Fragment8, { children: [
13182
12986
  /* @__PURE__ */ jsx15("path", { d: "M9 17H7A5 5 0 0 1 7 7" }),
13183
12987
  /* @__PURE__ */ jsx15("path", { d: "M15 7h2a5 5 0 0 1 4 8" }),
13184
12988
  /* @__PURE__ */ jsx15("path", { d: "M8 12h4" }),
@@ -13191,7 +12995,7 @@ function TreeIcon({ name, size = 11 }) {
13191
12995
  }
13192
12996
 
13193
12997
  // src/edit/tree/react/TreePanelView.tsx
13194
- 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";
13195
12999
  function TreePanelView({
13196
13000
  controller,
13197
13001
  rowHeight = 24,
@@ -13223,7 +13027,7 @@ function TreePanelView({
13223
13027
  const sourceState = source?.sourceState ?? "idle";
13224
13028
  const body = (() => {
13225
13029
  if (!source || sourceState === "idle") {
13226
- return /* @__PURE__ */ jsx16(EmptyState6, { 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." });
13227
13031
  }
13228
13032
  if (sourceState === "loading" && state.rows.length === 0) {
13229
13033
  return /* @__PURE__ */ jsx16(LoadingState, { label: source.sourceMessage ?? "Loading\u2026" });
@@ -13240,8 +13044,8 @@ function TreePanelView({
13240
13044
  );
13241
13045
  }
13242
13046
  if (state.rows.length === 0) {
13243
- return state.filter ? /* @__PURE__ */ jsx16(EmptyState6, { title: "No matches", hint: `Nothing matches \u201C${state.filter}\u201D.` }) : /* @__PURE__ */ jsx16(
13244
- EmptyState6,
13047
+ return state.filter ? /* @__PURE__ */ jsx16(EmptyState7, { title: "No matches", hint: `Nothing matches \u201C${state.filter}\u201D.` }) : /* @__PURE__ */ jsx16(
13048
+ EmptyState7,
13245
13049
  {
13246
13050
  title: "Nothing here",
13247
13051
  hint: emptyHint ?? source.sourceMessage ?? "This source has no items yet."
@@ -13256,7 +13060,7 @@ function TreePanelView({
13256
13060
  overscan
13257
13061
  });
13258
13062
  const slice = state.rows.slice(window2.startIndex, window2.endIndex);
13259
- return /* @__PURE__ */ jsx16(ScrollArea4, { children: /* @__PURE__ */ jsx16(
13063
+ return /* @__PURE__ */ jsx16(ScrollArea5, { children: /* @__PURE__ */ jsx16(
13260
13064
  "div",
13261
13065
  {
13262
13066
  ref: scrollRef,
@@ -13288,10 +13092,10 @@ function TreePanelView({
13288
13092
  })();
13289
13093
  return /* @__PURE__ */ jsxs15("div", { style: { display: "flex", flexDirection: "column", height: "100%", minHeight: 0 }, children: [
13290
13094
  /* @__PURE__ */ jsx16(
13291
- Toolbar5,
13095
+ Toolbar6,
13292
13096
  {
13293
13097
  left: showSearch ? /* @__PURE__ */ jsx16(
13294
- SearchField3,
13098
+ SearchField4,
13295
13099
  {
13296
13100
  value: state.filter,
13297
13101
  onChange: (term) => controller.setFilter(term),
@@ -13299,22 +13103,22 @@ function TreePanelView({
13299
13103
  }
13300
13104
  ) : void 0,
13301
13105
  right: /* @__PURE__ */ jsxs15(ToolbarGroup5, { end: true, children: [
13302
- /* @__PURE__ */ jsx16(IconButton4, { icon: /* @__PURE__ */ jsx16(ExpandGlyph, {}), label: "Expand all", onClick: () => controller.expandAll() }),
13106
+ /* @__PURE__ */ jsx16(IconButton5, { icon: /* @__PURE__ */ jsx16(ExpandGlyph, {}), label: "Expand all", onClick: () => controller.expandAll() }),
13303
13107
  /* @__PURE__ */ jsx16(
13304
- IconButton4,
13108
+ IconButton5,
13305
13109
  {
13306
13110
  icon: /* @__PURE__ */ jsx16(CollapseGlyph, {}),
13307
13111
  label: "Collapse all",
13308
13112
  onClick: () => controller.collapseAll()
13309
13113
  }
13310
13114
  ),
13311
- /* @__PURE__ */ jsx16(IconButton4, { icon: /* @__PURE__ */ jsx16(RefreshGlyph, {}), label: "Refresh", onClick: () => controller.refresh() })
13115
+ /* @__PURE__ */ jsx16(IconButton5, { icon: /* @__PURE__ */ jsx16(RefreshGlyph, {}), label: "Refresh", onClick: () => controller.refresh() })
13312
13116
  ] })
13313
13117
  }
13314
13118
  ),
13315
13119
  body,
13316
13120
  /* @__PURE__ */ jsx16(
13317
- StatusBar6,
13121
+ StatusBar7,
13318
13122
  {
13319
13123
  left: `${state.rows.length} item${state.rows.length === 1 ? "" : "s"}`,
13320
13124
  right: state.selection.length > 0 ? `${state.selection.length} selected` : void 0
@@ -13373,7 +13177,7 @@ function TreeRowView({
13373
13177
  },
13374
13178
  title: drop?.reason,
13375
13179
  children: /* @__PURE__ */ jsx16(
13376
- Row2,
13180
+ Row3,
13377
13181
  {
13378
13182
  role: "treeitem",
13379
13183
  "aria-expanded": row.container ? row.expanded : void 0,
@@ -13408,7 +13212,7 @@ function TreeRowView({
13408
13212
  onPointerUp: () => {
13409
13213
  if (state.drag) controller.endDrag();
13410
13214
  },
13411
- icon: /* @__PURE__ */ jsxs15(Fragment8, { children: [
13215
+ icon: /* @__PURE__ */ jsxs15(Fragment9, { children: [
13412
13216
  twisty,
13413
13217
  /* @__PURE__ */ jsx16(NodeIcon, { icon: node.icon ?? defaultIconFor(node.kind) })
13414
13218
  ] }),
@@ -13438,15 +13242,15 @@ function TreeRowView({
13438
13242
  }
13439
13243
  ) : node.label,
13440
13244
  meta: /* @__PURE__ */ jsx16(ChildStateChip, { row, controller }),
13441
- trailing: /* @__PURE__ */ jsxs15(Fragment8, { children: [
13245
+ trailing: /* @__PURE__ */ jsxs15(Fragment9, { children: [
13442
13246
  columns?.map((columnId) => /* @__PURE__ */ jsx16("span", { style: { opacity: 0.7, fontVariantNumeric: "tabular-nums" }, children: node.columns?.[columnId] ?? "" }, columnId)),
13443
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)),
13444
13248
  node.badges?.map((badge) => (
13445
13249
  // Opaque: the host formatted the text, the panel only places it.
13446
- /* @__PURE__ */ jsx16(Badge5, { 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)
13447
13251
  )),
13448
13252
  node.actions?.map((action) => /* @__PURE__ */ jsx16(
13449
- IconButton4,
13253
+ IconButton5,
13450
13254
  {
13451
13255
  size: "sm",
13452
13256
  icon: /* @__PURE__ */ jsx16(NodeIcon, { icon: action.icon }),
@@ -13472,7 +13276,7 @@ function ChildStateChip({
13472
13276
  }
13473
13277
  if (row.childState === "error") {
13474
13278
  const error = row.node.error;
13475
- return /* @__PURE__ */ jsx16(Badge5, { 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" });
13476
13280
  }
13477
13281
  if (row.node.hasMore && row.expanded) {
13478
13282
  return /* @__PURE__ */ jsx16(
@@ -13489,7 +13293,7 @@ function ChildStateChip({
13489
13293
  );
13490
13294
  }
13491
13295
  if (row.node.truncatedAt !== void 0) {
13492
- return /* @__PURE__ */ jsx16(Badge5, { tone: "warning", children: `first ${row.node.truncatedAt}` });
13296
+ return /* @__PURE__ */ jsx16(Badge6, { tone: "warning", children: `first ${row.node.truncatedAt}` });
13493
13297
  }
13494
13298
  if (row.expanded && isEmptyContainer(row.node)) {
13495
13299
  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.3",
3
+ "version": "0.11.4",
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.12.0 <1",
63
+ "@xenosystem/components": ">=0.13.1 <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.12.0",
79
+ "@xenosystem/components": "^0.13.1",
80
80
  "@xenosystem/data-core": "^0.1.0",
81
81
  "@xenosystem/elements-react": "0.0.1",
82
82
  "@xenosystem/time-core": "^0.1.0",