@menukfernandoo/canvas-flow 0.1.0 → 0.2.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/chrome.css +145 -97
- package/dist/cli.mjs +5 -5
- package/package.json +1 -1
package/dist/chrome.css
CHANGED
|
@@ -1,46 +1,28 @@
|
|
|
1
1
|
:root {
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
--
|
|
5
|
-
--
|
|
6
|
-
--
|
|
7
|
-
--
|
|
8
|
-
--
|
|
9
|
-
--
|
|
10
|
-
--
|
|
11
|
-
--
|
|
12
|
-
--
|
|
13
|
-
--
|
|
14
|
-
--
|
|
15
|
-
--
|
|
16
|
-
--
|
|
17
|
-
--
|
|
18
|
-
--
|
|
19
|
-
--
|
|
20
|
-
--
|
|
21
|
-
--
|
|
22
|
-
--
|
|
23
|
-
--
|
|
24
|
-
--
|
|
25
|
-
--
|
|
26
|
-
--bg-panel: var(--ink-800);
|
|
27
|
-
--bg-bar: var(--ink-700);
|
|
28
|
-
--bg-elevated: var(--ink-600);
|
|
29
|
-
--fg: var(--cream-100);
|
|
30
|
-
--fg-muted: var(--steel-100);
|
|
31
|
-
--fg-dim: var(--steel-200);
|
|
32
|
-
--fg-faint: var(--steel-300);
|
|
33
|
-
--fg-label: var(--steel-400);
|
|
34
|
-
--border: var(--steel-600);
|
|
35
|
-
--border-subtle: var(--steel-700);
|
|
36
|
-
--border-strong: var(--steel-500);
|
|
37
|
-
--accent: var(--brass-500);
|
|
38
|
-
--accent-hover: var(--brass-400);
|
|
39
|
-
--accent-ink: var(--brass-ink);
|
|
40
|
-
--danger: var(--rust-500);
|
|
41
|
-
--font-serif: "EB Garamond", "Iowan Old Style", Georgia, serif;
|
|
42
|
-
--font-sans: Geist, ui-sans-serif, system-ui, -apple-system, "Segoe UI", sans-serif;
|
|
43
|
-
--font-mono: "Geist Mono", ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;
|
|
2
|
+
/* Canvas Flow — cool blue-graphite instrument surface with an electric
|
|
3
|
+
indigo -> cyan "flow" accent. Deliberately not a warm charcoal/brass theme. */
|
|
4
|
+
--bg: #0b0e14;
|
|
5
|
+
--bg-bar: #0e121b;
|
|
6
|
+
--bg-panel: #0f1420;
|
|
7
|
+
--bg-elevated: #161d2c;
|
|
8
|
+
--surface-hover: #1b2334;
|
|
9
|
+
--border: #232c40;
|
|
10
|
+
--border-subtle: #1a2231;
|
|
11
|
+
--border-strong: #35425f;
|
|
12
|
+
--fg: #e9edf7;
|
|
13
|
+
--fg-muted: #c3ccdd;
|
|
14
|
+
--fg-dim: #9aa4bd;
|
|
15
|
+
--fg-faint: #6d7791;
|
|
16
|
+
--fg-label: #57617a;
|
|
17
|
+
--accent: #6d5cff;
|
|
18
|
+
--accent-hover: #8676ff;
|
|
19
|
+
--accent-2: #34e0cf;
|
|
20
|
+
--accent-ink: #f3f5ff;
|
|
21
|
+
--flow: linear-gradient(90deg, var(--accent), var(--accent-2));
|
|
22
|
+
--danger: #ff6b74;
|
|
23
|
+
--warn: #f0b45a;
|
|
24
|
+
--font-sans: ui-sans-serif, system-ui, -apple-system, "Segoe UI", Roboto, Helvetica, Arial, sans-serif;
|
|
25
|
+
--font-mono: ui-monospace, "SF Mono", "JetBrains Mono", "Cascadia Code", Menlo, Consolas, monospace;
|
|
44
26
|
--text-xs: 12px;
|
|
45
27
|
--lh-xs: 1.35;
|
|
46
28
|
--text-sm: 13px;
|
|
@@ -86,15 +68,15 @@
|
|
|
86
68
|
--space-20: 40px;
|
|
87
69
|
--space-24: 48px;
|
|
88
70
|
--space-32: 64px;
|
|
89
|
-
--radius-sm:
|
|
90
|
-
--radius-md:
|
|
91
|
-
--radius-lg:
|
|
92
|
-
--radius-xl:
|
|
71
|
+
--radius-sm: 5px;
|
|
72
|
+
--radius-md: 6px;
|
|
73
|
+
--radius-lg: 8px;
|
|
74
|
+
--radius-xl: 10px;
|
|
93
75
|
--radius-pill: 999px;
|
|
94
76
|
--hairline: 1px solid var(--border);
|
|
95
77
|
--hairline-subtle: 1px solid var(--border-subtle);
|
|
96
|
-
--shadow-tooltip: 0
|
|
97
|
-
--shadow-floating: 0
|
|
78
|
+
--shadow-tooltip: 0 10px 30px rgba(2, 5, 12, 0.55);
|
|
79
|
+
--shadow-floating: 0 18px 54px rgba(2, 5, 12, 0.6);
|
|
98
80
|
--bar-h: 56px;
|
|
99
81
|
--panel-w: 360px;
|
|
100
82
|
--ease: cubic-bezier(0.2, 0.6, 0.2, 1);
|
|
@@ -144,26 +126,34 @@ body.canvasflow {
|
|
|
144
126
|
display: flex;
|
|
145
127
|
align-items: flex-end;
|
|
146
128
|
height: 22px;
|
|
147
|
-
gap:
|
|
129
|
+
gap: 9px;
|
|
148
130
|
white-space: nowrap;
|
|
149
131
|
flex-shrink: 0;
|
|
150
132
|
}
|
|
151
133
|
.brand-mark {
|
|
152
|
-
font-family: var(--font-
|
|
153
|
-
font-
|
|
154
|
-
font-
|
|
134
|
+
font-family: var(--font-mono);
|
|
135
|
+
font-size: 16px;
|
|
136
|
+
font-weight: var(--w-semi);
|
|
137
|
+
letter-spacing: var(--track-tight);
|
|
155
138
|
line-height: 1;
|
|
156
139
|
color: var(--fg);
|
|
157
140
|
}
|
|
141
|
+
.brand-flow {
|
|
142
|
+
background: var(--flow);
|
|
143
|
+
-webkit-background-clip: text;
|
|
144
|
+
background-clip: text;
|
|
145
|
+
-webkit-text-fill-color: transparent;
|
|
146
|
+
color: transparent;
|
|
147
|
+
}
|
|
158
148
|
.brand-support {
|
|
159
|
-
font-family: var(--font-
|
|
149
|
+
font-family: var(--font-mono);
|
|
160
150
|
font-size: 10px;
|
|
161
|
-
font-weight:
|
|
151
|
+
font-weight: var(--w-medium);
|
|
162
152
|
letter-spacing: 0.18em;
|
|
163
153
|
text-transform: uppercase;
|
|
164
|
-
color: var(--fg-
|
|
154
|
+
color: var(--fg-faint);
|
|
165
155
|
position: relative;
|
|
166
|
-
top: 1px;
|
|
156
|
+
top: -1px;
|
|
167
157
|
}
|
|
168
158
|
.spacer {
|
|
169
159
|
flex: 1;
|
|
@@ -173,8 +163,10 @@ body.canvasflow {
|
|
|
173
163
|
align-items: center;
|
|
174
164
|
gap: 8px;
|
|
175
165
|
color: var(--fg-muted);
|
|
176
|
-
font-family:
|
|
177
|
-
font-size: var(--text-
|
|
166
|
+
font-family: var(--font-mono);
|
|
167
|
+
font-size: var(--text-xs);
|
|
168
|
+
font-weight: var(--w-medium);
|
|
169
|
+
letter-spacing: 0.04em;
|
|
178
170
|
white-space: nowrap;
|
|
179
171
|
cursor: pointer;
|
|
180
172
|
user-select: none;
|
|
@@ -208,6 +200,9 @@ body.canvasflow {
|
|
|
208
200
|
left 150ms var(--ease),
|
|
209
201
|
background 150ms var(--ease);
|
|
210
202
|
}
|
|
203
|
+
.annotate-switch[aria-pressed="true"] {
|
|
204
|
+
color: var(--fg);
|
|
205
|
+
}
|
|
211
206
|
.annotate-switch[aria-pressed="true"] .switch-track {
|
|
212
207
|
background: var(--accent);
|
|
213
208
|
}
|
|
@@ -227,14 +222,14 @@ body.canvasflow {
|
|
|
227
222
|
border: 1px solid var(--border-subtle);
|
|
228
223
|
background: transparent;
|
|
229
224
|
color: var(--fg-dim);
|
|
230
|
-
border-radius:
|
|
225
|
+
border-radius: var(--radius-md);
|
|
231
226
|
cursor: pointer;
|
|
232
227
|
padding: 0;
|
|
233
228
|
}
|
|
234
229
|
.more-button:hover:not(:disabled),
|
|
235
230
|
.more-button[aria-expanded="true"] {
|
|
236
231
|
border-color: var(--border-strong);
|
|
237
|
-
background: var(--
|
|
232
|
+
background: var(--surface-hover);
|
|
238
233
|
color: var(--fg);
|
|
239
234
|
}
|
|
240
235
|
.more-button:disabled {
|
|
@@ -262,8 +257,9 @@ body.canvasflow {
|
|
|
262
257
|
padding: 7px 10px 9px;
|
|
263
258
|
}
|
|
264
259
|
.menu-label {
|
|
260
|
+
font-family: var(--font-mono);
|
|
265
261
|
font-size: 9px;
|
|
266
|
-
font-weight: var(--w-
|
|
262
|
+
font-weight: var(--w-semi);
|
|
267
263
|
letter-spacing: var(--track-label);
|
|
268
264
|
text-transform: uppercase;
|
|
269
265
|
color: var(--fg-faint);
|
|
@@ -279,14 +275,14 @@ body.canvasflow {
|
|
|
279
275
|
background: transparent;
|
|
280
276
|
padding: 3px 4px;
|
|
281
277
|
margin: 0 -4px;
|
|
282
|
-
border-radius:
|
|
278
|
+
border-radius: 5px;
|
|
283
279
|
cursor: pointer;
|
|
284
280
|
font-family: var(--font-mono);
|
|
285
281
|
font-size: 12px;
|
|
286
282
|
color: var(--fg-muted);
|
|
287
283
|
}
|
|
288
284
|
.menu-file:hover {
|
|
289
|
-
background: var(--
|
|
285
|
+
background: var(--surface-hover);
|
|
290
286
|
}
|
|
291
287
|
.menu-file > svg {
|
|
292
288
|
opacity: 0.7;
|
|
@@ -312,7 +308,7 @@ body.canvasflow {
|
|
|
312
308
|
white-space: nowrap;
|
|
313
309
|
}
|
|
314
310
|
.copy-hint {
|
|
315
|
-
font-family: var(--font-
|
|
311
|
+
font-family: var(--font-mono);
|
|
316
312
|
font-size: 10px;
|
|
317
313
|
font-weight: var(--w-semi);
|
|
318
314
|
color: var(--fg-faint);
|
|
@@ -358,7 +354,7 @@ body.canvasflow {
|
|
|
358
354
|
color: var(--fg);
|
|
359
355
|
}
|
|
360
356
|
.menu-item:hover:not(:disabled) {
|
|
361
|
-
background: var(--
|
|
357
|
+
background: var(--surface-hover);
|
|
362
358
|
}
|
|
363
359
|
.menu-item:disabled {
|
|
364
360
|
cursor: not-allowed;
|
|
@@ -375,7 +371,7 @@ body.canvasflow {
|
|
|
375
371
|
opacity: 1;
|
|
376
372
|
}
|
|
377
373
|
.menu-item.danger:hover:not(:disabled) {
|
|
378
|
-
background: rgba(
|
|
374
|
+
background: rgba(255, 107, 116, 0.12);
|
|
379
375
|
}
|
|
380
376
|
.button {
|
|
381
377
|
border: 0;
|
|
@@ -385,7 +381,7 @@ body.canvasflow {
|
|
|
385
381
|
color: var(--accent-ink);
|
|
386
382
|
font-family: inherit;
|
|
387
383
|
font-size: var(--text-sm);
|
|
388
|
-
font-weight: var(--w-
|
|
384
|
+
font-weight: var(--w-semi);
|
|
389
385
|
white-space: nowrap;
|
|
390
386
|
cursor: pointer;
|
|
391
387
|
transition:
|
|
@@ -414,7 +410,7 @@ body.canvasflow {
|
|
|
414
410
|
.send-caret {
|
|
415
411
|
border-radius: 0 var(--radius-md) var(--radius-md) 0;
|
|
416
412
|
padding: 9px;
|
|
417
|
-
border-left: 1px solid rgba(
|
|
413
|
+
border-left: 1px solid rgba(11, 14, 20, 0.28);
|
|
418
414
|
display: grid;
|
|
419
415
|
place-items: center;
|
|
420
416
|
}
|
|
@@ -422,7 +418,7 @@ body.canvasflow {
|
|
|
422
418
|
right: 0;
|
|
423
419
|
bottom: 44px;
|
|
424
420
|
width: 208px;
|
|
425
|
-
border-radius:
|
|
421
|
+
border-radius: var(--radius-lg);
|
|
426
422
|
}
|
|
427
423
|
.share-overlay {
|
|
428
424
|
position: fixed;
|
|
@@ -431,7 +427,7 @@ body.canvasflow {
|
|
|
431
427
|
display: grid;
|
|
432
428
|
place-items: center;
|
|
433
429
|
padding: var(--space-16);
|
|
434
|
-
background: rgba(
|
|
430
|
+
background: rgba(6, 9, 15, 0.74);
|
|
435
431
|
}
|
|
436
432
|
.share-overlay[hidden] {
|
|
437
433
|
display: none;
|
|
@@ -455,14 +451,15 @@ body.canvasflow {
|
|
|
455
451
|
margin-bottom: var(--space-8);
|
|
456
452
|
}
|
|
457
453
|
.share-kicker {
|
|
454
|
+
font-family: var(--font-mono);
|
|
458
455
|
color: var(--fg-label);
|
|
459
456
|
font-size: var(--text-xs);
|
|
460
|
-
font-weight: var(--w-
|
|
457
|
+
font-weight: var(--w-semi);
|
|
461
458
|
letter-spacing: var(--track-label);
|
|
462
459
|
text-transform: uppercase;
|
|
463
460
|
}
|
|
464
461
|
.share-link {
|
|
465
|
-
color:
|
|
462
|
+
color: var(--accent-2);
|
|
466
463
|
text-decoration: underline;
|
|
467
464
|
text-decoration-color: var(--border-strong);
|
|
468
465
|
text-underline-offset: 2px;
|
|
@@ -473,11 +470,12 @@ body.canvasflow {
|
|
|
473
470
|
}
|
|
474
471
|
.share-head h2 {
|
|
475
472
|
margin: var(--space-2) 0 0;
|
|
476
|
-
font-family: var(--font-
|
|
477
|
-
font-size: var(--text-
|
|
478
|
-
font-style:
|
|
479
|
-
font-weight: var(--w-
|
|
480
|
-
|
|
473
|
+
font-family: var(--font-sans);
|
|
474
|
+
font-size: var(--text-xl);
|
|
475
|
+
font-style: normal;
|
|
476
|
+
font-weight: var(--w-semi);
|
|
477
|
+
letter-spacing: var(--track-tight);
|
|
478
|
+
line-height: var(--lh-xl);
|
|
481
479
|
}
|
|
482
480
|
.share-close {
|
|
483
481
|
display: flex;
|
|
@@ -519,9 +517,10 @@ body.canvasflow {
|
|
|
519
517
|
display: grid;
|
|
520
518
|
gap: var(--space-4);
|
|
521
519
|
min-width: 0;
|
|
520
|
+
font-family: var(--font-mono);
|
|
522
521
|
color: var(--fg-muted);
|
|
523
522
|
font-size: var(--text-xs);
|
|
524
|
-
font-weight: var(--w-
|
|
523
|
+
font-weight: var(--w-semi);
|
|
525
524
|
letter-spacing: var(--track-label);
|
|
526
525
|
text-transform: uppercase;
|
|
527
526
|
}
|
|
@@ -530,16 +529,22 @@ body.canvasflow {
|
|
|
530
529
|
min-width: 0;
|
|
531
530
|
width: 100%;
|
|
532
531
|
border: 1px solid var(--border);
|
|
533
|
-
border-radius: var(--radius-
|
|
532
|
+
border-radius: var(--radius-md);
|
|
534
533
|
background: var(--bg);
|
|
535
534
|
color: var(--fg);
|
|
536
535
|
font: inherit;
|
|
536
|
+
font-family: var(--font-sans);
|
|
537
537
|
font-size: var(--text-base);
|
|
538
538
|
font-weight: var(--w-regular);
|
|
539
539
|
letter-spacing: 0;
|
|
540
540
|
padding: 10px;
|
|
541
541
|
text-transform: none;
|
|
542
542
|
}
|
|
543
|
+
.share-grid input:focus,
|
|
544
|
+
.share-result input:focus {
|
|
545
|
+
border-color: var(--accent);
|
|
546
|
+
outline: none;
|
|
547
|
+
}
|
|
543
548
|
.share-grid input::placeholder {
|
|
544
549
|
color: var(--fg-label);
|
|
545
550
|
}
|
|
@@ -581,7 +586,7 @@ body.canvasflow {
|
|
|
581
586
|
color: var(--fg-muted);
|
|
582
587
|
font: inherit;
|
|
583
588
|
font-size: var(--text-xs);
|
|
584
|
-
font-weight: var(--w-
|
|
589
|
+
font-weight: var(--w-semi);
|
|
585
590
|
padding: 0 10px;
|
|
586
591
|
cursor: pointer;
|
|
587
592
|
white-space: nowrap;
|
|
@@ -603,7 +608,7 @@ body.canvasflow {
|
|
|
603
608
|
color: var(--fg-muted);
|
|
604
609
|
font-family: inherit;
|
|
605
610
|
font-size: var(--text-sm);
|
|
606
|
-
font-weight: var(--w-
|
|
611
|
+
font-weight: var(--w-semi);
|
|
607
612
|
padding: 9px 14px;
|
|
608
613
|
cursor: pointer;
|
|
609
614
|
}
|
|
@@ -627,18 +632,34 @@ body.canvasflow {
|
|
|
627
632
|
.panel {
|
|
628
633
|
width: var(--panel-w);
|
|
629
634
|
border-left: var(--hairline-subtle);
|
|
630
|
-
background: var(--bg-panel);
|
|
635
|
+
background-color: var(--bg-panel);
|
|
636
|
+
background-image: radial-gradient(circle at 1px 1px, rgba(150, 170, 220, 0.05) 1px, transparent 0);
|
|
637
|
+
background-size: 18px 18px;
|
|
631
638
|
display: flex;
|
|
632
639
|
flex-direction: column;
|
|
633
640
|
min-width: 0;
|
|
634
641
|
min-height: 0;
|
|
635
642
|
}
|
|
636
643
|
.panel h2 {
|
|
637
|
-
|
|
644
|
+
display: flex;
|
|
645
|
+
align-items: center;
|
|
646
|
+
gap: 8px;
|
|
647
|
+
font-family: var(--font-mono);
|
|
648
|
+
font-size: 11px;
|
|
638
649
|
line-height: 1.3;
|
|
639
|
-
margin:
|
|
650
|
+
margin: 18px 16px 10px;
|
|
640
651
|
font-weight: var(--w-semi);
|
|
641
|
-
letter-spacing:
|
|
652
|
+
letter-spacing: var(--track-caps);
|
|
653
|
+
text-transform: uppercase;
|
|
654
|
+
color: var(--fg-dim);
|
|
655
|
+
}
|
|
656
|
+
.panel h2::before {
|
|
657
|
+
content: "";
|
|
658
|
+
width: 7px;
|
|
659
|
+
height: 7px;
|
|
660
|
+
border-radius: 2px;
|
|
661
|
+
background: var(--flow);
|
|
662
|
+
flex-shrink: 0;
|
|
642
663
|
}
|
|
643
664
|
.chat {
|
|
644
665
|
flex: 1;
|
|
@@ -651,16 +672,18 @@ body.canvasflow {
|
|
|
651
672
|
}
|
|
652
673
|
.bubble {
|
|
653
674
|
max-width: 85%;
|
|
654
|
-
border-radius: var(--radius-
|
|
675
|
+
border-radius: var(--radius-lg);
|
|
655
676
|
padding: 10px 12px;
|
|
656
677
|
background: var(--bg-elevated);
|
|
657
678
|
border: var(--hairline);
|
|
658
679
|
color: var(--fg);
|
|
680
|
+
line-height: var(--lh-sm);
|
|
659
681
|
}
|
|
660
682
|
.bubble.user {
|
|
661
683
|
align-self: flex-end;
|
|
662
684
|
background: var(--bg-elevated);
|
|
663
685
|
border-color: var(--border-strong);
|
|
686
|
+
border-left: 2px solid var(--accent);
|
|
664
687
|
}
|
|
665
688
|
.bubble.agent {
|
|
666
689
|
align-self: flex-start;
|
|
@@ -686,8 +709,9 @@ body.canvasflow {
|
|
|
686
709
|
display: block;
|
|
687
710
|
color: var(--fg-faint);
|
|
688
711
|
margin-bottom: 4px;
|
|
712
|
+
font-family: var(--font-mono);
|
|
689
713
|
font-size: 10px;
|
|
690
|
-
font-weight: var(--w-
|
|
714
|
+
font-weight: var(--w-semi);
|
|
691
715
|
letter-spacing: var(--track-label);
|
|
692
716
|
text-transform: uppercase;
|
|
693
717
|
}
|
|
@@ -704,12 +728,14 @@ body.canvasflow {
|
|
|
704
728
|
gap: 8px;
|
|
705
729
|
padding: 12px 16px;
|
|
706
730
|
border-top: var(--hairline-subtle);
|
|
731
|
+
background: var(--bg-panel);
|
|
707
732
|
min-width: 0;
|
|
708
733
|
flex-shrink: 0;
|
|
709
734
|
box-sizing: border-box;
|
|
710
735
|
}
|
|
711
736
|
.presence-banner {
|
|
712
737
|
border: 1px solid var(--border);
|
|
738
|
+
border-left: 2px solid var(--warn);
|
|
713
739
|
border-radius: var(--radius-sm);
|
|
714
740
|
background: var(--bg-elevated);
|
|
715
741
|
color: var(--fg-muted);
|
|
@@ -741,8 +767,9 @@ body.canvasflow {
|
|
|
741
767
|
background: var(--bg-elevated);
|
|
742
768
|
color: var(--fg-muted);
|
|
743
769
|
padding: 5px 7px 5px 11px;
|
|
770
|
+
font-family: var(--font-mono);
|
|
744
771
|
font-size: 12px;
|
|
745
|
-
font-weight: var(--w-
|
|
772
|
+
font-weight: var(--w-medium);
|
|
746
773
|
}
|
|
747
774
|
.pill-preview {
|
|
748
775
|
display: block;
|
|
@@ -764,6 +791,10 @@ body.canvasflow {
|
|
|
764
791
|
color: var(--fg-muted);
|
|
765
792
|
cursor: pointer;
|
|
766
793
|
}
|
|
794
|
+
.pill-close:hover {
|
|
795
|
+
background: var(--border-strong);
|
|
796
|
+
color: var(--fg);
|
|
797
|
+
}
|
|
767
798
|
.pill-close svg {
|
|
768
799
|
display: block;
|
|
769
800
|
}
|
|
@@ -784,9 +815,10 @@ body.canvasflow {
|
|
|
784
815
|
box-shadow: var(--shadow-tooltip);
|
|
785
816
|
}
|
|
786
817
|
.tooltip-label {
|
|
818
|
+
font-family: var(--font-mono);
|
|
787
819
|
color: var(--fg-label);
|
|
788
820
|
font-size: 10px;
|
|
789
|
-
font-weight:
|
|
821
|
+
font-weight: 700;
|
|
790
822
|
letter-spacing: var(--track-label);
|
|
791
823
|
text-transform: uppercase;
|
|
792
824
|
margin: 0 0 4px;
|
|
@@ -822,6 +854,11 @@ body.canvasflow {
|
|
|
822
854
|
font: inherit;
|
|
823
855
|
font-family: var(--font-sans);
|
|
824
856
|
box-sizing: border-box;
|
|
857
|
+
transition: border-color 120ms var(--ease);
|
|
858
|
+
}
|
|
859
|
+
.composer textarea:focus {
|
|
860
|
+
border-color: var(--accent);
|
|
861
|
+
outline: none;
|
|
825
862
|
}
|
|
826
863
|
.composer textarea::placeholder {
|
|
827
864
|
color: var(--fg-label);
|
|
@@ -845,7 +882,7 @@ body.canvasflow {
|
|
|
845
882
|
.ended-overlay {
|
|
846
883
|
position: fixed;
|
|
847
884
|
inset: var(--bar-h) 0 0 0;
|
|
848
|
-
background: rgba(
|
|
885
|
+
background: rgba(6, 9, 15, 0.88);
|
|
849
886
|
display: flex;
|
|
850
887
|
align-items: center;
|
|
851
888
|
justify-content: center;
|
|
@@ -857,15 +894,19 @@ body.canvasflow {
|
|
|
857
894
|
.ended-card {
|
|
858
895
|
width: min(360px, calc(100vw - 48px));
|
|
859
896
|
border: 1px solid var(--border);
|
|
897
|
+
border-top: 2px solid var(--accent);
|
|
860
898
|
border-radius: var(--radius-xl);
|
|
861
899
|
background: var(--bg-panel);
|
|
862
|
-
padding:
|
|
900
|
+
padding: 22px 24px;
|
|
863
901
|
text-align: center;
|
|
902
|
+
box-shadow: var(--shadow-floating);
|
|
864
903
|
}
|
|
865
904
|
.ended-title {
|
|
866
|
-
font-family: var(--font-
|
|
867
|
-
font-style:
|
|
868
|
-
font-size:
|
|
905
|
+
font-family: var(--font-sans);
|
|
906
|
+
font-style: normal;
|
|
907
|
+
font-size: 20px;
|
|
908
|
+
font-weight: var(--w-semi);
|
|
909
|
+
letter-spacing: var(--track-tight);
|
|
869
910
|
line-height: 1.3;
|
|
870
911
|
color: var(--fg);
|
|
871
912
|
margin-bottom: 8px;
|
|
@@ -887,10 +928,10 @@ body.canvasflow {
|
|
|
887
928
|
left: var(--space-8);
|
|
888
929
|
right: var(--space-8);
|
|
889
930
|
z-index: 20;
|
|
890
|
-
border: 1px solid rgba(
|
|
931
|
+
border: 1px solid rgba(240, 180, 90, 0.4);
|
|
891
932
|
border-radius: var(--radius-lg);
|
|
892
|
-
background: rgba(
|
|
893
|
-
color: var(--
|
|
933
|
+
background: rgba(28, 22, 10, 0.92);
|
|
934
|
+
color: var(--warn);
|
|
894
935
|
padding: var(--space-6) var(--space-8);
|
|
895
936
|
font-size: var(--text-sm);
|
|
896
937
|
line-height: var(--lh-sm);
|
|
@@ -938,3 +979,10 @@ body.layout-gate-active iframe#artifact {
|
|
|
938
979
|
flex-direction: column;
|
|
939
980
|
}
|
|
940
981
|
}
|
|
982
|
+
@media (prefers-reduced-motion: reduce) {
|
|
983
|
+
* {
|
|
984
|
+
animation-duration: 0.001ms !important;
|
|
985
|
+
animation-iteration-count: 1 !important;
|
|
986
|
+
transition-duration: 0.001ms !important;
|
|
987
|
+
}
|
|
988
|
+
}
|
package/dist/cli.mjs
CHANGED
|
@@ -4630,7 +4630,7 @@ function createArtifactSdk(deriveQueueKey, isNativeInteractive = isNativeInterac
|
|
|
4630
4630
|
}
|
|
4631
4631
|
function highlightElement(el) {
|
|
4632
4632
|
if (!el) return;
|
|
4633
|
-
el.style.outline = "var(--canvasflow-annotate-outline,2px solid #
|
|
4633
|
+
el.style.outline = "var(--canvasflow-annotate-outline,2px solid #6d5cff)";
|
|
4634
4634
|
el.style.outlineOffset = "var(--canvasflow-annotate-offset,2px)";
|
|
4635
4635
|
}
|
|
4636
4636
|
function clearHighlight(el) {
|
|
@@ -4660,7 +4660,7 @@ function createArtifactSdk(deriveQueueKey, isNativeInteractive = isNativeInterac
|
|
|
4660
4660
|
if (annotationMode && !style) {
|
|
4661
4661
|
style = document.createElement("style");
|
|
4662
4662
|
style.id = "canvasflow-cursor-style";
|
|
4663
|
-
style.textContent = ":root{--canvasflow-accent:#
|
|
4663
|
+
style.textContent = ":root{--canvasflow-accent:#6d5cff;--canvasflow-annotate-outline:2px solid var(--canvasflow-accent);--canvasflow-annotate-offset:2px}*{cursor:default!important}[data-canvasflow-action],[data-canvasflow-action] *{cursor:pointer!important}input,textarea,[contenteditable]:not([contenteditable='false']){cursor:text!important}button,select,label,option,input[type='button'],input[type='submit'],input[type='reset'],input[type='checkbox'],input[type='radio'],input[type='file'],input[type='color'],input[type='range'],input[type='image']{cursor:pointer!important}";
|
|
4664
4664
|
document.head.appendChild(style);
|
|
4665
4665
|
}
|
|
4666
4666
|
if (!annotationMode && style) style.remove();
|
|
@@ -5015,7 +5015,7 @@ function createArtifactSdk(deriveQueueKey, isNativeInteractive = isNativeInterac
|
|
|
5015
5015
|
document.documentElement.appendChild(host);
|
|
5016
5016
|
shadow = host.attachShadow({ mode: "open" });
|
|
5017
5017
|
const style = document.createElement("style");
|
|
5018
|
-
style.textContent = `:host{all:initial;position:fixed;z-index:2147483647;left:0;top:0;color-scheme:dark;--
|
|
5018
|
+
style.textContent = `:host{all:initial;position:fixed;z-index:2147483647;left:0;top:0;color-scheme:dark;--bg:#0b0e14;--bg-panel:#0f1420;--bg-elevated:#161d2c;--fg:#e9edf7;--fg-faint:#6d7791;--border:#2a3550;--accent:#6d5cff;--accent-hover:#8676ff;--accent-2:#34e0cf;--accent-ink:#f3f5ff;--font-sans:ui-sans-serif,system-ui,-apple-system,"Segoe UI",Roboto,sans-serif;--font-mono:ui-monospace,"SF Mono","JetBrains Mono",Menlo,Consolas,monospace;--radius-md:6px;--radius-xl:10px;--shadow-floating:0 18px 54px rgba(2,5,12,.6);font-family:var(--font-sans)}*{box-sizing:border-box}:focus-visible{outline:2px solid var(--accent);outline-offset:2px}.canvasflow-text-highlight{position:fixed;pointer-events:none;background:rgba(109,92,255,.26);border-radius:2px;box-shadow:0 0 0 1px rgba(109,92,255,.5)}.canvasflow-annotation-card{position:fixed;width:min(320px,calc(100vw - 24px));padding:12px;border-radius:var(--radius-xl);background:var(--bg-panel);color:var(--fg);border:1px solid var(--accent);box-shadow:var(--shadow-floating);font:14px/1.4 var(--font-sans)}.canvasflow-heading{font-family:var(--font-mono);font-weight:600;font-size:11px;letter-spacing:.08em;text-transform:uppercase;color:var(--fg-faint);margin-bottom:8px}.canvasflow-annotation-card textarea{width:100%;min-height:86px;resize:vertical;border-radius:var(--radius-md);border:1px solid var(--border);background:var(--bg);color:var(--fg);padding:9px;font:inherit;font-family:var(--font-sans)}.canvasflow-annotation-card textarea:focus{outline:none;border-color:var(--accent)}.canvasflow-annotation-card textarea::placeholder{color:var(--fg-faint)}.canvasflow-annotation-card .canvasflow-hint{margin-top:6px;font-size:11px;color:var(--fg-faint)}.canvasflow-annotation-card .canvasflow-row{display:flex;gap:8px;justify-content:flex-end;margin-top:8px}.canvasflow-annotation-card button{border:0;border-radius:var(--radius-md);padding:8px 10px;font-family:var(--font-sans);font-size:13px;font-weight:600;cursor:pointer}.canvasflow-annotation-card button:active{opacity:.85}.canvasflow-annotation-card .canvasflow-send{background:var(--accent);color:var(--accent-ink)}.canvasflow-annotation-card .canvasflow-send:hover{background:var(--accent-hover)}.canvasflow-annotation-card .canvasflow-cancel{background:var(--bg-elevated);color:var(--fg)}`;
|
|
5019
5019
|
shadow.appendChild(style);
|
|
5020
5020
|
return shadow;
|
|
5021
5021
|
}
|
|
@@ -6165,7 +6165,7 @@ function createChromeHtml(session, { layoutGateEnabled = true } = {}) {
|
|
|
6165
6165
|
<link rel="stylesheet" href="/chrome.css">
|
|
6166
6166
|
</head>
|
|
6167
6167
|
<body class="${bodyClass}">
|
|
6168
|
-
<div class="bar"><div class="brand"><span class="brand-mark">
|
|
6168
|
+
<div class="bar"><div class="brand"><span class="brand-mark">canvas<span class="brand-flow">flow</span></span><span class="brand-support">review</span></div><div class="spacer" aria-hidden="true"></div><button class="annotate-switch" id="annotation" type="button" aria-pressed="true" title="${escapeHtml(modeToggleHint)}"><span class="switch-track" aria-hidden="true"><span class="switch-knob"></span></span><span>Annotate</span></button><div class="more-wrap" id="moreWrap"><button class="more-button" id="moreButton" type="button" title="More" aria-haspopup="menu" aria-expanded="false">${chromeIcons.more}</button><div class="menu more-menu" id="moreMenu" hidden><div class="menu-head"><div class="menu-label">Editing</div><button class="menu-file" id="copyPath" type="button" title="Copy path \xB7 ${escapeHtml(session.file)}">${chromeIcons.file}<span class="menu-file-text"><span class="path-head">${escapeHtml(pathHead)}</span><span class="path-tail">${escapeHtml(pathTail)}</span></span><span class="copy-hint" id="copyHint"><span class="icon-copy">${chromeIcons.copy}</span><span class="icon-check">${chromeIcons.check}</span><span id="copyHintText">Copy</span></span></button></div><div class="menu-rule"></div><button class="menu-item" id="reloadArtifact" type="button">${chromeIcons.refresh}<span>Reload artifact</span></button><button class="menu-item" id="copySnapshot" type="button">${chromeIcons.camera}<span>Copy DOM snapshot</span></button><button class="menu-item" id="exportArtifact" type="button">${chromeIcons.download}<span>Export standalone HTML</span></button><button class="menu-item" id="shareArtifact" type="button">${chromeIcons.globe}<span>Publish link</span></button><div class="menu-rule"></div><button class="menu-item danger" id="end" type="button">${chromeIcons.exit}<span>End session</span></button></div></div></div>
|
|
6169
6169
|
<div class="layout"><div class="frame"><iframe id="artifact" sandbox="allow-scripts allow-forms allow-popups allow-downloads" data-artifact-src="/artifact/${session.key}/index.html"></iframe><div class="layout-issue-banner" id="layoutIssueBanner" hidden>This surface may have layout issues. Your agent has been notified.</div></div><aside class="panel"><h2>Conversation</h2><div class="chat" id="chatLog"></div><div class="composer"><div class="presence-banner" id="presenceBanner" hidden>Your agent is not listening. If this persists, ask your agent to poll for updates from CanvasFlow.</div><div class="annotation-pills" id="annotationPills"></div><textarea id="chatInput" placeholder="Write a message for the agent..."></textarea><div class="actions" id="sendActions"><span class="send-hint" id="sendHint" hidden>Write a message or annotate an element first.</span><div class="split"><button class="button send-main" id="send">Send to Agent</button><button class="button send-caret" id="sendCaret" type="button" title="Send options" aria-haspopup="menu" aria-expanded="false">${chromeIcons.caret}</button></div><div class="menu send-menu" id="sendMenu" hidden><button class="menu-item" id="sendFromMenu" type="button">${chromeIcons.send}<span>Send to Agent</span></button><button class="menu-item danger" id="sendAndEnd" type="button">${chromeIcons.exit}<span>Send & end session</span></button></div></div></div></aside></div>
|
|
6170
6170
|
<div class="share-overlay" id="shareDialog" role="dialog" aria-modal="true" aria-labelledby="shareTitleText" hidden><form class="share-card" id="shareForm"><div class="share-head"><div><div class="share-kicker">Publish to <a class="share-link" href="https://ht-ml.app" target="_blank" rel="noopener noreferrer">ht-ml.app</a></div><h2 id="shareTitleText">Publish artifact</h2></div><button class="share-close" id="shareClose" type="button" aria-label="Close publish dialog"><svg width="14" height="14" viewBox="0 0 10 10" fill="none" aria-hidden="true" focusable="false"><path d="M1 1L9 9M9 1L1 9" stroke="currentColor" stroke-width="1.6" stroke-linecap="round"/></svg></button></div><p class="share-note">ht-ml.app is a separate, third-party hosting service, not part of CanvasFlow. Publishing sends this artifact to its servers.</p><p class="share-copy">This uploads this artifact to ht-ml.app with local assets inlined. Without a password, the page is PUBLIC and anyone with the link can open it. With a password, the page is PRIVATE and viewers must supply the password to view.</p><p class="share-note">Do not publish secrets. The CanvasFlow annotation SDK is not included.</p><div class="share-grid"><label>Password (optional)<input id="sharePassword" name="password" type="password" autocomplete="new-password" placeholder="Leave blank for a public page"></label></div><div class="share-status" id="shareStatus" role="status"></div><div class="share-result" id="shareResult" hidden><label>Share URL<div class="share-copy-row"><input id="shareUrl" readonly><button class="share-copy-btn" id="copyShareUrl" type="button">Copy URL</button></div></label><label>Update key (secret)<div class="share-copy-row"><input id="shareUpdateKey" readonly><button class="share-copy-btn" id="copyUpdateKey" type="button">Copy key</button></div></label><p class="share-note">Keep the update key private. ht-ml.app returns it once and it is the only way to update or delete this page later.</p></div><div class="share-actions"><button class="share-cancel" id="shareCancel" type="button">Cancel</button><button class="button" id="sharePublish" type="submit">Publish</button></div></form></div>
|
|
6171
6171
|
<div class="ended-overlay layout-gate-overlay" id="layoutGateOverlay"${layoutGateHidden}><div class="ended-card"><div class="ended-title" id="layoutGateTitle">Checking layout.<br>One moment.</div><p class="ended-copy" id="layoutGateCopy">CanvasFlow is waiting for fonts and final geometry before revealing this artifact.</p><button class="button ended-action" id="layoutGateAction" type="button">Show anyway</button></div></div>
|
|
@@ -6378,7 +6378,7 @@ function normalizePagePath(path6) {
|
|
|
6378
6378
|
var COMMANDS = /* @__PURE__ */ new Set(["open", "poll", "end", "stop", "server", "playbook", "design", "setup", "export", "share"]);
|
|
6379
6379
|
var RESERVED = new Set(RESERVED_COMMANDS);
|
|
6380
6380
|
var DESCRIPTION = "Canvas Flow helps agents turn rich HTML artifacts into collaborative human review surfaces. Whenever you are about to give user a complex response that will be easier to understand via a rich / interactive page, consider using Canvas Flow. First generate an interactive HTML artifact according to user request, then run `canvas-flow <html-file>` so the user can visually review it, annotate elements or selected text, queue prompts, and send feedback back through `canvas-flow poll`.";
|
|
6381
|
-
var VERSION = "0.
|
|
6381
|
+
var VERSION = "0.2.0";
|
|
6382
6382
|
async function run(argv) {
|
|
6383
6383
|
await ensureStateDir();
|
|
6384
6384
|
const normalizedArgv = normalizeArgv(argv);
|
package/package.json
CHANGED