@xenosystem/blocks 0.13.0 → 0.13.1

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.
@@ -13,11 +13,19 @@ import {
13
13
  StopwatchIcon,
14
14
  SwapIcon,
15
15
  TrashIcon,
16
+ TreeIcon,
16
17
  UndoIcon,
17
18
  VisibilityIcon,
18
19
  XIcon,
19
20
  XIcon2
20
- } from "../chunk-OCEZTO2D.js";
21
+ } from "../chunk-J5XEAON6.js";
22
+ import {
23
+ CaseGlyph,
24
+ ChevronGlyph,
25
+ CollapseGlyph,
26
+ ExpandGlyph,
27
+ RefreshGlyph
28
+ } from "../chunk-GQWAIPDF.js";
21
29
  import "../chunk-2KG3PWR4.js";
22
30
 
23
31
  // src/edit/layers/panel.ts
@@ -9347,12 +9355,7 @@ import {
9347
9355
  } from "@xenosystem/components/chrome";
9348
9356
  import { jsx as jsx9, jsxs as jsxs8 } from "react/jsx-runtime";
9349
9357
  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
- ] });
9358
+ return /* @__PURE__ */ jsx9(CaseGlyph, { size: 12 });
9356
9359
  }
9357
9360
  function WordIcon() {
9358
9361
  return /* @__PURE__ */ jsxs8("svg", { width: "12", height: "12", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "1.5", children: [
@@ -13189,105 +13192,7 @@ import {
13189
13192
  ToolbarGroup as ToolbarGroup5
13190
13193
  } from "@xenosystem/components/chrome";
13191
13194
  import { computeWindow as computeWindow3 } from "@xenosystem/tree-core";
13192
-
13193
- // src/edit/tree/react/icons.tsx
13194
13195
  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
13196
  function TreePanelView({
13292
13197
  controller,
13293
13198
  rowHeight = 24,
@@ -13319,13 +13224,13 @@ function TreePanelView({
13319
13224
  const sourceState = source?.sourceState ?? "idle";
13320
13225
  const body = (() => {
13321
13226
  if (!source || sourceState === "idle") {
13322
- return /* @__PURE__ */ jsx13(EmptyState8, { title: "No source", hint: emptyHint ?? "Connect a source to browse it." });
13227
+ return /* @__PURE__ */ jsx12(EmptyState8, { title: "No source", hint: emptyHint ?? "Connect a source to browse it." });
13323
13228
  }
13324
13229
  if (sourceState === "loading" && state.rows.length === 0) {
13325
- return /* @__PURE__ */ jsx13(LoadingState, { label: source.sourceMessage ?? "Loading\u2026" });
13230
+ return /* @__PURE__ */ jsx12(LoadingState, { label: source.sourceMessage ?? "Loading\u2026" });
13326
13231
  }
13327
13232
  if (sourceState === "error" || sourceState === "denied") {
13328
- return /* @__PURE__ */ jsx13(
13233
+ return /* @__PURE__ */ jsx12(
13329
13234
  ErrorState,
13330
13235
  {
13331
13236
  title: sourceState === "denied" ? "Access not granted" : "Could not read this source",
@@ -13336,7 +13241,7 @@ function TreePanelView({
13336
13241
  );
13337
13242
  }
13338
13243
  if (state.rows.length === 0) {
13339
- return state.filter ? /* @__PURE__ */ jsx13(EmptyState8, { title: "No matches", hint: `Nothing matches \u201C${state.filter}\u201D.` }) : /* @__PURE__ */ jsx13(
13244
+ return state.filter ? /* @__PURE__ */ jsx12(EmptyState8, { title: "No matches", hint: `Nothing matches \u201C${state.filter}\u201D.` }) : /* @__PURE__ */ jsx12(
13340
13245
  EmptyState8,
13341
13246
  {
13342
13247
  title: "Nothing here",
@@ -13352,7 +13257,7 @@ function TreePanelView({
13352
13257
  overscan
13353
13258
  });
13354
13259
  const slice = state.rows.slice(window2.startIndex, window2.endIndex);
13355
- return /* @__PURE__ */ jsx13(ScrollArea6, { children: /* @__PURE__ */ jsx13(
13260
+ return /* @__PURE__ */ jsx12(ScrollArea6, { children: /* @__PURE__ */ jsx12(
13356
13261
  "div",
13357
13262
  {
13358
13263
  ref: scrollRef,
@@ -13366,7 +13271,7 @@ function TreePanelView({
13366
13271
  e.preventDefault();
13367
13272
  }
13368
13273
  },
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(
13274
+ 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
13275
  TreeRowView,
13371
13276
  {
13372
13277
  row: row2,
@@ -13382,11 +13287,11 @@ function TreePanelView({
13382
13287
  }
13383
13288
  ) });
13384
13289
  })();
13385
- return /* @__PURE__ */ jsxs12("div", { style: { display: "flex", flexDirection: "column", height: "100%", minHeight: 0 }, children: [
13386
- /* @__PURE__ */ jsx13(
13290
+ return /* @__PURE__ */ jsxs11("div", { style: { display: "flex", flexDirection: "column", height: "100%", minHeight: 0 }, children: [
13291
+ /* @__PURE__ */ jsx12(
13387
13292
  Toolbar7,
13388
13293
  {
13389
- left: showSearch ? /* @__PURE__ */ jsx13(
13294
+ left: showSearch ? /* @__PURE__ */ jsx12(
13390
13295
  SearchField5,
13391
13296
  {
13392
13297
  value: state.filter,
@@ -13394,22 +13299,22 @@ function TreePanelView({
13394
13299
  placeholder: "Filter\u2026"
13395
13300
  }
13396
13301
  ) : 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(
13302
+ right: /* @__PURE__ */ jsxs11(ToolbarGroup5, { end: true, children: [
13303
+ /* @__PURE__ */ jsx12(IconButton7, { icon: /* @__PURE__ */ jsx12(ExpandGlyph, {}), label: "Expand all", onClick: () => controller.expandAll() }),
13304
+ /* @__PURE__ */ jsx12(
13400
13305
  IconButton7,
13401
13306
  {
13402
- icon: /* @__PURE__ */ jsx13(CollapseGlyph, {}),
13307
+ icon: /* @__PURE__ */ jsx12(CollapseGlyph, {}),
13403
13308
  label: "Collapse all",
13404
13309
  onClick: () => controller.collapseAll()
13405
13310
  }
13406
13311
  ),
13407
- /* @__PURE__ */ jsx13(IconButton7, { icon: /* @__PURE__ */ jsx13(RefreshGlyph, {}), label: "Refresh", onClick: () => controller.refresh() })
13312
+ /* @__PURE__ */ jsx12(IconButton7, { icon: /* @__PURE__ */ jsx12(RefreshGlyph, {}), label: "Refresh", onClick: () => controller.refresh() })
13408
13313
  ] })
13409
13314
  }
13410
13315
  ),
13411
13316
  body,
13412
- /* @__PURE__ */ jsx13(
13317
+ /* @__PURE__ */ jsx12(
13413
13318
  StatusBar8,
13414
13319
  {
13415
13320
  left: `${state.rows.length} item${state.rows.length === 1 ? "" : "s"}`,
@@ -13431,7 +13336,7 @@ function TreeRowView({
13431
13336
  const selected = state.selection.includes(row2.id);
13432
13337
  const renaming = state.renaming?.id === row2.id ? state.renaming : null;
13433
13338
  const drop = state.drag?.targetId === row2.id ? state.drag : null;
13434
- const twisty = row2.container ? /* @__PURE__ */ jsx13(
13339
+ const twisty = row2.container ? /* @__PURE__ */ jsx12(
13435
13340
  "span",
13436
13341
  {
13437
13342
  role: "button",
@@ -13451,13 +13356,13 @@ function TreeRowView({
13451
13356
  transition: "transform 80ms ease",
13452
13357
  opacity: 0.7
13453
13358
  },
13454
- children: /* @__PURE__ */ jsx13(ChevronGlyph, {})
13359
+ children: /* @__PURE__ */ jsx12(ChevronGlyph, { size: 9 })
13455
13360
  }
13456
13361
  ) : (
13457
13362
  // 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" } })
13363
+ /* @__PURE__ */ jsx12("span", { style: { width: 12, flex: "0 0 auto" } })
13459
13364
  );
13460
- return /* @__PURE__ */ jsx13(
13365
+ return /* @__PURE__ */ jsx12(
13461
13366
  "div",
13462
13367
  {
13463
13368
  style: {
@@ -13468,7 +13373,7 @@ function TreeRowView({
13468
13373
  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
13374
  },
13470
13375
  title: drop?.reason,
13471
- children: /* @__PURE__ */ jsx13(
13376
+ children: /* @__PURE__ */ jsx12(
13472
13377
  Row4,
13473
13378
  {
13474
13379
  role: "treeitem",
@@ -13504,11 +13409,11 @@ function TreeRowView({
13504
13409
  onPointerUp: () => {
13505
13410
  if (state.drag) controller.endDrag();
13506
13411
  },
13507
- icon: /* @__PURE__ */ jsxs12(Fragment9, { children: [
13412
+ icon: /* @__PURE__ */ jsxs11(Fragment8, { children: [
13508
13413
  twisty,
13509
- /* @__PURE__ */ jsx13(NodeIcon, { icon: node.icon ?? defaultIconFor(node.kind) })
13414
+ /* @__PURE__ */ jsx12(NodeIcon, { icon: node.icon ?? defaultIconFor(node.kind) })
13510
13415
  ] }),
13511
- label: renaming ? /* @__PURE__ */ jsx13(
13416
+ label: renaming ? /* @__PURE__ */ jsx12(
13512
13417
  "input",
13513
13418
  {
13514
13419
  autoFocus: true,
@@ -13533,19 +13438,19 @@ function TreeRowView({
13533
13438
  }
13534
13439
  }
13535
13440
  ) : 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)),
13441
+ meta: /* @__PURE__ */ jsx12(ChildStateChip, { row: row2, controller }),
13442
+ trailing: /* @__PURE__ */ jsxs11(Fragment8, { children: [
13443
+ columns?.map((columnId) => /* @__PURE__ */ jsx12("span", { style: { opacity: 0.7, fontVariantNumeric: "tabular-nums" }, children: node.columns?.[columnId] ?? "" }, columnId)),
13444
+ 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
13445
  node.badges?.map((badge) => (
13541
13446
  // 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)
13447
+ /* @__PURE__ */ jsx12(Badge7, { tone: badge.tone, className: badge.title ? void 0 : void 0, children: badge.text }, badge.id)
13543
13448
  )),
13544
- node.actions?.map((action) => /* @__PURE__ */ jsx13(
13449
+ node.actions?.map((action) => /* @__PURE__ */ jsx12(
13545
13450
  IconButton7,
13546
13451
  {
13547
13452
  size: "sm",
13548
- icon: /* @__PURE__ */ jsx13(NodeIcon, { icon: action.icon }),
13453
+ icon: /* @__PURE__ */ jsx12(NodeIcon, { icon: action.icon }),
13549
13454
  label: action.label,
13550
13455
  disabled: action.disabled,
13551
13456
  onClick: () => controller.runAction(row2.id, action.id)
@@ -13564,14 +13469,14 @@ function ChildStateChip({
13564
13469
  }) {
13565
13470
  if (!row2.container) return null;
13566
13471
  if (row2.childState === "loading") {
13567
- return /* @__PURE__ */ jsx13("span", { style: { opacity: 0.5, fontSize: 9 }, children: "loading\u2026" });
13472
+ return /* @__PURE__ */ jsx12("span", { style: { opacity: 0.5, fontSize: 9 }, children: "loading\u2026" });
13568
13473
  }
13569
13474
  if (row2.childState === "error") {
13570
13475
  const error = row2.node.error;
13571
- return /* @__PURE__ */ jsx13(Badge7, { tone: "error", children: error?.code === "denied" ? "no access" : error?.code ?? "failed" });
13476
+ return /* @__PURE__ */ jsx12(Badge7, { tone: "error", children: error?.code === "denied" ? "no access" : error?.code ?? "failed" });
13572
13477
  }
13573
13478
  if (row2.node.hasMore && row2.expanded) {
13574
- return /* @__PURE__ */ jsx13(
13479
+ return /* @__PURE__ */ jsx12(
13575
13480
  "span",
13576
13481
  {
13577
13482
  role: "button",
@@ -13585,18 +13490,18 @@ function ChildStateChip({
13585
13490
  );
13586
13491
  }
13587
13492
  if (row2.node.truncatedAt !== void 0) {
13588
- return /* @__PURE__ */ jsx13(Badge7, { tone: "warning", children: `first ${row2.node.truncatedAt}` });
13493
+ return /* @__PURE__ */ jsx12(Badge7, { tone: "warning", children: `first ${row2.node.truncatedAt}` });
13589
13494
  }
13590
13495
  if (row2.expanded && isEmptyContainer(row2.node)) {
13591
- return /* @__PURE__ */ jsx13("span", { style: { opacity: 0.4, fontSize: 9 }, children: "empty" });
13496
+ return /* @__PURE__ */ jsx12("span", { style: { opacity: 0.4, fontSize: 9 }, children: "empty" });
13592
13497
  }
13593
13498
  return null;
13594
13499
  }
13595
13500
  function NodeIcon({ icon }) {
13596
13501
  if (icon.kind === "text") {
13597
- return /* @__PURE__ */ jsx13("span", { style: { fontSize: 11, lineHeight: 1, display: "flex", alignItems: "center" }, children: icon.value });
13502
+ return /* @__PURE__ */ jsx12("span", { style: { fontSize: 11, lineHeight: 1, display: "flex", alignItems: "center" }, children: icon.value });
13598
13503
  }
13599
- return /* @__PURE__ */ jsx13(TreeIcon, { name: icon.name });
13504
+ return /* @__PURE__ */ jsx12(TreeIcon, { name: icon.name });
13600
13505
  }
13601
13506
 
13602
13507
  // 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 };
@@ -28,10 +28,29 @@ import {
28
28
  StopwatchIcon,
29
29
  SwapIcon,
30
30
  TrashIcon,
31
+ TreeIcon,
31
32
  UndoIcon,
32
33
  VisibilityIcon,
33
34
  XIcon2 as XIcon
34
- } from "../chunk-OCEZTO2D.js";
35
+ } from "../chunk-J5XEAON6.js";
36
+ import {
37
+ CancelGlyph,
38
+ CaseGlyph,
39
+ ChevronGlyph,
40
+ ClearGlyph,
41
+ CollapseGlyph,
42
+ CopyGlyph,
43
+ DownloadGlyph,
44
+ ExpandGlyph,
45
+ PlugGlyph,
46
+ PlusGlyph,
47
+ RefreshGlyph,
48
+ RetryGlyph,
49
+ SortAscGlyph,
50
+ SortDescGlyph,
51
+ Svg,
52
+ XGlyph
53
+ } from "../chunk-GQWAIPDF.js";
35
54
  import "../chunk-2KG3PWR4.js";
36
55
 
37
56
  // src/icons/index.ts
@@ -70,10 +89,28 @@ var ICONS = Object.freeze({
70
89
  "icons/LockState": LockStateIcon,
71
90
  // color
72
91
  "icons/Swap": SwapIcon,
73
- "icons/Eyedropper": EyedropperIcon
92
+ "icons/Eyedropper": EyedropperIcon,
93
+ // shared (src/icons/glyphs.tsx — the one source; the data/ops/time blocks re-export these)
94
+ "icons/Refresh": RefreshGlyph,
95
+ "icons/Close": XGlyph,
96
+ "icons/Plus": PlusGlyph,
97
+ "icons/Chevron": ChevronGlyph,
98
+ "icons/Download": DownloadGlyph,
99
+ "icons/Plug": PlugGlyph,
100
+ "icons/SortAsc": SortAscGlyph,
101
+ "icons/SortDesc": SortDescGlyph,
102
+ "icons/Expand": ExpandGlyph,
103
+ "icons/Collapse": CollapseGlyph,
104
+ "icons/Copy": CopyGlyph,
105
+ "icons/Clear": ClearGlyph,
106
+ "icons/Cancel": CancelGlyph,
107
+ "icons/Retry": RetryGlyph,
108
+ "icons/Case": CaseGlyph,
109
+ "icons/TreeKind": TreeIcon
74
110
  });
75
111
  var ICON_UNITS = Object.keys(ICONS);
76
112
  export {
77
113
  ICONS,
78
- ICON_UNITS
114
+ ICON_UNITS,
115
+ Svg
79
116
  };