@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 CHANGED
@@ -1,46 +1,28 @@
1
1
  :root {
2
- --ink-900: #0f1115;
3
- --ink-800: #11141a;
4
- --ink-700: #171a21;
5
- --ink-600: #1c212b;
6
- --steel-700: #2a2f3a;
7
- --steel-600: #303745;
8
- --steel-500: #3c4557;
9
- --steel-400: #8c96aa;
10
- --steel-300: #aeb6c6;
11
- --steel-200: #b9c0cf;
12
- --steel-100: #d8deea;
13
- --cream-50: #fffbf3;
14
- --cream-100: #f7f3ea;
15
- --cream-200: #e8e1cf;
16
- --brass-500: #f4c95d;
17
- --brass-400: #ffd877;
18
- --brass-ink: #17130a;
19
- --sage-900: #172419;
20
- --sage-700: #315f3a;
21
- --sage-300: #8fe39e;
22
- --amber-900: #25230f;
23
- --amber-700: #5d4d1b;
24
- --rust-500: #f06464;
25
- --bg: var(--ink-900);
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: 8px;
90
- --radius-md: 10px;
91
- --radius-lg: 12px;
92
- --radius-xl: 14px;
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 16px 44px rgba(0, 0, 0, 0.35);
97
- --shadow-floating: 0 20px 70px rgba(0, 0, 0, 0.35);
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: 8px;
129
+ gap: 9px;
148
130
  white-space: nowrap;
149
131
  flex-shrink: 0;
150
132
  }
151
133
  .brand-mark {
152
- font-family: var(--font-serif);
153
- font-style: italic;
154
- font-size: 22px;
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-sans);
149
+ font-family: var(--font-mono);
160
150
  font-size: 10px;
161
- font-weight: 600;
151
+ font-weight: var(--w-medium);
162
152
  letter-spacing: 0.18em;
163
153
  text-transform: uppercase;
164
- color: var(--fg-muted);
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: inherit;
177
- font-size: var(--text-sm);
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: 9px;
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(--steel-700);
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-bold);
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: 7px;
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(--steel-700);
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-sans);
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(--steel-700);
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(240, 100, 100, 0.1);
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-bold);
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(23, 19, 10, 0.22);
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: 11px;
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(15, 17, 21, 0.72);
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-bold);
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: inherit;
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-serif);
477
- font-size: var(--text-2xl);
478
- font-style: italic;
479
- font-weight: var(--w-regular);
480
- line-height: var(--lh-2xl);
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-bold);
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-lg);
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-bold);
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-bold);
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
- font-size: 15px;
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: 16px 16px 8px;
650
+ margin: 18px 16px 10px;
640
651
  font-weight: var(--w-semi);
641
- letter-spacing: 0;
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-xl);
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-bold);
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-bold);
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: 900;
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(15, 17, 21, 0.86);
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: 20px 24px;
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-serif);
867
- font-style: italic;
868
- font-size: 22px;
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(244, 201, 93, 0.35);
931
+ border: 1px solid rgba(240, 180, 90, 0.4);
891
932
  border-radius: var(--radius-lg);
892
- background: rgba(37, 35, 15, 0.92);
893
- color: var(--brass-400);
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 #f4c95d)";
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:#f4c95d;--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}";
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;--ink-900:#0f1115;--ink-800:#11141a;--ink-700:#171a21;--ink-600:#1c212b;--steel-700:#2a2f3a;--steel-600:#303745;--steel-500:#3c4557;--steel-400:#8c96aa;--steel-300:#aeb6c6;--steel-200:#b9c0cf;--steel-100:#d8deea;--cream-50:#fffbf3;--cream-100:#f7f3ea;--cream-200:#e8e1cf;--brass-500:#f4c95d;--brass-400:#ffd877;--brass-ink:#17130a;--bg:var(--ink-900);--bg-panel:var(--ink-800);--bg-elevated:var(--ink-600);--fg:var(--cream-100);--fg-faint:var(--steel-300);--border:var(--steel-600);--accent:#f4c95d;--accent-hover:#ffd877;--font-sans:Geist,ui-sans-serif,system-ui,-apple-system,"Segoe UI",sans-serif;--font-mono:"Geist Mono",ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;--radius-md:10px;--radius-xl:14px;--shadow-floating:0 20px 70px rgba(0,0,0,.35);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(244,201,93,.28);border-radius:2px;box-shadow:0 0 0 1px rgba(244,201,93,.45)}.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-weight:700;margin-bottom:6px}.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::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:700;cursor:pointer}.canvasflow-annotation-card button:active{opacity:.85}.canvasflow-annotation-card .canvasflow-send{background:var(--accent);color:var(--brass-ink)}.canvasflow-annotation-card .canvasflow-send:hover{background:var(--accent-hover)}.canvasflow-annotation-card .canvasflow-cancel{background:var(--steel-700);color:var(--fg)}`;
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">CanvasFlow</span><span class="brand-support">Editor</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>
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 &amp; 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.1.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
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@menukfernandoo/canvas-flow",
3
- "version": "0.1.0",
3
+ "version": "0.2.0",
4
4
  "packageManager": "pnpm@11.1.1",
5
5
  "description": "HTML is the new markdown. CanvasFlow is the new editor for your HTML artifacts.",
6
6
  "type": "module",