@jay-framework/aiditor 0.19.6 → 0.19.7

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.
@@ -29,11 +29,15 @@
29
29
  --harmony-shadow-sm: 0 1px 4px rgba(22, 45, 61, 0.06);
30
30
  --harmony-shadow-md: 0 4px 24px rgba(22, 45, 61, 0.1);
31
31
  --harmony-shadow-lg: 0 8px 40px rgba(22, 45, 61, 0.12);
32
+ --harmony-shadow-add-btn:
33
+ 0 1px 2px rgba(22, 45, 61, 0.05),
34
+ 0 4px 14px rgba(22, 45, 61, 0.1),
35
+ 0 10px 28px rgba(22, 45, 61, 0.08);
32
36
  --harmony-radius-sm: 6px;
33
37
  --harmony-radius-md: 10px;
34
38
  --harmony-radius-lg: 16px;
35
39
  --harmony-radius-pill: 999px;
36
- --harmony-sidebar-width: 52px;
40
+ --harmony-sidebar-width: 72px;
37
41
  --harmony-global-bar-height: 52px;
38
42
  --harmony-secondary-bar-height: 44px;
39
43
  --harmony-font: 'Madefor', 'Helvetica Neue', Helvetica, Arial, sans-serif;
@@ -146,25 +150,69 @@
146
150
  flex: 1;
147
151
  display: flex;
148
152
  flex-direction: column;
153
+ align-items: center;
149
154
  min-height: 0;
150
- padding: 20px 28px 72px;
151
- overflow: hidden;
155
+ padding: 20px 40px 72px;
156
+ overflow-x: visible;
157
+ overflow-y: hidden;
158
+ }
159
+
160
+ .canvas-stage-shell {
161
+ position: relative;
162
+ flex: 1;
163
+ display: flex;
164
+ flex-direction: column;
165
+ min-height: 0;
166
+ max-width: 100%;
167
+ align-self: center;
152
168
  }
153
169
 
154
170
  .canvas-window {
171
+ position: relative;
155
172
  flex: 1;
156
173
  display: flex;
157
174
  flex-direction: column;
158
175
  min-height: 0;
159
- max-width: 1280px;
160
176
  width: 100%;
161
- margin: 0 auto;
177
+ max-width: 100%;
162
178
  background: var(--harmony-bg-surface);
163
179
  border: 1px solid var(--harmony-border);
164
180
  border-radius: var(--harmony-radius-lg);
165
181
  box-shadow: var(--harmony-shadow-md);
166
182
  overflow: hidden;
167
183
  }
184
+ .stage-resize-handle {
185
+ position: absolute;
186
+ top: 50%;
187
+ z-index: 12;
188
+ width: 10px;
189
+ height: 56px;
190
+ border: 1px solid var(--harmony-border-strong);
191
+ border-radius: var(--harmony-radius-pill);
192
+ background: var(--harmony-bg-surface);
193
+ box-shadow: var(--harmony-shadow-sm);
194
+ cursor: col-resize;
195
+ touch-action: none;
196
+ }
197
+ .stage-resize-handle::before {
198
+ content: "";
199
+ position: absolute;
200
+ top: 50%;
201
+ left: 50%;
202
+ width: 2px;
203
+ height: 20px;
204
+ margin: -10px 0 0 -1px;
205
+ border-radius: 1px;
206
+ background: var(--harmony-border-strong);
207
+ }
208
+ .stage-resize-handle-left {
209
+ left: 0;
210
+ transform: translate(calc(-100% - 8px), -50%);
211
+ }
212
+ .stage-resize-handle-right {
213
+ right: 0;
214
+ transform: translate(calc(100% + 8px), -50%);
215
+ }
168
216
 
169
217
  .canvas-chrome {
170
218
  flex-shrink: 0;
@@ -185,30 +233,63 @@
185
233
  }
186
234
 
187
235
  /* Floating annotation toolbar — centered at bottom of canvas stage */
188
- .annotate-dock {
236
+ .annotate-dock-wrap {
189
237
  position: absolute;
190
238
  bottom: 20px;
191
239
  left: 50%;
192
240
  transform: translateX(-50%);
193
241
  z-index: 60;
194
242
  display: flex;
243
+ flex-direction: column;
195
244
  align-items: center;
196
- gap: 2px;
197
- padding: 5px 8px;
245
+ gap: 8px;
246
+ pointer-events: none;
247
+ }
248
+ .annotate-dock-wrap > * { pointer-events: auto; }
249
+ .clear-markers-confirm {
250
+ display: flex;
251
+ align-items: center;
252
+ gap: 10px;
253
+ padding: 8px 14px;
198
254
  background: var(--harmony-bg-surface);
199
255
  border: 1px solid var(--harmony-border);
200
256
  border-radius: var(--harmony-radius-pill);
201
257
  box-shadow: 0 6px 28px rgba(22, 45, 61, 0.14), 0 2px 6px rgba(22, 45, 61, 0.06);
202
- pointer-events: auto;
258
+ font-size: 13px;
259
+ color: var(--harmony-text);
260
+ white-space: nowrap;
203
261
  }
204
- .annotate-dock-label {
262
+ .clear-markers-confirm-msg { color: var(--harmony-text-secondary); }
263
+ .clear-markers-cancel-btn,
264
+ .clear-markers-confirm-btn {
265
+ border-radius: var(--harmony-radius-pill);
266
+ padding: 5px 12px;
205
267
  font-size: 12px;
206
268
  font-weight: 600;
207
- color: var(--harmony-text-secondary);
208
- padding: 0 8px 0 4px;
269
+ cursor: pointer;
209
270
  white-space: nowrap;
210
- border-right: 1px solid var(--harmony-border);
211
- margin-right: 4px;
271
+ }
272
+ .clear-markers-cancel-btn {
273
+ background: var(--harmony-bg-surface);
274
+ color: var(--harmony-text);
275
+ border: 1px solid var(--harmony-border);
276
+ }
277
+ .clear-markers-cancel-btn:hover { background: var(--harmony-bg-hover); }
278
+ .clear-markers-confirm-btn {
279
+ background: var(--harmony-danger, #d64545);
280
+ color: #fff;
281
+ border: none;
282
+ }
283
+ .clear-markers-confirm-btn:hover { opacity: 0.9; }
284
+ .annotate-dock {
285
+ display: flex;
286
+ align-items: center;
287
+ gap: 2px;
288
+ padding: 5px 8px;
289
+ background: var(--harmony-bg-surface);
290
+ border: 1px solid var(--harmony-border);
291
+ border-radius: var(--harmony-radius-pill);
292
+ box-shadow: 0 6px 28px rgba(22, 45, 61, 0.14), 0 2px 6px rgba(22, 45, 61, 0.06);
212
293
  }
213
294
 
214
295
  /* ── Global top bar aliases (legacy class names) ── */
@@ -249,11 +330,187 @@
249
330
  color: var(--harmony-text-secondary);
250
331
  white-space: nowrap;
251
332
  }
252
- .harmony-path-select {
333
+
334
+ /* Harmony-style nav button (routes / snapshots picker trigger) */
335
+ .harmony-nav-btn {
336
+ display: inline-flex;
337
+ align-items: center;
338
+ gap: 4px;
339
+ max-width: min(320px, 42vw);
340
+ padding: 6px 10px;
341
+ background: transparent;
342
+ color: var(--harmony-text);
343
+ border: 1px solid transparent;
344
+ border-radius: var(--harmony-radius-sm);
345
+ font-size: 13px;
346
+ font-weight: 500;
347
+ font-family: var(--harmony-font);
348
+ cursor: pointer;
349
+ white-space: nowrap;
350
+ flex-shrink: 0;
351
+ }
352
+ .harmony-nav-btn:hover {
353
+ background: var(--harmony-bg-hover);
354
+ }
355
+ .harmony-nav-btn-active,
356
+ .harmony-nav-btn-active:hover {
357
+ background: var(--harmony-bg-hover);
358
+ border-color: var(--harmony-primary);
359
+ box-shadow: 0 0 0 3px var(--harmony-primary-soft);
360
+ }
361
+ .harmony-nav-btn-prefix {
362
+ color: var(--harmony-text-secondary);
363
+ font-weight: 600;
364
+ flex-shrink: 0;
365
+ }
366
+ .harmony-nav-btn-label {
367
+ overflow: hidden;
368
+ text-overflow: ellipsis;
369
+ font-family: var(--harmony-font);
370
+ font-size: 13px;
371
+ font-weight: 500;
372
+ }
373
+ .harmony-nav-btn-chevron {
374
+ flex-shrink: 0;
375
+ color: var(--harmony-text);
376
+ font-size: 11px;
377
+ line-height: 1;
378
+ }
379
+
380
+ /* Floating routes panel (Harmony site-overview style) */
381
+ .harmony-routes-panel-overlay {
382
+ position: fixed;
383
+ inset: 0;
384
+ z-index: 220;
385
+ background: rgba(22, 45, 61, 0.12);
386
+ }
387
+ .harmony-routes-panel {
388
+ position: absolute;
389
+ top: 56px;
390
+ left: 16px;
391
+ width: min(380px, calc(100vw - 32px));
392
+ max-height: min(72vh, 620px);
393
+ display: flex;
394
+ flex-direction: column;
395
+ background: var(--harmony-bg-surface);
396
+ border: 1px solid var(--harmony-border);
397
+ border-radius: var(--harmony-radius-lg);
398
+ box-shadow: var(--harmony-shadow-lg);
399
+ overflow: hidden;
400
+ }
401
+ .harmony-routes-panel-header {
402
+ flex-shrink: 0;
403
+ display: flex;
404
+ align-items: center;
405
+ justify-content: space-between;
406
+ gap: 8px;
407
+ padding: 14px 16px;
408
+ border-bottom: 1px solid var(--harmony-border);
409
+ background: var(--harmony-bg-subtle, #f8f9fb);
410
+ }
411
+ .harmony-routes-panel-title {
412
+ font-size: 14px;
413
+ font-weight: 600;
414
+ color: var(--harmony-text);
415
+ }
416
+ .harmony-routes-panel-close {
417
+ background: none;
418
+ border: none;
419
+ color: var(--harmony-text-muted);
420
+ font-size: 20px;
421
+ cursor: pointer;
422
+ line-height: 1;
423
+ padding: 0 4px;
424
+ }
425
+ .harmony-routes-panel-close:hover { color: var(--harmony-text); }
426
+ .harmony-routes-panel-search-row {
427
+ flex-shrink: 0;
428
+ padding: 12px 16px;
429
+ border-bottom: 1px solid var(--harmony-border);
430
+ }
431
+ .harmony-routes-panel-search-input {
432
+ width: 100%;
433
+ box-sizing: border-box;
434
+ padding: 8px 12px;
435
+ font-size: 13px;
436
+ font-family: var(--harmony-font);
437
+ color: var(--harmony-text);
438
+ background: var(--harmony-bg-surface);
439
+ border: 1px solid var(--harmony-border);
440
+ border-radius: var(--harmony-radius-sm);
441
+ outline: none;
442
+ }
443
+ .harmony-routes-panel-search-input:focus {
444
+ border-color: var(--harmony-primary);
445
+ box-shadow: 0 0 0 3px var(--harmony-primary-soft);
446
+ }
447
+ .harmony-routes-panel-search-input::placeholder {
448
+ color: var(--harmony-text-muted);
449
+ }
450
+ .harmony-routes-panel-body {
451
+ flex: 1;
452
+ min-height: 0;
453
+ overflow-y: auto;
454
+ padding: 8px 0;
455
+ }
456
+ .harmony-routes-panel-section-title {
457
+ margin: 0;
458
+ padding: 10px 16px 6px;
459
+ font-size: 11px;
460
+ font-weight: 600;
461
+ letter-spacing: 0.04em;
462
+ text-transform: uppercase;
463
+ color: var(--harmony-text-muted);
464
+ }
465
+ .harmony-routes-panel-section-title + .harmony-routes-panel-item,
466
+ .harmony-routes-panel-item + .harmony-routes-panel-section-title {
467
+ margin-top: 4px;
468
+ padding-top: 14px;
469
+ border-top: 1px solid var(--harmony-border);
470
+ }
471
+ .harmony-routes-panel-item {
253
472
  display: flex;
254
473
  align-items: center;
255
474
  gap: 8px;
475
+ width: 100%;
476
+ box-sizing: border-box;
477
+ padding: 9px 16px;
478
+ border: none;
479
+ background: transparent;
480
+ color: var(--harmony-text);
481
+ font-size: 13px;
482
+ font-family: var(--harmony-mono);
483
+ text-align: left;
484
+ cursor: pointer;
485
+ }
486
+ .harmony-routes-panel-item:hover {
487
+ background: var(--harmony-bg-hover);
488
+ }
489
+ .harmony-routes-panel-item--selected {
490
+ background: var(--harmony-primary-soft);
491
+ color: var(--harmony-primary);
492
+ font-weight: 600;
493
+ }
494
+ .harmony-routes-panel-check {
495
+ flex-shrink: 0;
496
+ width: 16px;
497
+ font-size: 13px;
498
+ line-height: 1;
499
+ text-align: center;
500
+ }
501
+ .harmony-routes-panel-item-label {
502
+ flex: 1;
256
503
  min-width: 0;
504
+ overflow: hidden;
505
+ text-overflow: ellipsis;
506
+ white-space: nowrap;
507
+ }
508
+ .harmony-routes-panel-empty {
509
+ margin: 0;
510
+ padding: 16px;
511
+ font-size: 13px;
512
+ color: var(--harmony-text-secondary);
513
+ text-align: center;
257
514
  }
258
515
 
259
516
  .aiditor-logo {
@@ -290,8 +547,7 @@
290
547
  .aiditor-dropdown option { background: #fff; color: var(--harmony-text); }
291
548
  .harmony-page-select { flex: 1; min-width: 160px; }
292
549
  .preview-path-select { flex: 1; min-width: 0; max-width: 400px; }
293
- .path-select-row { display: flex; align-items: center; gap: 8px; width: 100%; }
294
- .params-loading-hint { font-size: 11px; color: var(--harmony-text-muted); white-space: nowrap; flex-shrink: 0; }
550
+ .freeze-select { min-width: 140px; max-width: 220px; font-family: var(--harmony-font); }
295
551
 
296
552
  /* Harmony buttons */
297
553
  .harmony-btn-primary {
@@ -308,6 +564,7 @@
308
564
  }
309
565
  .harmony-btn-primary:hover { background: var(--harmony-primary-hover); }
310
566
  .harmony-btn-primary:disabled { opacity: 0.5; cursor: not-allowed; }
567
+ .aiditor-publish-btn { min-width: 88px; border-radius: var(--harmony-radius-sm); }
311
568
 
312
569
  .harmony-btn-secondary {
313
570
  background: var(--harmony-bg-surface);
@@ -328,69 +585,255 @@
328
585
  .add-page-from-brief-btn { /* inherits harmony-btn-secondary */ }
329
586
  .project-settings-btn { /* inherits harmony-btn-secondary */ }
330
587
 
331
- .harmony-editor-body,
332
- .harmony-sidebar,
333
- .harmony-secondary-bar { display: none !important; }
334
- .harmony-workspace { display: contents; }
335
- .preview-visual-tools { display: flex; flex-shrink: 0; gap: 2px; align-items: center; }
336
-
337
- .visual-tool-btn {
338
- background: transparent;
339
- color: var(--harmony-text-secondary);
340
- border: none;
341
- border-radius: var(--harmony-radius-sm);
342
- padding: 7px 10px;
343
- font-size: 12px;
344
- cursor: pointer;
345
- line-height: 1;
346
- display: inline-flex;
347
- align-items: center;
348
- justify-content: center;
349
- min-width: 34px;
350
- min-height: 34px;
351
- }
352
- .visual-tool-btn:hover { background: var(--harmony-bg-hover); color: var(--harmony-text); }
353
- .visual-tool-on {
354
- background: var(--harmony-primary-soft) !important;
355
- color: var(--harmony-primary) !important;
356
- }
357
- .tool-group-sep {
358
- width: 1px;
359
- background: var(--harmony-border);
360
- align-self: stretch;
361
- margin: 0 4px;
362
- flex-shrink: 0;
363
- }
364
-
365
- /* Canvas aliases */
366
- .harmony-canvas-area,
367
- .canvas-workspace {
588
+ .harmony-editor-body {
368
589
  flex: 1;
369
590
  display: flex;
370
- flex-direction: column;
371
591
  min-height: 0;
372
- padding: 20px 28px 72px;
373
- gap: 10px;
374
592
  overflow: hidden;
593
+ position: relative;
375
594
  }
376
- .harmony-canvas-window,
377
- .canvas-window {
378
- flex: 1;
379
- display: flex;
380
- flex-direction: column;
381
- min-height: 0;
595
+ .harmony-float-rail {
596
+ position: absolute;
597
+ inset: 0;
598
+ z-index: 30;
599
+ pointer-events: none;
600
+ }
601
+ .harmony-add-btn {
602
+ position: absolute;
603
+ top: 16px;
604
+ left: 16px;
605
+ display: inline-flex;
606
+ align-items: center;
607
+ justify-content: center;
608
+ gap: 4px;
609
+ padding: 8px 14px;
382
610
  background: var(--harmony-bg-surface);
611
+ color: var(--harmony-text);
383
612
  border: 1px solid var(--harmony-border);
384
- border-radius: var(--harmony-radius-lg);
385
- box-shadow: var(--harmony-shadow-md);
386
- overflow: hidden;
613
+ border-radius: var(--harmony-radius-md);
614
+ box-shadow: var(--harmony-shadow-add-btn);
615
+ font-size: 13px;
616
+ font-weight: 600;
617
+ font-family: var(--harmony-font);
618
+ cursor: pointer;
619
+ white-space: nowrap;
620
+ line-height: 1.2;
621
+ pointer-events: auto;
387
622
  }
388
-
389
- .harmony-canvas-chrome {
390
- flex-shrink: 0;
623
+ .harmony-add-btn:hover {
624
+ background: var(--harmony-bg-hover);
625
+ border-color: var(--harmony-border-strong);
626
+ box-shadow:
627
+ 0 2px 4px rgba(22, 45, 61, 0.06),
628
+ 0 6px 18px rgba(22, 45, 61, 0.12),
629
+ 0 12px 32px rgba(22, 45, 61, 0.09);
630
+ }
631
+ .harmony-add-btn:disabled { opacity: 0.5; cursor: not-allowed; }
632
+ .harmony-add-btn-open {
633
+ background: var(--harmony-bg-hover);
634
+ border-color: var(--harmony-border-strong);
635
+ box-shadow:
636
+ inset 0 1px 2px rgba(22, 45, 61, 0.06),
637
+ 0 1px 2px rgba(22, 45, 61, 0.04);
638
+ }
639
+ .harmony-stage-icon-btn {
640
+ position: absolute;
641
+ left: 20px;
642
+ bottom: 20px;
643
+ z-index: 25;
391
644
  display: flex;
392
645
  align-items: center;
393
- gap: 12px;
646
+ justify-content: center;
647
+ width: auto;
648
+ height: auto;
649
+ padding: 4px;
650
+ background: none;
651
+ border: none;
652
+ box-shadow: none;
653
+ color: var(--harmony-text);
654
+ font-size: 22px;
655
+ line-height: 1;
656
+ cursor: pointer;
657
+ opacity: 0.72;
658
+ }
659
+ .harmony-stage-icon-btn:hover { opacity: 1; color: var(--harmony-text); }
660
+ .harmony-stage-icon-btn:disabled { opacity: 0.35; cursor: not-allowed; }
661
+ .harmony-add-flyout-backdrop { display: none; position: fixed; inset: 0; z-index: 34; background: transparent; }
662
+ .harmony-add-flyout-backdrop.harmony-add-flyout-visible { display: block; }
663
+ .harmony-add-flyout {
664
+ display: none;
665
+ position: absolute;
666
+ top: 56px;
667
+ left: 16px;
668
+ z-index: 35;
669
+ flex-direction: column;
670
+ gap: 8px;
671
+ padding: 0;
672
+ background: transparent;
673
+ border: none;
674
+ box-shadow: none;
675
+ min-width: 0;
676
+ }
677
+ .harmony-add-flyout.harmony-add-flyout-visible { display: flex; }
678
+ .harmony-add-flyout-item {
679
+ display: flex;
680
+ align-items: center;
681
+ gap: 12px;
682
+ width: 220px;
683
+ padding: 10px 12px;
684
+ background: var(--harmony-bg-surface);
685
+ color: var(--harmony-text);
686
+ border: 1px solid var(--harmony-border);
687
+ border-radius: var(--harmony-radius-md);
688
+ box-shadow: var(--harmony-shadow-md);
689
+ cursor: pointer;
690
+ text-align: left;
691
+ font-family: var(--harmony-font);
692
+ }
693
+ .harmony-add-flyout-item:hover { border-color: var(--harmony-border-strong); box-shadow: var(--harmony-shadow-lg); }
694
+ .harmony-add-flyout-thumb {
695
+ flex-shrink: 0;
696
+ width: 40px;
697
+ height: 40px;
698
+ border-radius: var(--harmony-radius-sm);
699
+ border: 1px solid var(--harmony-border);
700
+ background-size: 24px 24px;
701
+ background-position: center;
702
+ background-repeat: no-repeat;
703
+ }
704
+ .harmony-add-flyout-thumb-pages {
705
+ background-color: #e8f0ff;
706
+ background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' fill='none' viewBox='0 0 24 24'%3E%3Crect x='4' y='3' width='16' height='18' rx='2' stroke='%23116dff' stroke-width='1.5'/%3E%3Cpath d='M8 8h8M8 12h8M8 16h5' stroke='%23116dff' stroke-width='1.5' stroke-linecap='round'/%3E%3C/svg%3E");
707
+ }
708
+ .harmony-add-flyout-thumb-elements {
709
+ background-color: #fff4e8;
710
+ background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' fill='none' viewBox='0 0 24 24'%3E%3Crect x='4' y='4' width='7' height='7' rx='1.5' stroke='%23f5a623' stroke-width='1.5'/%3E%3Crect x='13' y='4' width='7' height='7' rx='1.5' stroke='%23f5a623' stroke-width='1.5'/%3E%3Crect x='4' y='13' width='7' height='7' rx='1.5' stroke='%23f5a623' stroke-width='1.5'/%3E%3Crect x='13' y='13' width='7' height='7' rx='1.5' stroke='%23f5a623' stroke-width='1.5'/%3E%3C/svg%3E");
711
+ }
712
+ .harmony-add-flyout-label { font-size: 14px; font-weight: 500; color: var(--harmony-text); }
713
+ .harmony-elements-panel {
714
+ position: absolute;
715
+ top: 0;
716
+ left: 0;
717
+ bottom: 0;
718
+ z-index: 32;
719
+ width: 280px;
720
+ display: flex;
721
+ flex-direction: column;
722
+ background: var(--harmony-bg-surface);
723
+ border-right: 1px solid var(--harmony-border);
724
+ box-shadow: var(--harmony-shadow-md);
725
+ }
726
+ .harmony-elements-panel-header {
727
+ flex-shrink: 0;
728
+ display: flex;
729
+ align-items: center;
730
+ justify-content: space-between;
731
+ gap: 8px;
732
+ padding: 14px 16px;
733
+ border-bottom: 1px solid var(--harmony-border);
734
+ }
735
+ .harmony-elements-panel-title { font-size: 14px; font-weight: 600; color: var(--harmony-text); }
736
+ .harmony-elements-panel-close { background: none; border: none; color: var(--harmony-text-muted); font-size: 20px; cursor: pointer; line-height: 1; padding: 0 4px; }
737
+ .harmony-elements-panel-close:hover { color: var(--harmony-text); }
738
+ .harmony-elements-panel-body { flex: 1; min-height: 0; overflow-y: auto; padding: 12px; display: flex; flex-direction: column; gap: 8px; }
739
+ .harmony-elements-panel-hint { margin: 0; font-size: 12px; color: var(--harmony-text-secondary); line-height: 1.45; }
740
+ .harmony-secondary-bar { display: none !important; }
741
+ .harmony-workspace { flex: 1; display: flex; flex-direction: column; min-width: 0; min-height: 0; overflow: hidden; }
742
+ .sr-only { position: absolute; width: 1px; height: 1px; padding: 0; margin: -1px; overflow: hidden; clip: rect(0, 0, 0, 0); white-space: nowrap; border: 0; }
743
+ .preview-visual-tools { display: flex; flex-shrink: 0; gap: 2px; align-items: center; }
744
+
745
+ .visual-tool-btn {
746
+ background: transparent;
747
+ color: var(--harmony-text-secondary);
748
+ border: none;
749
+ border-radius: var(--harmony-radius-sm);
750
+ padding: 7px 10px;
751
+ font-size: 12px;
752
+ cursor: pointer;
753
+ line-height: 1;
754
+ display: inline-flex;
755
+ align-items: center;
756
+ justify-content: center;
757
+ min-width: 34px;
758
+ min-height: 34px;
759
+ }
760
+ .visual-tool-btn:hover { background: var(--harmony-bg-hover); color: var(--harmony-text); }
761
+ .visual-tool-btn:disabled { opacity: 0.45; cursor: not-allowed; }
762
+ .visual-tool-btn:disabled:hover { background: transparent; color: var(--harmony-text-secondary); }
763
+ .send-to-agent-btn { color: var(--harmony-primary) !important; }
764
+ .send-to-agent-btn:disabled { color: var(--harmony-text-secondary) !important; }
765
+ .tool-send-icon { display: block; }
766
+ .tool-glyph {
767
+ font-family: var(--harmony-font);
768
+ font-size: 17px;
769
+ line-height: 1;
770
+ display: inline-block;
771
+ user-select: none;
772
+ }
773
+ .tool-rec-label {
774
+ font-family: var(--harmony-font);
775
+ font-size: 10px;
776
+ font-weight: 700;
777
+ letter-spacing: 0.05em;
778
+ line-height: 1;
779
+ display: inline-block;
780
+ user-select: none;
781
+ }
782
+ .visual-tool-on {
783
+ background: var(--harmony-primary-soft) !important;
784
+ color: var(--harmony-primary) !important;
785
+ }
786
+ .tool-group-sep {
787
+ width: 1px;
788
+ background: var(--harmony-border);
789
+ align-self: stretch;
790
+ margin: 0 4px;
791
+ flex-shrink: 0;
792
+ }
793
+
794
+ /* Canvas aliases */
795
+ .harmony-canvas-area,
796
+ .canvas-workspace {
797
+ flex: 1;
798
+ display: flex;
799
+ flex-direction: column;
800
+ align-items: center;
801
+ min-height: 0;
802
+ padding: 20px 40px 72px;
803
+ gap: 10px;
804
+ overflow-x: visible;
805
+ overflow-y: hidden;
806
+ }
807
+ .canvas-stage-shell {
808
+ position: relative;
809
+ flex: 1;
810
+ display: flex;
811
+ flex-direction: column;
812
+ min-height: 0;
813
+ max-width: 100%;
814
+ align-self: center;
815
+ }
816
+ .harmony-canvas-window,
817
+ .canvas-window {
818
+ position: relative;
819
+ flex: 1;
820
+ display: flex;
821
+ flex-direction: column;
822
+ min-height: 0;
823
+ width: 100%;
824
+ max-width: 100%;
825
+ background: var(--harmony-bg-surface);
826
+ border: 1px solid var(--harmony-border);
827
+ border-radius: var(--harmony-radius-lg);
828
+ box-shadow: var(--harmony-shadow-md);
829
+ overflow: hidden;
830
+ }
831
+
832
+ .harmony-canvas-chrome {
833
+ flex-shrink: 0;
834
+ display: flex;
835
+ align-items: center;
836
+ gap: 12px;
394
837
  padding: 10px 16px;
395
838
  background: var(--harmony-bg-subtle);
396
839
  border-bottom: 1px solid var(--harmony-border);
@@ -441,8 +884,6 @@
441
884
  }
442
885
  .harmony-canvas-content { flex: 1; }
443
886
  .preview-frame { width: 100%; height: 100%; min-height: 360px; border: none; display: block; }
444
- .preview-frame-tablet { align-self: center; width: 768px; max-width: 100%; }
445
- .preview-frame-mobile { align-self: center; width: 390px; max-width: 100%; }
446
887
 
447
888
  /* ── Visual annotations ── */
448
889
  .visual-overlay { position: absolute; inset: 0; z-index: 2; }
@@ -456,6 +897,18 @@
456
897
  background: var(--harmony-primary);
457
898
  border: 2px solid #fff;
458
899
  box-shadow: var(--harmony-shadow-sm);
900
+ pointer-events: auto;
901
+ cursor: pointer;
902
+ z-index: 3;
903
+ }
904
+ .point-marker.marker-edit-mode {
905
+ cursor: grab;
906
+ }
907
+ .point-marker.marker-edit-mode:active {
908
+ cursor: grabbing;
909
+ }
910
+ .point-marker-open {
911
+ box-shadow: 0 0 0 3px var(--harmony-primary-soft), var(--harmony-shadow-sm);
459
912
  }
460
913
  .point-marker-idx {
461
914
  position: absolute;
@@ -477,7 +930,39 @@
477
930
  position: absolute;
478
931
  border: 2px dashed var(--harmony-primary);
479
932
  background: var(--harmony-primary-soft);
480
- pointer-events: none;
933
+ pointer-events: auto;
934
+ cursor: pointer;
935
+ z-index: 2;
936
+ }
937
+ .area-rect.marker-edit-mode {
938
+ cursor: grab;
939
+ }
940
+ .area-rect.marker-edit-mode:active {
941
+ cursor: grabbing;
942
+ }
943
+ .area-resize-handle {
944
+ position: absolute;
945
+ width: 8px;
946
+ height: 8px;
947
+ margin: -4px 0 0 -4px;
948
+ border-radius: 2px;
949
+ background: #fff;
950
+ border: 1px solid var(--harmony-primary);
951
+ box-shadow: var(--harmony-shadow-sm);
952
+ pointer-events: auto;
953
+ z-index: 2;
954
+ }
955
+ .area-resize-nw { left: 0; top: 0; cursor: nwse-resize; }
956
+ .area-resize-n { left: 50%; top: 0; cursor: ns-resize; }
957
+ .area-resize-ne { left: 100%; top: 0; cursor: nesw-resize; }
958
+ .area-resize-e { left: 100%; top: 50%; cursor: ew-resize; }
959
+ .area-resize-se { left: 100%; top: 100%; cursor: nwse-resize; }
960
+ .area-resize-s { left: 50%; top: 100%; cursor: ns-resize; }
961
+ .area-resize-sw { left: 0; top: 100%; cursor: nesw-resize; }
962
+ .area-resize-w { left: 0; top: 50%; cursor: ew-resize; }
963
+ .area-rect-open {
964
+ border-style: solid;
965
+ box-shadow: 0 0 0 2px var(--harmony-primary-soft);
481
966
  }
482
967
  .area-marker-idx {
483
968
  position: absolute;
@@ -497,37 +982,6 @@
497
982
  z-index: 1;
498
983
  }
499
984
  .area-rect-draft { border-style: solid; border-color: var(--harmony-primary); background: var(--harmony-primary-soft); }
500
- .arrow-pending-dot {
501
- position: absolute;
502
- width: 10px;
503
- height: 10px;
504
- margin: -5px 0 0 -5px;
505
- border-radius: 50%;
506
- background: var(--harmony-primary);
507
- border: 2px solid #fff;
508
- box-shadow: var(--harmony-shadow-sm);
509
- pointer-events: none;
510
- }
511
- .arrow-svg { position: absolute; inset: 0; width: 100%; height: 100%; pointer-events: none; }
512
- .arrow-svg line { stroke: var(--harmony-primary); stroke-width: 2; marker-end: url(#aiditor-arrowhead); }
513
- .arrow-end-pin {
514
- position: absolute;
515
- width: 22px;
516
- height: 22px;
517
- margin: -11px 0 0 -11px;
518
- border-radius: 50%;
519
- background: var(--harmony-primary);
520
- color: #fff;
521
- border: 2px solid #fff;
522
- box-shadow: var(--harmony-shadow-sm);
523
- font-size: 11px;
524
- font-weight: 700;
525
- display: flex;
526
- align-items: center;
527
- justify-content: center;
528
- pointer-events: none;
529
- z-index: 3;
530
- }
531
985
  .visual-popovers { position: absolute; inset: 0; z-index: 4; pointer-events: none; }
532
986
  .visual-popover {
533
987
  position: absolute;
@@ -537,7 +991,7 @@
537
991
  display: flex;
538
992
  flex-direction: column;
539
993
  gap: 8px;
540
- padding: 12px 14px;
994
+ padding: 12px 14px 44px;
541
995
  background: var(--harmony-bg-surface);
542
996
  border: 1px solid var(--harmony-border);
543
997
  border-radius: var(--harmony-radius-md);
@@ -549,6 +1003,10 @@
549
1003
  overflow-x: hidden;
550
1004
  min-height: 0;
551
1005
  }
1006
+ .visual-popover-hidden {
1007
+ display: none !important;
1008
+ pointer-events: none;
1009
+ }
552
1010
  .visual-popover-flip-x { transform: translate(calc(-100% - 14px), 10px); }
553
1011
  .visual-popover-flip-y { transform: translate(10px, calc(-100% - 14px)); }
554
1012
  .visual-popover-flip-x.visual-popover-flip-y { transform: translate(calc(-100% - 14px), calc(-100% - 14px)); }
@@ -565,18 +1023,19 @@
565
1023
  cursor: pointer;
566
1024
  }
567
1025
  .visual-annotation-remove:hover { color: var(--harmony-danger); border-color: var(--harmony-danger); }
568
- .visual-annotation-run {
569
- background: var(--harmony-primary);
570
- color: #fff;
571
- border: none;
1026
+ .visual-annotation-minimize {
1027
+ display: inline-flex;
1028
+ align-items: center;
1029
+ justify-content: center;
1030
+ background: transparent;
1031
+ color: var(--harmony-text-muted);
1032
+ border: 1px solid var(--harmony-border);
572
1033
  border-radius: var(--harmony-radius-sm);
573
- padding: 4px 10px;
574
- font-size: 11px;
575
- font-weight: 600;
1034
+ padding: 4px 6px;
576
1035
  cursor: pointer;
1036
+ line-height: 0;
577
1037
  }
578
- .visual-annotation-run:hover { background: var(--harmony-primary-hover); }
579
- .visual-annotation-run:disabled { opacity: 0.45; cursor: not-allowed; }
1038
+ .visual-annotation-minimize:hover { color: var(--harmony-primary); border-color: var(--harmony-primary); }
580
1039
  .visual-annotation-instruction {
581
1040
  width: 100%;
582
1041
  min-height: 48px;
@@ -592,6 +1051,34 @@
592
1051
  }
593
1052
  .visual-annotation-instruction:focus { border-color: var(--harmony-primary); box-shadow: 0 0 0 3px var(--harmony-primary-soft); }
594
1053
  .visual-annotation-files { display: flex; flex-direction: column; gap: 6px; margin-top: 4px; }
1054
+ .visual-annotation-quick-send {
1055
+ position: absolute;
1056
+ right: 10px;
1057
+ bottom: 10px;
1058
+ display: inline-flex;
1059
+ align-items: center;
1060
+ justify-content: center;
1061
+ width: 32px;
1062
+ height: 32px;
1063
+ padding: 0;
1064
+ border: 1px solid var(--harmony-border);
1065
+ border-radius: var(--harmony-radius-sm);
1066
+ background: var(--harmony-bg-surface);
1067
+ color: var(--harmony-primary);
1068
+ cursor: pointer;
1069
+ box-shadow: 0 2px 8px rgba(22, 45, 61, 0.1);
1070
+ z-index: 3;
1071
+ line-height: 0;
1072
+ }
1073
+ .visual-annotation-quick-send:hover:not(:disabled) {
1074
+ background: var(--harmony-primary-soft);
1075
+ border-color: var(--harmony-primary);
1076
+ }
1077
+ .visual-annotation-quick-send:disabled {
1078
+ opacity: 0.45;
1079
+ cursor: not-allowed;
1080
+ color: var(--harmony-text-secondary);
1081
+ }
595
1082
  .visual-attach-row { display: flex; flex-wrap: wrap; align-items: center; gap: 6px; }
596
1083
  .visual-attach-btn {
597
1084
  background: var(--harmony-bg-subtle);
@@ -625,7 +1112,7 @@
625
1112
  .visual-submit-error { font-size: 12px; color: var(--harmony-danger); margin: 0; padding: 0 2px; }
626
1113
  .visual-submit-progress { font-size: 12px; color: var(--harmony-primary); margin: 0; padding: 0 2px; }
627
1114
 
628
- .video-record-btn { border-color: var(--harmony-primary) !important; color: var(--harmony-primary) !important; }
1115
+ .video-record-btn { color: var(--harmony-primary) !important; }
629
1116
  .video-record-active { animation: pulse-rec 1.2s ease-in-out infinite; }
630
1117
  @keyframes pulse-rec { 0%,100% { opacity: 1; } 50% { opacity: 0.55; } }
631
1118
 
@@ -641,9 +1128,24 @@
641
1128
  height: 200px;
642
1129
  box-shadow: 0 -2px 12px rgba(22, 45, 61, 0.06);
643
1130
  }
644
- .bottom-panel-collapsed { max-height: 32px; overflow: hidden; }
1131
+ .bottom-panel-collapsed {
1132
+ height: auto !important;
1133
+ max-height: none;
1134
+ overflow: visible;
1135
+ }
1136
+ .bottom-panel-collapsed .bottom-panel-resize,
1137
+ .bottom-panel-collapsed .bottom-panel-body {
1138
+ display: none;
1139
+ }
645
1140
  .bottom-panel-resize { height: 4px; cursor: ns-resize; background: transparent; flex-shrink: 0; }
646
1141
  .bottom-panel-resize:hover, .bottom-panel-resize:active { background: var(--harmony-primary); }
1142
+ .bottom-panel-body {
1143
+ display: flex;
1144
+ flex-direction: column;
1145
+ flex: 1;
1146
+ min-height: 0;
1147
+ overflow: hidden;
1148
+ }
647
1149
  .bottom-panel-header {
648
1150
  display: flex;
649
1151
  align-items: center;
@@ -676,6 +1178,40 @@
676
1178
  .bottom-panel-spacer { flex: 1; }
677
1179
  .bottom-panel-clear { background: none; border: none; color: var(--harmony-text-muted); font-size: 11px; cursor: pointer; padding: 2px 6px; }
678
1180
  .bottom-panel-clear:hover { color: var(--harmony-text); }
1181
+ .bottom-panel-stop {
1182
+ background: var(--harmony-danger-soft, rgba(220, 38, 38, 0.12));
1183
+ border: 1px solid var(--harmony-danger, #dc2626);
1184
+ color: var(--harmony-danger, #dc2626);
1185
+ font-size: 11px;
1186
+ font-weight: 600;
1187
+ cursor: pointer;
1188
+ padding: 2px 8px;
1189
+ border-radius: 4px;
1190
+ margin-right: 6px;
1191
+ }
1192
+ .bottom-panel-stop:hover { background: var(--harmony-danger, #dc2626); color: #fff; }
1193
+ .bottom-panel-stop-hidden {
1194
+ visibility: hidden;
1195
+ pointer-events: none;
1196
+ }
1197
+ .bottom-panel-header-actions {
1198
+ display: flex;
1199
+ align-items: center;
1200
+ gap: 0;
1201
+ flex-shrink: 0;
1202
+ }
1203
+ .agent-stop-confirm-anchor {
1204
+ position: relative;
1205
+ display: flex;
1206
+ align-items: center;
1207
+ }
1208
+ .agent-stop-confirm-float {
1209
+ position: absolute;
1210
+ right: 0;
1211
+ bottom: calc(100% + 8px);
1212
+ z-index: 30;
1213
+ pointer-events: auto;
1214
+ }
679
1215
  .output-panel {
680
1216
  overflow-y: auto;
681
1217
  padding: 8px 16px;
@@ -690,12 +1226,28 @@
690
1226
  }
691
1227
  .chunk { color: var(--harmony-text); }
692
1228
  .chunk-status { color: var(--harmony-text-muted); font-style: italic; }
1229
+ .chunk-stopped-user {
1230
+ color: var(--harmony-warning, #b45309);
1231
+ font-weight: 700;
1232
+ margin-top: 14px;
1233
+ padding-top: 10px;
1234
+ border-top: 1px dashed var(--harmony-border);
1235
+ }
693
1236
  .chunk-tool { color: var(--harmony-primary); }
694
1237
  .chunk-error { color: var(--harmony-danger); }
695
1238
  .chunk-thinking { color: var(--harmony-text-muted); font-style: italic; }
696
1239
  .chunk-result { color: var(--harmony-success); }
697
1240
  .chunk-user { color: var(--harmony-text); }
698
1241
  .chunk-user-prefix { color: var(--harmony-text-muted); }
1242
+ .chunk-divider {
1243
+ color: var(--harmony-text-muted);
1244
+ font-size: 11px;
1245
+ font-style: italic;
1246
+ text-align: center;
1247
+ border-top: 1px solid var(--harmony-border);
1248
+ margin: 12px 0 8px;
1249
+ padding-top: 10px;
1250
+ }
699
1251
  .agent-chat-row {
700
1252
  display: flex;
701
1253
  gap: 8px;
@@ -909,54 +1461,410 @@
909
1461
  overflow: hidden;
910
1462
  border: 1px solid var(--harmony-border);
911
1463
  }
912
- .snapshot-img { max-width: 100%; max-height: 100%; object-fit: contain; display: block; user-select: none; -webkit-user-drag: none; }
913
- .snapshot-img-overlay { position: absolute; inset: 0; z-index: 2; }
914
- .snapshot-img-overlay-none { pointer-events: none; }
915
- .snapshot-annotations-panel { flex: 1; min-width: 220px; max-width: 340px; display: flex; flex-direction: column; gap: 8px; overflow-y: auto; }
916
- .snapshot-annotation-card {
917
- background: var(--harmony-bg-subtle);
918
- border: 1px solid var(--harmony-border);
919
- border-radius: var(--harmony-radius-md);
920
- padding: 10px 12px;
921
- display: flex;
922
- flex-direction: column;
923
- gap: 6px;
1464
+ .snapshot-img { max-width: 100%; max-height: 100%; object-fit: contain; display: block; user-select: none; -webkit-user-drag: none; }
1465
+ .snapshot-img-overlay { position: absolute; inset: 0; z-index: 2; }
1466
+ .snapshot-img-overlay-none { pointer-events: none; }
1467
+ .snapshot-annotations-panel { flex: 1; min-width: 220px; max-width: 340px; display: flex; flex-direction: column; gap: 8px; overflow-y: auto; }
1468
+ .snapshot-annotation-card {
1469
+ position: relative;
1470
+ background: var(--harmony-bg-subtle);
1471
+ border: 1px solid var(--harmony-border);
1472
+ border-radius: var(--harmony-radius-md);
1473
+ padding: 10px 12px 44px;
1474
+ display: flex;
1475
+ flex-direction: column;
1476
+ gap: 6px;
1477
+ }
1478
+ .snapshot-annotation-card-head { display: flex; align-items: center; justify-content: space-between; gap: 8px; }
1479
+ .snapshot-annotation-kind { font-size: 11px; color: var(--harmony-primary); font-weight: 600; }
1480
+ .snapshot-annotation-remove {
1481
+ background: transparent;
1482
+ color: var(--harmony-text-muted);
1483
+ border: 1px solid var(--harmony-border);
1484
+ border-radius: var(--harmony-radius-sm);
1485
+ padding: 4px 8px;
1486
+ font-size: 11px;
1487
+ cursor: pointer;
1488
+ }
1489
+ .snapshot-annotation-remove:hover { color: var(--harmony-danger); border-color: var(--harmony-danger); }
1490
+ .snapshot-empty-hint { color: var(--harmony-text-muted); font-size: 12px; font-style: italic; padding: 8px 0; }
1491
+ .snapshot-discard-confirm { display: flex; align-items: center; gap: 10px; font-size: 13px; color: var(--harmony-danger); }
1492
+ .snapshot-discard-confirm-msg { flex: 1; }
1493
+
1494
+ /* ── Add Page modal (Harmony-style centered dialog) ── */
1495
+ .add-page-overlay {
1496
+ position: fixed;
1497
+ inset: 0;
1498
+ z-index: 300;
1499
+ background: rgba(255, 255, 255, 0.72);
1500
+ backdrop-filter: blur(14px);
1501
+ -webkit-backdrop-filter: blur(14px);
1502
+ display: flex;
1503
+ align-items: center;
1504
+ justify-content: center;
1505
+ padding: 40px 48px;
1506
+ box-sizing: border-box;
1507
+ }
1508
+ .project-settings-overlay {
1509
+ position: fixed;
1510
+ inset: 0;
1511
+ z-index: 350;
1512
+ background: rgba(22, 45, 61, 0.4);
1513
+ display: flex;
1514
+ align-items: center;
1515
+ justify-content: center;
1516
+ padding: 24px;
1517
+ box-sizing: border-box;
1518
+ }
1519
+ .add-menu-picker-overlay {
1520
+ position: fixed;
1521
+ inset: 0;
1522
+ z-index: 360;
1523
+ background: rgba(22, 45, 61, 0.45);
1524
+ display: flex;
1525
+ align-items: center;
1526
+ justify-content: center;
1527
+ padding: 24px;
1528
+ box-sizing: border-box;
1529
+ }
1530
+ .add-menu-picker-dialog {
1531
+ background: var(--harmony-bg-surface);
1532
+ border: 1px solid var(--harmony-border);
1533
+ border-radius: var(--harmony-radius-lg);
1534
+ width: min(480px, 100%);
1535
+ max-height: min(80vh, 640px);
1536
+ display: flex;
1537
+ flex-direction: column;
1538
+ overflow: hidden;
1539
+ box-shadow: var(--harmony-shadow-lg);
1540
+ }
1541
+ .add-menu-picker-dialog--browse {
1542
+ width: min(720px, 100%);
1543
+ max-height: min(85vh, 720px);
1544
+ }
1545
+ .add-menu-picker-header {
1546
+ display: flex;
1547
+ align-items: center;
1548
+ gap: 8px;
1549
+ padding: 14px 16px;
1550
+ border-bottom: 1px solid var(--harmony-border);
1551
+ background: var(--harmony-bg-subtle);
1552
+ }
1553
+ .add-menu-picker-title {
1554
+ flex: 1;
1555
+ font-size: 14px;
1556
+ font-weight: 600;
1557
+ color: var(--harmony-text);
1558
+ }
1559
+ .add-menu-picker-back,
1560
+ .add-menu-picker-close {
1561
+ background: none;
1562
+ border: none;
1563
+ color: var(--harmony-text-muted);
1564
+ font-size: 13px;
1565
+ cursor: pointer;
1566
+ line-height: 1;
1567
+ padding: 4px 6px;
1568
+ }
1569
+ .add-menu-picker-close { font-size: 20px; }
1570
+ .add-menu-picker-back:hover,
1571
+ .add-menu-picker-close:hover { color: var(--harmony-text); }
1572
+ .add-menu-picker-body {
1573
+ padding: 12px 16px 16px;
1574
+ overflow: auto;
1575
+ display: flex;
1576
+ flex-direction: column;
1577
+ gap: 6px;
1578
+ flex: 1;
1579
+ min-height: 0;
1580
+ }
1581
+ .add-menu-picker-hint {
1582
+ font-size: 12px;
1583
+ color: var(--harmony-text-muted);
1584
+ margin: 0;
1585
+ }
1586
+ .add-menu-picker-plugin-btn,
1587
+ .add-menu-picker-component-card {
1588
+ display: flex;
1589
+ flex-direction: column;
1590
+ align-items: flex-start;
1591
+ gap: 2px;
1592
+ width: 100%;
1593
+ text-align: left;
1594
+ padding: 10px 12px;
1595
+ border: 1px solid var(--harmony-border);
1596
+ border-radius: var(--harmony-radius-md);
1597
+ background: var(--harmony-bg-surface);
1598
+ color: var(--harmony-text);
1599
+ font-family: var(--harmony-font);
1600
+ font-size: 13px;
1601
+ cursor: pointer;
1602
+ }
1603
+ .add-menu-picker-plugin-btn:hover,
1604
+ .add-menu-picker-component-card:hover {
1605
+ background: var(--harmony-bg-hover);
1606
+ border-color: var(--harmony-border-strong);
1607
+ }
1608
+ .add-menu-picker-plugin-meta,
1609
+ .add-menu-picker-component-sub {
1610
+ font-size: 11px;
1611
+ color: var(--harmony-text-muted);
1612
+ }
1613
+ .add-menu-picker-browse {
1614
+ flex: 1;
1615
+ min-height: 0;
1616
+ display: flex;
1617
+ flex-direction: column;
1618
+ gap: 10px;
1619
+ }
1620
+ .add-menu-picker-plugin-tabs {
1621
+ display: flex;
1622
+ flex-wrap: wrap;
1623
+ gap: 6px;
1624
+ }
1625
+ .add-menu-picker-plugin-tab {
1626
+ padding: 6px 12px;
1627
+ border: 1px solid var(--harmony-border);
1628
+ border-radius: 999px;
1629
+ background: var(--harmony-bg-surface);
1630
+ color: var(--harmony-text-muted);
1631
+ font-family: var(--harmony-font);
1632
+ font-size: 12px;
1633
+ cursor: pointer;
1634
+ }
1635
+ .add-menu-picker-plugin-tab:hover {
1636
+ background: var(--harmony-bg-hover);
1637
+ color: var(--harmony-text);
1638
+ }
1639
+ .add-menu-picker-plugin-tab--selected {
1640
+ background: var(--harmony-bg-subtle);
1641
+ color: var(--harmony-text);
1642
+ font-weight: 600;
1643
+ border-color: var(--harmony-border-strong);
1644
+ }
1645
+ .add-menu-picker-browse-layout {
1646
+ display: flex;
1647
+ gap: 0;
1648
+ flex: 1;
1649
+ min-height: 0;
1650
+ border: 1px solid var(--harmony-border);
1651
+ border-radius: var(--harmony-radius-md);
1652
+ overflow: hidden;
1653
+ }
1654
+ .add-menu-picker-sidebar {
1655
+ display: flex;
1656
+ flex-direction: column;
1657
+ width: 168px;
1658
+ flex-shrink: 0;
1659
+ border-right: 1px solid var(--harmony-border);
1660
+ background: var(--harmony-bg-subtle);
1661
+ overflow-y: auto;
1662
+ padding: 8px 6px;
1663
+ gap: 2px;
1664
+ }
1665
+ .add-menu-picker-category-btn {
1666
+ display: flex;
1667
+ align-items: center;
1668
+ justify-content: space-between;
1669
+ gap: 8px;
1670
+ width: 100%;
1671
+ text-align: left;
1672
+ padding: 8px 10px;
1673
+ border: none;
1674
+ border-radius: var(--harmony-radius-md);
1675
+ background: transparent;
1676
+ color: var(--harmony-text);
1677
+ font-family: var(--harmony-font);
1678
+ font-size: 13px;
1679
+ cursor: pointer;
1680
+ }
1681
+ .add-menu-picker-category-btn:hover {
1682
+ background: var(--harmony-bg-hover);
1683
+ }
1684
+ .add-menu-picker-category-btn--selected {
1685
+ background: var(--harmony-bg-surface);
1686
+ font-weight: 600;
1687
+ box-shadow: inset 0 0 0 1px var(--harmony-border);
1688
+ }
1689
+ .add-menu-picker-category-count {
1690
+ font-size: 11px;
1691
+ color: var(--harmony-text-muted);
1692
+ }
1693
+ .add-menu-picker-main {
1694
+ flex: 1;
1695
+ min-width: 0;
1696
+ display: flex;
1697
+ flex-direction: column;
1698
+ padding: 14px 16px 16px;
1699
+ overflow: hidden;
1700
+ }
1701
+ .add-menu-picker-main-title {
1702
+ margin: 0 0 12px;
1703
+ font-size: 18px;
1704
+ font-weight: 600;
1705
+ color: var(--harmony-text);
1706
+ }
1707
+ .add-menu-picker-subcategories {
1708
+ display: flex;
1709
+ flex-wrap: nowrap;
1710
+ gap: 8px;
1711
+ overflow-x: auto;
1712
+ flex: 1;
1713
+ min-width: 0;
1714
+ scrollbar-width: none;
1715
+ -webkit-overflow-scrolling: touch;
1716
+ }
1717
+ .add-menu-picker-subcategories::-webkit-scrollbar { display: none; }
1718
+ .add-menu-picker-subcategory-scroll {
1719
+ display: flex;
1720
+ align-items: center;
1721
+ gap: 6px;
1722
+ margin-bottom: 14px;
1723
+ min-width: 0;
1724
+ }
1725
+ .add-menu-picker-subcategory-scroll-btn {
1726
+ flex-shrink: 0;
1727
+ width: 28px;
1728
+ height: 28px;
1729
+ border: 1px solid var(--harmony-border);
1730
+ border-radius: var(--harmony-radius-sm);
1731
+ background: var(--harmony-bg-surface);
1732
+ color: var(--harmony-text-muted);
1733
+ font-size: 16px;
1734
+ line-height: 1;
1735
+ cursor: pointer;
1736
+ padding: 0;
1737
+ }
1738
+ .add-menu-picker-subcategory-scroll-btn:hover {
1739
+ color: var(--harmony-text);
1740
+ background: var(--harmony-bg-hover);
1741
+ }
1742
+ .add-menu-picker-subcategory-btn {
1743
+ display: inline-flex;
1744
+ align-items: center;
1745
+ gap: 6px;
1746
+ flex-shrink: 0;
1747
+ padding: 6px 12px;
1748
+ border: none;
1749
+ border-radius: 999px;
1750
+ background: transparent;
1751
+ color: var(--harmony-text-muted);
1752
+ font-family: var(--harmony-font);
1753
+ font-size: 13px;
1754
+ cursor: pointer;
1755
+ white-space: nowrap;
1756
+ }
1757
+ .add-menu-picker-subcategory-btn:hover {
1758
+ color: var(--harmony-text);
1759
+ background: var(--harmony-bg-hover);
1760
+ }
1761
+ .add-menu-picker-subcategory-btn--selected {
1762
+ background: var(--harmony-bg-subtle);
1763
+ color: var(--harmony-text);
1764
+ font-weight: 600;
1765
+ box-shadow: inset 0 0 0 1px var(--harmony-border);
1766
+ }
1767
+ .add-menu-picker-subcategory-count {
1768
+ font-size: 12px;
1769
+ color: var(--harmony-text-muted);
1770
+ font-weight: 400;
1771
+ }
1772
+ .add-menu-picker-search-row {
1773
+ display: flex;
1774
+ align-items: center;
1775
+ gap: 8px;
1776
+ margin-bottom: 10px;
1777
+ min-width: 0;
1778
+ }
1779
+ .add-menu-picker-search-field {
1780
+ flex: 1;
1781
+ min-width: 0;
1782
+ display: flex;
1783
+ align-items: center;
1784
+ gap: 8px;
1785
+ padding: 8px 12px;
1786
+ border: 1px solid var(--harmony-border);
1787
+ border-radius: 999px;
1788
+ background: var(--harmony-bg-surface);
1789
+ }
1790
+ .add-menu-picker-search-icon {
1791
+ color: var(--harmony-text-muted);
1792
+ font-size: 14px;
1793
+ line-height: 1;
1794
+ flex-shrink: 0;
1795
+ }
1796
+ .add-menu-picker-search-input {
1797
+ flex: 1;
1798
+ min-width: 0;
1799
+ border: none;
1800
+ background: transparent;
1801
+ color: var(--harmony-text);
1802
+ font-family: var(--harmony-font);
1803
+ font-size: 13px;
1804
+ outline: none;
1805
+ }
1806
+ .add-menu-picker-search-input::placeholder {
1807
+ color: var(--harmony-text-muted);
1808
+ }
1809
+ .add-menu-picker-search-clear {
1810
+ flex-shrink: 0;
1811
+ background: none;
1812
+ border: none;
1813
+ color: var(--harmony-text-muted);
1814
+ font-size: 16px;
1815
+ line-height: 1;
1816
+ cursor: pointer;
1817
+ padding: 0 2px;
1818
+ }
1819
+ .add-menu-picker-search-clear:hover { color: var(--harmony-text); }
1820
+ .add-menu-picker-search-summary {
1821
+ margin: 0 0 12px;
1822
+ font-size: 13px;
1823
+ color: var(--harmony-text-muted);
1824
+ }
1825
+ .add-menu-picker-browse-layout--search {
1826
+ border: none;
1827
+ }
1828
+ .add-menu-picker-browse-layout--search .add-menu-picker-main {
1829
+ padding-top: 0;
1830
+ }
1831
+ .add-menu-picker-browse-content {
1832
+ display: grid;
1833
+ grid-template-columns: repeat(auto-fill, minmax(180px, 1fr));
1834
+ gap: 10px;
1835
+ overflow-y: auto;
1836
+ flex: 1;
1837
+ min-height: 0;
1838
+ align-content: start;
1839
+ }
1840
+ .add-menu-picker-browse-row {
1841
+ display: contents;
924
1842
  }
925
- .snapshot-annotation-card-head { display: flex; align-items: center; justify-content: space-between; gap: 8px; }
926
- .snapshot-annotation-kind { font-size: 11px; color: var(--harmony-primary); font-weight: 600; }
927
- .snapshot-annotation-remove {
928
- background: transparent;
1843
+ .add-menu-picker-section-title {
1844
+ margin: 8px 0 4px;
1845
+ font-size: 13px;
1846
+ font-weight: 600;
929
1847
  color: var(--harmony-text-muted);
930
- border: 1px solid var(--harmony-border);
931
- border-radius: var(--harmony-radius-sm);
932
- padding: 4px 8px;
933
- font-size: 11px;
934
- cursor: pointer;
1848
+ text-transform: uppercase;
1849
+ letter-spacing: 0.04em;
1850
+ grid-column: 1 / -1;
935
1851
  }
936
- .snapshot-annotation-remove:hover { color: var(--harmony-danger); border-color: var(--harmony-danger); }
937
- .snapshot-empty-hint { color: var(--harmony-text-muted); font-size: 12px; font-style: italic; padding: 8px 0; }
938
- .snapshot-discard-confirm { display: flex; align-items: center; gap: 10px; font-size: 13px; color: var(--harmony-danger); }
939
- .snapshot-discard-confirm-msg { flex: 1; }
940
-
941
- /* ── Add Page slideover ── */
942
- .add-page-overlay {
943
- position: fixed;
944
- inset: 0;
945
- z-index: 300;
946
- background: rgba(22, 45, 61, 0.35);
947
- display: flex;
948
- justify-content: flex-end;
1852
+ .add-menu-picker-browse-content .add-menu-picker-component-card {
1853
+ width: auto;
949
1854
  }
950
- .project-settings-overlay {
951
- position: fixed;
952
- inset: 0;
953
- z-index: 350;
954
- background: rgba(22, 45, 61, 0.4);
955
- display: flex;
956
- align-items: center;
957
- justify-content: center;
958
- padding: 24px;
959
- box-sizing: border-box;
1855
+ .add-menu-picker-component-card {
1856
+ min-height: 72px;
1857
+ }
1858
+ .add-menu-picker-component-card--browse-only {
1859
+ opacity: 0.6;
1860
+ cursor: default;
1861
+ }
1862
+ .add-menu-picker-component-title {
1863
+ font-weight: 500;
1864
+ overflow: hidden;
1865
+ text-overflow: ellipsis;
1866
+ white-space: nowrap;
1867
+ max-width: 100%;
960
1868
  }
961
1869
  .project-settings-dialog {
962
1870
  background: var(--harmony-bg-surface);
@@ -981,28 +1889,33 @@
981
1889
  .project-settings-close { background: none; border: none; color: var(--harmony-text-muted); font-size: 20px; cursor: pointer; line-height: 1; }
982
1890
  .project-settings-body { padding: 14px 16px; overflow: auto; display: flex; flex-direction: column; gap: 12px; }
983
1891
  .add-page-slideover {
984
- width: min(480px, 100vw);
985
- height: 100%;
1892
+ width: min(920px, 100%);
1893
+ max-height: min(88vh, 860px);
1894
+ height: auto;
986
1895
  background: var(--harmony-bg-surface);
987
- border-left: 1px solid var(--harmony-border);
1896
+ border: 1px solid var(--harmony-border);
1897
+ border-radius: var(--harmony-radius-lg);
988
1898
  display: flex;
989
1899
  flex-direction: column;
990
- box-shadow: var(--harmony-shadow-lg);
1900
+ box-shadow:
1901
+ 0 24px 80px rgba(22, 45, 61, 0.16),
1902
+ 0 8px 24px rgba(22, 45, 61, 0.08);
991
1903
  position: relative;
1904
+ overflow: hidden;
992
1905
  }
993
1906
  .add-page-header {
994
1907
  display: flex;
995
1908
  align-items: center;
996
- gap: 8px;
997
- padding: 14px 16px;
1909
+ gap: 12px;
1910
+ padding: 20px 28px;
998
1911
  border-bottom: 1px solid var(--harmony-border);
999
1912
  flex-shrink: 0;
1000
- background: var(--harmony-bg-subtle);
1913
+ background: var(--harmony-bg-surface);
1001
1914
  }
1002
- .add-page-title { font-size: 14px; font-weight: 600; color: var(--harmony-text); flex: 1; }
1003
- .add-page-close { background: none; border: none; color: var(--harmony-text-muted); font-size: 20px; cursor: pointer; line-height: 1; padding: 0 4px; }
1004
- .add-page-close:hover { color: var(--harmony-text); }
1005
- .add-page-body { flex: 1; overflow: auto; padding: 14px 16px; display: flex; flex-direction: column; gap: 16px; }
1915
+ .add-page-title { font-size: 20px; font-weight: 700; color: var(--harmony-text); flex: 1; letter-spacing: -0.02em; }
1916
+ .add-page-close { background: none; border: none; color: var(--harmony-text-muted); font-size: 22px; cursor: pointer; line-height: 1; padding: 4px; border-radius: var(--harmony-radius-sm); }
1917
+ .add-page-close:hover { color: var(--harmony-text); background: var(--harmony-bg-hover); }
1918
+ .add-page-body { flex: 1; overflow: auto; padding: 24px 28px; display: flex; flex-direction: column; gap: 20px; min-height: 0; }
1006
1919
  .add-page-section-label { font-size: 11px; font-weight: 600; color: var(--harmony-text-muted); text-transform: uppercase; letter-spacing: 0.4px; margin-bottom: 6px; }
1007
1920
  .add-page-section-header-row { display: flex; align-items: center; justify-content: space-between; gap: 8px; margin-bottom: 6px; }
1008
1921
  .add-page-section-header-row .add-page-section-label { margin-bottom: 0; flex: 1; }
@@ -1037,11 +1950,13 @@
1037
1950
  position: absolute;
1038
1951
  inset: 0;
1039
1952
  z-index: 10;
1040
- background: rgba(22, 45, 61, 0.4);
1953
+ background: rgba(255, 255, 255, 0.6);
1954
+ backdrop-filter: blur(8px);
1955
+ -webkit-backdrop-filter: blur(8px);
1041
1956
  display: flex;
1042
1957
  align-items: center;
1043
1958
  justify-content: center;
1044
- padding: 16px;
1959
+ padding: 24px;
1045
1960
  box-sizing: border-box;
1046
1961
  }
1047
1962
  .add-page-brief-fill-panel {
@@ -1190,6 +2105,10 @@
1190
2105
  .add-menu-panel .add-page-plugins-zone-title { flex-shrink: 0; }
1191
2106
  .add-menu-panel .add-menu-panel-attached { flex: 0 1 auto; min-height: 0; max-height: 120px; overflow-y: auto; overflow-x: hidden; -webkit-overflow-scrolling: touch; }
1192
2107
  .add-menu-panel .add-page-plugin-chips { margin-top: 0; }
2108
+ .annotation-add-menu-panel .add-page-plugin-chips,
2109
+ .add-menu-panel .add-page-plugin-chips { align-items: stretch; }
2110
+ .annotation-add-menu-panel .add-page-plugin-chip,
2111
+ .add-menu-panel .add-page-plugin-chip { width: 100%; max-width: 100%; box-sizing: border-box; }
1193
2112
  .add-menu-panel .add-page-btn,
1194
2113
  .add-menu-panel .add-page-manage-link,
1195
2114
  .add-menu-panel .add-page-hint,
@@ -1231,9 +2150,26 @@
1231
2150
  padding: 2px 6px;
1232
2151
  font-size: 10px;
1233
2152
  color: var(--harmony-text-secondary);
1234
- display: flex;
2153
+ display: inline-flex;
1235
2154
  align-items: center;
1236
2155
  gap: 4px;
2156
+ max-width: 100%;
2157
+ min-width: 0;
2158
+ }
2159
+ .add-page-plugin-chip-text {
2160
+ flex: 1 1 auto;
2161
+ min-width: 0;
2162
+ overflow: hidden;
2163
+ text-overflow: ellipsis;
2164
+ white-space: nowrap;
2165
+ }
2166
+ .add-page-plugin-chip-sub {
2167
+ color: var(--harmony-text-muted);
2168
+ margin-left: 4px;
2169
+ }
2170
+ .add-page-plugin-chip-remove,
2171
+ .add-page-plugin-chip-at {
2172
+ flex-shrink: 0;
1237
2173
  }
1238
2174
  .add-page-plugin-chip-remove { background: none; border: none; color: var(--harmony-text-muted); cursor: pointer; padding: 0 2px; }
1239
2175
  .add-page-plugins-warn { font-size: 11px; color: var(--harmony-warning); margin-top: 4px; }
@@ -1330,8 +2266,17 @@
1330
2266
  cursor: pointer;
1331
2267
  align-self: flex-start;
1332
2268
  }
1333
- .add-page-footer { display: flex; gap: 8px; padding: 12px 16px; border-top: 1px solid var(--harmony-border); flex-shrink: 0; background: var(--harmony-bg-subtle); }
1334
- .add-page-btn { flex: 1; padding: 10px; border-radius: var(--harmony-radius-pill); font-size: 13px; font-weight: 600; cursor: pointer; border: 1px solid var(--harmony-border); }
2269
+ .add-page-footer {
2270
+ display: flex;
2271
+ gap: 12px;
2272
+ justify-content: flex-end;
2273
+ padding: 16px 28px 20px;
2274
+ border-top: 1px solid var(--harmony-border);
2275
+ flex-shrink: 0;
2276
+ background: var(--harmony-bg-surface);
2277
+ }
2278
+ .add-page-footer .add-page-btn { flex: 0 0 auto; min-width: 120px; }
2279
+ .add-page-btn { padding: 10px 20px; border-radius: var(--harmony-radius-pill); font-size: 13px; font-weight: 600; cursor: pointer; border: 1px solid var(--harmony-border); }
1335
2280
  .add-page-btn-cancel { background: var(--harmony-bg-surface); color: var(--harmony-text-secondary); }
1336
2281
  .add-page-btn-primary { background: var(--harmony-primary); color: #fff; border-color: var(--harmony-primary); }
1337
2282
  .add-page-btn-primary:disabled { opacity: 0.45; cursor: not-allowed; }
@@ -1354,7 +2299,6 @@
1354
2299
  }
1355
2300
  .reset-btn:hover { color: var(--harmony-text); border-color: var(--harmony-border-strong); }
1356
2301
  .route-picker-stack { display: contents; }
1357
- .arrow-svg defs polygon { fill: #116dff; }
1358
2302
  </style>
1359
2303
  <script type="application/jay-data">
1360
2304
  data:
@@ -1368,11 +2312,13 @@ data:
1368
2312
  hasImage: boolean
1369
2313
  isRunning: boolean
1370
2314
  chunks:
1371
- - text: string
2315
+ - id: string
2316
+ text: string
1372
2317
  cssClass: string
1373
2318
  filePath: string
1374
2319
  toolName: string
1375
2320
  showUserPrefix: boolean
2321
+ isDivider: boolean
1376
2322
  agentChatMessage: string
1377
2323
  showAgentChatInput: boolean
1378
2324
  agentChatInputDisabled: boolean
@@ -1383,16 +2329,85 @@ data:
1383
2329
  pageSelectOptions:
1384
2330
  - url: string
1385
2331
  label: string
1386
- selectedRouteSelectValue: string
1387
2332
  hasPages: boolean
2333
+ showPagesPanel: boolean
2334
+ pageNavBtnClass: string
2335
+ pageNavBtnLabel: string
2336
+ pagesPanelSearchQuery: string
2337
+ filteredPageRouteRows:
2338
+ - url: string
2339
+ label: string
2340
+ isSelected: boolean
2341
+ checkGlyph: string
2342
+ cssClass: string
2343
+ filteredUrlInstanceRows:
2344
+ - path: string
2345
+ isSelected: boolean
2346
+ checkGlyph: string
2347
+ cssClass: string
2348
+ showRoutesPanelUrlInstances: boolean
2349
+ showPagesPanelEmptySearch: boolean
2350
+ showSnapshotNav: boolean
2351
+ showSnapshotPanel: boolean
2352
+ snapshotNavBtnClass: string
2353
+ snapshotNavBtnLabel: string
2354
+ snapshotPanelSearchQuery: string
2355
+ filteredSnapshotRows:
2356
+ - value: string
2357
+ label: string
2358
+ isSelected: boolean
2359
+ checkGlyph: string
2360
+ cssClass: string
2361
+ showSnapshotPanelEmptySearch: boolean
2362
+ showAddMenuPickerModal: boolean
2363
+ showAddMenuPickerLoading: boolean
2364
+ showAddMenuPickerEmpty: boolean
2365
+ showAddMenuPickerBrowse: boolean
2366
+ showAddMenuPickerBrowseLayout: boolean
2367
+ showAddMenuPickerSearchMode: boolean
2368
+ showAddMenuPickerSearchBack: boolean
2369
+ showAddMenuPickerSearchClear: boolean
2370
+ showAddMenuPickerBrowseTitle: boolean
2371
+ showAddMenuPickerSearchSummary: boolean
2372
+ showAddMenuPickerSubCategoryFilters: boolean
2373
+ showAddMenuPickerSubCategoryScrollPrev: boolean
2374
+ showAddMenuPickerSubCategoryScrollNext: boolean
2375
+ showAddMenuPickerComponents: boolean
2376
+ showAddMenuPickerNoComponents: boolean
2377
+ showAddMenuPickerNoSearchResults: boolean
2378
+ addMenuPickerDialogClass: string
2379
+ addMenuPickerHeaderTitle: string
2380
+ addMenuPickerBrowseCategoryTitle: string
2381
+ addMenuPickerSearchSummary: string
2382
+ addMenuPickerSearchQuery: string
2383
+ addMenuPickerBrowseLayoutClass: string
2384
+ addMenuPickerLeftNavRows:
2385
+ - rowKey: string
2386
+ navKey: string
2387
+ label: string
2388
+ itemCount: number
2389
+ isSelected: boolean
2390
+ cssClass: string
2391
+ addMenuPickerSubCategoryFilterRows:
2392
+ - rowKey: string
2393
+ navKey: string
2394
+ label: string
2395
+ itemCount: number
2396
+ showCount: boolean
2397
+ isSelected: boolean
2398
+ cssClass: string
2399
+ addMenuPickerBrowseRows:
2400
+ - rowKey: string
2401
+ isSectionHeader: boolean
2402
+ label: string
2403
+ itemId: string
2404
+ isPickable: boolean
2405
+ showPickable: boolean
2406
+ showBrowseOnly: boolean
1388
2407
  isPreviewMode: boolean
1389
2408
  previewUrlBar: string
1390
2409
  previewLoading: boolean
1391
- paramsLoadingHint: string
1392
2410
  previewError: string
1393
- showPathSelect: boolean
1394
- previewPathOptions:
1395
- - path: string
1396
2411
  selectedPreviewPath: string
1397
2412
  showPreviewIframe: boolean
1398
2413
  previewSrc: string
@@ -1402,6 +2417,8 @@ data:
1402
2417
  bottomPanelClass: string
1403
2418
  bottomPanelToggleGlyph: string
1404
2419
  showBottomPanelRunning: boolean
2420
+ showAgentStopConfirm: boolean
2421
+ agentStopBtnClass: string
1405
2422
  showFilePreview: boolean
1406
2423
  filePreviewPath: string
1407
2424
  filePreviewContent: string
@@ -1409,15 +2426,21 @@ data:
1409
2426
  filePreviewImageSrc: string
1410
2427
  filePreviewLoading: boolean
1411
2428
  showVisualToolbar: boolean
2429
+ showClearMarkersConfirm: boolean
2430
+ clearMarkersConfirmText: string
1412
2431
  visualToolNoneOn: boolean
1413
2432
  visualToolPointOn: boolean
1414
2433
  visualToolAreaOn: boolean
1415
- visualToolArrowOn: boolean
2434
+ visualMarkerToolsDisabled: boolean
2435
+ visualPointMarkerTooltip: string
2436
+ visualAreaMarkerTooltip: string
1416
2437
  visualPointDisplayItems:
1417
2438
  - id: string
1418
2439
  leftPct: number
1419
2440
  topPct: number
1420
2441
  indexLabel: string
2442
+ markerOpen: boolean
2443
+ markerEditMode: boolean
1421
2444
  showVisualPointMarkers: boolean
1422
2445
  visualAreaDisplayItems:
1423
2446
  - id: string
@@ -1426,32 +2449,20 @@ data:
1426
2449
  widthPct: number
1427
2450
  heightPct: number
1428
2451
  indexLabel: string
2452
+ markerOpen: boolean
2453
+ markerEditMode: boolean
1429
2454
  showVisualAreaItems: boolean
1430
2455
  areaDraftLeftPct: number
1431
2456
  areaDraftTopPct: number
1432
2457
  areaDraftWidthPct: number
1433
2458
  areaDraftHeightPct: number
1434
2459
  showAreaDraftRect: boolean
1435
- visualArrowDisplayItems:
1436
- - id: string
1437
- x1Pct: number
1438
- y1Pct: number
1439
- x2Pct: number
1440
- y2Pct: number
1441
- visualArrowPinItems:
1442
- - id: string
1443
- leftPct: number
1444
- topPct: number
1445
- indexLabel: string
1446
- hasVisualArrowLines: boolean
1447
- showArrowPending: boolean
1448
- arrowPendingLeftPct: number
1449
- arrowPendingTopPct: number
1450
2460
  visualAnnotationRows:
1451
2461
  - id: string
1452
2462
  kindLabel: string
1453
2463
  instruction: string
1454
- runDisabled: boolean
2464
+ showPopover: boolean
2465
+ quickSendDisabled: boolean
1455
2466
  leftPct: number
1456
2467
  topPct: number
1457
2468
  popoverFlipX: boolean
@@ -1470,15 +2481,6 @@ data:
1470
2481
  itemId: string
1471
2482
  title: string
1472
2483
  subtitle: string
1473
- addMenuSelectedCategory: string
1474
- showAddMenuItemPicker: boolean
1475
- markerPickerNavRows:
1476
- - rowKey: string
1477
- label: string
1478
- value: string
1479
- kind: enum (category | subCategory | item)
1480
- showMarkerPickerLoading: boolean
1481
- showMarkerPickerCatalogEmpty: boolean
1482
2484
  crAddMenuParamCollisionWarning: string
1483
2485
  crAddMenuRouteParamHint: string
1484
2486
  showCrAddMenuRouteParams: boolean
@@ -1514,9 +2516,11 @@ data:
1514
2516
  visualOverlayPointerNone: boolean
1515
2517
  showVideoRecordUi: boolean
1516
2518
  isVideoRecording: boolean
1517
- videoRecordLabel: string
2519
+ videoRecordTooltip: string
1518
2520
  videoRecordDisabled: boolean
1519
2521
  freezeDisabled: boolean
2522
+ sendToAgentDisabled: boolean
2523
+ sendToAgentTooltip: string
1520
2524
  showVideoReviewModal: boolean
1521
2525
  videoReviewPreparing: boolean
1522
2526
  videoReviewReady: boolean
@@ -1526,7 +2530,6 @@ data:
1526
2530
  videoModalToolNoneOn: boolean
1527
2531
  videoModalToolPointOn: boolean
1528
2532
  videoModalToolAreaOn: boolean
1529
- videoModalToolArrowOn: boolean
1530
2533
  videoPointDisplayItems:
1531
2534
  - id: string
1532
2535
  leftPct: number
@@ -1546,26 +2549,12 @@ data:
1546
2549
  videoAreaDraftWidthPct: number
1547
2550
  videoAreaDraftHeightPct: number
1548
2551
  showVideoAreaDraftRect: boolean
1549
- videoArrowDisplayItems:
1550
- - id: string
1551
- x1Pct: number
1552
- y1Pct: number
1553
- x2Pct: number
1554
- y2Pct: number
1555
- videoArrowPinItems:
1556
- - id: string
1557
- leftPct: number
1558
- topPct: number
1559
- indexLabel: string
1560
- hasVideoArrowLines: boolean
1561
- showVideoArrowPending: boolean
1562
- videoArrowPendingLeftPct: number
1563
- videoArrowPendingTopPct: number
1564
2552
  videoAnnotationRows:
1565
2553
  - id: string
1566
2554
  kindLabel: string
1567
2555
  instruction: string
1568
2556
  runDisabled: boolean
2557
+ quickSendDisabled: boolean
1569
2558
  leftPct: number
1570
2559
  topPct: number
1571
2560
  popoverFlipX: boolean
@@ -1584,15 +2573,6 @@ data:
1584
2573
  itemId: string
1585
2574
  title: string
1586
2575
  subtitle: string
1587
- addMenuSelectedCategory: string
1588
- showAddMenuItemPicker: boolean
1589
- markerPickerNavRows:
1590
- - rowKey: string
1591
- label: string
1592
- value: string
1593
- kind: enum (category | subCategory | item)
1594
- showMarkerPickerLoading: boolean
1595
- showMarkerPickerCatalogEmpty: boolean
1596
2576
  crAddMenuParamCollisionWarning: string
1597
2577
  crAddMenuRouteParamHint: string
1598
2578
  showCrAddMenuRouteParams: boolean
@@ -1621,12 +2601,12 @@ data:
1621
2601
  breakpointDesktopOn: boolean
1622
2602
  breakpointTabletOn: boolean
1623
2603
  breakpointMobileOn: boolean
2604
+ stageWidthPx: number
1624
2605
  showSnapshotModal: boolean
1625
2606
  snapshotImageSrc: string
1626
2607
  snapshotToolNoneOn: boolean
1627
2608
  snapshotToolPointOn: boolean
1628
2609
  snapshotToolAreaOn: boolean
1629
- snapshotToolArrowOn: boolean
1630
2610
  snapshotCanSubmit: boolean
1631
2611
  snapshotShowDiscardConfirm: boolean
1632
2612
  snapshotOverlayPointerNone: boolean
@@ -1635,6 +2615,7 @@ data:
1635
2615
  leftPct: number
1636
2616
  topPct: number
1637
2617
  indexLabel: string
2618
+ markerEditMode: boolean
1638
2619
  showSnapshotPointMarkers: boolean
1639
2620
  snapshotAreaDisplayItems:
1640
2621
  - id: string
@@ -1643,32 +2624,19 @@ data:
1643
2624
  widthPct: number
1644
2625
  heightPct: number
1645
2626
  indexLabel: string
2627
+ markerEditMode: boolean
1646
2628
  showSnapshotAreaItems: boolean
1647
2629
  snapshotAreaDraftLeftPct: number
1648
2630
  snapshotAreaDraftTopPct: number
1649
2631
  snapshotAreaDraftWidthPct: number
1650
2632
  snapshotAreaDraftHeightPct: number
1651
2633
  showSnapshotAreaDraft: boolean
1652
- snapshotArrowDisplayItems:
1653
- - id: string
1654
- x1Pct: number
1655
- y1Pct: number
1656
- x2Pct: number
1657
- y2Pct: number
1658
- snapshotArrowPinItems:
1659
- - id: string
1660
- leftPct: number
1661
- topPct: number
1662
- indexLabel: string
1663
- hasSnapshotArrowLines: boolean
1664
- showSnapshotArrowPending: boolean
1665
- snapshotArrowPendingLeftPct: number
1666
- snapshotArrowPendingTopPct: number
1667
2634
  snapshotAnnotationItems:
1668
2635
  - id: string
1669
2636
  indexLabel: string
1670
2637
  kindLabel: string
1671
2638
  instruction: string
2639
+ quickSendDisabled: boolean
1672
2640
  kind: string
1673
2641
  leftPct: number
1674
2642
  topPct: number
@@ -1688,15 +2656,6 @@ data:
1688
2656
  itemId: string
1689
2657
  title: string
1690
2658
  subtitle: string
1691
- addMenuSelectedCategory: string
1692
- showAddMenuItemPicker: boolean
1693
- markerPickerNavRows:
1694
- - rowKey: string
1695
- label: string
1696
- value: string
1697
- kind: enum (category | subCategory | item)
1698
- showMarkerPickerLoading: boolean
1699
- showMarkerPickerCatalogEmpty: boolean
1700
2659
  crAddMenuParamCollisionWarning: string
1701
2660
  crAddMenuRouteParamHint: string
1702
2661
  showCrAddMenuRouteParams: boolean
@@ -1780,25 +2739,14 @@ data:
1780
2739
  subtitle: string
1781
2740
  annotationId?: string
1782
2741
  showAddMenuEmptyHint: boolean
1783
- showAddMenuPopover: boolean
1784
- addMenuNavRows:
1785
- - rowKey: string
1786
- label: string
1787
- value: string
1788
- kind: enum (category | subCategory | item)
1789
- addMenuSelectedCategory: string
1790
- showMarkerAddMenuPopover: boolean
1791
- markerAddMenuPopoverLeftPct: number
1792
- markerAddMenuPopoverTopPct: number
1793
- markerAddMenuPickerAnnotationId: string
1794
- markerAddMenuNavRows:
2742
+ addMenuParamCollisionWarning: string
2743
+ addMenuRouteParamHint: string
2744
+ showAddMenuRouteParams: boolean
2745
+ addMenuRouteParamRows:
1795
2746
  - rowKey: string
1796
- label: string
1797
- value: string
1798
- kind: enum (category | subCategory | item)
1799
- markerAddMenuSelectedCategory: string
1800
- showMarkerAddMenuPickerLoading: boolean
1801
- showMarkerAddMenuPickerCatalogEmpty: boolean
2747
+ name: string
2748
+ showAddMenuRouteParamConfirm: boolean
2749
+ addMenuPendingRouteParamTitle: string
1802
2750
  crAddMenuParamCollisionWarning: string
1803
2751
  crAddMenuRouteParamHint: string
1804
2752
  showCrAddMenuRouteParams: boolean
@@ -1809,20 +2757,17 @@ data:
1809
2757
  crPendingRouteParamTitle: string
1810
2758
  showCrPlannedRoutePanel: boolean
1811
2759
  crPlannedRoute: string
1812
- addMenuParamCollisionWarning: string
1813
- addMenuRouteParamHint: string
1814
- showAddMenuRouteParams: boolean
1815
- addMenuRouteParamRows:
1816
- - rowKey: string
1817
- name: string
1818
- showAddMenuRouteParamConfirm: boolean
1819
- addMenuPendingRouteParamTitle: string
1820
2760
  showAddPageResultBanner: boolean
1821
2761
  addPageResultBannerClass: string
1822
2762
  addPageResultBannerMessage: string
1823
2763
  showAddPageRetry: boolean
1824
2764
  showAddPageFixWithAiditor: boolean
1825
2765
  showAddPageFromBriefBtn: boolean
2766
+ hasPublishScript: boolean
2767
+ publishDisabled: boolean
2768
+ publishTooltip: string
2769
+ publishBtnLabel: string
2770
+ isPublishing: boolean
1826
2771
  showBriefFillPopover: boolean
1827
2772
  briefFillContextNotes: string
1828
2773
  briefFillPopoverError: string
@@ -1860,36 +2805,151 @@ data:
1860
2805
  <div class="editor-topbar-left harmony-global-left">
1861
2806
  <span class="aiditor-logo"><span class="aiditor-logo-ai">AI</span>ditor</span>
1862
2807
  <div class="harmony-page-select-wrap">
1863
- <span class="harmony-page-label">Page</span>
1864
- <select
1865
- class="aiditor-dropdown harmony-page-select"
1866
- ref="pageRouteSelect"
1867
- value="{selectedRouteSelectValue}"
1868
- aria-label="Page route"
2808
+ <span class="harmony-page-label">Routes</span>
2809
+ <button
2810
+ type="button"
2811
+ class="{pageNavBtnClass}"
2812
+ ref="pageNavBtn"
2813
+ aria-label="Select route"
2814
+ aria-expanded="{showPagesPanel}"
2815
+ aria-haspopup="dialog"
1869
2816
  >
1870
- <option value="" disabled>Select a route…</option>
1871
- <option forEach="pageSelectOptions" trackBy="url" value="{url}">{label}</option>
1872
- </select>
2817
+ <span class="harmony-nav-btn-label">{pageNavBtnLabel}</span>
2818
+ <span class="harmony-nav-btn-chevron" aria-hidden="true">▾</span>
2819
+ </button>
1873
2820
  </div>
1874
- <div class="path-select-row harmony-path-select" if="showPathSelect">
1875
- <select
1876
- class="aiditor-dropdown preview-path-select"
1877
- ref="previewPathSelect"
1878
- value="{selectedPreviewPath}"
1879
- aria-label="URL instance"
2821
+ <div class="harmony-page-select-wrap" if="showSnapshotNav">
2822
+ <span class="harmony-page-label">Snapshots</span>
2823
+ <button
2824
+ type="button"
2825
+ class="{snapshotNavBtnClass}"
2826
+ ref="snapshotNavBtn"
2827
+ aria-label="Select snapshot"
2828
+ aria-expanded="{showSnapshotPanel}"
2829
+ aria-haspopup="dialog"
1880
2830
  >
1881
- <option forEach="previewPathOptions" trackBy="path" value="{path}">{path}</option>
1882
- </select>
1883
- <span class="params-loading-hint" if="paramsLoadingHint">{paramsLoadingHint}</span>
2831
+ <span class="harmony-nav-btn-label">{snapshotNavBtnLabel}</span>
2832
+ <span class="harmony-nav-btn-chevron" aria-hidden="true">▾</span>
2833
+ </button>
1884
2834
  </div>
1885
2835
  </div>
1886
2836
  <div class="editor-topbar-right harmony-global-right">
1887
- <button type="button" class="harmony-btn-secondary project-settings-btn" ref="projectSettingsBtn" disabled="isRunning">Settings</button>
1888
- <button type="button" class="harmony-btn-primary add-page-open-btn" ref="addPageOpenBtn" disabled="isRunning">+ Add Page</button>
1889
2837
  <button type="button" class="harmony-btn-secondary add-page-from-brief-btn" ref="addPageFromBriefBtn" if="showAddPageFromBriefBtn" disabled="isRunning">Page Briefs</button>
2838
+ <button
2839
+ type="button"
2840
+ class="harmony-btn-primary aiditor-publish-btn"
2841
+ ref="publishBtn"
2842
+ disabled="publishDisabled"
2843
+ title="{publishTooltip}"
2844
+ aria-label="{publishTooltip}"
2845
+ >{publishBtnLabel}</button>
1890
2846
  </div>
1891
2847
  </header>
1892
2848
 
2849
+ <div
2850
+ class="harmony-routes-panel-overlay"
2851
+ if="showPagesPanel"
2852
+ ref="pagesPanelOverlay"
2853
+ role="dialog"
2854
+ aria-modal="true"
2855
+ aria-label="Routes"
2856
+ >
2857
+ <div class="harmony-routes-panel" ref="pagesPanelDialog">
2858
+ <div class="harmony-routes-panel-header">
2859
+ <span class="harmony-routes-panel-title">Routes</span>
2860
+ <button type="button" class="harmony-routes-panel-close" ref="pagesPanelCloseBtn" aria-label="Close">×</button>
2861
+ </div>
2862
+ <div class="harmony-routes-panel-search-row">
2863
+ <input
2864
+ type="search"
2865
+ class="harmony-routes-panel-search-input"
2866
+ ref="pagesPanelSearchInput"
2867
+ value="{pagesPanelSearchQuery}"
2868
+ placeholder="Search routes and URL instances…"
2869
+ aria-label="Search routes and URL instances"
2870
+ />
2871
+ </div>
2872
+ <div class="harmony-routes-panel-body">
2873
+ <p class="harmony-routes-panel-empty" if="showPagesPanelEmptySearch">No routes or URL instances match your search.</p>
2874
+ <button
2875
+ type="button"
2876
+ forEach="filteredPageRouteRows"
2877
+ trackBy="url"
2878
+ class="{cssClass}"
2879
+ data-route-url="{url}"
2880
+ data-routes-panel-route=""
2881
+ >
2882
+ <span class="harmony-routes-panel-check">{checkGlyph}</span>
2883
+ <span class="harmony-routes-panel-item-label">{label}</span>
2884
+ </button>
2885
+ <p class="harmony-routes-panel-section-title" if="showRoutesPanelUrlInstances">URL instances</p>
2886
+ <button
2887
+ type="button"
2888
+ forEach="filteredUrlInstanceRows"
2889
+ trackBy="path"
2890
+ class="{cssClass}"
2891
+ data-preview-path="{path}"
2892
+ data-routes-panel-url-instance=""
2893
+ >
2894
+ <span class="harmony-routes-panel-check">{checkGlyph}</span>
2895
+ <span class="harmony-routes-panel-item-label">{path}</span>
2896
+ </button>
2897
+ </div>
2898
+ </div>
2899
+ </div>
2900
+
2901
+ <div
2902
+ class="harmony-routes-panel-overlay"
2903
+ if="showSnapshotPanel"
2904
+ ref="snapshotPanelOverlay"
2905
+ role="dialog"
2906
+ aria-modal="true"
2907
+ aria-label="Snapshots"
2908
+ >
2909
+ <div class="harmony-routes-panel" ref="snapshotPanelDialog">
2910
+ <div class="harmony-routes-panel-header">
2911
+ <span class="harmony-routes-panel-title">Snapshots</span>
2912
+ <button type="button" class="harmony-routes-panel-close" ref="snapshotPanelCloseBtn" aria-label="Close">×</button>
2913
+ </div>
2914
+ <div class="harmony-routes-panel-search-row">
2915
+ <input
2916
+ type="search"
2917
+ class="harmony-routes-panel-search-input"
2918
+ ref="snapshotPanelSearchInput"
2919
+ value="{snapshotPanelSearchQuery}"
2920
+ placeholder="Search snapshots…"
2921
+ aria-label="Search snapshots"
2922
+ />
2923
+ </div>
2924
+ <div class="harmony-routes-panel-body">
2925
+ <p class="harmony-routes-panel-empty" if="showSnapshotPanelEmptySearch">No snapshots match your search.</p>
2926
+ <button
2927
+ type="button"
2928
+ forEach="filteredSnapshotRows"
2929
+ trackBy="value"
2930
+ class="{cssClass}"
2931
+ data-snapshot-value="{value}"
2932
+ data-snapshot-panel-item=""
2933
+ >
2934
+ <span class="harmony-routes-panel-check">{checkGlyph}</span>
2935
+ <span class="harmony-routes-panel-item-label">{label}</span>
2936
+ </button>
2937
+ </div>
2938
+ </div>
2939
+ </div>
2940
+
2941
+ <div class="harmony-editor-body">
2942
+ <div class="harmony-float-rail" aria-label="Editor tools">
2943
+ <button
2944
+ type="button"
2945
+ class="harmony-add-btn harmony-add-page-btn"
2946
+ ref="harmonyAddPageBtn"
2947
+ disabled="isRunning"
2948
+ aria-label="Add Page"
2949
+ >Add Page</button>
2950
+ </div>
2951
+
2952
+ <div class="harmony-workspace">
1893
2953
  <input
1894
2954
  type="file"
1895
2955
  class="file-input-hidden"
@@ -1899,13 +2959,13 @@ data:
1899
2959
 
1900
2960
  <div class="editor-stage">
1901
2961
  <div class="canvas-workspace harmony-canvas-area" if="isPreviewMode">
1902
- <div class="preview-loading" if="previewLoading">{paramsLoadingHint}</div>
2962
+ <div class="preview-loading" if="previewLoading">Loading…</div>
1903
2963
  <div class="preview-error" if="previewError">{previewError}</div>
1904
- <div class="canvas-window harmony-canvas-window" if="showPreviewIframe">
2964
+ <div class="canvas-stage-shell" if="showPreviewIframe" style="width: {stageWidthPx}px;">
2965
+ <div class="stage-resize-handle stage-resize-handle-left" ref="stageResizeLeft" title="Drag to resize stage" aria-label="Resize stage width"></div>
2966
+ <div class="stage-resize-handle stage-resize-handle-right" ref="stageResizeRight" title="Drag to resize stage" aria-label="Resize stage width"></div>
2967
+ <div class="canvas-window harmony-canvas-window">
1905
2968
  <div class="canvas-chrome harmony-canvas-chrome">
1906
- <div class="canvas-chrome-left harmony-canvas-chrome-left">
1907
- <span class="canvas-page-badge harmony-canvas-page-badge">Preview</span>
1908
- </div>
1909
2969
  <div class="url-bar-wrap harmony-url-bar-wrap">
1910
2970
  <div class="url-bar">{previewUrlBar}</div>
1911
2971
  </div>
@@ -1915,54 +2975,42 @@ data:
1915
2975
  <button type="button" class="{breakpointMobileOn ? visual-tool-on} visual-tool-btn" ref="breakpointMobileBtn" title="Mobile (390px)"><svg width="8" height="14" viewBox="0 0 8 14" fill="none"><rect x="0.7" y="0.7" width="6.6" height="12.6" rx="1.1" stroke="currentColor" stroke-width="1.4"/><line x1="2.5" y1="11.5" x2="5.5" y2="11.5" stroke="currentColor" stroke-width="1.4" stroke-linecap="round"/></svg></button>
1916
2976
  </div>
1917
2977
  </div>
1918
- <div class="{breakpointTabletOn ? preview-frame-tablet} {breakpointMobileOn ? preview-frame-mobile} preview-frame-wrap harmony-canvas-content" ref="previewCaptureRoot">
2978
+ <div class="preview-frame-wrap harmony-canvas-content" ref="previewCaptureRoot">
1919
2979
  <iframe class="preview-frame" ref="previewIframe" src="{previewSrc}" title="Page preview"></iframe>
1920
2980
  <div class="{visualOverlayPointerNone ? visual-overlay-none} visual-overlay" ref="visualOverlay">
1921
2981
  <div
1922
- class="point-marker"
2982
+ class="{markerOpen ? point-marker-open} {markerEditMode ? marker-edit-mode} point-marker"
1923
2983
  forEach="visualPointDisplayItems"
1924
2984
  trackBy="id"
2985
+ ref="visualAnnotationMarker"
2986
+ data-visual-annotation-marker="{id}"
1925
2987
  style="left: {leftPct}%; top: {topPct}%;"
1926
2988
  >
1927
2989
  <span class="point-marker-idx">{indexLabel}</span>
1928
2990
  </div>
1929
2991
  <div
1930
- class="area-rect"
2992
+ class="{markerOpen ? area-rect-open} {markerEditMode ? marker-edit-mode} area-rect"
1931
2993
  forEach="visualAreaDisplayItems"
1932
2994
  trackBy="id"
2995
+ ref="visualAnnotationMarker"
2996
+ data-visual-annotation-marker="{id}"
1933
2997
  style="left: {leftPct}%; top: {topPct}%; width: {widthPct}%; height: {heightPct}%;"
1934
- ><span class="area-marker-idx">{indexLabel}</span></div>
2998
+ >
2999
+ <span class="area-marker-idx">{indexLabel}</span>
3000
+ <div if="markerEditMode" class="area-resize-handle area-resize-nw" data-area-resize-handle="nw"></div>
3001
+ <div if="markerEditMode" class="area-resize-handle area-resize-n" data-area-resize-handle="n"></div>
3002
+ <div if="markerEditMode" class="area-resize-handle area-resize-ne" data-area-resize-handle="ne"></div>
3003
+ <div if="markerEditMode" class="area-resize-handle area-resize-e" data-area-resize-handle="e"></div>
3004
+ <div if="markerEditMode" class="area-resize-handle area-resize-se" data-area-resize-handle="se"></div>
3005
+ <div if="markerEditMode" class="area-resize-handle area-resize-s" data-area-resize-handle="s"></div>
3006
+ <div if="markerEditMode" class="area-resize-handle area-resize-sw" data-area-resize-handle="sw"></div>
3007
+ <div if="markerEditMode" class="area-resize-handle area-resize-w" data-area-resize-handle="w"></div>
3008
+ </div>
1935
3009
  <div
1936
3010
  class="area-rect area-rect-draft"
1937
3011
  if="showAreaDraftRect"
1938
3012
  style="left: {areaDraftLeftPct}%; top: {areaDraftTopPct}%; width: {areaDraftWidthPct}%; height: {areaDraftHeightPct}%;"
1939
3013
  ></div>
1940
- <div
1941
- class="arrow-pending-dot"
1942
- if="showArrowPending"
1943
- style="left: {arrowPendingLeftPct}%; top: {arrowPendingTopPct}%;"
1944
- ></div>
1945
- <svg class="arrow-svg" if="hasVisualArrowLines" viewBox="0 0 100 100" preserveAspectRatio="none">
1946
- <defs>
1947
- <marker id="aiditor-arrowhead" markerWidth="8" markerHeight="8" refX="6" refY="4" orient="auto">
1948
- <polygon points="0 0, 8 4, 0 8" fill="#116dff" />
1949
- </marker>
1950
- </defs>
1951
- <line
1952
- forEach="visualArrowDisplayItems"
1953
- trackBy="id"
1954
- x1="{x1Pct}"
1955
- y1="{y1Pct}"
1956
- x2="{x2Pct}"
1957
- y2="{y2Pct}"
1958
- />
1959
- </svg>
1960
- <div
1961
- class="arrow-end-pin"
1962
- forEach="visualArrowPinItems"
1963
- trackBy="id"
1964
- style="left: {leftPct}%; top: {topPct}%;"
1965
- >{indexLabel}</div>
1966
3014
  </div>
1967
3015
  <div class="visual-popovers" if="showVisualAnnotationsPanel">
1968
3016
  <div
@@ -2011,7 +3059,7 @@ data:
2011
3059
  </div>
2012
3060
  </div>
2013
3061
  <div
2014
- class="{popoverFlipX ? visual-popover-flip-x} {popoverFlipY ? visual-popover-flip-y} visual-popover"
3062
+ class="{!showPopover ? visual-popover-hidden} {popoverFlipX ? visual-popover-flip-x} {popoverFlipY ? visual-popover-flip-y} visual-popover"
2015
3063
  forEach="visualAnnotationRows"
2016
3064
  trackBy="id"
2017
3065
  ref="annotationRow"
@@ -2024,10 +3072,10 @@ data:
2024
3072
  <button type="button" class="visual-annotation-remove" title="Remove annotation">Remove</button>
2025
3073
  <button
2026
3074
  type="button"
2027
- class="visual-annotation-run"
2028
- disabled="runDisabled"
2029
- title="Capture preview and send all annotations"
2030
- >Run</button>
3075
+ class="visual-annotation-minimize"
3076
+ title="Minimize comment"
3077
+ aria-label="Minimize comment"
3078
+ ><svg width="14" height="14" viewBox="0 0 14 14" fill="none" aria-hidden="true"><path d="M4 6l3 3 3-3" stroke="currentColor" stroke-width="1.6" stroke-linecap="round" stroke-linejoin="round"/></svg></button>
2031
3079
  </div>
2032
3080
  </div>
2033
3081
  <textarea
@@ -2037,18 +3085,16 @@ data:
2037
3085
  value="{instruction}"
2038
3086
  ></textarea>
2039
3087
  <div class="annotation-add-menu">
2040
- <button type="button" class="annotation-add-menu-toggle">Add Menu (optional)</button>
2041
- <div class="annotation-add-menu-panel add-menu-panel" if="showAddMenuControls">
3088
+ <div class="annotation-add-menu-panel add-menu-panel">
2042
3089
  <div class="add-menu-panel-attached">
2043
3090
  <div if="showMarkerAddMenuChips">
2044
3091
  <div class="add-page-plugins-zone-title">Add Menu on this marker</div>
2045
3092
  <div class="add-page-plugin-chips">
2046
- <span class="add-page-plugin-chip" forEach="markerAddMenuChips" trackBy="rowKey">{title}<span class="add-page-plugin-chip-sub">{subtitle}</span><button type="button" class="add-page-plugin-chip-remove" data-marker-add-menu-remove="1" data-item-id="{itemId}" title="Remove">×</button></span>
3093
+ <span class="add-page-plugin-chip" forEach="markerAddMenuChips" trackBy="rowKey"><span class="add-page-plugin-chip-text" title="{title}">{title}<span class="add-page-plugin-chip-sub">{subtitle}</span></span><button type="button" class="add-page-plugin-chip-remove" data-marker-add-menu-remove="1" data-item-id="{itemId}" title="Remove">×</button><button type="button" class="add-page-plugin-chip-at" data-marker-add-menu-at-title="1" data-title="{title}" title="Insert @Title">@</button></span>
2047
3094
  </div>
2048
3095
  </div>
2049
3096
  <p class="add-page-hint" if="showMarkerAddMenuEmptyHint">No resources attached on this marker — click + Add to pick from the catalog.</p>
2050
3097
  <button type="button" class="add-page-btn add-page-btn-cancel" data-marker-add-menu-open="1">+ Add</button>
2051
- <button type="button" class="add-page-manage-link" data-marker-add-menu-manage="1">Manage plugins…</button>
2052
3098
  <p class="add-page-field-error" if="crAddMenuParamCollisionWarning">{crAddMenuParamCollisionWarning}</p>
2053
3099
  <p class="add-page-hint" if="crAddMenuRouteParamHint">{crAddMenuRouteParamHint}</p>
2054
3100
  <div class="add-menu-route-params" if="showCrAddMenuRouteParams">
@@ -2065,22 +3111,6 @@ data:
2065
3111
  <button type="button" class="add-page-btn add-page-btn-cancel" data-cr-route-param-cancel="1">Cancel</button>
2066
3112
  </div>
2067
3113
  </div>
2068
- <div class="add-menu-popover" if="showAddMenuItemPicker">
2069
- <div class="add-menu-popover-header">
2070
- <span if="!addMenuSelectedCategory">Pick a category</span>
2071
- <span if="addMenuSelectedCategory">Pick an item</span>
2072
- <button type="button" data-marker-add-menu-close="1">×</button>
2073
- </div>
2074
- <p class="add-page-hint" if="showMarkerPickerLoading">Loading catalog…</p>
2075
- <p class="add-page-hint" if="showMarkerPickerCatalogEmpty">Add Menu catalog is empty. Run <code>yarn setup ui-kit --force</code> (and other plugins) in the project, then click + Add again.</p>
2076
- <div class="add-menu-nav">
2077
- <div class="add-menu-nav-row" forEach="markerPickerNavRows" trackBy="rowKey">
2078
- <button type="button" class="add-menu-nav-btn" if="kind===category" data-marker-add-menu-category="1" data-category="{value}">{label}</button>
2079
- <button type="button" class="add-menu-nav-btn" if="kind===subCategory" data-marker-add-menu-subcategory="1" data-subcategory="{value}">{label}</button>
2080
- <button type="button" class="add-menu-item-btn" if="kind===item" data-marker-add-menu-pick="1" data-item-id="{value}">{label}</button>
2081
- </div>
2082
- </div>
2083
- </div>
2084
3114
  </div>
2085
3115
  </div>
2086
3116
  <div class="visual-annotation-files">
@@ -2103,35 +3133,82 @@ data:
2103
3133
  </div>
2104
3134
  </div>
2105
3135
  </div>
3136
+ <button
3137
+ type="button"
3138
+ class="visual-annotation-quick-send"
3139
+ disabled="quickSendDisabled"
3140
+ title="Send comments to agent"
3141
+ aria-label="Send comments to agent"
3142
+ ><svg class="tool-send-icon" width="16" height="16" viewBox="0 0 16 16" fill="none" aria-hidden="true"><path d="M14 2L7 9" stroke="currentColor" stroke-width="1.4" stroke-linecap="round"/><path d="M14 2L9.5 14L7 9L2 6.5L14 2Z" stroke="currentColor" stroke-width="1.4" stroke-linejoin="round"/></svg></button>
2106
3143
  </div>
2107
3144
  </div>
2108
3145
  </div>
2109
- </div>
2110
3146
  <p class="visual-submit-error" if="showVisualSubmitError">{visualSubmitError}</p>
2111
- </div>
3147
+ </div>
3148
+ </div>
2112
3149
 
2113
- <div class="annotate-dock preview-visual-tools" if="isPreviewMode && showVisualToolbar">
2114
- <span class="annotate-dock-label">Annotate</span>
2115
- <button type="button" class="{visualToolNoneOn ? visual-tool-on} visual-tool-btn" ref="visualToolNoneBtn" title="Select">⤢</button>
2116
- <button type="button" class="{visualToolPointOn ? visual-tool-on} visual-tool-btn" ref="visualToolPointBtn" title="Point">⊙</button>
2117
- <button type="button" class="{visualToolAreaOn ? visual-tool-on} visual-tool-btn" ref="visualToolAreaBtn" title="Area">▢</button>
2118
- <button type="button" class="{visualToolArrowOn ? visual-tool-on} visual-tool-btn" ref="visualToolArrowBtn" title="Arrow">↗</button>
3150
+ <div class="annotate-dock-wrap" if="isPreviewMode && showVisualToolbar">
3151
+ <div class="clear-markers-confirm" if="showClearMarkersConfirm" role="alertdialog" aria-live="polite" aria-label="Confirm remove all markers">
3152
+ <span class="clear-markers-confirm-msg">{clearMarkersConfirmText}</span>
3153
+ <button type="button" class="clear-markers-cancel-btn" ref="clearMarkersCancelBtn">Cancel</button>
3154
+ <button type="button" class="clear-markers-confirm-btn" ref="clearMarkersConfirmBtn">Remove all</button>
3155
+ </div>
3156
+ <div class="annotate-dock preview-visual-tools">
3157
+ <button type="button" class="{visualToolNoneOn ? visual-tool-on} visual-tool-btn" ref="visualToolNoneBtn" title="Clear all markers and return to normal preview" aria-label="Clear all markers and return to normal preview"><span class="tool-glyph" aria-hidden="true">☒</span></button>
3158
+ <span class="tool-group-sep"></span>
3159
+ <button
3160
+ type="button"
3161
+ class="{visualToolPointOn ? visual-tool-on} visual-tool-btn"
3162
+ ref="visualToolPointBtn"
3163
+ disabled="visualMarkerToolsDisabled"
3164
+ title="{visualPointMarkerTooltip}"
3165
+ aria-label="{visualPointMarkerTooltip}"
3166
+ ><span class="tool-glyph" aria-hidden="true">⊚</span></button>
3167
+ <button
3168
+ type="button"
3169
+ class="{visualToolAreaOn ? visual-tool-on} visual-tool-btn"
3170
+ ref="visualToolAreaBtn"
3171
+ disabled="visualMarkerToolsDisabled"
3172
+ title="{visualAreaMarkerTooltip}"
3173
+ aria-label="{visualAreaMarkerTooltip}"
3174
+ ><span class="tool-glyph" aria-hidden="true">▢</span></button>
2119
3175
  <span class="tool-group-sep"></span>
2120
3176
  <button
2121
3177
  type="button"
2122
3178
  class="{isVideoRecording ? video-record-active} video-record-btn visual-tool-btn"
2123
3179
  ref="videoRecordBtn"
2124
3180
  disabled="videoRecordDisabled"
2125
- title="Record preview"
2126
- >{videoRecordLabel}</button>
3181
+ title="{videoRecordTooltip}"
3182
+ aria-label="{videoRecordTooltip}"
3183
+ ><span class="tool-rec-label" if="!isVideoRecording" aria-hidden="true">REC</span><span class="tool-rec-label" if="isVideoRecording" aria-hidden="true">⏹</span></button>
2127
3184
  <button
2128
3185
  type="button"
2129
3186
  class="visual-tool-btn freeze-btn"
2130
3187
  ref="freezeBtn"
2131
3188
  disabled="freezeDisabled"
2132
- title="Freeze page state"
2133
- >❄</button>
3189
+ title="Freeze the current page state"
3190
+ aria-label="Freeze the current page state"
3191
+ ><span class="tool-glyph" aria-hidden="true">❄</span></button>
3192
+ <span class="tool-group-sep"></span>
3193
+ <button
3194
+ type="button"
3195
+ class="visual-tool-btn send-to-agent-btn"
3196
+ ref="sendToAgentBtn"
3197
+ disabled="sendToAgentDisabled"
3198
+ title="{sendToAgentTooltip}"
3199
+ aria-label="{sendToAgentTooltip}"
3200
+ ><svg class="tool-send-icon" width="16" height="16" viewBox="0 0 16 16" fill="none" aria-hidden="true"><path d="M14 2L7 9" stroke="currentColor" stroke-width="1.4" stroke-linecap="round"/><path d="M14 2L9.5 14L7 9L2 6.5L14 2Z" stroke="currentColor" stroke-width="1.4" stroke-linejoin="round"/></svg></button>
3201
+ </div>
2134
3202
  </div>
3203
+ </div>
3204
+ <button
3205
+ type="button"
3206
+ class="harmony-stage-icon-btn project-settings-btn"
3207
+ ref="projectSettingsBtn"
3208
+ disabled="isRunning"
3209
+ aria-label="Project settings"
3210
+ title="Project settings"
3211
+ >⚙</button>
2135
3212
  </div>
2136
3213
  <div class="add-page-result-slot" ref="addPageResultBannerSlot">
2137
3214
  <div class="{addPageResultBannerClass} add-page-result-banner" if="showAddPageResultBanner">
@@ -2145,19 +3222,86 @@ data:
2145
3222
  <div class="{bottomPanelClass}">
2146
3223
  <div class="bottom-panel-resize" ref="bottomPanelResize"></div>
2147
3224
  <div class="bottom-panel-header" ref="bottomPanelHeader">
2148
- <span class="bottom-panel-title">AI Assistant</span>
3225
+ <span class="bottom-panel-title">AI Agent</span>
2149
3226
  <span class="bottom-panel-running" if="showBottomPanelRunning"></span>
2150
3227
  <span class="bottom-panel-spacer"></span>
2151
- <button type="button" class="bottom-panel-clear" ref="bottomPanelClearBtn">Clear</button>
2152
- <button type="button" class="bottom-panel-toggle" ref="bottomPanelToggleBtn">{bottomPanelToggleGlyph}</button>
3228
+ <div class="bottom-panel-header-actions">
3229
+ <div class="agent-stop-confirm-anchor">
3230
+ <div class="clear-markers-confirm agent-stop-confirm-float" if="showAgentStopConfirm" ref="agentStopConfirmDialog" role="alertdialog" aria-live="polite" aria-label="Confirm stop agent">
3231
+ <span class="clear-markers-confirm-msg">Stop the agent? Work in progress will be cancelled.</span>
3232
+ <button type="button" class="clear-markers-cancel-btn" ref="agentStopCancelBtn">Cancel</button>
3233
+ <button type="button" class="clear-markers-confirm-btn" ref="agentStopConfirmBtn">Stop</button>
3234
+ </div>
3235
+ <button type="button" class="{agentStopBtnClass}" ref="agentStopBtn" if="showBottomPanelRunning">Stop</button>
3236
+ </div>
3237
+ <button type="button" class="bottom-panel-clear" ref="bottomPanelClearBtn">Clear</button>
3238
+ <button type="button" class="bottom-panel-toggle" ref="bottomPanelToggleBtn">{bottomPanelToggleGlyph}</button>
3239
+ </div>
2153
3240
  </div>
3241
+ <div class="bottom-panel-body">
2154
3242
  <div class="output-panel" ref="outputScroll">
2155
- <div class="{cssClass}" forEach="chunks" trackBy="text"><span if="showUserPrefix" class="chunk-user-prefix">You: </span><span if="filePath" class="chunk-tool-prefix">&gt; {toolName} </span><a if="filePath" class="file-link" href="#" data-path="{filePath}">{filePath}</a><span if="!filePath">{text}</span></div>
3243
+ <div forEach="chunks" trackBy="id">
3244
+ <div if="isDivider" class="chunk chunk-divider">{text}</div>
3245
+ <div if="!isDivider" class="{cssClass}"><span if="showUserPrefix" class="chunk-user-prefix">You: </span><span if="filePath" class="chunk-tool-prefix">&gt; {toolName} </span><a if="filePath" class="file-link" href="#" data-path="{filePath}">{filePath}</a><span if="!filePath">{text}</span></div>
3246
+ </div>
2156
3247
  </div>
2157
3248
  <div class="agent-chat-row" if="showAgentChatInput">
2158
3249
  <textarea class="agent-chat-input" ref="agentChatInput" rows="1" value="{agentChatMessage}" placeholder="{agentChatPlaceholder}" disabled="agentChatInputDisabled" aria-label="Message to agent"></textarea>
2159
3250
  <button type="button" class="agent-chat-send" ref="agentChatSendBtn" disabled="agentChatSendDisabled" aria-label="Send message">Send</button>
2160
3251
  </div>
3252
+ </div>
3253
+ </div>
3254
+ </div>
3255
+ </div>
3256
+
3257
+ <div class="add-menu-picker-overlay" if="showAddMenuPickerModal" ref="addMenuPickerOverlay" role="dialog" aria-modal="true" aria-label="Add elements">
3258
+ <div class="{addMenuPickerDialogClass}" ref="addMenuPickerDialog">
3259
+ <div class="add-menu-picker-header">
3260
+ <span class="add-menu-picker-title">{addMenuPickerHeaderTitle}</span>
3261
+ <button type="button" class="add-menu-picker-close" ref="addMenuPickerCloseBtn" aria-label="Close">×</button>
3262
+ </div>
3263
+ <div class="add-menu-picker-body">
3264
+ <p class="add-menu-picker-hint" if="showAddMenuPickerLoading">Loading plugin catalog…</p>
3265
+ <p class="add-menu-picker-hint" if="showAddMenuPickerEmpty">No Add Menu items yet. Install plugins in Project settings, then try again.</p>
3266
+ <div class="add-menu-picker-browse" if="showAddMenuPickerBrowse">
3267
+ <div class="add-menu-picker-search-row">
3268
+ <button type="button" class="add-menu-picker-back" if="showAddMenuPickerSearchBack" data-add-menu-picker-search-back="1" aria-label="Back to browse">‹</button>
3269
+ <div class="add-menu-picker-search-field">
3270
+ <span class="add-menu-picker-search-icon" aria-hidden="true">⌕</span>
3271
+ <input type="search" class="add-menu-picker-search-input" ref="addMenuPickerSearchInput" placeholder="Search elements…" value="{addMenuPickerSearchQuery}" />
3272
+ <button type="button" class="add-menu-picker-search-clear" if="showAddMenuPickerSearchClear" data-add-menu-picker-search-clear="1" aria-label="Clear search">×</button>
3273
+ </div>
3274
+ </div>
3275
+ <div class="{addMenuPickerBrowseLayoutClass}">
3276
+ <nav class="add-menu-picker-sidebar" if="showAddMenuPickerBrowseLayout" aria-label="Categories">
3277
+ <button type="button" class="{cssClass}" forEach="addMenuPickerLeftNavRows" trackBy="rowKey" data-add-menu-picker-left-nav="1" data-nav-key="{navKey}">
3278
+ <span class="add-menu-picker-category-label">{label}</span>
3279
+ <span class="add-menu-picker-category-count">{itemCount}</span>
3280
+ </button>
3281
+ </nav>
3282
+ <div class="add-menu-picker-main">
3283
+ <h2 class="add-menu-picker-main-title" if="showAddMenuPickerBrowseTitle">{addMenuPickerBrowseCategoryTitle}</h2>
3284
+ <p class="add-menu-picker-search-summary" if="showAddMenuPickerSearchSummary">{addMenuPickerSearchSummary}</p>
3285
+ <div class="add-menu-picker-subcategory-scroll" if="showAddMenuPickerSubCategoryFilters">
3286
+ <button type="button" class="add-menu-picker-subcategory-scroll-btn" if="showAddMenuPickerSubCategoryScrollPrev" data-add-menu-picker-subcategory-scroll="1" data-direction="prev" aria-label="Scroll filters left">‹</button>
3287
+ <div class="add-menu-picker-subcategories" ref="addMenuPickerSubCategoryFilters">
3288
+ <button type="button" class="{cssClass}" forEach="addMenuPickerSubCategoryFilterRows" trackBy="rowKey" data-add-menu-picker-subcategory-filter="1" data-nav-key="{navKey}"><span>{label}</span><span class="add-menu-picker-subcategory-count" if="showCount">{itemCount}</span></button>
3289
+ </div>
3290
+ <button type="button" class="add-menu-picker-subcategory-scroll-btn" if="showAddMenuPickerSubCategoryScrollNext" data-add-menu-picker-subcategory-scroll="1" data-direction="next" aria-label="Scroll filters right">›</button>
3291
+ </div>
3292
+ <div class="add-menu-picker-browse-content" if="showAddMenuPickerComponents">
3293
+ <div class="add-menu-picker-browse-row" forEach="addMenuPickerBrowseRows" trackBy="rowKey">
3294
+ <h3 class="add-menu-picker-section-title" if="isSectionHeader">{label}</h3>
3295
+ <button type="button" class="add-menu-picker-component-card" if="showPickable" data-add-menu-picker-item="1" data-item-id="{itemId}" title="{label}"><span class="add-menu-picker-component-title">{label}</span></button>
3296
+ <div class="add-menu-picker-component-card add-menu-picker-component-card--browse-only" if="showBrowseOnly"><span class="add-menu-picker-component-title" title="{label}">{label}</span></div>
3297
+ </div>
3298
+ </div>
3299
+ <p class="add-menu-picker-hint" if="showAddMenuPickerNoComponents">No components in this group.</p>
3300
+ <p class="add-menu-picker-hint" if="showAddMenuPickerNoSearchResults">No elements match your search.</p>
3301
+ </div>
3302
+ </div>
3303
+ </div>
3304
+ </div>
2161
3305
  </div>
2162
3306
  </div>
2163
3307
 
@@ -2250,28 +3394,13 @@ data:
2250
3394
  <div class="add-menu-panel-attached">
2251
3395
  <div if="showAddMenuChips" class="add-page-plugin-chips">
2252
3396
  <span class="add-page-plugin-chip" forEach="addMenuChipRows" trackBy="rowKey">
2253
- {title}<span class="add-page-plugin-chip-sub">{subtitle}</span>
3397
+ <span class="add-page-plugin-chip-text" title="{title}">{title}<span class="add-page-plugin-chip-sub">{subtitle}</span></span>
2254
3398
  <button type="button" class="add-page-plugin-chip-remove" data-add-menu-remove-chip="1" data-item-id="{itemId}" title="Remove">×</button>
2255
3399
  <button type="button" class="add-page-plugin-chip-at" data-add-menu-at-title="1" data-title="{title}" title="Insert @Title">@</button>
2256
3400
  </span>
2257
3401
  </div>
2258
3402
  <p class="add-page-hint" if="showAddMenuEmptyHint">Install plugins in Project settings to unlock Add Menu items.</p>
2259
3403
  <button type="button" class="add-page-btn add-page-btn-cancel" data-add-menu-open="1">+ Add</button>
2260
- <button type="button" class="add-page-manage-link" data-add-menu-manage-plugins="1">Manage plugins…</button>
2261
- </div>
2262
- <div class="add-menu-popover" if="showAddMenuPopover">
2263
- <div class="add-menu-popover-header">
2264
- <span if="!addMenuSelectedCategory">Pick a category</span>
2265
- <span if="addMenuSelectedCategory">Pick an item</span>
2266
- <button type="button" data-add-menu-close="1">×</button>
2267
- </div>
2268
- <div class="add-menu-nav">
2269
- <div class="add-menu-nav-row" forEach="addMenuNavRows" trackBy="rowKey">
2270
- <button type="button" class="add-menu-nav-btn" if="kind===category" data-add-menu-category="1" data-category="{value}">{label}</button>
2271
- <button type="button" class="add-menu-nav-btn" if="kind===subCategory" data-add-menu-subcategory="1" data-subcategory="{value}">{label}</button>
2272
- <button type="button" class="add-menu-item-btn" if="kind===item" data-add-menu-pick="1" data-item-id="{value}">{label}</button>
2273
- </div>
2274
- </div>
2275
3404
  </div>
2276
3405
  <div class="add-menu-route-confirm" if="showAddMenuRouteParamConfirm">
2277
3406
  <p><strong>This component needs a dynamic page route</strong></p>
@@ -2342,23 +3471,6 @@ data:
2342
3471
  </div>
2343
3472
  </div>
2344
3473
  </div>
2345
- <div class="{bottomPanelClass}">
2346
- <div class="bottom-panel-resize" ref="bottomPanelResize"></div>
2347
- <div class="bottom-panel-header" ref="bottomPanelHeader">
2348
- <span class="bottom-panel-title">AI Assistant</span>
2349
- <span class="bottom-panel-running" if="showBottomPanelRunning"></span>
2350
- <span class="bottom-panel-spacer"></span>
2351
- <button type="button" class="bottom-panel-clear" ref="bottomPanelClearBtn">Clear</button>
2352
- <button type="button" class="bottom-panel-toggle" ref="bottomPanelToggleBtn">{bottomPanelToggleGlyph}</button>
2353
- </div>
2354
- <div class="output-panel" ref="outputScroll">
2355
- <div class="{cssClass}" forEach="chunks" trackBy="text"><span if="showUserPrefix" class="chunk-user-prefix">You: </span><span if="filePath" class="chunk-tool-prefix">&gt; {toolName} </span><a if="filePath" class="file-link" href="#" data-path="{filePath}">{filePath}</a><span if="!filePath">{text}</span></div>
2356
- </div>
2357
- <div class="agent-chat-row" if="showAgentChatInput">
2358
- <textarea class="agent-chat-input" ref="agentChatInput" rows="1" value="{agentChatMessage}" placeholder="{agentChatPlaceholder}" disabled="agentChatInputDisabled" aria-label="Message to agent"></textarea>
2359
- <button type="button" class="agent-chat-send" ref="agentChatSendBtn" disabled="agentChatSendDisabled" aria-label="Send message">Send</button>
2360
- </div>
2361
- </div>
2362
3474
  </div>
2363
3475
 
2364
3476
  <div class="file-preview-overlay" if="showFilePreview" ref="filePreviewBackdrop">
@@ -2389,10 +3501,10 @@ data:
2389
3501
  <!-- Must mount while preparing: refs.videoReviewPlayer must exist before videoReviewReady flips true. -->
2390
3502
  <div if="videoReviewPreparing || videoReviewReady">
2391
3503
  <div class="video-review-tools">
2392
- <button type="button" class="{videoModalToolNoneOn ? visual-tool-on} visual-tool-btn" ref="videoModalToolNoneBtn" title="Select">⤢</button>
2393
- <button type="button" class="{videoModalToolPointOn ? visual-tool-on} visual-tool-btn" ref="videoModalToolPointBtn" title="Point">⊙</button>
2394
- <button type="button" class="{videoModalToolAreaOn ? visual-tool-on} visual-tool-btn" ref="videoModalToolAreaBtn" title="Area">▢</button>
2395
- <button type="button" class="{videoModalToolArrowOn ? visual-tool-on} visual-tool-btn" ref="videoModalToolArrowBtn" title="Arrow">↗</button>
3504
+ <button type="button" class="{videoModalToolNoneOn ? visual-tool-on} visual-tool-btn" ref="videoModalToolNoneBtn" title="Select and pan the video" aria-label="Select and pan the video"><span class="tool-glyph" aria-hidden="true">☒</span></button>
3505
+ <span class="tool-group-sep"></span>
3506
+ <button type="button" class="{videoModalToolPointOn ? visual-tool-on} visual-tool-btn" ref="videoModalToolPointBtn" title="Add a point marker" aria-label="Add a point marker"><span class="tool-glyph" aria-hidden="true">⊚</span></button>
3507
+ <button type="button" class="{videoModalToolAreaOn ? visual-tool-on} visual-tool-btn" ref="videoModalToolAreaBtn" title="Add an area marker" aria-label="Add an area marker"><span class="tool-glyph" aria-hidden="true">▢</span></button>
2396
3508
  </div>
2397
3509
  <input type="file" class="file-input-hidden" ref="videoReviewAttachFileInput" multiple />
2398
3510
  <div class="preview-frame-wrap video-review-capture-root" ref="videoReviewCaptureRoot">
@@ -2424,32 +3536,6 @@ data:
2424
3536
  if="showVideoAreaDraftRect"
2425
3537
  style="left: {videoAreaDraftLeftPct}%; top: {videoAreaDraftTopPct}%; width: {videoAreaDraftWidthPct}%; height: {videoAreaDraftHeightPct}%;"
2426
3538
  ></div>
2427
- <div
2428
- class="arrow-pending-dot"
2429
- if="showVideoArrowPending"
2430
- style="left: {videoArrowPendingLeftPct}%; top: {videoArrowPendingTopPct}%;"
2431
- ></div>
2432
- <svg class="arrow-svg" if="hasVideoArrowLines" viewBox="0 0 100 100" preserveAspectRatio="none">
2433
- <defs>
2434
- <marker id="aiditor-video-arrowhead" markerWidth="8" markerHeight="8" refX="6" refY="4" orient="auto">
2435
- <polygon points="0 0, 8 4, 0 8" fill="#116dff" />
2436
- </marker>
2437
- </defs>
2438
- <line
2439
- forEach="videoArrowDisplayItems"
2440
- trackBy="id"
2441
- x1="{x1Pct}"
2442
- y1="{y1Pct}"
2443
- x2="{x2Pct}"
2444
- y2="{y2Pct}"
2445
- />
2446
- </svg>
2447
- <div
2448
- class="arrow-end-pin"
2449
- forEach="videoArrowPinItems"
2450
- trackBy="id"
2451
- style="left: {leftPct}%; top: {topPct}%;"
2452
- >{indexLabel}</div>
2453
3539
  </div>
2454
3540
  <div class="visual-popovers" if="showVideoAnnotationPopoversAtPlayhead">
2455
3541
  <div
@@ -2473,18 +3559,16 @@ data:
2473
3559
  value="{instruction}"
2474
3560
  ></textarea>
2475
3561
  <div class="annotation-add-menu">
2476
- <button type="button" class="annotation-add-menu-toggle">Add Menu (optional)</button>
2477
- <div class="annotation-add-menu-panel add-menu-panel" if="showAddMenuControls">
3562
+ <div class="annotation-add-menu-panel add-menu-panel">
2478
3563
  <div class="add-menu-panel-attached">
2479
3564
  <div if="showMarkerAddMenuChips">
2480
3565
  <div class="add-page-plugins-zone-title">Add Menu on this marker</div>
2481
3566
  <div class="add-page-plugin-chips">
2482
- <span class="add-page-plugin-chip" forEach="markerAddMenuChips" trackBy="rowKey">{title}<span class="add-page-plugin-chip-sub">{subtitle}</span><button type="button" class="add-page-plugin-chip-remove" data-marker-add-menu-remove="1" data-item-id="{itemId}" title="Remove">×</button></span>
3567
+ <span class="add-page-plugin-chip" forEach="markerAddMenuChips" trackBy="rowKey"><span class="add-page-plugin-chip-text" title="{title}">{title}<span class="add-page-plugin-chip-sub">{subtitle}</span></span><button type="button" class="add-page-plugin-chip-remove" data-marker-add-menu-remove="1" data-item-id="{itemId}" title="Remove">×</button><button type="button" class="add-page-plugin-chip-at" data-marker-add-menu-at-title="1" data-title="{title}" title="Insert @Title">@</button></span>
2483
3568
  </div>
2484
3569
  </div>
2485
3570
  <p class="add-page-hint" if="showMarkerAddMenuEmptyHint">No resources attached on this marker — click + Add to pick from the catalog.</p>
2486
3571
  <button type="button" class="add-page-btn add-page-btn-cancel" data-marker-add-menu-open="1">+ Add</button>
2487
- <button type="button" class="add-page-manage-link" data-marker-add-menu-manage="1">Manage plugins…</button>
2488
3572
  <p class="add-page-field-error" if="crAddMenuParamCollisionWarning">{crAddMenuParamCollisionWarning}</p>
2489
3573
  <p class="add-page-hint" if="crAddMenuRouteParamHint">{crAddMenuRouteParamHint}</p>
2490
3574
  <div class="add-menu-route-params" if="showCrAddMenuRouteParams">
@@ -2501,22 +3585,6 @@ data:
2501
3585
  <button type="button" class="add-page-btn add-page-btn-cancel" data-cr-route-param-cancel="1">Cancel</button>
2502
3586
  </div>
2503
3587
  </div>
2504
- <div class="add-menu-popover" if="showAddMenuItemPicker">
2505
- <div class="add-menu-popover-header">
2506
- <span if="!addMenuSelectedCategory">Pick a category</span>
2507
- <span if="addMenuSelectedCategory">Pick an item</span>
2508
- <button type="button" data-marker-add-menu-close="1">×</button>
2509
- </div>
2510
- <p class="add-page-hint" if="showMarkerPickerLoading">Loading catalog…</p>
2511
- <p class="add-page-hint" if="showMarkerPickerCatalogEmpty">Add Menu catalog is empty. Run <code>yarn setup ui-kit --force</code> (and other plugins) in the project, then click + Add again.</p>
2512
- <div class="add-menu-nav">
2513
- <div class="add-menu-nav-row" forEach="markerPickerNavRows" trackBy="rowKey">
2514
- <button type="button" class="add-menu-nav-btn" if="kind===category" data-marker-add-menu-category="1" data-category="{value}">{label}</button>
2515
- <button type="button" class="add-menu-nav-btn" if="kind===subCategory" data-marker-add-menu-subcategory="1" data-subcategory="{value}">{label}</button>
2516
- <button type="button" class="add-menu-item-btn" if="kind===item" data-marker-add-menu-pick="1" data-item-id="{value}">{label}</button>
2517
- </div>
2518
- </div>
2519
- </div>
2520
3588
  </div>
2521
3589
  </div>
2522
3590
  <div class="visual-annotation-files">
@@ -2539,6 +3607,13 @@ data:
2539
3607
  </div>
2540
3608
  </div>
2541
3609
  </div>
3610
+ <button
3611
+ type="button"
3612
+ class="visual-annotation-quick-send"
3613
+ disabled="quickSendDisabled"
3614
+ title="Send comments to agent"
3615
+ aria-label="Send comments to agent"
3616
+ ><svg class="tool-send-icon" width="16" height="16" viewBox="0 0 16 16" fill="none" aria-hidden="true"><path d="M14 2L7 9" stroke="currentColor" stroke-width="1.4" stroke-linecap="round"/><path d="M14 2L9.5 14L7 9L2 6.5L14 2Z" stroke="currentColor" stroke-width="1.4" stroke-linejoin="round"/></svg></button>
2542
3617
  </div>
2543
3618
  </div>
2544
3619
  </div>
@@ -2576,13 +3651,13 @@ data:
2576
3651
  <button type="button" class="snapshot-close" ref="snapshotCloseBtn" aria-label="Close">✕</button>
2577
3652
  </div>
2578
3653
  <div class="snapshot-tools">
2579
- <button type="button" class="{snapshotToolPointOn ? visual-tool-on} visual-tool-btn" ref="snapshotToolPointBtn" title="Point" aria-label="Point tool">⊙</button>
2580
- <button type="button" class="{snapshotToolAreaOn ? visual-tool-on} visual-tool-btn" ref="snapshotToolAreaBtn" title="Area" aria-label="Area tool">▢</button>
2581
- <button type="button" class="{snapshotToolArrowOn ? visual-tool-on} visual-tool-btn" ref="snapshotToolArrowBtn" title="Arrow" aria-label="Arrow tool">↗</button>
2582
- <button type="button" class="{snapshotToolNoneOn ? visual-tool-on} visual-tool-btn" ref="snapshotToolNoneBtn" title="Select" aria-label="Select tool">⤢</button>
3654
+ <button type="button" class="{snapshotToolNoneOn ? visual-tool-on} visual-tool-btn" ref="snapshotToolNoneBtn" title="Select and pan the snapshot" aria-label="Select and pan the snapshot"><span class="tool-glyph" aria-hidden="true">☒</span></button>
2583
3655
  <span class="tool-group-sep"></span>
2584
- <button type="button" class="visual-tool-btn" ref="snapshotUndoBtn" title="Undo last marker" aria-label="Undo">↩</button>
2585
- <button type="button" class="visual-tool-btn" ref="snapshotClearBtn" title="Clear all markers" aria-label="Clear all">✕ Clear</button>
3656
+ <button type="button" class="{snapshotToolPointOn ? visual-tool-on} visual-tool-btn" ref="snapshotToolPointBtn" title="Add a point marker" aria-label="Add a point marker"><span class="tool-glyph" aria-hidden="true">⊚</span></button>
3657
+ <button type="button" class="{snapshotToolAreaOn ? visual-tool-on} visual-tool-btn" ref="snapshotToolAreaBtn" title="Add an area marker" aria-label="Add an area marker"><span class="tool-glyph" aria-hidden="true">▢</span></button>
3658
+ <span class="tool-group-sep"></span>
3659
+ <button type="button" class="visual-tool-btn" ref="snapshotUndoBtn" title="Undo last marker" aria-label="Undo last marker"><span class="tool-glyph" aria-hidden="true">↩</span></button>
3660
+ <button type="button" class="visual-tool-btn" ref="snapshotClearBtn" title="Clear all markers" aria-label="Clear all markers"><span class="tool-glyph" aria-hidden="true">✕</span></button>
2586
3661
  </div>
2587
3662
  <input type="file" class="file-input-hidden" ref="snapshotAttachFileInput" multiple />
2588
3663
  <div class="snapshot-body">
@@ -2590,50 +3665,38 @@ data:
2590
3665
  <img class="snapshot-img" ref="snapshotImg" src="{snapshotImageSrc}" alt="Captured snapshot" draggable="false" />
2591
3666
  <div class="{snapshotOverlayPointerNone ? snapshot-img-overlay-none} snapshot-img-overlay" ref="snapshotOverlay">
2592
3667
  <div
2593
- class="point-marker"
3668
+ class="{markerEditMode ? marker-edit-mode} point-marker"
2594
3669
  forEach="snapshotPointDisplayItems"
2595
3670
  trackBy="id"
3671
+ data-snapshot-annotation-marker="{id}"
3672
+ data-snapshot-annotation-kind="point"
2596
3673
  style="left: {leftPct}%; top: {topPct}%;"
2597
3674
  >
2598
3675
  <span class="point-marker-idx">{indexLabel}</span>
2599
3676
  </div>
2600
3677
  <div
2601
- class="area-rect"
3678
+ class="{markerEditMode ? marker-edit-mode} area-rect"
2602
3679
  forEach="snapshotAreaDisplayItems"
2603
3680
  trackBy="id"
3681
+ data-snapshot-annotation-marker="{id}"
3682
+ data-snapshot-annotation-kind="area"
2604
3683
  style="left: {leftPct}%; top: {topPct}%; width: {widthPct}%; height: {heightPct}%;"
2605
- ><span class="area-marker-idx">{indexLabel}</span></div>
3684
+ >
3685
+ <span class="area-marker-idx">{indexLabel}</span>
3686
+ <div if="markerEditMode" class="area-resize-handle area-resize-nw" data-area-resize-handle="nw"></div>
3687
+ <div if="markerEditMode" class="area-resize-handle area-resize-n" data-area-resize-handle="n"></div>
3688
+ <div if="markerEditMode" class="area-resize-handle area-resize-ne" data-area-resize-handle="ne"></div>
3689
+ <div if="markerEditMode" class="area-resize-handle area-resize-e" data-area-resize-handle="e"></div>
3690
+ <div if="markerEditMode" class="area-resize-handle area-resize-se" data-area-resize-handle="se"></div>
3691
+ <div if="markerEditMode" class="area-resize-handle area-resize-s" data-area-resize-handle="s"></div>
3692
+ <div if="markerEditMode" class="area-resize-handle area-resize-sw" data-area-resize-handle="sw"></div>
3693
+ <div if="markerEditMode" class="area-resize-handle area-resize-w" data-area-resize-handle="w"></div>
3694
+ </div>
2606
3695
  <div
2607
3696
  class="area-rect area-rect-draft"
2608
3697
  if="showSnapshotAreaDraft"
2609
3698
  style="left: {snapshotAreaDraftLeftPct}%; top: {snapshotAreaDraftTopPct}%; width: {snapshotAreaDraftWidthPct}%; height: {snapshotAreaDraftHeightPct}%;"
2610
3699
  ></div>
2611
- <div
2612
- class="arrow-pending-dot"
2613
- if="showSnapshotArrowPending"
2614
- style="left: {snapshotArrowPendingLeftPct}%; top: {snapshotArrowPendingTopPct}%;"
2615
- ></div>
2616
- <svg class="arrow-svg" if="hasSnapshotArrowLines" viewBox="0 0 100 100" preserveAspectRatio="none">
2617
- <defs>
2618
- <marker id="aiditor-snapshot-arrowhead" markerWidth="8" markerHeight="8" refX="6" refY="4" orient="auto">
2619
- <polygon points="0 0, 8 4, 0 8" fill="#116dff" />
2620
- </marker>
2621
- </defs>
2622
- <line
2623
- forEach="snapshotArrowDisplayItems"
2624
- trackBy="id"
2625
- x1="{x1Pct}"
2626
- y1="{y1Pct}"
2627
- x2="{x2Pct}"
2628
- y2="{y2Pct}"
2629
- />
2630
- </svg>
2631
- <div
2632
- class="arrow-end-pin"
2633
- forEach="snapshotArrowPinItems"
2634
- trackBy="id"
2635
- style="left: {leftPct}%; top: {topPct}%;"
2636
- >{indexLabel}</div>
2637
3700
  </div>
2638
3701
  </div>
2639
3702
  <div class="snapshot-annotations-panel">
@@ -2656,18 +3719,16 @@ data:
2656
3719
  value="{instruction}"
2657
3720
  ></textarea>
2658
3721
  <div class="annotation-add-menu">
2659
- <button type="button" class="annotation-add-menu-toggle">Add Menu (optional)</button>
2660
- <div class="annotation-add-menu-panel add-menu-panel" if="showAddMenuControls">
3722
+ <div class="annotation-add-menu-panel add-menu-panel">
2661
3723
  <div class="add-menu-panel-attached">
2662
3724
  <div if="showMarkerAddMenuChips">
2663
3725
  <div class="add-page-plugins-zone-title">Add Menu on this marker</div>
2664
3726
  <div class="add-page-plugin-chips">
2665
- <span class="add-page-plugin-chip" forEach="markerAddMenuChips" trackBy="rowKey">{title}<span class="add-page-plugin-chip-sub">{subtitle}</span><button type="button" class="add-page-plugin-chip-remove" data-marker-add-menu-remove="1" data-item-id="{itemId}" title="Remove">×</button></span>
3727
+ <span class="add-page-plugin-chip" forEach="markerAddMenuChips" trackBy="rowKey"><span class="add-page-plugin-chip-text" title="{title}">{title}<span class="add-page-plugin-chip-sub">{subtitle}</span></span><button type="button" class="add-page-plugin-chip-remove" data-marker-add-menu-remove="1" data-item-id="{itemId}" title="Remove">×</button><button type="button" class="add-page-plugin-chip-at" data-marker-add-menu-at-title="1" data-title="{title}" title="Insert @Title">@</button></span>
2666
3728
  </div>
2667
3729
  </div>
2668
3730
  <p class="add-page-hint" if="showMarkerAddMenuEmptyHint">No resources attached on this marker — click + Add to pick from the catalog.</p>
2669
3731
  <button type="button" class="add-page-btn add-page-btn-cancel" data-marker-add-menu-open="1">+ Add</button>
2670
- <button type="button" class="add-page-manage-link" data-marker-add-menu-manage="1">Manage plugins…</button>
2671
3732
  <p class="add-page-field-error" if="crAddMenuParamCollisionWarning">{crAddMenuParamCollisionWarning}</p>
2672
3733
  <p class="add-page-hint" if="crAddMenuRouteParamHint">{crAddMenuRouteParamHint}</p>
2673
3734
  <div class="add-menu-route-params" if="showCrAddMenuRouteParams">
@@ -2684,22 +3745,6 @@ data:
2684
3745
  <button type="button" class="add-page-btn add-page-btn-cancel" data-cr-route-param-cancel="1">Cancel</button>
2685
3746
  </div>
2686
3747
  </div>
2687
- <div class="add-menu-popover" if="showAddMenuItemPicker">
2688
- <div class="add-menu-popover-header">
2689
- <span if="!addMenuSelectedCategory">Pick a category</span>
2690
- <span if="addMenuSelectedCategory">Pick an item</span>
2691
- <button type="button" data-marker-add-menu-close="1">×</button>
2692
- </div>
2693
- <p class="add-page-hint" if="showMarkerPickerLoading">Loading catalog…</p>
2694
- <p class="add-page-hint" if="showMarkerPickerCatalogEmpty">Add Menu catalog is empty. Run <code>yarn setup ui-kit --force</code> (and other plugins) in the project, then click + Add again.</p>
2695
- <div class="add-menu-nav">
2696
- <div class="add-menu-nav-row" forEach="markerPickerNavRows" trackBy="rowKey">
2697
- <button type="button" class="add-menu-nav-btn" if="kind===category" data-marker-add-menu-category="1" data-category="{value}">{label}</button>
2698
- <button type="button" class="add-menu-nav-btn" if="kind===subCategory" data-marker-add-menu-subcategory="1" data-subcategory="{value}">{label}</button>
2699
- <button type="button" class="add-menu-item-btn" if="kind===item" data-marker-add-menu-pick="1" data-item-id="{value}">{label}</button>
2700
- </div>
2701
- </div>
2702
- </div>
2703
3748
  </div>
2704
3749
  </div>
2705
3750
  <div class="visual-annotation-files">
@@ -2722,6 +3767,13 @@ data:
2722
3767
  </div>
2723
3768
  </div>
2724
3769
  </div>
3770
+ <button
3771
+ type="button"
3772
+ class="visual-annotation-quick-send"
3773
+ disabled="quickSendDisabled"
3774
+ title="Send comments to agent"
3775
+ aria-label="Send comments to agent"
3776
+ ><svg class="tool-send-icon" width="16" height="16" viewBox="0 0 16 16" fill="none" aria-hidden="true"><path d="M14 2L7 9" stroke="currentColor" stroke-width="1.4" stroke-linecap="round"/><path d="M14 2L9.5 14L7 9L2 6.5L14 2Z" stroke="currentColor" stroke-width="1.4" stroke-linejoin="round"/></svg></button>
2725
3777
  </div>
2726
3778
  </div>
2727
3779
  </div>
@@ -2738,6 +3790,7 @@ data:
2738
3790
  </div>
2739
3791
  </div>
2740
3792
 
3793
+ </div>
2741
3794
  </div>
2742
3795
  </body>
2743
3796
  </html>