@tangle-network/sandbox-ui 0.76.0 → 0.79.0

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.
package/dist/tokens.css CHANGED
@@ -1,5 +1,14 @@
1
- /* Tangle Sandbox UI design tokens */
2
- /* Brand: warm purple palette, #5B4ED4 primary */
1
+ /* Tangle design tokens — the single palette every Tangle surface renders from.
2
+ *
3
+ * The surface ladder carries an indigo cast and steps in even ~4-5% lightness
4
+ * increments, so a card, a nested panel and an overlay each read as a distinct
5
+ * plane by their own fill. A flat, desaturated ladder forces separation onto
6
+ * borders instead, which is what makes an app read as grey and washed out.
7
+ * Light mirrors it: white paper on a tinted canvas, never white-on-white.
8
+ *
9
+ * Apps consume this spine as-is. If a product needs its own accent identity,
10
+ * add a named theme in named-themes.css (`data-theme="<name>"`) — do NOT re-declare
11
+ * these tokens in the app, or its surfaces silently stop tracking the brand. */
3
12
 
4
13
  /* MD3 surface hierarchy */
5
14
  /* Dark is the default theme (`:root`/`[data-sandbox-ui]`). It also responds to
@@ -9,15 +18,15 @@
9
18
  [data-sandbox-ui],
10
19
  [data-theme="dark"],
11
20
  .dark {
12
- --md3-surface: #16161f;
13
- --md3-surface-dim: #111119;
14
- --md3-surface-bright: #2a2940;
15
- --md3-surface-container-lowest: #101017;
16
- --md3-surface-container-low: #16161f;
17
- --md3-surface-container: #1c1b27;
18
- --md3-surface-container-high: #232231;
19
- --md3-surface-container-highest: #2c2b3d;
20
- --md3-surface-variant: #2c2b3d;
21
+ --md3-surface: #0a0a14; /* L0 page canvas */
22
+ --md3-surface-dim: #060610; /* recessed page */
23
+ --md3-surface-bright: #232238;
24
+ --md3-surface-container-lowest: #050509; /* L-1 terminal/code well */
25
+ --md3-surface-container-low: #12111f; /* L1 chrome, field wells */
26
+ --md3-surface-container: #191826; /* L2 resting card */
27
+ --md3-surface-container-high: #221f33; /* L3 nested / hover */
28
+ --md3-surface-container-highest: #2c2942; /* L4 overlay */
29
+ --md3-surface-variant: #2c2942;
21
30
  --md3-on-surface: #fdfdfd;
22
31
  --md3-on-surface-variant: #aaa8b8;
23
32
 
@@ -37,7 +46,7 @@
37
46
 
38
47
  --md3-tertiary: #10B981;
39
48
  --md3-outline: #4a4965;
40
- --md3-outline-variant: #34324a;
49
+ --md3-outline-variant: #2a293d;
41
50
 
42
51
  --md3-error: #ff5277;
43
52
  --md3-error-dim: #eb2855;
@@ -50,25 +59,27 @@
50
59
  --md3-inverse-on-surface: #000000;
51
60
  --md3-surface-tint: #818CF8;
52
61
 
53
- /* Semantic HSL bridge — flat neutral spine (Tangle Quiet) */
54
- --hsl-background: 240 7% 9%; /* #15151a canvas — lifted off pure black */
62
+ /* Semantic HSL bridge — the indigo-cast surface ladder */
63
+ --hsl-background: 240 33% 6%; /* L0 canvas #0a0a14 */
55
64
  --hsl-foreground: 240 6% 93%; /* #ececee */
56
- --hsl-card: 240 5% 13%; /* #1f1f23 surface, clearly above canvas */
65
+ --hsl-card: 244 23% 12%; /* L2 card #191826 */
57
66
  --hsl-card-foreground: 240 6% 93%;
58
- --hsl-popover: 240 5% 17%; /* #28282d elevated */
67
+ --hsl-popover: 247 23% 21%; /* L4 overlay #2c2942 */
59
68
  --hsl-popover-foreground: 240 6% 93%;
60
69
  --hsl-primary: 239 84% 62%;
61
70
  --hsl-primary-foreground: 0 0% 100%;
62
- --hsl-secondary: 240 5% 15%; /* #242428 surface-2 */
71
+ --hsl-secondary: 249 24% 16%; /* L3 #221f33 */
63
72
  --hsl-secondary-foreground: 240 6% 93%;
64
- --hsl-muted: 240 5% 15%; /* #242428 — neutral hover well */
65
- --hsl-muted-foreground: 240 4% 64%; /* #9c9ca6 text-muted */
66
- --hsl-accent: 240 5% 15%; /* neutral hover (indigo lives in accent-surface-strong) */
73
+ --hsl-muted: 249 24% 16%; /* L3 hover well */
74
+ --hsl-muted-foreground: 240 5% 68%; /* #a9a9b1 — high enough that the
75
+ reduced-opacity caption derivatives (/70, /60) still clear the large-text
76
+ contrast floor against the L2 card. */
77
+ --hsl-accent: 249 24% 16%; /* neutral hover (indigo lives in accent-surface-strong) */
67
78
  --hsl-accent-foreground: 240 6% 93%;
68
79
  --hsl-destructive: 348 74% 48%;
69
80
  --hsl-destructive-foreground: 0 0% 100%;
70
- --hsl-border: 240 5% 16%; /* soft edge — fill carries separation, not the line */
71
- --hsl-input: 240 5% 15%;
81
+ --hsl-border: 243 19.6% 20%; /* #2a293d = --md3-outline-variant */
82
+ --hsl-input: 244 29% 9%; /* recessed field well #12111f */
72
83
  --hsl-ring: 239 84% 67%;
73
84
  --hsl-success: 160 84% 39%;
74
85
  --hsl-warning: 40 94% 56%;
@@ -92,6 +103,11 @@
92
103
  --destructive: var(--hsl-destructive);
93
104
  --destructive-foreground: var(--hsl-destructive-foreground);
94
105
  --border: var(--hsl-border);
106
+ /* shadcn's `--input` is the input BORDER and the Switch's off-track — a
107
+ * mid-tone that has to stay visible AGAINST a surface. It is deliberately NOT
108
+ * the field fill: pointing it at the recessed well would tint a border and a
109
+ * track the same color as the plane behind them, and both would vanish. The
110
+ * field fill is --hsl-input / --bg-input below. */
95
111
  --input: var(--hsl-muted-foreground);
96
112
  --ring: var(--hsl-ring);
97
113
  --success: var(--hsl-success);
@@ -99,21 +115,22 @@
99
115
  --error: var(--hsl-destructive);
100
116
  --info: var(--hsl-info);
101
117
 
102
- /* Sidebar tokens — flat surface + hairline */
103
- --sidebar-background: 240 6% 11%; /* #1a1a1f surface */
118
+ /* Sidebar tokens — L1 chrome: one step ABOVE the canvas in lightness, so the
119
+ * panel reads as its own plane rather than a hole in the page. */
120
+ --sidebar-background: 244 29% 9%; /* L1 chrome #12111f */
104
121
  --sidebar-foreground: 240 6% 93%;
105
122
  --sidebar-primary: 239 84% 67%;
106
123
  --sidebar-primary-foreground: 0 0% 100%;
107
- --sidebar-accent: 240 5% 15%; /* neutral hover */
124
+ --sidebar-accent: 249 24% 16%; /* L3 hover well */
108
125
  --sidebar-accent-foreground: 240 6% 93%;
109
- --sidebar-border: 240 5% 16%; /* soft edge */
126
+ --sidebar-border: 243 19.6% 20%; /* = --md3-outline-variant */
110
127
  --sidebar-ring: 239 84% 67%;
111
128
 
112
- /* Depth scale — flat neutral spine (Tangle Quiet) */
113
- --depth-1: #15151a;
114
- --depth-2: #1f1f23;
115
- --depth-3: #26262b;
116
- --depth-4: #2e2e34;
129
+ /* Depth scale — tracks the MD3 ladder (canvas / card / nested / overlay) */
130
+ --depth-1: #0a0a14;
131
+ --depth-2: #191826;
132
+ --depth-3: #221f33;
133
+ --depth-4: #2c2942;
117
134
 
118
135
  /* Status colors */
119
136
  --status-running: #10B981;
@@ -157,7 +174,7 @@
157
174
  --glass-border-hover: var(--border-default);
158
175
  --glass-blur: 0px;
159
176
 
160
- /* Mesh glows — quieted to off; chrome is flat in Tangle Quiet */
177
+ /* Mesh glows — off; depth comes from the ladder, not from glow */
161
178
  --mesh-teal: transparent;
162
179
  --mesh-violet: transparent;
163
180
  --mesh-blue: transparent;
@@ -171,13 +188,13 @@
171
188
  --accent-surface-strong: rgba(129, 140, 248, 0.14);
172
189
  --accent-text: #b9bffb;
173
190
 
174
- /* Surfaces — flat single-neutral (no radial mesh) */
175
- --bg-root: #15151a;
191
+ /* Surfaces — solid fills off the ladder (no radial mesh) */
192
+ --bg-root: #0a0a14;
176
193
  --bg-dark: var(--depth-1);
177
194
  --bg-card: var(--depth-2);
178
195
  --bg-elevated: var(--depth-4);
179
196
  --bg-section: var(--depth-1);
180
- --bg-input: var(--depth-3);
197
+ --bg-input: hsl(var(--hsl-input)); /* the field well — same color, hex-free */
181
198
  --bg-hover: rgba(255, 255, 255, 0.04);
182
199
  --bg-selection: rgba(129, 140, 248, 0.14);
183
200
 
@@ -319,15 +336,21 @@
319
336
  /* Light theme — clean professional, warm purple accents */
320
337
 
321
338
  /* MD3 surface hierarchy */
322
- --md3-surface: #f8f9fb;
323
- --md3-surface-dim: #d9dae0;
324
- --md3-surface-bright: #f8f9fb;
325
- --md3-surface-container-lowest: #ffffff;
326
- --md3-surface-container-low: #f3f4f7;
327
- --md3-surface-container: #edeef2;
328
- --md3-surface-container-high: #e7e8ed;
329
- --md3-surface-container-highest: #e1e2e8;
330
- --md3-surface-variant: #e1e2e8;
339
+ /* The light ladder ALTERNATES; it is not monotonic, and that is deliberate.
340
+ * On a tinted canvas, a raised plane is PAPER (white) and a recessed one is a
341
+ * tinted WELL. So card and overlay are both white and separate from each other
342
+ * by shadow and ring, not by fill — which is how light-mode elevation actually
343
+ * reads. Forcing a strictly-darkening ladder here is what produced the
344
+ * white-on-white flatness this palette replaced. Pinned in tokens.test.ts. */
345
+ --md3-surface: #eceef3; /* L0 page canvas — tinted */
346
+ --md3-surface-dim: #dcdee6;
347
+ --md3-surface-bright: #ffffff;
348
+ --md3-surface-container-lowest: #ffffff; /* insets read as paper */
349
+ --md3-surface-container-low: #f6f7fa; /* L1 chrome, field wells — well */
350
+ --md3-surface-container: #ffffff; /* L2 resting card — paper */
351
+ --md3-surface-container-high: #f1f2f7; /* L3 nested / hover — well */
352
+ --md3-surface-container-highest: #ffffff; /* L4 overlay — paper + shadow */
353
+ --md3-surface-variant: #f1f2f7;
331
354
  --md3-on-surface: #191c24;
332
355
  --md3-on-surface-variant: #464858;
333
356
 
@@ -361,34 +384,37 @@
361
384
  --md3-inverse-on-surface: #f0f1f4;
362
385
  --md3-surface-tint: #6366F1;
363
386
 
364
- /* Semantic HSL bridge — flat neutral light (Tangle Quiet) */
365
- --hsl-background: 0 0% 100%; /* #ffffff */
387
+ /* Semantic HSL bridge — white paper on a tinted canvas */
388
+ --hsl-background: 223 23% 94%; /* L0 canvas #eceef3 */
366
389
  --hsl-foreground: 0 0% 5%; /* #0d0d0d */
367
- --hsl-card: 240 7% 97%; /* #f7f7f8 surface */
390
+ --hsl-card: 0 0% 100%; /* L2 card = white paper */
368
391
  --hsl-card-foreground: 0 0% 5%;
369
392
  --hsl-popover: 0 0% 100%;
370
393
  --hsl-popover-foreground: 0 0% 5%;
371
394
  --hsl-primary: 245 62% 57%; /* #5B4ED4 light accent */
372
395
  --hsl-primary-foreground: 0 0% 100%;
373
- --hsl-secondary: 240 6% 93%; /* #ececee surface-2 */
396
+ --hsl-secondary: 230 27% 96%; /* L3 #f1f2f7 */
374
397
  --hsl-secondary-foreground: 0 0% 10%;
375
- --hsl-muted: 240 6% 93%; /* #ececee neutral hover */
398
+ --hsl-muted: 230 27% 96%; /* L3 hover well */
376
399
  --hsl-muted-foreground: 240 5% 38%; /* #5d5d66 text-muted */
377
- --hsl-accent: 240 6% 93%; /* neutral hover */
400
+ --hsl-accent: 230 27% 96%; /* neutral hover */
378
401
  --hsl-accent-foreground: 0 0% 10%;
379
402
  --hsl-destructive: 0 72% 41%;
380
403
  --hsl-destructive-foreground: 0 0% 100%;
381
- --hsl-border: 240 6% 89%; /* hairline ≈ rgba(0,0,0,0.08) */
382
- --hsl-input: 240 6% 89%;
404
+ --hsl-border: 244 16.3% 80.8%; /* #c7c6d6 = --md3-outline-variant */
405
+ --hsl-input: 225 29% 97%; /* field well #f6f7fa */
383
406
  --hsl-ring: 245 62% 57%;
384
407
  --hsl-success: 160 84% 30%;
385
408
  --hsl-warning: 41 96% 50%;
386
409
  --hsl-info: 212 80% 50%;
387
410
 
388
- --depth-1: #ffffff;
389
- --depth-2: #f7f7f8;
390
- --depth-3: #ececee;
391
- --depth-4: #e3e3e6;
411
+ /* depth-2 (card) and depth-4 (elevated) are BOTH paper, on purpose: in light,
412
+ * a popover does not out-lighten a white card — it lifts by shadow. See the
413
+ * ladder note above. */
414
+ --depth-1: #eceef3; /* canvas */
415
+ --depth-2: #ffffff; /* card — paper */
416
+ --depth-3: #f1f2f7; /* nested well */
417
+ --depth-4: #ffffff; /* elevated — paper, separated by shadow */
392
418
 
393
419
  --status-running: #059669;
394
420
  --status-creating: #3E349E;
@@ -430,13 +456,13 @@
430
456
  --surface-neutral-text: var(--text-muted);
431
457
 
432
458
  /* Sidebar — light, flat surface + hairline */
433
- --sidebar-background: 240 7% 97%; /* #f7f7f8 surface */
459
+ --sidebar-background: 0 0% 100%; /* white paper */
434
460
  --sidebar-foreground: 0 0% 5%;
435
461
  --sidebar-primary: 245 62% 57%; /* #5B4ED4 */
436
462
  --sidebar-primary-foreground: 0 0% 100%;
437
- --sidebar-accent: 240 6% 93%; /* neutral hover */
463
+ --sidebar-accent: 230 27% 96%; /* L3 hover well */
438
464
  --sidebar-accent-foreground: 0 0% 10%;
439
- --sidebar-border: 240 6% 89%; /* hairline */
465
+ --sidebar-border: 244 16.3% 80.8%; /* = --md3-outline-variant */
440
466
  --sidebar-ring: 245 62% 57%;
441
467
 
442
468
  --mesh-teal: transparent;
@@ -444,12 +470,17 @@
444
470
  --mesh-blue: transparent;
445
471
 
446
472
  /* Surfaces — flat single-neutral light */
447
- --bg-root: #ffffff;
448
- --bg-dark: #f7f7f8;
449
- --bg-card: #f7f7f8;
450
- --bg-elevated: #ffffff;
451
- --bg-section: #f7f7f8;
452
- --bg-input: #ececee;
473
+ --bg-root: #eceef3;
474
+ --bg-dark: var(--depth-1);
475
+ --bg-card: var(--depth-2);
476
+ /* Paper, exactly like --bg-card: in light you cannot raise a plane by making it
477
+ * lighter than white, so an overlay lifts by SHADOW. A consumer that fills with
478
+ * --bg-elevated and applies no shadow gets no separation from a card — that is
479
+ * the contract, not an oversight (--hsl-popover is white for the same reason).
480
+ * Pair it with --shadow-dropdown. */
481
+ --bg-elevated: var(--depth-4);
482
+ --bg-section: var(--depth-1);
483
+ --bg-input: hsl(var(--hsl-input)); /* the field well — same color, hex-free */
453
484
  --bg-hover: rgba(0, 0, 0, 0.04);
454
485
  --bg-selection: rgba(91, 78, 212, 0.10);
455
486
 
@@ -12,7 +12,14 @@ import * as react_jsx_runtime from 'react/jsx-runtime';
12
12
  * so the spine stays a single readable column.
13
13
  */
14
14
  type WfNodeTone = "trigger" | "structural" | "action";
15
- type WfNodeStatus = "queued" | "running" | "succeeded" | "failed";
15
+ /**
16
+ * A node's live run status. `waiting` is NOT a variant of `running`: the run has
17
+ * stopped at that node and makes no further progress until a human answers it (a
18
+ * `decision` step). Collapsing it into `running` tells the viewer the workflow is
19
+ * working when in fact it is blocked on THEM — so it gets its own colour, its own
20
+ * label, and a progress bar that does not move.
21
+ */
22
+ type WfNodeStatus = "queued" | "running" | "waiting" | "succeeded" | "failed";
16
23
  /**
17
24
  * Live RUN state for one node, supplied by the host (keyed by node id) and
18
25
  * merged onto {@link WfNodeData.state} at render time. Absent ⇒ the graph shows
package/dist/workflows.js CHANGED
@@ -26,7 +26,7 @@ function retryImport(factory, retries = 2, delayMs = 350) {
26
26
  function lazyWorkflowGraph() {
27
27
  return lazy(
28
28
  () => retryImport(
29
- () => import("./WorkflowGraph-V2AVCNDC.js").then((m) => ({ default: m.WorkflowGraph }))
29
+ () => import("./WorkflowGraph-SJ2SG5TP.js").then((m) => ({ default: m.WorkflowGraph }))
30
30
  )
31
31
  );
32
32
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@tangle-network/sandbox-ui",
3
- "version": "0.76.0",
3
+ "version": "0.79.0",
4
4
  "description": "Unified UI component library for Tangle Sandbox — primitives, chat, dashboard, terminal, editor, and workspace components",
5
5
  "repository": {
6
6
  "type": "git",
@@ -123,7 +123,7 @@
123
123
  },
124
124
  "peerDependencies": {
125
125
  "@tangle-network/agent-interface": ">=0.17.0 <1.0.0",
126
- "@tangle-network/brand": "^1.0.0",
126
+ "@tangle-network/brand": "^1.1.0",
127
127
  "@tangle-network/ui": "^11.0.0",
128
128
  "@xyflow/react": "^12.0.0",
129
129
  "react": "^18 || ^19",
@@ -178,7 +178,7 @@
178
178
  "@tailwindcss/postcss": "^4.2.2",
179
179
  "@tailwindcss/vite": "^4.2.2",
180
180
  "@tangle-network/agent-interface": ">=0.17.0 <1.0.0",
181
- "@tangle-network/brand": "^1.0.0",
181
+ "@tangle-network/brand": "^1.1.0",
182
182
  "@tangle-network/ui": "^11.0.0",
183
183
  "@tanstack/react-query": "^5.91.0",
184
184
  "@testing-library/dom": "^10.4.1",