@xenosystem/blocks 0.13.0 → 0.13.2

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.
@@ -6,18 +6,25 @@ import {
6
6
  LinkIcon,
7
7
  LockStateIcon,
8
8
  NextIcon,
9
- PendingGlyph,
10
9
  PrevIcon,
11
10
  RedoIcon,
12
11
  ResetIcon,
13
12
  StopwatchIcon,
14
13
  SwapIcon,
15
14
  TrashIcon,
15
+ TreeIcon,
16
16
  UndoIcon,
17
17
  VisibilityIcon,
18
18
  XIcon,
19
19
  XIcon2
20
- } from "../chunk-OCEZTO2D.js";
20
+ } from "../chunk-SFSCCISX.js";
21
+ import {
22
+ CaseGlyph,
23
+ ChevronGlyph,
24
+ CollapseGlyph,
25
+ ExpandGlyph,
26
+ RefreshGlyph
27
+ } from "../chunk-GQWAIPDF.js";
21
28
  import "../chunk-2KG3PWR4.js";
22
29
 
23
30
  // src/edit/layers/panel.ts
@@ -4825,7 +4832,7 @@ var HISTORY_DECLARATION = {
4825
4832
  node: {
4826
4833
  component: "fragment",
4827
4834
  children: [
4828
- { component: "icons/Pending", when: { item: "pending" } },
4835
+ { component: "chrome/Spinner", when: { item: "pending" } },
4829
4836
  { component: "chrome/Badge", when: { item: "failed" }, props: { size: { value: "sm" }, tone: { value: "error" } }, children: [text3({ value: "failed" })] },
4830
4837
  { component: "chrome/Badge", when: { item: "showSource" }, props: { size: { value: "sm" }, title: { item: "sourceTitle" } }, children: [text3({ item: "sourceGlyph" })] },
4831
4838
  { component: "chrome/Badge", when: { item: "showCoalesced" }, props: { size: { value: "sm" }, title: { item: "coalescedTitle" } }, children: [text3({ item: "coalescedText" })] },
@@ -4861,7 +4868,7 @@ var HISTORY_DECLARATION = {
4861
4868
  };
4862
4869
 
4863
4870
  // src/edit/history/react/HistoryPanelView.tsx
4864
- import { Badge as Badge3, Column as Column3, EmptyState as EmptyState3, IconButton as IconButton4, InlineConfirm, RowList as RowList2, Row as Row2, ScrollArea as ScrollArea3, SearchField as SearchField3, StatusBar as StatusBar2, Text as Text4, Toolbar as Toolbar2, VirtualWindow as VirtualWindow2 } from "@xenosystem/components/chrome";
4871
+ import { Badge as Badge3, Column as Column3, EmptyState as EmptyState3, IconButton as IconButton4, InlineConfirm, RowList as RowList2, Row as Row2, ScrollArea as ScrollArea3, SearchField as SearchField3, Spinner, StatusBar as StatusBar2, Text as Text4, Toolbar as Toolbar2, VirtualWindow as VirtualWindow2 } from "@xenosystem/components/chrome";
4865
4872
  import { Fragment as Fragment4, jsx as jsx5, jsxs as jsxs4 } from "react/jsx-runtime";
4866
4873
  function HistoryPanelView({ controller }) {
4867
4874
  const subscribe = useCallback4((cb) => controller.subscribe(cb), [controller]);
@@ -4958,7 +4965,7 @@ function HistoryRowView({ row: row2, controller }) {
4958
4965
  "data-history-row": row2.key,
4959
4966
  title: row2.label,
4960
4967
  trailing: /* @__PURE__ */ jsxs4(Fragment4, { children: [
4961
- row2.pending ? /* @__PURE__ */ jsx5(PendingGlyph, {}) : null,
4968
+ row2.pending ? /* @__PURE__ */ jsx5(Spinner, {}) : null,
4962
4969
  row2.failed ? /* @__PURE__ */ jsx5(Badge3, { size: "sm", tone: "error", children: "failed" }) : null,
4963
4970
  row2.showSource ? /* @__PURE__ */ jsx5(Badge3, { size: "sm", title: row2.sourceTitle, children: row2.sourceGlyph }) : null,
4964
4971
  row2.showCoalesced ? /* @__PURE__ */ jsx5(Badge3, { size: "sm", title: row2.coalescedTitle, children: row2.coalescedText }) : null,
@@ -9347,12 +9354,7 @@ import {
9347
9354
  } from "@xenosystem/components/chrome";
9348
9355
  import { jsx as jsx9, jsxs as jsxs8 } from "react/jsx-runtime";
9349
9356
  function CaseIcon() {
9350
- return /* @__PURE__ */ jsxs8("svg", { width: "12", height: "12", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "1.5", children: [
9351
- /* @__PURE__ */ jsx9("path", { d: "m3 15 4-8 4 8" }),
9352
- /* @__PURE__ */ jsx9("path", { d: "M4 13h6" }),
9353
- /* @__PURE__ */ jsx9("circle", { cx: "18", cy: "12", r: "3" }),
9354
- /* @__PURE__ */ jsx9("path", { d: "M21 9v6" })
9355
- ] });
9357
+ return /* @__PURE__ */ jsx9(CaseGlyph, { size: 12 });
9356
9358
  }
9357
9359
  function WordIcon() {
9358
9360
  return /* @__PURE__ */ jsxs8("svg", { width: "12", height: "12", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "1.5", children: [
@@ -13189,105 +13191,7 @@ import {
13189
13191
  ToolbarGroup as ToolbarGroup5
13190
13192
  } from "@xenosystem/components/chrome";
13191
13193
  import { computeWindow as computeWindow3 } from "@xenosystem/tree-core";
13192
-
13193
- // src/edit/tree/react/icons.tsx
13194
13194
  import { Fragment as Fragment8, jsx as jsx12, jsxs as jsxs11 } from "react/jsx-runtime";
13195
- function Svg({ children, size = 11 }) {
13196
- return /* @__PURE__ */ jsx12(
13197
- "svg",
13198
- {
13199
- width: size,
13200
- height: size,
13201
- viewBox: "0 0 24 24",
13202
- fill: "none",
13203
- stroke: "currentColor",
13204
- strokeWidth: "1.5",
13205
- strokeLinecap: "round",
13206
- strokeLinejoin: "round",
13207
- "aria-hidden": "true",
13208
- children
13209
- }
13210
- );
13211
- }
13212
- function ChevronGlyph() {
13213
- return /* @__PURE__ */ jsx12(Svg, { size: 9, children: /* @__PURE__ */ jsx12("path", { d: "m9 18 6-6-6-6" }) });
13214
- }
13215
- function ExpandGlyph() {
13216
- return /* @__PURE__ */ jsxs11(Svg, { children: [
13217
- /* @__PURE__ */ jsx12("path", { d: "M12 22v-6" }),
13218
- /* @__PURE__ */ jsx12("path", { d: "M12 8V2" }),
13219
- /* @__PURE__ */ jsx12("path", { d: "m9 5 3-3 3 3" }),
13220
- /* @__PURE__ */ jsx12("path", { d: "m9 19 3 3 3-3" }),
13221
- /* @__PURE__ */ jsx12("path", { d: "M4 12H2" }),
13222
- /* @__PURE__ */ jsx12("path", { d: "M10 12H8" }),
13223
- /* @__PURE__ */ jsx12("path", { d: "M16 12h-2" }),
13224
- /* @__PURE__ */ jsx12("path", { d: "M22 12h-2" })
13225
- ] });
13226
- }
13227
- function CollapseGlyph() {
13228
- return /* @__PURE__ */ jsxs11(Svg, { children: [
13229
- /* @__PURE__ */ jsx12("path", { d: "M12 22v-6" }),
13230
- /* @__PURE__ */ jsx12("path", { d: "M12 8V2" }),
13231
- /* @__PURE__ */ jsx12("path", { d: "m9 13 3 3 3-3" }),
13232
- /* @__PURE__ */ jsx12("path", { d: "m9 11 3-3 3 3" }),
13233
- /* @__PURE__ */ jsx12("path", { d: "M4 12H2" }),
13234
- /* @__PURE__ */ jsx12("path", { d: "M22 12h-2" })
13235
- ] });
13236
- }
13237
- function RefreshGlyph() {
13238
- return /* @__PURE__ */ jsxs11(Svg, { children: [
13239
- /* @__PURE__ */ jsx12("path", { d: "M21 12a9 9 0 0 0-9-9 9.75 9.75 0 0 0-6.74 2.74L3 8" }),
13240
- /* @__PURE__ */ jsx12("path", { d: "M3 3v5h5" }),
13241
- /* @__PURE__ */ jsx12("path", { d: "M3 12a9 9 0 0 0 9 9 9.75 9.75 0 0 0 6.74-2.74L21 16" }),
13242
- /* @__PURE__ */ jsx12("path", { d: "M16 16h5v5" })
13243
- ] });
13244
- }
13245
- var PATHS = {
13246
- folder: /* @__PURE__ */ jsx12("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" }),
13247
- file: /* @__PURE__ */ jsxs11(Fragment8, { children: [
13248
- /* @__PURE__ */ jsx12("path", { d: "M15 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V7Z" }),
13249
- /* @__PURE__ */ jsx12("path", { d: "M14 2v4a2 2 0 0 0 2 2h4" })
13250
- ] }),
13251
- "folder-tree": /* @__PURE__ */ jsxs11(Fragment8, { children: [
13252
- /* @__PURE__ */ jsx12("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" }),
13253
- /* @__PURE__ */ jsx12("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" }),
13254
- /* @__PURE__ */ jsx12("path", { d: "M3 5a2 2 0 0 0 2 2h3" }),
13255
- /* @__PURE__ */ jsx12("path", { d: "M3 3v13a2 2 0 0 0 2 2h3" })
13256
- ] }),
13257
- box: /* @__PURE__ */ jsxs11(Fragment8, { children: [
13258
- /* @__PURE__ */ jsx12("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" }),
13259
- /* @__PURE__ */ jsx12("path", { d: "m3.3 7 8.7 5 8.7-5" }),
13260
- /* @__PURE__ */ jsx12("path", { d: "M12 22V12" })
13261
- ] }),
13262
- component: /* @__PURE__ */ jsx12("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" }),
13263
- "file-text": /* @__PURE__ */ jsxs11(Fragment8, { children: [
13264
- /* @__PURE__ */ jsx12("path", { d: "M15 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V7Z" }),
13265
- /* @__PURE__ */ jsx12("path", { d: "M14 2v4a2 2 0 0 0 2 2h4" }),
13266
- /* @__PURE__ */ jsx12("path", { d: "M8 13h8M8 17h5" })
13267
- ] }),
13268
- heading: /* @__PURE__ */ jsx12(Fragment8, { children: /* @__PURE__ */ jsx12("path", { d: "M6 4v16M18 4v16M6 12h12" }) }),
13269
- bot: /* @__PURE__ */ jsxs11(Fragment8, { children: [
13270
- /* @__PURE__ */ jsx12("rect", { x: "3", y: "8", width: "18", height: "12", rx: "2" }),
13271
- /* @__PURE__ */ jsx12("path", { d: "M12 4v4M8 14h.01M16 14h.01" })
13272
- ] }),
13273
- link: /* @__PURE__ */ jsxs11(Fragment8, { children: [
13274
- /* @__PURE__ */ jsx12("path", { d: "M10 13a5 5 0 0 0 7.5.5l3-3a5 5 0 0 0-7-7l-1.8 1.7" }),
13275
- /* @__PURE__ */ jsx12("path", { d: "M14 11a5 5 0 0 0-7.5-.5l-3 3a5 5 0 0 0 7 7l1.8-1.7" })
13276
- ] }),
13277
- "link-2-off": /* @__PURE__ */ jsxs11(Fragment8, { children: [
13278
- /* @__PURE__ */ jsx12("path", { d: "M9 17H7A5 5 0 0 1 7 7" }),
13279
- /* @__PURE__ */ jsx12("path", { d: "M15 7h2a5 5 0 0 1 4 8" }),
13280
- /* @__PURE__ */ jsx12("path", { d: "M8 12h4" }),
13281
- /* @__PURE__ */ jsx12("path", { d: "m2 2 20 20" })
13282
- ] }),
13283
- "circle-dot": /* @__PURE__ */ jsx12("rect", { x: "9", y: "9", width: "6", height: "6", rx: "1" })
13284
- };
13285
- function TreeIcon({ name, size = 11 }) {
13286
- return /* @__PURE__ */ jsx12(Svg, { size, children: PATHS[name] ?? PATHS["circle-dot"] });
13287
- }
13288
-
13289
- // src/edit/tree/react/TreePanelView.tsx
13290
- import { Fragment as Fragment9, jsx as jsx13, jsxs as jsxs12 } from "react/jsx-runtime";
13291
13195
  function TreePanelView({
13292
13196
  controller,
13293
13197
  rowHeight = 24,
@@ -13319,13 +13223,13 @@ function TreePanelView({
13319
13223
  const sourceState = source?.sourceState ?? "idle";
13320
13224
  const body = (() => {
13321
13225
  if (!source || sourceState === "idle") {
13322
- return /* @__PURE__ */ jsx13(EmptyState8, { title: "No source", hint: emptyHint ?? "Connect a source to browse it." });
13226
+ return /* @__PURE__ */ jsx12(EmptyState8, { title: "No source", hint: emptyHint ?? "Connect a source to browse it." });
13323
13227
  }
13324
13228
  if (sourceState === "loading" && state.rows.length === 0) {
13325
- return /* @__PURE__ */ jsx13(LoadingState, { label: source.sourceMessage ?? "Loading\u2026" });
13229
+ return /* @__PURE__ */ jsx12(LoadingState, { label: source.sourceMessage ?? "Loading\u2026" });
13326
13230
  }
13327
13231
  if (sourceState === "error" || sourceState === "denied") {
13328
- return /* @__PURE__ */ jsx13(
13232
+ return /* @__PURE__ */ jsx12(
13329
13233
  ErrorState,
13330
13234
  {
13331
13235
  title: sourceState === "denied" ? "Access not granted" : "Could not read this source",
@@ -13336,7 +13240,7 @@ function TreePanelView({
13336
13240
  );
13337
13241
  }
13338
13242
  if (state.rows.length === 0) {
13339
- return state.filter ? /* @__PURE__ */ jsx13(EmptyState8, { title: "No matches", hint: `Nothing matches \u201C${state.filter}\u201D.` }) : /* @__PURE__ */ jsx13(
13243
+ return state.filter ? /* @__PURE__ */ jsx12(EmptyState8, { title: "No matches", hint: `Nothing matches \u201C${state.filter}\u201D.` }) : /* @__PURE__ */ jsx12(
13340
13244
  EmptyState8,
13341
13245
  {
13342
13246
  title: "Nothing here",
@@ -13352,7 +13256,7 @@ function TreePanelView({
13352
13256
  overscan
13353
13257
  });
13354
13258
  const slice = state.rows.slice(window2.startIndex, window2.endIndex);
13355
- return /* @__PURE__ */ jsx13(ScrollArea6, { children: /* @__PURE__ */ jsx13(
13259
+ return /* @__PURE__ */ jsx12(ScrollArea6, { children: /* @__PURE__ */ jsx12(
13356
13260
  "div",
13357
13261
  {
13358
13262
  ref: scrollRef,
@@ -13366,7 +13270,7 @@ function TreePanelView({
13366
13270
  e.preventDefault();
13367
13271
  }
13368
13272
  },
13369
- children: /* @__PURE__ */ jsx13("div", { style: { height: window2.totalHeight, position: "relative" }, children: /* @__PURE__ */ jsx13("div", { style: { transform: `translateY(${window2.offsetTop}px)` }, children: slice.map((row2) => /* @__PURE__ */ jsx13(
13273
+ children: /* @__PURE__ */ jsx12("div", { style: { height: window2.totalHeight, position: "relative" }, children: /* @__PURE__ */ jsx12("div", { style: { transform: `translateY(${window2.offsetTop}px)` }, children: slice.map((row2) => /* @__PURE__ */ jsx12(
13370
13274
  TreeRowView,
13371
13275
  {
13372
13276
  row: row2,
@@ -13382,11 +13286,11 @@ function TreePanelView({
13382
13286
  }
13383
13287
  ) });
13384
13288
  })();
13385
- return /* @__PURE__ */ jsxs12("div", { style: { display: "flex", flexDirection: "column", height: "100%", minHeight: 0 }, children: [
13386
- /* @__PURE__ */ jsx13(
13289
+ return /* @__PURE__ */ jsxs11("div", { style: { display: "flex", flexDirection: "column", height: "100%", minHeight: 0 }, children: [
13290
+ /* @__PURE__ */ jsx12(
13387
13291
  Toolbar7,
13388
13292
  {
13389
- left: showSearch ? /* @__PURE__ */ jsx13(
13293
+ left: showSearch ? /* @__PURE__ */ jsx12(
13390
13294
  SearchField5,
13391
13295
  {
13392
13296
  value: state.filter,
@@ -13394,22 +13298,22 @@ function TreePanelView({
13394
13298
  placeholder: "Filter\u2026"
13395
13299
  }
13396
13300
  ) : void 0,
13397
- right: /* @__PURE__ */ jsxs12(ToolbarGroup5, { end: true, children: [
13398
- /* @__PURE__ */ jsx13(IconButton7, { icon: /* @__PURE__ */ jsx13(ExpandGlyph, {}), label: "Expand all", onClick: () => controller.expandAll() }),
13399
- /* @__PURE__ */ jsx13(
13301
+ right: /* @__PURE__ */ jsxs11(ToolbarGroup5, { end: true, children: [
13302
+ /* @__PURE__ */ jsx12(IconButton7, { icon: /* @__PURE__ */ jsx12(ExpandGlyph, {}), label: "Expand all", onClick: () => controller.expandAll() }),
13303
+ /* @__PURE__ */ jsx12(
13400
13304
  IconButton7,
13401
13305
  {
13402
- icon: /* @__PURE__ */ jsx13(CollapseGlyph, {}),
13306
+ icon: /* @__PURE__ */ jsx12(CollapseGlyph, {}),
13403
13307
  label: "Collapse all",
13404
13308
  onClick: () => controller.collapseAll()
13405
13309
  }
13406
13310
  ),
13407
- /* @__PURE__ */ jsx13(IconButton7, { icon: /* @__PURE__ */ jsx13(RefreshGlyph, {}), label: "Refresh", onClick: () => controller.refresh() })
13311
+ /* @__PURE__ */ jsx12(IconButton7, { icon: /* @__PURE__ */ jsx12(RefreshGlyph, {}), label: "Refresh", onClick: () => controller.refresh() })
13408
13312
  ] })
13409
13313
  }
13410
13314
  ),
13411
13315
  body,
13412
- /* @__PURE__ */ jsx13(
13316
+ /* @__PURE__ */ jsx12(
13413
13317
  StatusBar8,
13414
13318
  {
13415
13319
  left: `${state.rows.length} item${state.rows.length === 1 ? "" : "s"}`,
@@ -13431,7 +13335,7 @@ function TreeRowView({
13431
13335
  const selected = state.selection.includes(row2.id);
13432
13336
  const renaming = state.renaming?.id === row2.id ? state.renaming : null;
13433
13337
  const drop = state.drag?.targetId === row2.id ? state.drag : null;
13434
- const twisty = row2.container ? /* @__PURE__ */ jsx13(
13338
+ const twisty = row2.container ? /* @__PURE__ */ jsx12(
13435
13339
  "span",
13436
13340
  {
13437
13341
  role: "button",
@@ -13451,13 +13355,13 @@ function TreeRowView({
13451
13355
  transition: "transform 80ms ease",
13452
13356
  opacity: 0.7
13453
13357
  },
13454
- children: /* @__PURE__ */ jsx13(ChevronGlyph, {})
13358
+ children: /* @__PURE__ */ jsx12(ChevronGlyph, { size: 9 })
13455
13359
  }
13456
13360
  ) : (
13457
13361
  // A leaf still reserves the twisty column, so labels stay in ONE column across mixed rows.
13458
- /* @__PURE__ */ jsx13("span", { style: { width: 12, flex: "0 0 auto" } })
13362
+ /* @__PURE__ */ jsx12("span", { style: { width: 12, flex: "0 0 auto" } })
13459
13363
  );
13460
- return /* @__PURE__ */ jsx13(
13364
+ return /* @__PURE__ */ jsx12(
13461
13365
  "div",
13462
13366
  {
13463
13367
  style: {
@@ -13468,7 +13372,7 @@ function TreeRowView({
13468
13372
  boxShadow: drop?.position === "into" ? "inset 0 0 0 1px var(--xeno-active)" : drop?.position === "before" ? "inset 0 1px 0 0 var(--xeno-active)" : drop?.position === "after" ? "inset 0 -1px 0 0 var(--xeno-active)" : void 0
13469
13373
  },
13470
13374
  title: drop?.reason,
13471
- children: /* @__PURE__ */ jsx13(
13375
+ children: /* @__PURE__ */ jsx12(
13472
13376
  Row4,
13473
13377
  {
13474
13378
  role: "treeitem",
@@ -13504,11 +13408,11 @@ function TreeRowView({
13504
13408
  onPointerUp: () => {
13505
13409
  if (state.drag) controller.endDrag();
13506
13410
  },
13507
- icon: /* @__PURE__ */ jsxs12(Fragment9, { children: [
13411
+ icon: /* @__PURE__ */ jsxs11(Fragment8, { children: [
13508
13412
  twisty,
13509
- /* @__PURE__ */ jsx13(NodeIcon, { icon: node.icon ?? defaultIconFor(node.kind) })
13413
+ /* @__PURE__ */ jsx12(NodeIcon, { icon: node.icon ?? defaultIconFor(node.kind) })
13510
13414
  ] }),
13511
- label: renaming ? /* @__PURE__ */ jsx13(
13415
+ label: renaming ? /* @__PURE__ */ jsx12(
13512
13416
  "input",
13513
13417
  {
13514
13418
  autoFocus: true,
@@ -13533,19 +13437,19 @@ function TreeRowView({
13533
13437
  }
13534
13438
  }
13535
13439
  ) : node.label,
13536
- meta: /* @__PURE__ */ jsx13(ChildStateChip, { row: row2, controller }),
13537
- trailing: /* @__PURE__ */ jsxs12(Fragment9, { children: [
13538
- columns?.map((columnId) => /* @__PURE__ */ jsx13("span", { style: { opacity: 0.7, fontVariantNumeric: "tabular-nums" }, children: node.columns?.[columnId] ?? "" }, columnId)),
13539
- node.glyphs?.map((glyph) => /* @__PURE__ */ jsx13("span", { title: glyph.title, style: { display: "flex", opacity: 0.7 }, children: /* @__PURE__ */ jsx13(NodeIcon, { icon: glyph.icon }) }, glyph.id)),
13440
+ meta: /* @__PURE__ */ jsx12(ChildStateChip, { row: row2, controller }),
13441
+ trailing: /* @__PURE__ */ jsxs11(Fragment8, { children: [
13442
+ columns?.map((columnId) => /* @__PURE__ */ jsx12("span", { style: { opacity: 0.7, fontVariantNumeric: "tabular-nums" }, children: node.columns?.[columnId] ?? "" }, columnId)),
13443
+ node.glyphs?.map((glyph) => /* @__PURE__ */ jsx12("span", { title: glyph.title, style: { display: "flex", opacity: 0.7 }, children: /* @__PURE__ */ jsx12(NodeIcon, { icon: glyph.icon }) }, glyph.id)),
13540
13444
  node.badges?.map((badge) => (
13541
13445
  // Opaque: the host formatted the text, the panel only places it.
13542
- /* @__PURE__ */ jsx13(Badge7, { tone: badge.tone, className: badge.title ? void 0 : void 0, children: badge.text }, badge.id)
13446
+ /* @__PURE__ */ jsx12(Badge7, { tone: badge.tone, className: badge.title ? void 0 : void 0, children: badge.text }, badge.id)
13543
13447
  )),
13544
- node.actions?.map((action) => /* @__PURE__ */ jsx13(
13448
+ node.actions?.map((action) => /* @__PURE__ */ jsx12(
13545
13449
  IconButton7,
13546
13450
  {
13547
13451
  size: "sm",
13548
- icon: /* @__PURE__ */ jsx13(NodeIcon, { icon: action.icon }),
13452
+ icon: /* @__PURE__ */ jsx12(NodeIcon, { icon: action.icon }),
13549
13453
  label: action.label,
13550
13454
  disabled: action.disabled,
13551
13455
  onClick: () => controller.runAction(row2.id, action.id)
@@ -13564,14 +13468,14 @@ function ChildStateChip({
13564
13468
  }) {
13565
13469
  if (!row2.container) return null;
13566
13470
  if (row2.childState === "loading") {
13567
- return /* @__PURE__ */ jsx13("span", { style: { opacity: 0.5, fontSize: 9 }, children: "loading\u2026" });
13471
+ return /* @__PURE__ */ jsx12("span", { style: { opacity: 0.5, fontSize: 9 }, children: "loading\u2026" });
13568
13472
  }
13569
13473
  if (row2.childState === "error") {
13570
13474
  const error = row2.node.error;
13571
- return /* @__PURE__ */ jsx13(Badge7, { tone: "error", children: error?.code === "denied" ? "no access" : error?.code ?? "failed" });
13475
+ return /* @__PURE__ */ jsx12(Badge7, { tone: "error", children: error?.code === "denied" ? "no access" : error?.code ?? "failed" });
13572
13476
  }
13573
13477
  if (row2.node.hasMore && row2.expanded) {
13574
- return /* @__PURE__ */ jsx13(
13478
+ return /* @__PURE__ */ jsx12(
13575
13479
  "span",
13576
13480
  {
13577
13481
  role: "button",
@@ -13585,18 +13489,18 @@ function ChildStateChip({
13585
13489
  );
13586
13490
  }
13587
13491
  if (row2.node.truncatedAt !== void 0) {
13588
- return /* @__PURE__ */ jsx13(Badge7, { tone: "warning", children: `first ${row2.node.truncatedAt}` });
13492
+ return /* @__PURE__ */ jsx12(Badge7, { tone: "warning", children: `first ${row2.node.truncatedAt}` });
13589
13493
  }
13590
13494
  if (row2.expanded && isEmptyContainer(row2.node)) {
13591
- return /* @__PURE__ */ jsx13("span", { style: { opacity: 0.4, fontSize: 9 }, children: "empty" });
13495
+ return /* @__PURE__ */ jsx12("span", { style: { opacity: 0.4, fontSize: 9 }, children: "empty" });
13592
13496
  }
13593
13497
  return null;
13594
13498
  }
13595
13499
  function NodeIcon({ icon }) {
13596
13500
  if (icon.kind === "text") {
13597
- return /* @__PURE__ */ jsx13("span", { style: { fontSize: 11, lineHeight: 1, display: "flex", alignItems: "center" }, children: icon.value });
13501
+ return /* @__PURE__ */ jsx12("span", { style: { fontSize: 11, lineHeight: 1, display: "flex", alignItems: "center" }, children: icon.value });
13598
13502
  }
13599
- return /* @__PURE__ */ jsx13(TreeIcon, { name: icon.name });
13503
+ return /* @__PURE__ */ jsx12(TreeIcon, { name: icon.name });
13600
13504
  }
13601
13505
 
13602
13506
  // src/edit/tree/panel.ts
@@ -1,4 +1,22 @@
1
- import { ComponentType } from 'react';
1
+ import { ReactNode, ComponentType } from 'react';
2
+
3
+ /**
4
+ * The shared glyphs — ONE source for the strokes that used to be copied per block (`Refresh` was
5
+ * byte-identical in three files, `X` in three, `Plus` in two). Lucide geometry at strokeWidth 1.5,
6
+ * rectangles and lines only: no circles anywhere (DESIGN_SYSTEM §3). Every block-local `icons.tsx`
7
+ * re-exports from here under its own name, so no view changed when the copies collapsed.
8
+ *
9
+ * Interim, like the registry beside it: when `@xenosystem/elements-react` ships the icon set, this
10
+ * file becomes re-exports and the blocks are untouched.
11
+ *
12
+ * @module
13
+ */
14
+
15
+ /** The frame every glyph draws in. */
16
+ declare function Svg({ children, size }: {
17
+ children: ReactNode;
18
+ size?: number;
19
+ }): ReactNode;
2
20
 
3
21
  /**
4
22
  * `@xenosystem/blocks/icons` — ONE glyph registry for every declared block, keyed `icons/<Name>`.
@@ -20,4 +38,4 @@ declare const ICONS: Readonly<Record<`icons/${string}`, ComponentType<any>>>;
20
38
  /** The registry names, for a host's registry check and the seen-before-used gate. */
21
39
  declare const ICON_UNITS: readonly string[];
22
40
 
23
- export { ICONS, ICON_UNITS };
41
+ export { ICONS, ICON_UNITS, Svg };
@@ -21,17 +21,34 @@ import {
21
21
  LinkIcon,
22
22
  LockStateIcon,
23
23
  NextIcon,
24
- PendingGlyph,
25
24
  PrevIcon,
26
25
  RedoIcon,
27
26
  ResetIcon,
28
27
  StopwatchIcon,
29
28
  SwapIcon,
30
29
  TrashIcon,
30
+ TreeIcon,
31
31
  UndoIcon,
32
- VisibilityIcon,
33
- XIcon2 as XIcon
34
- } from "../chunk-OCEZTO2D.js";
32
+ VisibilityIcon
33
+ } from "../chunk-SFSCCISX.js";
34
+ import {
35
+ CancelGlyph,
36
+ CaseGlyph,
37
+ ChevronGlyph,
38
+ ClearGlyph,
39
+ CollapseGlyph,
40
+ CopyGlyph,
41
+ DownloadGlyph,
42
+ ExpandGlyph,
43
+ PlugGlyph,
44
+ PlusGlyph,
45
+ RefreshGlyph,
46
+ RetryGlyph,
47
+ SortAscGlyph,
48
+ SortDescGlyph,
49
+ Svg,
50
+ XGlyph
51
+ } from "../chunk-GQWAIPDF.js";
35
52
  import "../chunk-2KG3PWR4.js";
36
53
 
37
54
  // src/icons/index.ts
@@ -54,8 +71,6 @@ var ICONS = Object.freeze({
54
71
  "icons/Undo": UndoIcon,
55
72
  "icons/Redo": RedoIcon,
56
73
  "icons/Trash": TrashIcon,
57
- "icons/X": XIcon,
58
- "icons/Pending": PendingGlyph,
59
74
  "icons/HistoryEntry": EntryIcon,
60
75
  // inspector
61
76
  "icons/Stopwatch": StopwatchIcon,
@@ -70,10 +85,28 @@ var ICONS = Object.freeze({
70
85
  "icons/LockState": LockStateIcon,
71
86
  // color
72
87
  "icons/Swap": SwapIcon,
73
- "icons/Eyedropper": EyedropperIcon
88
+ "icons/Eyedropper": EyedropperIcon,
89
+ // shared (src/icons/glyphs.tsx — the one source; the data/ops/time blocks re-export these)
90
+ "icons/Refresh": RefreshGlyph,
91
+ "icons/Close": XGlyph,
92
+ "icons/Plus": PlusGlyph,
93
+ "icons/Chevron": ChevronGlyph,
94
+ "icons/Download": DownloadGlyph,
95
+ "icons/Plug": PlugGlyph,
96
+ "icons/SortAsc": SortAscGlyph,
97
+ "icons/SortDesc": SortDescGlyph,
98
+ "icons/Expand": ExpandGlyph,
99
+ "icons/Collapse": CollapseGlyph,
100
+ "icons/Copy": CopyGlyph,
101
+ "icons/Clear": ClearGlyph,
102
+ "icons/Cancel": CancelGlyph,
103
+ "icons/Retry": RetryGlyph,
104
+ "icons/Case": CaseGlyph,
105
+ "icons/TreeKind": TreeIcon
74
106
  });
75
107
  var ICON_UNITS = Object.keys(ICONS);
76
108
  export {
77
109
  ICONS,
78
- ICON_UNITS
110
+ ICON_UNITS,
111
+ Svg
79
112
  };