@designfever/web-review-kit 0.8.0 → 0.8.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -2444,7 +2444,9 @@ var reviewShellQaPanelStyle = `
2444
2444
  .df-review-status-toggle-row {
2445
2445
  display: flex;
2446
2446
  align-items: center;
2447
+ justify-content: space-between;
2447
2448
  gap: 6px;
2449
+ width: 100%;
2448
2450
  min-width: 0;
2449
2451
  overflow-x: auto;
2450
2452
  overflow-y: hidden;
@@ -2488,10 +2490,31 @@ var reviewShellQaPanelStyle = `
2488
2490
  opacity: 0.72;
2489
2491
  }
2490
2492
 
2493
+ .df-review-status-preset-toggle {
2494
+ width: 34px;
2495
+ min-width: 34px;
2496
+ padding: 0;
2497
+ }
2498
+
2499
+ .df-review-status-preset-toggle svg {
2500
+ width: 14px;
2501
+ height: 14px;
2502
+ }
2503
+
2491
2504
  .df-review-status-toggle.is-active {
2492
2505
  color: var(--df-review-text);
2493
2506
  }
2494
2507
 
2508
+ .df-review-status-preset-toggle.is-active {
2509
+ border-color: var(--df-review-line);
2510
+ color: var(--df-review-muted);
2511
+ background: var(--df-review-line-soft);
2512
+ }
2513
+
2514
+ .df-review-status-toggle.is-status-todo {
2515
+ flex: 1 1 auto;
2516
+ }
2517
+
2495
2518
  .df-review-status-toggle.is-status-todo.is-active {
2496
2519
  border-color: var(--df-review-line);
2497
2520
  color: var(--df-review-muted);
@@ -2516,10 +2539,15 @@ var reviewShellQaPanelStyle = `
2516
2539
  background: var(--df-review-purple-soft);
2517
2540
  }
2518
2541
 
2542
+ .df-review-status-toggle.is-status-done {
2543
+ margin-right: var(--df-review-space-2);
2544
+ color: var(--df-review-muted);
2545
+ }
2546
+
2519
2547
  .df-review-status-toggle.is-status-done.is-active {
2520
- border-color: rgba(99, 215, 199, 0.34);
2521
- color: var(--df-review-area);
2522
- background: var(--df-review-area-soft);
2548
+ border-color: var(--df-review-line);
2549
+ color: var(--df-review-muted);
2550
+ background: var(--df-review-line-soft);
2523
2551
  }
2524
2552
 
2525
2553
  .df-review-filter-tabs {
@@ -2673,7 +2701,8 @@ var reviewShellQaPanelStyle = `
2673
2701
  box-shadow: inset 0 0 0 1px var(--df-review-accent-hover), 0 0 0 3px rgba(124, 199, 255, 0.12);
2674
2702
  }
2675
2703
 
2676
- .df-review-item-card.is-overlay-hidden .df-review-item-main {
2704
+ .df-review-item-card.is-overlay-hidden .df-review-item-main,
2705
+ .df-review-item-card.is-overlay-hidden .df-review-item-body {
2677
2706
  opacity: 0.68;
2678
2707
  }
2679
2708
 
@@ -2685,7 +2714,8 @@ var reviewShellQaPanelStyle = `
2685
2714
  min-width: 0;
2686
2715
  }
2687
2716
 
2688
- .df-review-item-main {
2717
+ .df-review-item-main,
2718
+ .df-review-item-body {
2689
2719
  display: grid;
2690
2720
  gap: 4px;
2691
2721
  min-width: 0;
@@ -2697,7 +2727,7 @@ var reviewShellQaPanelStyle = `
2697
2727
  }
2698
2728
 
2699
2729
  .df-review-item-main strong,
2700
- .df-review-item-main p {
2730
+ .df-review-item-body p {
2701
2731
  margin: 0;
2702
2732
  }
2703
2733
 
@@ -2721,6 +2751,73 @@ var reviewShellQaPanelStyle = `
2721
2751
  white-space: pre-wrap;
2722
2752
  }
2723
2753
 
2754
+ .df-review-item-comment-shell {
2755
+ display: grid;
2756
+ gap: 2px;
2757
+ min-width: 0;
2758
+ }
2759
+
2760
+ .df-review-item-comment-more {
2761
+ display: flex;
2762
+ align-items: center;
2763
+ justify-content: center;
2764
+ gap: 5px;
2765
+ width: 100%;
2766
+ min-width: 0;
2767
+ min-height: 37px;
2768
+ border: 0;
2769
+ padding: 10px 0 7px;
2770
+ color: var(--df-review-muted);
2771
+ background: transparent;
2772
+ cursor: pointer;
2773
+ font-size: var(--df-review-font-size-xs);
2774
+ font-weight: var(--df-review-font-weight-normal);
2775
+ line-height: 1;
2776
+ transition: color 140ms ease;
2777
+ }
2778
+
2779
+ .df-review-item-comment-more::before,
2780
+ .df-review-item-comment-more::after {
2781
+ content: '';
2782
+ flex: 1 1 auto;
2783
+ height: 1px;
2784
+ border-radius: var(--df-review-radius-pill);
2785
+ background: var(--df-review-line-soft);
2786
+ }
2787
+
2788
+ .df-review-item-comment-more span {
2789
+ flex: 0 0 auto;
2790
+ }
2791
+
2792
+ .df-review-item-comment-more:hover,
2793
+ .df-review-item-comment-more:focus-visible {
2794
+ color: var(--df-review-accent);
2795
+ outline: none;
2796
+ }
2797
+
2798
+ .df-review-item-comment-more svg {
2799
+ flex: 0 0 auto;
2800
+ width: 14px;
2801
+ height: 14px;
2802
+ fill: none;
2803
+ stroke: currentColor;
2804
+ stroke-linecap: round;
2805
+ stroke-linejoin: round;
2806
+ stroke-width: 2;
2807
+ }
2808
+
2809
+ .df-review-item-comment.is-collapsed {
2810
+ max-height: 140px;
2811
+ overflow-x: hidden;
2812
+ overflow-y: auto;
2813
+ scrollbar-width: thin;
2814
+ }
2815
+
2816
+ .df-review-item-comment.is-expanded {
2817
+ max-height: none;
2818
+ overflow: visible;
2819
+ }
2820
+
2724
2821
  .df-review-item-comment.is-primary {
2725
2822
  padding: 5px 0;
2726
2823
  color: var(--df-review-text);
@@ -2782,7 +2879,7 @@ var reviewShellQaPanelStyle = `
2782
2879
  white-space: nowrap;
2783
2880
  }
2784
2881
 
2785
- .df-review-item-main small {
2882
+ .df-review-item-body small {
2786
2883
  color: var(--df-review-subtle);
2787
2884
  font-size: var(--df-review-font-size-xs);
2788
2885
  }
@@ -4133,11 +4230,17 @@ var reviewShellStageStyle = `
4133
4230
 
4134
4231
  .df-review-outside-marker {
4135
4232
  --df-review-outside-marker-color: #7cc7ff;
4233
+ --df-review-outside-marker-connector-top: 10px;
4234
+ --df-review-outside-marker-connector-stem-top: 10px;
4235
+ --df-review-outside-marker-connector-stem-height: 0px;
4236
+ --df-review-outside-marker-z-index: 1;
4136
4237
  position: absolute;
4137
4238
  right: 10px;
4239
+ z-index: var(--df-review-outside-marker-z-index);
4138
4240
  display: inline-flex;
4139
4241
  align-items: center;
4140
4242
  justify-content: center;
4243
+ width: max-content;
4141
4244
  min-width: 28px;
4142
4245
  height: 22px;
4143
4246
  padding: 0 6px;
@@ -4149,21 +4252,33 @@ var reviewShellStageStyle = `
4149
4252
  font-size: var(--df-review-font-size-2xs);
4150
4253
  font-weight: var(--df-review-font-weight-emphasis);
4151
4254
  line-height: 1;
4255
+ white-space: nowrap;
4152
4256
  pointer-events: auto;
4153
4257
  }
4154
4258
 
4259
+ .df-review-outside-marker::before,
4155
4260
  .df-review-outside-marker::after {
4156
4261
  content: "";
4157
4262
  position: absolute;
4158
- left: 100%;
4159
- top: 10px;
4160
- width: 10px;
4161
- height: 1px;
4162
4263
  background: var(--df-review-outside-marker-color);
4163
4264
  opacity: 0.72;
4164
4265
  pointer-events: none;
4165
4266
  }
4166
4267
 
4268
+ .df-review-outside-marker::before {
4269
+ left: 100%;
4270
+ top: var(--df-review-outside-marker-connector-stem-top);
4271
+ width: 1px;
4272
+ height: var(--df-review-outside-marker-connector-stem-height);
4273
+ }
4274
+
4275
+ .df-review-outside-marker::after {
4276
+ left: 100%;
4277
+ top: var(--df-review-outside-marker-connector-top);
4278
+ width: 10px;
4279
+ height: 1px;
4280
+ }
4281
+
4167
4282
  .df-review-outside-marker.is-scope-tablet {
4168
4283
  --df-review-outside-marker-color: #63d7c7;
4169
4284
  }
@@ -5202,7 +5317,7 @@ function ensureReviewShellStyle() {
5202
5317
  // src/react-shell/review/shell.tsx
5203
5318
  import {
5204
5319
  useMemo as useMemo18,
5205
- useState as useState17
5320
+ useState as useState18
5206
5321
  } from "react";
5207
5322
 
5208
5323
  // src/react-shell/store/store.context.tsx
@@ -5362,69 +5477,80 @@ var __iconNode = [
5362
5477
  ];
5363
5478
  var Bot = createLucideIcon("bot", __iconNode);
5364
5479
 
5480
+ // node_modules/.pnpm/lucide-react@1.20.0_react@19.2.7/node_modules/lucide-react/dist/esm/icons/check-check.mjs
5481
+ var __iconNode2 = [
5482
+ ["path", { d: "M18 6 7 17l-5-5", key: "116fxf" }],
5483
+ ["path", { d: "m22 10-7.5 7.5L13 16", key: "ke71qq" }]
5484
+ ];
5485
+ var CheckCheck = createLucideIcon("check-check", __iconNode2);
5486
+
5365
5487
  // node_modules/.pnpm/lucide-react@1.20.0_react@19.2.7/node_modules/lucide-react/dist/esm/icons/chevron-down.mjs
5366
- var __iconNode2 = [["path", { d: "m6 9 6 6 6-6", key: "qrunsl" }]];
5367
- var ChevronDown = createLucideIcon("chevron-down", __iconNode2);
5488
+ var __iconNode3 = [["path", { d: "m6 9 6 6 6-6", key: "qrunsl" }]];
5489
+ var ChevronDown = createLucideIcon("chevron-down", __iconNode3);
5368
5490
 
5369
5491
  // node_modules/.pnpm/lucide-react@1.20.0_react@19.2.7/node_modules/lucide-react/dist/esm/icons/chevron-right.mjs
5370
- var __iconNode3 = [["path", { d: "m9 18 6-6-6-6", key: "mthhwq" }]];
5371
- var ChevronRight = createLucideIcon("chevron-right", __iconNode3);
5492
+ var __iconNode4 = [["path", { d: "m9 18 6-6-6-6", key: "mthhwq" }]];
5493
+ var ChevronRight = createLucideIcon("chevron-right", __iconNode4);
5494
+
5495
+ // node_modules/.pnpm/lucide-react@1.20.0_react@19.2.7/node_modules/lucide-react/dist/esm/icons/chevron-up.mjs
5496
+ var __iconNode5 = [["path", { d: "m18 15-6-6-6 6", key: "153udz" }]];
5497
+ var ChevronUp = createLucideIcon("chevron-up", __iconNode5);
5372
5498
 
5373
5499
  // node_modules/.pnpm/lucide-react@1.20.0_react@19.2.7/node_modules/lucide-react/dist/esm/icons/circle-question-mark.mjs
5374
- var __iconNode4 = [
5500
+ var __iconNode6 = [
5375
5501
  ["circle", { cx: "12", cy: "12", r: "10", key: "1mglay" }],
5376
5502
  ["path", { d: "M9.09 9a3 3 0 0 1 5.83 1c0 2-3 3-3 3", key: "1u773s" }],
5377
5503
  ["path", { d: "M12 17h.01", key: "p32p05" }]
5378
5504
  ];
5379
- var CircleQuestionMark = createLucideIcon("circle-question-mark", __iconNode4);
5505
+ var CircleQuestionMark = createLucideIcon("circle-question-mark", __iconNode6);
5380
5506
 
5381
5507
  // node_modules/.pnpm/lucide-react@1.20.0_react@19.2.7/node_modules/lucide-react/dist/esm/icons/code-xml.mjs
5382
- var __iconNode5 = [
5508
+ var __iconNode7 = [
5383
5509
  ["path", { d: "m18 16 4-4-4-4", key: "1inbqp" }],
5384
5510
  ["path", { d: "m6 8-4 4 4 4", key: "15zrgr" }],
5385
5511
  ["path", { d: "m14.5 4-5 16", key: "e7oirm" }]
5386
5512
  ];
5387
- var CodeXml = createLucideIcon("code-xml", __iconNode5);
5513
+ var CodeXml = createLucideIcon("code-xml", __iconNode7);
5388
5514
 
5389
5515
  // node_modules/.pnpm/lucide-react@1.20.0_react@19.2.7/node_modules/lucide-react/dist/esm/icons/contrast.mjs
5390
- var __iconNode6 = [
5516
+ var __iconNode8 = [
5391
5517
  ["circle", { cx: "12", cy: "12", r: "10", key: "1mglay" }],
5392
5518
  ["path", { d: "M12 18a6 6 0 0 0 0-12v12z", key: "j4l70d" }]
5393
5519
  ];
5394
- var Contrast = createLucideIcon("contrast", __iconNode6);
5520
+ var Contrast = createLucideIcon("contrast", __iconNode8);
5395
5521
 
5396
5522
  // node_modules/.pnpm/lucide-react@1.20.0_react@19.2.7/node_modules/lucide-react/dist/esm/icons/copy.mjs
5397
- var __iconNode7 = [
5523
+ var __iconNode9 = [
5398
5524
  ["rect", { width: "14", height: "14", x: "8", y: "8", rx: "2", ry: "2", key: "17jyea" }],
5399
5525
  ["path", { d: "M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2", key: "zix9uf" }]
5400
5526
  ];
5401
- var Copy = createLucideIcon("copy", __iconNode7);
5527
+ var Copy = createLucideIcon("copy", __iconNode9);
5402
5528
 
5403
5529
  // node_modules/.pnpm/lucide-react@1.20.0_react@19.2.7/node_modules/lucide-react/dist/esm/icons/corner-up-right.mjs
5404
- var __iconNode8 = [
5530
+ var __iconNode10 = [
5405
5531
  ["path", { d: "m15 14 5-5-5-5", key: "12vg1m" }],
5406
5532
  ["path", { d: "M4 20v-7a4 4 0 0 1 4-4h12", key: "1lu4f8" }]
5407
5533
  ];
5408
- var CornerUpRight = createLucideIcon("corner-up-right", __iconNode8);
5534
+ var CornerUpRight = createLucideIcon("corner-up-right", __iconNode10);
5409
5535
 
5410
5536
  // node_modules/.pnpm/lucide-react@1.20.0_react@19.2.7/node_modules/lucide-react/dist/esm/icons/database.mjs
5411
- var __iconNode9 = [
5537
+ var __iconNode11 = [
5412
5538
  ["ellipse", { cx: "12", cy: "5", rx: "9", ry: "3", key: "msslwz" }],
5413
5539
  ["path", { d: "M3 5V19A9 3 0 0 0 21 19V5", key: "1wlel7" }],
5414
5540
  ["path", { d: "M3 12A9 3 0 0 0 21 12", key: "mv7ke4" }]
5415
5541
  ];
5416
- var Database = createLucideIcon("database", __iconNode9);
5542
+ var Database = createLucideIcon("database", __iconNode11);
5417
5543
 
5418
5544
  // node_modules/.pnpm/lucide-react@1.20.0_react@19.2.7/node_modules/lucide-react/dist/esm/icons/external-link.mjs
5419
- var __iconNode10 = [
5545
+ var __iconNode12 = [
5420
5546
  ["path", { d: "M15 3h6v6", key: "1q9fwt" }],
5421
5547
  ["path", { d: "M10 14 21 3", key: "gplh6r" }],
5422
5548
  ["path", { d: "M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6", key: "a6xqqp" }]
5423
5549
  ];
5424
- var ExternalLink = createLucideIcon("external-link", __iconNode10);
5550
+ var ExternalLink = createLucideIcon("external-link", __iconNode12);
5425
5551
 
5426
5552
  // node_modules/.pnpm/lucide-react@1.20.0_react@19.2.7/node_modules/lucide-react/dist/esm/icons/eye-off.mjs
5427
- var __iconNode11 = [
5553
+ var __iconNode13 = [
5428
5554
  [
5429
5555
  "path",
5430
5556
  {
@@ -5442,10 +5568,10 @@ var __iconNode11 = [
5442
5568
  ],
5443
5569
  ["path", { d: "m2 2 20 20", key: "1ooewy" }]
5444
5570
  ];
5445
- var EyeOff = createLucideIcon("eye-off", __iconNode11);
5571
+ var EyeOff = createLucideIcon("eye-off", __iconNode13);
5446
5572
 
5447
5573
  // node_modules/.pnpm/lucide-react@1.20.0_react@19.2.7/node_modules/lucide-react/dist/esm/icons/eye.mjs
5448
- var __iconNode12 = [
5574
+ var __iconNode14 = [
5449
5575
  [
5450
5576
  "path",
5451
5577
  {
@@ -5455,59 +5581,59 @@ var __iconNode12 = [
5455
5581
  ],
5456
5582
  ["circle", { cx: "12", cy: "12", r: "3", key: "1v7zrd" }]
5457
5583
  ];
5458
- var Eye = createLucideIcon("eye", __iconNode12);
5584
+ var Eye = createLucideIcon("eye", __iconNode14);
5459
5585
 
5460
5586
  // node_modules/.pnpm/lucide-react@1.20.0_react@19.2.7/node_modules/lucide-react/dist/esm/icons/image.mjs
5461
- var __iconNode13 = [
5587
+ var __iconNode15 = [
5462
5588
  ["rect", { width: "18", height: "18", x: "3", y: "3", rx: "2", ry: "2", key: "1m3agn" }],
5463
5589
  ["circle", { cx: "9", cy: "9", r: "2", key: "af1f0g" }],
5464
5590
  ["path", { d: "m21 15-3.086-3.086a2 2 0 0 0-2.828 0L6 21", key: "1xmnt7" }]
5465
5591
  ];
5466
- var Image2 = createLucideIcon("image", __iconNode13);
5592
+ var Image2 = createLucideIcon("image", __iconNode15);
5467
5593
 
5468
5594
  // node_modules/.pnpm/lucide-react@1.20.0_react@19.2.7/node_modules/lucide-react/dist/esm/icons/layout-grid.mjs
5469
- var __iconNode14 = [
5595
+ var __iconNode16 = [
5470
5596
  ["rect", { width: "7", height: "7", x: "3", y: "3", rx: "1", key: "1g98yp" }],
5471
5597
  ["rect", { width: "7", height: "7", x: "14", y: "3", rx: "1", key: "6d4xhi" }],
5472
5598
  ["rect", { width: "7", height: "7", x: "14", y: "14", rx: "1", key: "nxv5o0" }],
5473
5599
  ["rect", { width: "7", height: "7", x: "3", y: "14", rx: "1", key: "1bb6yr" }]
5474
5600
  ];
5475
- var LayoutGrid = createLucideIcon("layout-grid", __iconNode14);
5601
+ var LayoutGrid = createLucideIcon("layout-grid", __iconNode16);
5476
5602
 
5477
5603
  // node_modules/.pnpm/lucide-react@1.20.0_react@19.2.7/node_modules/lucide-react/dist/esm/icons/link-2.mjs
5478
- var __iconNode15 = [
5604
+ var __iconNode17 = [
5479
5605
  ["path", { d: "M9 17H7A5 5 0 0 1 7 7h2", key: "8i5ue5" }],
5480
5606
  ["path", { d: "M15 7h2a5 5 0 1 1 0 10h-2", key: "1b9ql8" }],
5481
5607
  ["line", { x1: "8", x2: "16", y1: "12", y2: "12", key: "1jonct" }]
5482
5608
  ];
5483
- var Link2 = createLucideIcon("link-2", __iconNode15);
5609
+ var Link2 = createLucideIcon("link-2", __iconNode17);
5484
5610
 
5485
5611
  // node_modules/.pnpm/lucide-react@1.20.0_react@19.2.7/node_modules/lucide-react/dist/esm/icons/list-checks.mjs
5486
- var __iconNode16 = [
5612
+ var __iconNode18 = [
5487
5613
  ["path", { d: "M13 5h8", key: "a7qcls" }],
5488
5614
  ["path", { d: "M13 12h8", key: "h98zly" }],
5489
5615
  ["path", { d: "M13 19h8", key: "c3s6r1" }],
5490
5616
  ["path", { d: "m3 17 2 2 4-4", key: "1jhpwq" }],
5491
5617
  ["path", { d: "m3 7 2 2 4-4", key: "1obspn" }]
5492
5618
  ];
5493
- var ListChecks = createLucideIcon("list-checks", __iconNode16);
5619
+ var ListChecks = createLucideIcon("list-checks", __iconNode18);
5494
5620
 
5495
5621
  // node_modules/.pnpm/lucide-react@1.20.0_react@19.2.7/node_modules/lucide-react/dist/esm/icons/lock-open.mjs
5496
- var __iconNode17 = [
5622
+ var __iconNode19 = [
5497
5623
  ["rect", { width: "18", height: "11", x: "3", y: "11", rx: "2", ry: "2", key: "1w4ew1" }],
5498
5624
  ["path", { d: "M7 11V7a5 5 0 0 1 9.9-1", key: "1mm8w8" }]
5499
5625
  ];
5500
- var LockOpen = createLucideIcon("lock-open", __iconNode17);
5626
+ var LockOpen = createLucideIcon("lock-open", __iconNode19);
5501
5627
 
5502
5628
  // node_modules/.pnpm/lucide-react@1.20.0_react@19.2.7/node_modules/lucide-react/dist/esm/icons/lock.mjs
5503
- var __iconNode18 = [
5629
+ var __iconNode20 = [
5504
5630
  ["rect", { width: "18", height: "11", x: "3", y: "11", rx: "2", ry: "2", key: "1w4ew1" }],
5505
5631
  ["path", { d: "M7 11V7a5 5 0 0 1 10 0v4", key: "fwvmzm" }]
5506
5632
  ];
5507
- var Lock = createLucideIcon("lock", __iconNode18);
5633
+ var Lock = createLucideIcon("lock", __iconNode20);
5508
5634
 
5509
5635
  // node_modules/.pnpm/lucide-react@1.20.0_react@19.2.7/node_modules/lucide-react/dist/esm/icons/map.mjs
5510
- var __iconNode19 = [
5636
+ var __iconNode21 = [
5511
5637
  [
5512
5638
  "path",
5513
5639
  {
@@ -5518,27 +5644,27 @@ var __iconNode19 = [
5518
5644
  ["path", { d: "M15 5.764v15", key: "1pn4in" }],
5519
5645
  ["path", { d: "M9 3.236v15", key: "1uimfh" }]
5520
5646
  ];
5521
- var Map2 = createLucideIcon("map", __iconNode19);
5647
+ var Map2 = createLucideIcon("map", __iconNode21);
5522
5648
 
5523
5649
  // node_modules/.pnpm/lucide-react@1.20.0_react@19.2.7/node_modules/lucide-react/dist/esm/icons/maximize-2.mjs
5524
- var __iconNode20 = [
5650
+ var __iconNode22 = [
5525
5651
  ["path", { d: "M15 3h6v6", key: "1q9fwt" }],
5526
5652
  ["path", { d: "m21 3-7 7", key: "1l2asr" }],
5527
5653
  ["path", { d: "m3 21 7-7", key: "tjx5ai" }],
5528
5654
  ["path", { d: "M9 21H3v-6", key: "wtvkvv" }]
5529
5655
  ];
5530
- var Maximize2 = createLucideIcon("maximize-2", __iconNode20);
5656
+ var Maximize2 = createLucideIcon("maximize-2", __iconNode22);
5531
5657
 
5532
5658
  // node_modules/.pnpm/lucide-react@1.20.0_react@19.2.7/node_modules/lucide-react/dist/esm/icons/monitor.mjs
5533
- var __iconNode21 = [
5659
+ var __iconNode23 = [
5534
5660
  ["rect", { width: "20", height: "14", x: "2", y: "3", rx: "2", key: "48i651" }],
5535
5661
  ["line", { x1: "8", x2: "16", y1: "21", y2: "21", key: "1svkeh" }],
5536
5662
  ["line", { x1: "12", x2: "12", y1: "17", y2: "21", key: "vw1qmm" }]
5537
5663
  ];
5538
- var Monitor = createLucideIcon("monitor", __iconNode21);
5664
+ var Monitor = createLucideIcon("monitor", __iconNode23);
5539
5665
 
5540
5666
  // node_modules/.pnpm/lucide-react@1.20.0_react@19.2.7/node_modules/lucide-react/dist/esm/icons/moon.mjs
5541
- var __iconNode22 = [
5667
+ var __iconNode24 = [
5542
5668
  [
5543
5669
  "path",
5544
5670
  {
@@ -5547,28 +5673,28 @@ var __iconNode22 = [
5547
5673
  }
5548
5674
  ]
5549
5675
  ];
5550
- var Moon = createLucideIcon("moon", __iconNode22);
5676
+ var Moon = createLucideIcon("moon", __iconNode24);
5551
5677
 
5552
5678
  // node_modules/.pnpm/lucide-react@1.20.0_react@19.2.7/node_modules/lucide-react/dist/esm/icons/move-vertical.mjs
5553
- var __iconNode23 = [
5679
+ var __iconNode25 = [
5554
5680
  ["path", { d: "M12 2v20", key: "t6zp3m" }],
5555
5681
  ["path", { d: "m8 18 4 4 4-4", key: "bh5tu3" }],
5556
5682
  ["path", { d: "m8 6 4-4 4 4", key: "ybng9g" }]
5557
5683
  ];
5558
- var MoveVertical = createLucideIcon("move-vertical", __iconNode23);
5684
+ var MoveVertical = createLucideIcon("move-vertical", __iconNode25);
5559
5685
 
5560
5686
  // node_modules/.pnpm/lucide-react@1.20.0_react@19.2.7/node_modules/lucide-react/dist/esm/icons/network.mjs
5561
- var __iconNode24 = [
5687
+ var __iconNode26 = [
5562
5688
  ["rect", { x: "16", y: "16", width: "6", height: "6", rx: "1", key: "4q2zg0" }],
5563
5689
  ["rect", { x: "2", y: "16", width: "6", height: "6", rx: "1", key: "8cvhb9" }],
5564
5690
  ["rect", { x: "9", y: "2", width: "6", height: "6", rx: "1", key: "1egb70" }],
5565
5691
  ["path", { d: "M5 16v-3a1 1 0 0 1 1-1h12a1 1 0 0 1 1 1v3", key: "1jsf9p" }],
5566
5692
  ["path", { d: "M12 12V8", key: "2874zd" }]
5567
5693
  ];
5568
- var Network = createLucideIcon("network", __iconNode24);
5694
+ var Network = createLucideIcon("network", __iconNode26);
5569
5695
 
5570
5696
  // node_modules/.pnpm/lucide-react@1.20.0_react@19.2.7/node_modules/lucide-react/dist/esm/icons/pencil.mjs
5571
- var __iconNode25 = [
5697
+ var __iconNode27 = [
5572
5698
  [
5573
5699
  "path",
5574
5700
  {
@@ -5578,32 +5704,32 @@ var __iconNode25 = [
5578
5704
  ],
5579
5705
  ["path", { d: "m15 5 4 4", key: "1mk7zo" }]
5580
5706
  ];
5581
- var Pencil = createLucideIcon("pencil", __iconNode25);
5707
+ var Pencil = createLucideIcon("pencil", __iconNode27);
5582
5708
 
5583
5709
  // node_modules/.pnpm/lucide-react@1.20.0_react@19.2.7/node_modules/lucide-react/dist/esm/icons/plus.mjs
5584
- var __iconNode26 = [
5710
+ var __iconNode28 = [
5585
5711
  ["path", { d: "M5 12h14", key: "1ays0h" }],
5586
5712
  ["path", { d: "M12 5v14", key: "s699le" }]
5587
5713
  ];
5588
- var Plus = createLucideIcon("plus", __iconNode26);
5714
+ var Plus = createLucideIcon("plus", __iconNode28);
5589
5715
 
5590
5716
  // node_modules/.pnpm/lucide-react@1.20.0_react@19.2.7/node_modules/lucide-react/dist/esm/icons/rectangle-horizontal.mjs
5591
- var __iconNode27 = [
5717
+ var __iconNode29 = [
5592
5718
  ["rect", { width: "20", height: "12", x: "2", y: "6", rx: "2", key: "9lu3g6" }]
5593
5719
  ];
5594
- var RectangleHorizontal = createLucideIcon("rectangle-horizontal", __iconNode27);
5720
+ var RectangleHorizontal = createLucideIcon("rectangle-horizontal", __iconNode29);
5595
5721
 
5596
5722
  // node_modules/.pnpm/lucide-react@1.20.0_react@19.2.7/node_modules/lucide-react/dist/esm/icons/refresh-cw.mjs
5597
- var __iconNode28 = [
5723
+ var __iconNode30 = [
5598
5724
  ["path", { d: "M3 12a9 9 0 0 1 9-9 9.75 9.75 0 0 1 6.74 2.74L21 8", key: "v9h5vc" }],
5599
5725
  ["path", { d: "M21 3v5h-5", key: "1q7to0" }],
5600
5726
  ["path", { d: "M21 12a9 9 0 0 1-9 9 9.75 9.75 0 0 1-6.74-2.74L3 16", key: "3uifl3" }],
5601
5727
  ["path", { d: "M8 16H3v5", key: "1cv678" }]
5602
5728
  ];
5603
- var RefreshCw = createLucideIcon("refresh-cw", __iconNode28);
5729
+ var RefreshCw = createLucideIcon("refresh-cw", __iconNode30);
5604
5730
 
5605
5731
  // node_modules/.pnpm/lucide-react@1.20.0_react@19.2.7/node_modules/lucide-react/dist/esm/icons/ruler.mjs
5606
- var __iconNode29 = [
5732
+ var __iconNode31 = [
5607
5733
  [
5608
5734
  "path",
5609
5735
  {
@@ -5616,26 +5742,26 @@ var __iconNode29 = [
5616
5742
  ["path", { d: "m8.5 6.5 2-2", key: "vc6u1g" }],
5617
5743
  ["path", { d: "m17.5 15.5 2-2", key: "wo5hmg" }]
5618
5744
  ];
5619
- var Ruler = createLucideIcon("ruler", __iconNode29);
5745
+ var Ruler = createLucideIcon("ruler", __iconNode31);
5620
5746
 
5621
5747
  // node_modules/.pnpm/lucide-react@1.20.0_react@19.2.7/node_modules/lucide-react/dist/esm/icons/scan.mjs
5622
- var __iconNode30 = [
5748
+ var __iconNode32 = [
5623
5749
  ["path", { d: "M3 7V5a2 2 0 0 1 2-2h2", key: "aa7l1z" }],
5624
5750
  ["path", { d: "M17 3h2a2 2 0 0 1 2 2v2", key: "4qcy5o" }],
5625
5751
  ["path", { d: "M21 17v2a2 2 0 0 1-2 2h-2", key: "6vwrx8" }],
5626
5752
  ["path", { d: "M7 21H5a2 2 0 0 1-2-2v-2", key: "ioqczr" }]
5627
5753
  ];
5628
- var Scan = createLucideIcon("scan", __iconNode30);
5754
+ var Scan = createLucideIcon("scan", __iconNode32);
5629
5755
 
5630
5756
  // node_modules/.pnpm/lucide-react@1.20.0_react@19.2.7/node_modules/lucide-react/dist/esm/icons/search.mjs
5631
- var __iconNode31 = [
5757
+ var __iconNode33 = [
5632
5758
  ["path", { d: "m21 21-4.34-4.34", key: "14j7rj" }],
5633
5759
  ["circle", { cx: "11", cy: "11", r: "8", key: "4ej97u" }]
5634
5760
  ];
5635
- var Search = createLucideIcon("search", __iconNode31);
5761
+ var Search = createLucideIcon("search", __iconNode33);
5636
5762
 
5637
5763
  // node_modules/.pnpm/lucide-react@1.20.0_react@19.2.7/node_modules/lucide-react/dist/esm/icons/settings.mjs
5638
- var __iconNode32 = [
5764
+ var __iconNode34 = [
5639
5765
  [
5640
5766
  "path",
5641
5767
  {
@@ -5645,17 +5771,17 @@ var __iconNode32 = [
5645
5771
  ],
5646
5772
  ["circle", { cx: "12", cy: "12", r: "3", key: "1v7zrd" }]
5647
5773
  ];
5648
- var Settings = createLucideIcon("settings", __iconNode32);
5774
+ var Settings = createLucideIcon("settings", __iconNode34);
5649
5775
 
5650
5776
  // node_modules/.pnpm/lucide-react@1.20.0_react@19.2.7/node_modules/lucide-react/dist/esm/icons/smartphone.mjs
5651
- var __iconNode33 = [
5777
+ var __iconNode35 = [
5652
5778
  ["rect", { width: "14", height: "20", x: "5", y: "2", rx: "2", ry: "2", key: "1yt0o3" }],
5653
5779
  ["path", { d: "M12 18h.01", key: "mhygvu" }]
5654
5780
  ];
5655
- var Smartphone = createLucideIcon("smartphone", __iconNode33);
5781
+ var Smartphone = createLucideIcon("smartphone", __iconNode35);
5656
5782
 
5657
5783
  // node_modules/.pnpm/lucide-react@1.20.0_react@19.2.7/node_modules/lucide-react/dist/esm/icons/square-mouse-pointer.mjs
5658
- var __iconNode34 = [
5784
+ var __iconNode36 = [
5659
5785
  [
5660
5786
  "path",
5661
5787
  {
@@ -5665,10 +5791,10 @@ var __iconNode34 = [
5665
5791
  ],
5666
5792
  ["path", { d: "M21 11V5a2 2 0 0 0-2-2H5a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h6", key: "14rsvq" }]
5667
5793
  ];
5668
- var SquareMousePointer = createLucideIcon("square-mouse-pointer", __iconNode34);
5794
+ var SquareMousePointer = createLucideIcon("square-mouse-pointer", __iconNode36);
5669
5795
 
5670
5796
  // node_modules/.pnpm/lucide-react@1.20.0_react@19.2.7/node_modules/lucide-react/dist/esm/icons/sun.mjs
5671
- var __iconNode35 = [
5797
+ var __iconNode37 = [
5672
5798
  ["circle", { cx: "12", cy: "12", r: "4", key: "4exip2" }],
5673
5799
  ["path", { d: "M12 2v2", key: "tus03m" }],
5674
5800
  ["path", { d: "M12 20v2", key: "1lh1kg" }],
@@ -5679,40 +5805,40 @@ var __iconNode35 = [
5679
5805
  ["path", { d: "m6.34 17.66-1.41 1.41", key: "1m8zz5" }],
5680
5806
  ["path", { d: "m19.07 4.93-1.41 1.41", key: "1shlcs" }]
5681
5807
  ];
5682
- var Sun = createLucideIcon("sun", __iconNode35);
5808
+ var Sun = createLucideIcon("sun", __iconNode37);
5683
5809
 
5684
5810
  // node_modules/.pnpm/lucide-react@1.20.0_react@19.2.7/node_modules/lucide-react/dist/esm/icons/trash-2.mjs
5685
- var __iconNode36 = [
5811
+ var __iconNode38 = [
5686
5812
  ["path", { d: "M10 11v6", key: "nco0om" }],
5687
5813
  ["path", { d: "M14 11v6", key: "outv1u" }],
5688
5814
  ["path", { d: "M19 6v14a2 2 0 0 1-2 2H7a2 2 0 0 1-2-2V6", key: "miytrc" }],
5689
5815
  ["path", { d: "M3 6h18", key: "d0wm0j" }],
5690
5816
  ["path", { d: "M8 6V4a2 2 0 0 1 2-2h4a2 2 0 0 1 2 2v2", key: "e791ji" }]
5691
5817
  ];
5692
- var Trash2 = createLucideIcon("trash-2", __iconNode36);
5818
+ var Trash2 = createLucideIcon("trash-2", __iconNode38);
5693
5819
 
5694
5820
  // node_modules/.pnpm/lucide-react@1.20.0_react@19.2.7/node_modules/lucide-react/dist/esm/icons/type.mjs
5695
- var __iconNode37 = [
5821
+ var __iconNode39 = [
5696
5822
  ["path", { d: "M12 4v16", key: "1654pz" }],
5697
5823
  ["path", { d: "M4 7V5a1 1 0 0 1 1-1h14a1 1 0 0 1 1 1v2", key: "e0r10z" }],
5698
5824
  ["path", { d: "M9 20h6", key: "s66wpe" }]
5699
5825
  ];
5700
- var Type = createLucideIcon("type", __iconNode37);
5826
+ var Type = createLucideIcon("type", __iconNode39);
5701
5827
 
5702
5828
  // node_modules/.pnpm/lucide-react@1.20.0_react@19.2.7/node_modules/lucide-react/dist/esm/icons/upload.mjs
5703
- var __iconNode38 = [
5829
+ var __iconNode40 = [
5704
5830
  ["path", { d: "M12 3v12", key: "1x0j5s" }],
5705
5831
  ["path", { d: "m17 8-5-5-5 5", key: "7q97r8" }],
5706
5832
  ["path", { d: "M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4", key: "ih7n3h" }]
5707
5833
  ];
5708
- var Upload = createLucideIcon("upload", __iconNode38);
5834
+ var Upload = createLucideIcon("upload", __iconNode40);
5709
5835
 
5710
5836
  // node_modules/.pnpm/lucide-react@1.20.0_react@19.2.7/node_modules/lucide-react/dist/esm/icons/x.mjs
5711
- var __iconNode39 = [
5837
+ var __iconNode41 = [
5712
5838
  ["path", { d: "M18 6 6 18", key: "1bl5f8" }],
5713
5839
  ["path", { d: "m6 6 12 12", key: "d8bk6v" }]
5714
5840
  ];
5715
- var X = createLucideIcon("x", __iconNode39);
5841
+ var X = createLucideIcon("x", __iconNode41);
5716
5842
 
5717
5843
  // src/react-shell/figma/image.overlay.controller.ts
5718
5844
  import {
@@ -6636,6 +6762,7 @@ var FigmaImageLayerStateButtons = ({
6636
6762
  "aria-pressed": overlayState.isVisible,
6637
6763
  className: `df-review-figma-image-state-button${overlayState.isVisible ? " is-active" : ""}`,
6638
6764
  "data-review-tooltip": overlayState.isVisible ? "Hide overlay" : "Show overlay",
6765
+ "data-review-tooltip-placement": "left",
6639
6766
  title: overlayState.isVisible ? "Hide overlay" : "Show overlay",
6640
6767
  type: "button",
6641
6768
  onClick: (event) => {
@@ -6652,6 +6779,7 @@ var FigmaImageLayerStateButtons = ({
6652
6779
  "aria-pressed": overlayState.isLocked,
6653
6780
  className: `df-review-figma-image-state-button${overlayState.isLocked ? " is-active" : ""}`,
6654
6781
  "data-review-tooltip": overlayState.isLocked ? "Unlock" : "Lock",
6782
+ "data-review-tooltip-placement": "left",
6655
6783
  title: overlayState.isLocked ? "Unlock" : "Lock",
6656
6784
  type: "button",
6657
6785
  onClick: (event) => {
@@ -6668,6 +6796,7 @@ var FigmaImageLayerStateButtons = ({
6668
6796
  "aria-pressed": overlayState.mode === "invert",
6669
6797
  className: `df-review-figma-image-state-button${overlayState.mode === "invert" ? " is-active" : ""}`,
6670
6798
  "data-review-tooltip": "Invert",
6799
+ "data-review-tooltip-placement": "left",
6671
6800
  title: "Invert",
6672
6801
  type: "button",
6673
6802
  onClick: (event) => {
@@ -7537,9 +7666,10 @@ var formatPromptSourceHint = (item) => {
7537
7666
  `Section id: ${source.sectionId ?? "(none)"}`
7538
7667
  ].join("\n");
7539
7668
  };
7540
- var buildReviewItemPrompt = (numberedItem, reviewPathPrefix) => {
7669
+ var buildReviewItemPrompt = (numberedItem, reviewPathPrefix, qaPrompt = "") => {
7541
7670
  const { item } = numberedItem;
7542
7671
  const anchor = item.anchor;
7672
+ const qaPromptText = qaPrompt.trim();
7543
7673
  const candidates = getPromptAnchorCandidates(item);
7544
7674
  const candidateLines = candidates.length > 0 ? candidates.map((candidate, index) => {
7545
7675
  const confidence = typeof candidate.confidence === "number" ? `, confidence=${Math.round(candidate.confidence * 100)}%` : "";
@@ -7547,6 +7677,7 @@ var buildReviewItemPrompt = (numberedItem, reviewPathPrefix) => {
7547
7677
  return `${index + 1}. ${candidate.selector} (${candidate.strategy}${confidence}${fingerprint})`;
7548
7678
  }).join("\n") : "(none)";
7549
7679
  return [
7680
+ ...qaPromptText ? [qaPromptText, ""] : [],
7550
7681
  "Fix this df-web-review-kit QA issue.",
7551
7682
  "",
7552
7683
  `Page: ${getItemTarget(item, reviewPathPrefix)}`,
@@ -7844,6 +7975,7 @@ var createReviewShellConfig = ({
7844
7975
  pages,
7845
7976
  adapters,
7846
7977
  initialPrompt = DEFAULT_INITIAL_REVIEW_PROMPT,
7978
+ qaPrompt = "",
7847
7979
  presets = DEFAULT_REVIEW_VIEWPORT_PRESETS,
7848
7980
  reviewPathPrefix = DEFAULT_REVIEW_PATH_PREFIX,
7849
7981
  sourceInspector,
@@ -7860,6 +7992,7 @@ var createReviewShellConfig = ({
7860
7992
  const isSourceInspectorEnabled = resolvedSourceInspector?.enabled !== false && Boolean(resolvedSourceRoot?.trim());
7861
7993
  return {
7862
7994
  initialPrompt,
7995
+ qaPrompt,
7863
7996
  projectId,
7864
7997
  pages,
7865
7998
  reviewPathPrefix,
@@ -8224,7 +8357,7 @@ function useReviewItemActions({
8224
8357
  onClearSelectedItem,
8225
8358
  onRefreshReviewData
8226
8359
  }) {
8227
- const { reviewPathPrefix, viewportPresets } = useReviewShellConfig();
8360
+ const { qaPrompt, reviewPathPrefix, viewportPresets } = useReviewShellConfig();
8228
8361
  const {
8229
8362
  activeAdapterEntry,
8230
8363
  isRemoteSource,
@@ -8353,7 +8486,7 @@ function useReviewItemActions({
8353
8486
  onToast: showToast
8354
8487
  });
8355
8488
  const copyItemPrompt = (numberedItem) => copyPrompt(
8356
- buildReviewItemPrompt(numberedItem, reviewPathPrefix),
8489
+ buildReviewItemPrompt(numberedItem, reviewPathPrefix, qaPrompt),
8357
8490
  `qa:${numberedItem.item.id}`,
8358
8491
  "QA prompt copied"
8359
8492
  );
@@ -8579,9 +8712,16 @@ var QaItemEditModal = ({
8579
8712
  };
8580
8713
 
8581
8714
  // src/react-shell/qa/panel.tsx
8715
+ import {
8716
+ useEffect as useEffect5,
8717
+ useRef as useRef4
8718
+ } from "react";
8719
+
8720
+ // src/react-shell/qa/item.card.tsx
8582
8721
  import {
8583
8722
  useEffect as useEffect4,
8584
- useRef as useRef3
8723
+ useRef as useRef3,
8724
+ useState as useState5
8585
8725
  } from "react";
8586
8726
 
8587
8727
  // src/react-shell/qa/item.assignee.actions.tsx
@@ -9032,6 +9172,30 @@ var QaItemCard = ({
9032
9172
  const canEditItem = activeAdapterEntry.canUpdate && !isSubmitting && !isMutating;
9033
9173
  const itemTitle = fields.title ? item.title?.trim() : "";
9034
9174
  const itemMeta = [formatItemCardDate(item.createdAt), itemAuthor].filter(Boolean).join(" | ");
9175
+ const commentRef = useRef3(null);
9176
+ const [isCommentExpanded, setIsCommentExpanded] = useState5(false);
9177
+ const [isCommentOverflowing, setIsCommentOverflowing] = useState5(false);
9178
+ const showCommentToggle = isCommentExpanded || isCommentOverflowing;
9179
+ useEffect4(() => {
9180
+ setIsCommentExpanded(false);
9181
+ setIsCommentOverflowing(false);
9182
+ }, [item.id, itemComment]);
9183
+ useEffect4(() => {
9184
+ if (isCommentExpanded) return void 0;
9185
+ const element = commentRef.current;
9186
+ if (!element) return void 0;
9187
+ const updateCommentOverflow = () => {
9188
+ setIsCommentOverflowing(
9189
+ element.scrollHeight > element.clientHeight + 1
9190
+ );
9191
+ };
9192
+ updateCommentOverflow();
9193
+ const ResizeObserverClass = element.ownerDocument.defaultView?.ResizeObserver;
9194
+ if (!ResizeObserverClass) return void 0;
9195
+ const observer = new ResizeObserverClass(updateCommentOverflow);
9196
+ observer.observe(element);
9197
+ return () => observer.disconnect();
9198
+ }, [isCommentExpanded, itemComment]);
9035
9199
  return /* @__PURE__ */ jsxs7(
9036
9200
  "article",
9037
9201
  {
@@ -9080,22 +9244,7 @@ var QaItemCard = ({
9080
9244
  itemMode
9081
9245
  ] })
9082
9246
  ] }),
9083
- itemTitle && /* @__PURE__ */ jsx11("strong", { className: "df-review-item-title", children: itemTitle }),
9084
- /* @__PURE__ */ jsx11(
9085
- "p",
9086
- {
9087
- className: `df-review-item-comment${itemTitle ? "" : " is-primary"}`,
9088
- children: itemComment
9089
- }
9090
- ),
9091
- item.attachments && /* @__PURE__ */ jsx11(QaItemAttachments, { attachments: item.attachments }),
9092
- !isRemoteSource && /* @__PURE__ */ jsx11(QaItemExternalLinks, { item }),
9093
- /* @__PURE__ */ jsx11("small", { className: "df-review-item-meta", children: itemMeta }),
9094
- isMutating && /* @__PURE__ */ jsxs7("small", { className: "df-review-item-saving", "aria-live": "polite", children: [
9095
- /* @__PURE__ */ jsx11("span", { className: "df-review-spinner", "aria-hidden": "true" }),
9096
- "Saving QA..."
9097
- ] }),
9098
- item.submitError && /* @__PURE__ */ jsx11("small", { className: "df-review-item-error", children: item.submitError })
9247
+ itemTitle && /* @__PURE__ */ jsx11("strong", { className: "df-review-item-title", children: itemTitle })
9099
9248
  ] }),
9100
9249
  /* @__PURE__ */ jsxs7(
9101
9250
  "div",
@@ -9153,6 +9302,50 @@ var QaItemCard = ({
9153
9302
  }
9154
9303
  )
9155
9304
  ] }),
9305
+ /* @__PURE__ */ jsxs7("div", { className: "df-review-item-body", children: [
9306
+ /* @__PURE__ */ jsxs7(
9307
+ "div",
9308
+ {
9309
+ className: `df-review-item-comment-shell${showCommentToggle ? " has-toggle" : ""}${isCommentExpanded ? " is-expanded" : " is-collapsed"}`,
9310
+ children: [
9311
+ /* @__PURE__ */ jsx11(
9312
+ "p",
9313
+ {
9314
+ className: `df-review-item-comment${itemTitle ? "" : " is-primary"}${isCommentExpanded ? " is-expanded" : " is-collapsed"}`,
9315
+ ref: commentRef,
9316
+ children: itemComment
9317
+ }
9318
+ ),
9319
+ showCommentToggle && /* @__PURE__ */ jsxs7(
9320
+ "button",
9321
+ {
9322
+ "aria-expanded": isCommentExpanded,
9323
+ "aria-label": isCommentExpanded ? "Collapse QA content" : "Expand QA content",
9324
+ className: "df-review-item-comment-more",
9325
+ title: isCommentExpanded ? "Collapse QA content" : "Expand QA content",
9326
+ type: "button",
9327
+ onClick: (event) => {
9328
+ event.stopPropagation();
9329
+ setIsCommentExpanded((current) => !current);
9330
+ },
9331
+ children: [
9332
+ /* @__PURE__ */ jsx11("span", { children: isCommentExpanded ? "Less" : "More" }),
9333
+ isCommentExpanded ? /* @__PURE__ */ jsx11(ChevronUp, { "aria-hidden": "true" }) : /* @__PURE__ */ jsx11(ChevronDown, { "aria-hidden": "true" })
9334
+ ]
9335
+ }
9336
+ )
9337
+ ]
9338
+ }
9339
+ ),
9340
+ item.attachments && /* @__PURE__ */ jsx11(QaItemAttachments, { attachments: item.attachments }),
9341
+ !isRemoteSource && /* @__PURE__ */ jsx11(QaItemExternalLinks, { item }),
9342
+ /* @__PURE__ */ jsx11("small", { className: "df-review-item-meta", children: itemMeta }),
9343
+ isMutating && /* @__PURE__ */ jsxs7("small", { className: "df-review-item-saving", "aria-live": "polite", children: [
9344
+ /* @__PURE__ */ jsx11("span", { className: "df-review-spinner", "aria-hidden": "true" }),
9345
+ "Saving QA..."
9346
+ ] }),
9347
+ item.submitError && /* @__PURE__ */ jsx11("small", { className: "df-review-item-error", children: item.submitError })
9348
+ ] }),
9156
9349
  /* @__PURE__ */ jsxs7("div", { className: "df-review-item-actions", children: [
9157
9350
  /* @__PURE__ */ jsxs7("div", { className: "df-review-item-workflow-actions", children: [
9158
9351
  /* @__PURE__ */ jsx11(
@@ -9259,6 +9452,7 @@ var QaPanelHeader = ({
9259
9452
  sourceEntries,
9260
9453
  statusOptions,
9261
9454
  onChangeReviewSource,
9455
+ onEnableActiveQaStatusFilters,
9262
9456
  onQaStatusFilterToggle,
9263
9457
  onRefreshReviewData
9264
9458
  }) => {
@@ -9302,30 +9496,45 @@ var QaPanelHeader = ({
9302
9496
  )
9303
9497
  ] })
9304
9498
  ] }),
9305
- /* @__PURE__ */ jsx12(
9499
+ /* @__PURE__ */ jsxs8(
9306
9500
  "div",
9307
9501
  {
9308
9502
  className: "df-review-status-toggle-row",
9309
9503
  "aria-label": "QA status filters",
9310
- children: statusFilterOptions.map((statusOption) => {
9311
- const isActive = qaStatusFilters.includes(statusOption.value);
9312
- const count = qaStatusFilterCounts.get(statusOption.value) ?? 0;
9313
- return /* @__PURE__ */ jsxs8(
9504
+ children: [
9505
+ /* @__PURE__ */ jsx12(
9314
9506
  "button",
9315
9507
  {
9316
- "aria-label": `${statusOption.label} QA (${count})`,
9317
- "aria-pressed": isActive,
9318
- className: `df-review-status-toggle is-status-${statusOption.value}${isActive ? " is-active" : ""}`,
9508
+ "aria-label": "Show all non-done QA",
9509
+ "aria-pressed": !hasActiveFilter,
9510
+ className: `df-review-status-toggle df-review-status-preset-toggle${!hasActiveFilter ? " is-active" : ""}`,
9511
+ "data-review-tooltip": "Show all non-done QA",
9512
+ title: "Show all non-done QA",
9319
9513
  type: "button",
9320
- onClick: () => onQaStatusFilterToggle(statusOption.value),
9321
- children: [
9322
- /* @__PURE__ */ jsx12("span", { children: statusOption.label }),
9323
- /* @__PURE__ */ jsx12("strong", { children: count })
9324
- ]
9325
- },
9326
- statusOption.value
9327
- );
9328
- })
9514
+ onClick: onEnableActiveQaStatusFilters,
9515
+ children: /* @__PURE__ */ jsx12(CheckCheck, { "aria-hidden": "true" })
9516
+ }
9517
+ ),
9518
+ statusFilterOptions.map((statusOption) => {
9519
+ const isActive = qaStatusFilters.includes(statusOption.value);
9520
+ const count = qaStatusFilterCounts.get(statusOption.value) ?? 0;
9521
+ return /* @__PURE__ */ jsxs8(
9522
+ "button",
9523
+ {
9524
+ "aria-label": `${statusOption.label} QA (${count})`,
9525
+ "aria-pressed": isActive,
9526
+ className: `df-review-status-toggle is-status-${statusOption.value}${isActive ? " is-active" : ""}`,
9527
+ type: "button",
9528
+ onClick: () => onQaStatusFilterToggle(statusOption.value),
9529
+ children: [
9530
+ /* @__PURE__ */ jsx12("span", { children: statusOption.label }),
9531
+ /* @__PURE__ */ jsx12("strong", { children: count })
9532
+ ]
9533
+ },
9534
+ statusOption.value
9535
+ );
9536
+ })
9537
+ ]
9329
9538
  }
9330
9539
  )
9331
9540
  ] });
@@ -9383,6 +9592,7 @@ var ReviewQaPanel = ({
9383
9592
  onCopyItemPrompt,
9384
9593
  onCopyRemoteIssuePath,
9385
9594
  onEditItem,
9595
+ onEnableActiveQaStatusFilters,
9386
9596
  onQaStatusFilterToggle,
9387
9597
  onRefreshReviewData,
9388
9598
  onRemoveItem,
@@ -9390,9 +9600,9 @@ var ReviewQaPanel = ({
9390
9600
  onSubmitItem,
9391
9601
  onToggleItemOverlayVisibility
9392
9602
  }) => {
9393
- const listRef = useRef3(null);
9603
+ const listRef = useRef4(null);
9394
9604
  const emptyMessage = isAllQaVisible ? `No ${activeAdapterEntry.label} QA.` : isRemoteSource ? `No ${activeAdapterEntry.label} QA on this page.` : "No QA on this page.";
9395
- useEffect4(() => {
9605
+ useEffect5(() => {
9396
9606
  if (!isListVisible || !selectedItemId) return;
9397
9607
  const selectedCard = Array.from(
9398
9608
  listRef.current?.querySelectorAll(
@@ -9422,6 +9632,7 @@ var ReviewQaPanel = ({
9422
9632
  sourceEntries,
9423
9633
  statusOptions: activeAdapterEntry.statusOptions,
9424
9634
  onChangeReviewSource,
9635
+ onEnableActiveQaStatusFilters,
9425
9636
  onQaStatusFilterToggle,
9426
9637
  onRefreshReviewData
9427
9638
  }
@@ -9852,6 +10063,11 @@ var useReviewQaPanelData = () => {
9852
10063
  },
9853
10064
  [qaStatusFilters, setQaStatusFiltersState]
9854
10065
  );
10066
+ const showActiveQaStatusFilters = useCallback5(() => {
10067
+ const defaultFilters = getDefaultReviewQaStatusFilters();
10068
+ setQaStatusFiltersState(defaultFilters);
10069
+ writeStoredReviewQaStatusFilters(defaultFilters);
10070
+ }, [setQaStatusFiltersState]);
9855
10071
  const currentPresetScope = getViewportPresetKind(size);
9856
10072
  return {
9857
10073
  activeItems,
@@ -9860,6 +10076,7 @@ var useReviewQaPanelData = () => {
9860
10076
  filteredNumberedActiveItems,
9861
10077
  getItemPresetScope,
9862
10078
  qaStatusFilterCounts,
10079
+ showActiveQaStatusFilters,
9863
10080
  toggleQaStatusFilter
9864
10081
  };
9865
10082
  };
@@ -9904,6 +10121,7 @@ var QaPanelContainer = () => {
9904
10121
  filteredNumberedActiveItems,
9905
10122
  getItemPresetScope,
9906
10123
  qaStatusFilterCounts,
10124
+ showActiveQaStatusFilters,
9907
10125
  toggleQaStatusFilter
9908
10126
  } = useReviewQaPanelData();
9909
10127
  const {
@@ -9968,6 +10186,7 @@ var QaPanelContainer = () => {
9968
10186
  onCopyItemPrompt: (numberedItem) => void copyItemPrompt(numberedItem),
9969
10187
  onCopyRemoteIssuePath: copyRemoteIssuePath,
9970
10188
  onEditItem: setEditingItem,
10189
+ onEnableActiveQaStatusFilters: showActiveQaStatusFilters,
9971
10190
  onQaStatusFilterToggle: toggleQaStatusFilter,
9972
10191
  onRefreshReviewData: refreshReviewData2,
9973
10192
  onRemoveItem: removeItem,
@@ -9982,10 +10201,10 @@ var QaPanelContainer = () => {
9982
10201
  // src/react-shell/hooks/use.review.section.outline.ts
9983
10202
  import {
9984
10203
  useCallback as useCallback6,
9985
- useEffect as useEffect5,
10204
+ useEffect as useEffect6,
9986
10205
  useMemo as useMemo5,
9987
- useRef as useRef4,
9988
- useState as useState5
10206
+ useRef as useRef5,
10207
+ useState as useState6
9989
10208
  } from "react";
9990
10209
 
9991
10210
  // src/react-shell/review/shell.helpers.ts
@@ -10821,13 +11040,13 @@ function useReviewSectionOutline({
10821
11040
  const showToast = useReviewToast();
10822
11041
  const isPanelVisible = isListVisible && sidePanel === "source";
10823
11042
  const targetSrc = useMemo5(() => buildTargetSrc(target), [target]);
10824
- const sectionOutlineCountRef = useRef4(0);
10825
- const [sectionOutline, setSectionOutline] = useState5(null);
10826
- const [sectionOutlineFilter, setSectionOutlineFilter] = useState5(
11043
+ const sectionOutlineCountRef = useRef5(0);
11044
+ const [sectionOutline, setSectionOutline] = useState6(null);
11045
+ const [sectionOutlineFilter, setSectionOutlineFilter] = useState6(
10827
11046
  () => getStoredSourceTreeFilter()
10828
11047
  );
10829
- const [sectionOutlineMetaVisibility, setSectionOutlineMetaVisibility] = useState5(() => getStoredSourceTreeMetaVisibility());
10830
- const [collapsedSectionOutlineIds, setCollapsedSectionOutlineIds] = useState5(() => /* @__PURE__ */ new Set());
11048
+ const [sectionOutlineMetaVisibility, setSectionOutlineMetaVisibility] = useState6(() => getStoredSourceTreeMetaVisibility());
11049
+ const [collapsedSectionOutlineIds, setCollapsedSectionOutlineIds] = useState6(() => /* @__PURE__ */ new Set());
10831
11050
  const updateSectionOutlineFilter = useCallback6((nextFilter) => {
10832
11051
  setSectionOutlineFilter(nextFilter);
10833
11052
  writeStoredSourceTreeFilter(nextFilter);
@@ -10859,10 +11078,10 @@ function useReviewSectionOutline({
10859
11078
  [filteredSectionOutline]
10860
11079
  );
10861
11080
  const isSectionOutlineFiltering = sectionOutlineFilterTerms.length > 0;
10862
- useEffect5(() => {
11081
+ useEffect6(() => {
10863
11082
  sectionOutlineCountRef.current = sectionOutlineTotalCount;
10864
11083
  }, [sectionOutlineTotalCount]);
10865
- useEffect5(() => {
11084
+ useEffect6(() => {
10866
11085
  onClearSourceInspector();
10867
11086
  setCollapsedSectionOutlineIds(/* @__PURE__ */ new Set());
10868
11087
  setSectionOutline(null);
@@ -10899,7 +11118,7 @@ function useReviewSectionOutline({
10899
11118
  },
10900
11119
  [getCurrentSectionOutline]
10901
11120
  );
10902
- useEffect5(() => {
11121
+ useEffect6(() => {
10903
11122
  if (!isPanelVisible) return void 0;
10904
11123
  const refreshSectionOutline = () => {
10905
11124
  refreshCurrentSectionOutline(true);
@@ -10920,7 +11139,7 @@ function useReviewSectionOutline({
10920
11139
  targetFrameLoadVersion,
10921
11140
  targetSrc
10922
11141
  ]);
10923
- useEffect5(() => {
11142
+ useEffect6(() => {
10924
11143
  if (!isPanelVisible) return void 0;
10925
11144
  const frameDocument = iframeRef.current?.contentDocument;
10926
11145
  const body = frameDocument?.body;
@@ -11561,7 +11780,7 @@ function FigmaRailIcon() {
11561
11780
  }
11562
11781
 
11563
11782
  // src/react-shell/presence/overlay.tsx
11564
- import { useState as useState6 } from "react";
11783
+ import { useState as useState7 } from "react";
11565
11784
  import { jsx as jsx18, jsxs as jsxs13 } from "react/jsx-runtime";
11566
11785
  var getPresenceName = (user) => user.displayName || user.userId;
11567
11786
  var PresenceUserIcon = () => /* @__PURE__ */ jsxs13("svg", { "aria-hidden": "true", viewBox: "0 0 30 30", children: [
@@ -11590,7 +11809,7 @@ var PresenceOverlay = ({
11590
11809
  presenceSessionId,
11591
11810
  users
11592
11811
  }) => {
11593
- const [isExpanded, setIsExpanded] = useState6(false);
11812
+ const [isExpanded, setIsExpanded] = useState7(false);
11594
11813
  if (users.length === 0) return null;
11595
11814
  return /* @__PURE__ */ jsxs13(
11596
11815
  "div",
@@ -11823,8 +12042,8 @@ var ReviewSideRailContainer = () => {
11823
12042
 
11824
12043
  // src/react-shell/review/shell.frame.tsx
11825
12044
  import {
11826
- useEffect as useEffect6,
11827
- useRef as useRef5
12045
+ useEffect as useEffect7,
12046
+ useRef as useRef6
11828
12047
  } from "react";
11829
12048
  import { jsxs as jsxs16 } from "react/jsx-runtime";
11830
12049
  var getTooltipElements = (root) => Array.from(root.querySelectorAll("[data-review-tooltip]"));
@@ -11859,8 +12078,8 @@ var ReviewShellFrame = ({
11859
12078
  isListVisible,
11860
12079
  slots
11861
12080
  }) => {
11862
- const rootRef = useRef5(null);
11863
- useEffect6(() => {
12081
+ const rootRef = useRef6(null);
12082
+ useEffect7(() => {
11864
12083
  const root = rootRef.current;
11865
12084
  if (!root) return void 0;
11866
12085
  syncNativeTooltipTitles(root, areTooltipsEnabled);
@@ -12339,7 +12558,7 @@ var ReviewSettingsModal = ({
12339
12558
  // src/react-shell/sitemap/modal.tsx
12340
12559
  import {
12341
12560
  useMemo as useMemo6,
12342
- useState as useState7
12561
+ useState as useState8
12343
12562
  } from "react";
12344
12563
 
12345
12564
  // src/react-shell/sitemap/tree.ts
@@ -12628,14 +12847,14 @@ var SitemapModal = ({
12628
12847
  onSelectAllQa,
12629
12848
  onSelectPage
12630
12849
  }) => {
12631
- const [sort, setSort] = useState7({
12850
+ const [sort, setSort] = useState8({
12632
12851
  key: "page",
12633
12852
  direction: "asc"
12634
12853
  });
12635
- const [collapsedFolderHrefs, setCollapsedFolderHrefs] = useState7(
12854
+ const [collapsedFolderHrefs, setCollapsedFolderHrefs] = useState8(
12636
12855
  () => /* @__PURE__ */ new Set()
12637
12856
  );
12638
- const [searchQuery, setSearchQuery] = useState7("");
12857
+ const [searchQuery, setSearchQuery] = useState8("");
12639
12858
  const trimmedSearchQuery = searchQuery.trim();
12640
12859
  const allQaUsers = useMemo6(
12641
12860
  () => mergePresenceUsers(Array.from(pagePresenceUsers.values()).flat()),
@@ -12971,6 +13190,7 @@ var useReviewShellData = () => {
12971
13190
  const presetScopeCounts = useMemo7(() => {
12972
13191
  const counts = /* @__PURE__ */ new Map();
12973
13192
  activeItems.forEach((item) => {
13193
+ if (normalizeReviewItemStatus(item.status) === SITEMAP_STATUS_DONE2) return;
12974
13194
  const scope = getItemPresetScope(item);
12975
13195
  counts.set(scope, (counts.get(scope) ?? 0) + 1);
12976
13196
  });
@@ -13504,7 +13724,7 @@ var RulerOverlay = () => {
13504
13724
  };
13505
13725
 
13506
13726
  // src/react-shell/target/figma.image.overlay.ts
13507
- import { useCallback as useCallback9, useEffect as useEffect7, useRef as useRef6 } from "react";
13727
+ import { useCallback as useCallback9, useEffect as useEffect8, useRef as useRef7 } from "react";
13508
13728
 
13509
13729
  // src/react-shell/target/target.ts
13510
13730
  var HIDE_SCROLLBAR_STYLE_ID = "df-review-hide-scrollbar";
@@ -13694,7 +13914,7 @@ var useTargetFigmaImageOverlays = ({
13694
13914
  size,
13695
13915
  targetSrc
13696
13916
  }) => {
13697
- const targetDocumentRef = useRef6(null);
13917
+ const targetDocumentRef = useRef7(null);
13698
13918
  const overlaySignature = createTargetFigmaImageOverlaySignature(
13699
13919
  figmaImageOverlays
13700
13920
  );
@@ -13723,10 +13943,10 @@ var useTargetFigmaImageOverlays = ({
13723
13943
  size,
13724
13944
  targetSrc
13725
13945
  ]);
13726
- useEffect7(() => {
13946
+ useEffect8(() => {
13727
13947
  syncTargetFigmaImageOverlays();
13728
13948
  }, [syncTargetFigmaImageOverlays]);
13729
- useEffect7(() => {
13949
+ useEffect8(() => {
13730
13950
  return () => {
13731
13951
  if (!targetDocumentRef.current) return;
13732
13952
  removeTargetFigmaImageOverlays(targetDocumentRef.current);
@@ -13937,13 +14157,73 @@ function normalizeTargetFigmaImageOffsetY(value) {
13937
14157
 
13938
14158
  // src/react-shell/target/outside.markers.tsx
13939
14159
  import {
13940
- useEffect as useEffect8,
14160
+ useEffect as useEffect9,
13941
14161
  useMemo as useMemo8,
13942
- useRef as useRef7,
13943
- useState as useState8
14162
+ useRef as useRef8,
14163
+ useState as useState9
13944
14164
  } from "react";
13945
14165
  import { jsx as jsx35 } from "react/jsx-runtime";
13946
14166
  var OUTSIDE_MARKER_HEIGHT = 22;
14167
+ var OUTSIDE_MARKER_CONNECTOR_TOP = 10;
14168
+ var OUTSIDE_MARKER_GAP = 6;
14169
+ var OUTSIDE_MARKER_SPACING = OUTSIDE_MARKER_HEIGHT + OUTSIDE_MARKER_GAP;
14170
+ var clampMarkerTop = (top, maxTop) => Math.max(0, Math.min(maxTop, top));
14171
+ var toMarkerPixel = (value) => Math.round(value * 100) / 100;
14172
+ var arrangeOutsideMarkerLayout = (markers, viewportHeight) => {
14173
+ if (markers.length === 0) return [];
14174
+ const maxTop = Math.max(0, viewportHeight - OUTSIDE_MARKER_HEIGHT);
14175
+ const sorted = markers.map((marker, index) => ({
14176
+ marker,
14177
+ index,
14178
+ anchorTop: clampMarkerTop(marker.anchorTop, maxTop),
14179
+ top: clampMarkerTop(marker.anchorTop, maxTop)
14180
+ })).sort(
14181
+ (a, b) => a.anchorTop - b.anchorTop || a.index - b.index
14182
+ );
14183
+ for (let index = 1; index < sorted.length; index += 1) {
14184
+ sorted[index].top = Math.max(
14185
+ sorted[index].top,
14186
+ sorted[index - 1].top + OUTSIDE_MARKER_SPACING
14187
+ );
14188
+ }
14189
+ if (sorted[sorted.length - 1].top > maxTop) {
14190
+ sorted[sorted.length - 1].top = maxTop;
14191
+ for (let index = sorted.length - 2; index >= 0; index -= 1) {
14192
+ sorted[index].top = Math.min(
14193
+ sorted[index].top,
14194
+ sorted[index + 1].top - OUTSIDE_MARKER_SPACING
14195
+ );
14196
+ }
14197
+ }
14198
+ if (sorted[0].top < 0) {
14199
+ const spacing = sorted.length > 1 ? maxTop / (sorted.length - 1) : 0;
14200
+ sorted.forEach((marker, index) => {
14201
+ marker.top = index * spacing;
14202
+ });
14203
+ }
14204
+ return sorted.map(({ marker, index, anchorTop, top }) => {
14205
+ const safeTop = clampMarkerTop(top, maxTop);
14206
+ const connectorTop = anchorTop - safeTop + OUTSIDE_MARKER_CONNECTOR_TOP;
14207
+ const connectorStemTop = Math.min(
14208
+ OUTSIDE_MARKER_CONNECTOR_TOP,
14209
+ connectorTop
14210
+ );
14211
+ const connectorStemHeight = Math.abs(
14212
+ connectorTop - OUTSIDE_MARKER_CONNECTOR_TOP
14213
+ );
14214
+ return {
14215
+ index,
14216
+ marker: {
14217
+ ...marker,
14218
+ anchorTop: toMarkerPixel(anchorTop),
14219
+ top: toMarkerPixel(safeTop),
14220
+ connectorTop: toMarkerPixel(connectorTop),
14221
+ connectorStemTop: toMarkerPixel(connectorStemTop),
14222
+ connectorStemHeight: toMarkerPixel(connectorStemHeight)
14223
+ }
14224
+ };
14225
+ }).sort((a, b) => a.index - b.index).map(({ marker }) => marker);
14226
+ };
13947
14227
  var createTargetEnvironment = (iframe) => {
13948
14228
  const targetWindow = iframe?.contentWindow;
13949
14229
  const targetDocument = iframe?.contentDocument;
@@ -13996,9 +14276,9 @@ var ReviewOutsideMarkers = () => {
13996
14276
  (state) => state.setIsListVisible
13997
14277
  );
13998
14278
  const setSidePanel = useReviewShellStore((state) => state.setSidePanel);
13999
- const [layoutVersion, setLayoutVersion] = useState8(0);
14000
- const frameUpdateRef = useRef7(null);
14001
- useEffect8(() => {
14279
+ const [layoutVersion, setLayoutVersion] = useState9(0);
14280
+ const frameUpdateRef = useRef8(null);
14281
+ useEffect9(() => {
14002
14282
  const targetWindow = iframeRef.current?.contentWindow;
14003
14283
  const frameScroll = frameScrollRef.current;
14004
14284
  if (!targetWindow) return void 0;
@@ -14030,27 +14310,26 @@ var ReviewOutsideMarkers = () => {
14030
14310
  if (!environment) return [];
14031
14311
  const hiddenItemIds = new Set(hiddenOverlayItemIdList);
14032
14312
  const currentScope = getReviewViewportScope(size, reviewViewportPresets);
14033
- return getNumberedReviewItems(activeItems, reviewViewportPresets).flatMap(
14034
- (numberedItem) => {
14035
- const { item, scope, displayLabel } = numberedItem;
14036
- if (hiddenItemIds.has(item.id)) return [];
14037
- if (!shouldShowMarkerForScope(scope, currentScope)) return [];
14038
- const top = getOutsideMarkerTop(item, environment);
14039
- if (typeof top !== "number") return [];
14040
- const hostTop = toHostPoint({ x: 0, y: top }, environment).y;
14041
- return {
14042
- item,
14043
- label: displayLabel,
14044
- scope,
14045
- top: Math.max(
14046
- 0,
14047
- Math.min(
14048
- environment.viewportRect.height - OUTSIDE_MARKER_HEIGHT,
14049
- hostTop
14050
- )
14051
- )
14052
- };
14053
- }
14313
+ const rawMarkers = getNumberedReviewItems(
14314
+ activeItems,
14315
+ reviewViewportPresets
14316
+ ).flatMap((numberedItem) => {
14317
+ const { item, scope, displayLabel } = numberedItem;
14318
+ if (hiddenItemIds.has(item.id)) return [];
14319
+ if (!shouldShowMarkerForScope(scope, currentScope)) return [];
14320
+ const top = getOutsideMarkerTop(item, environment);
14321
+ if (typeof top !== "number") return [];
14322
+ const hostTop = toHostPoint({ x: 0, y: top }, environment).y;
14323
+ return {
14324
+ item,
14325
+ label: displayLabel,
14326
+ scope,
14327
+ anchorTop: hostTop
14328
+ };
14329
+ });
14330
+ return arrangeOutsideMarkerLayout(
14331
+ rawMarkers,
14332
+ environment.viewportRect.height
14054
14333
  );
14055
14334
  }, [
14056
14335
  activeItems,
@@ -14061,24 +14340,34 @@ var ReviewOutsideMarkers = () => {
14061
14340
  size
14062
14341
  ]);
14063
14342
  if (markers.length === 0) return null;
14064
- return /* @__PURE__ */ jsx35("div", { className: "df-review-outside-marker-layer", "aria-label": "QA markers", children: markers.map((marker) => /* @__PURE__ */ jsx35(
14065
- "button",
14066
- {
14067
- "aria-label": `Focus ${marker.label}`,
14068
- className: `df-review-outside-marker is-scope-${marker.scope}${marker.item.id === selectedItemId ? " is-active" : ""}`,
14069
- style: { top: `${marker.top}px` },
14070
- type: "button",
14071
- onClick: (event) => {
14072
- event.preventDefault();
14073
- event.stopPropagation();
14074
- setSidePanel("qa");
14075
- setIsListVisible(true);
14076
- restoreReviewItem(marker.item);
14343
+ return /* @__PURE__ */ jsx35("div", { className: "df-review-outside-marker-layer", "aria-label": "QA markers", children: markers.map((marker) => {
14344
+ const isActive = marker.item.id === selectedItemId;
14345
+ const style = {
14346
+ top: `${marker.top}px`,
14347
+ "--df-review-outside-marker-connector-top": `${marker.connectorTop}px`,
14348
+ "--df-review-outside-marker-connector-stem-top": `${marker.connectorStemTop}px`,
14349
+ "--df-review-outside-marker-connector-stem-height": `${marker.connectorStemHeight}px`,
14350
+ "--df-review-outside-marker-z-index": isActive ? 2 : 1
14351
+ };
14352
+ return /* @__PURE__ */ jsx35(
14353
+ "button",
14354
+ {
14355
+ "aria-label": `Focus ${marker.label}`,
14356
+ className: `df-review-outside-marker is-scope-${marker.scope}${isActive ? " is-active" : ""}`,
14357
+ style,
14358
+ type: "button",
14359
+ onClick: (event) => {
14360
+ event.preventDefault();
14361
+ event.stopPropagation();
14362
+ setSidePanel("qa");
14363
+ setIsListVisible(true);
14364
+ restoreReviewItem(marker.item);
14365
+ },
14366
+ children: marker.label
14077
14367
  },
14078
- children: marker.label
14079
- },
14080
- marker.item.id
14081
- )) });
14368
+ marker.item.id
14369
+ );
14370
+ }) });
14082
14371
  };
14083
14372
 
14084
14373
  // src/react-shell/target/frame.tsx
@@ -14160,7 +14449,7 @@ var ReviewTargetFrame = () => {
14160
14449
  };
14161
14450
 
14162
14451
  // src/react-shell/topbar.container.tsx
14163
- import { useState as useState9 } from "react";
14452
+ import { useState as useState10 } from "react";
14164
14453
 
14165
14454
  // src/react-shell/topbar.tsx
14166
14455
  import { jsx as jsx37, jsxs as jsxs28 } from "react/jsx-runtime";
@@ -14403,7 +14692,7 @@ var TopbarContainer = () => {
14403
14692
  (state) => state.setIsSitemapOpen
14404
14693
  );
14405
14694
  const setSize = useReviewShellStore((state) => state.setSize);
14406
- const [copyLabel, setCopyLabel] = useState9("Copy URL");
14695
+ const [copyLabel, setCopyLabel] = useState10("Copy URL");
14407
14696
  const copyCurrentUrl = () => copyCurrentReviewUrl({
14408
14697
  onCopyLabelChange: setCopyLabel
14409
14698
  });
@@ -14448,7 +14737,7 @@ import {
14448
14737
  } from "react";
14449
14738
 
14450
14739
  // src/react-shell/hooks/use.review.command.key.ts
14451
- import { useEffect as useEffect9, useState as useState10 } from "react";
14740
+ import { useEffect as useEffect10, useState as useState11 } from "react";
14452
14741
  var isCommandModifierKeyEvent = (event) => event.key === "Meta" || event.code === "MetaLeft" || event.code === "MetaRight";
14453
14742
  var isCommandKeyDownEvent = (event) => isCommandModifierKeyEvent(event) || event.metaKey;
14454
14743
  function useReviewCommandKey({
@@ -14456,8 +14745,8 @@ function useReviewCommandKey({
14456
14745
  targetFrameLoadVersion,
14457
14746
  targetSrc
14458
14747
  }) {
14459
- const [isCommandKeyPressed, setIsCommandKeyPressed] = useState10(false);
14460
- useEffect9(() => {
14748
+ const [isCommandKeyPressed, setIsCommandKeyPressed] = useState11(false);
14749
+ useEffect10(() => {
14461
14750
  const targetDocument = iframeRef.current?.contentDocument;
14462
14751
  const targetWindow = iframeRef.current?.contentWindow;
14463
14752
  const setCommandKeyPressed = (pressed) => {
@@ -14720,8 +15009,8 @@ function highlightControllerItem(item, controller, isCurrent) {
14720
15009
  // src/react-shell/hooks/use.review.kit.lifecycle.ts
14721
15010
  import {
14722
15011
  useCallback as useCallback11,
14723
- useEffect as useEffect10,
14724
- useRef as useRef8
15012
+ useEffect as useEffect11,
15013
+ useRef as useRef9
14725
15014
  } from "react";
14726
15015
 
14727
15016
  // src/react-shell/hooks/review.frame.navigation.ts
@@ -15383,7 +15672,7 @@ var useReviewKitLifecycle = ({
15383
15672
  onSyncTargetViewport
15384
15673
  }) => {
15385
15674
  const storeApi = useReviewShellStoreApi();
15386
- const hiddenOverlayItemIdListRef = useRef8(hiddenOverlayItemIdList);
15675
+ const hiddenOverlayItemIdListRef = useRef9(hiddenOverlayItemIdList);
15387
15676
  const destroyReviewKit = useCallback11(() => {
15388
15677
  cleanupTargetRef.current?.();
15389
15678
  cleanupTargetRef.current = null;
@@ -15493,13 +15782,13 @@ var useReviewKitLifecycle = ({
15493
15782
  },
15494
15783
  [controllerRef, onModeChange]
15495
15784
  );
15496
- useEffect10(() => destroyReviewKit, [destroyReviewKit]);
15497
- useEffect10(() => {
15785
+ useEffect11(() => destroyReviewKit, [destroyReviewKit]);
15786
+ useEffect11(() => {
15498
15787
  const frameDocument = iframeRef.current?.contentDocument;
15499
15788
  if (!frameDocument || frameDocument.readyState !== "complete") return;
15500
15789
  initReviewKit();
15501
15790
  }, [iframeRef, initReviewKit]);
15502
- useEffect10(() => {
15791
+ useEffect11(() => {
15503
15792
  hiddenOverlayItemIdListRef.current = hiddenOverlayItemIdList;
15504
15793
  controllerRef.current?.setHiddenItemIds(hiddenOverlayItemIdList);
15505
15794
  }, [controllerRef, hiddenOverlayItemIdList]);
@@ -15512,7 +15801,7 @@ var useReviewKitLifecycle = ({
15512
15801
  };
15513
15802
 
15514
15803
  // src/react-shell/hooks/use.review.target.overlay.ts
15515
- import { useCallback as useCallback12, useEffect as useEffect11, useRef as useRef9 } from "react";
15804
+ import { useCallback as useCallback12, useEffect as useEffect12, useRef as useRef10 } from "react";
15516
15805
  var TARGET_OVERLAY_REFRESH_DELAYS = [80, 240, 600];
15517
15806
  var useReviewTargetOverlay = ({
15518
15807
  iframeRef,
@@ -15520,7 +15809,7 @@ var useReviewTargetOverlay = ({
15520
15809
  targetOverlayState,
15521
15810
  onTargetOverlayStateChange
15522
15811
  }) => {
15523
- const refreshTimersRef = useRef9([]);
15812
+ const refreshTimersRef = useRef10([]);
15524
15813
  const clearRefreshTimers = useCallback12(() => {
15525
15814
  refreshTimersRef.current.forEach((timer) => window.clearTimeout(timer));
15526
15815
  refreshTimersRef.current = [];
@@ -15583,11 +15872,11 @@ var useReviewTargetOverlay = ({
15583
15872
  },
15584
15873
  [dispatchTargetOverlayHotkey, updateTargetOverlayState]
15585
15874
  );
15586
- useEffect11(() => {
15875
+ useEffect12(() => {
15587
15876
  if (isFigmaOverlayAvailable || !targetOverlayState.figma) return;
15588
15877
  closeTargetOverlay("figma");
15589
15878
  }, [closeTargetOverlay, isFigmaOverlayAvailable, targetOverlayState.figma]);
15590
- useEffect11(() => clearRefreshTimers, [clearRefreshTimers]);
15879
+ useEffect12(() => clearRefreshTimers, [clearRefreshTimers]);
15591
15880
  return {
15592
15881
  closeTargetOverlay,
15593
15882
  refreshTargetOverlayState,
@@ -15598,7 +15887,7 @@ var useReviewTargetOverlay = ({
15598
15887
  // src/react-shell/hooks/use.review.target.sync.ts
15599
15888
  import {
15600
15889
  useCallback as useCallback13,
15601
- useEffect as useEffect12
15890
+ useEffect as useEffect13
15602
15891
  } from "react";
15603
15892
  var useReviewTargetSync = ({
15604
15893
  iframeRef,
@@ -15648,10 +15937,10 @@ var useReviewTargetSync = ({
15648
15937
  storeApi
15649
15938
  ]
15650
15939
  );
15651
- useEffect12(() => {
15940
+ useEffect13(() => {
15652
15941
  onActiveRouteChange(getTargetRouteKey(target, reviewPathPrefix));
15653
15942
  }, [onActiveRouteChange, reviewPathPrefix, target]);
15654
- useEffect12(() => {
15943
+ useEffect13(() => {
15655
15944
  const { target: currentTarget, selectedItemId } = storeApi.getState();
15656
15945
  if (selectedItemId) {
15657
15946
  updateShellUrlForItem(currentTarget, size, selectedItemId, source);
@@ -15822,17 +16111,17 @@ var useReviewController = ({
15822
16111
  // src/react-shell/hooks/use.review.ruler.ts
15823
16112
  import {
15824
16113
  useCallback as useCallback16,
15825
- useEffect as useEffect14,
15826
- useState as useState12
16114
+ useEffect as useEffect15,
16115
+ useState as useState13
15827
16116
  } from "react";
15828
16117
 
15829
16118
  // src/react-shell/hooks/use.review.ruler.drag.ts
15830
16119
  import {
15831
16120
  useCallback as useCallback15,
15832
- useEffect as useEffect13,
16121
+ useEffect as useEffect14,
15833
16122
  useMemo as useMemo11,
15834
- useRef as useRef10,
15835
- useState as useState11
16123
+ useRef as useRef11,
16124
+ useState as useState12
15836
16125
  } from "react";
15837
16126
 
15838
16127
  // src/react-shell/ruler/ruler.ts
@@ -15862,14 +16151,14 @@ var useReviewRulerDrag = ({
15862
16151
  size,
15863
16152
  targetSrc
15864
16153
  }) => {
15865
- const rulerOverlayRef = useRef10(null);
15866
- const rulerDragRectRef = useRef10(null);
15867
- const isRulerDraggingRef = useRef10(false);
15868
- const sizeRef = useRef10(size);
15869
- const [rulerStart, setRulerStart] = useState11(null);
15870
- const [rulerPoint, setRulerPoint] = useState11(null);
15871
- const [rulerHover, setRulerHover] = useState11(null);
15872
- const [isRulerDragging, setIsRulerDragging] = useState11(false);
16154
+ const rulerOverlayRef = useRef11(null);
16155
+ const rulerDragRectRef = useRef11(null);
16156
+ const isRulerDraggingRef = useRef11(false);
16157
+ const sizeRef = useRef11(size);
16158
+ const [rulerStart, setRulerStart] = useState12(null);
16159
+ const [rulerPoint, setRulerPoint] = useState12(null);
16160
+ const [rulerHover, setRulerHover] = useState12(null);
16161
+ const [isRulerDragging, setIsRulerDragging] = useState12(false);
15873
16162
  const rulerMeasure = useMemo11(
15874
16163
  () => getRulerMeasure(rulerStart, rulerPoint),
15875
16164
  [rulerPoint, rulerStart]
@@ -15901,10 +16190,10 @@ var useReviewRulerDrag = ({
15901
16190
  },
15902
16191
  []
15903
16192
  );
15904
- useEffect13(() => {
16193
+ useEffect14(() => {
15905
16194
  sizeRef.current = size;
15906
16195
  }, [size]);
15907
- useEffect13(() => {
16196
+ useEffect14(() => {
15908
16197
  if (!isRulerVisible || !isRulerAvailable) return void 0;
15909
16198
  const getRulerEventClientPoint = (event) => {
15910
16199
  const frame2 = iframeRef.current;
@@ -16018,7 +16307,7 @@ var useReviewRulerDrag = ({
16018
16307
  isRulerVisible,
16019
16308
  startRulerDrag
16020
16309
  ]);
16021
- useEffect13(() => {
16310
+ useEffect14(() => {
16022
16311
  clearRulerMeasure();
16023
16312
  }, [clearRulerMeasure, size.height, size.width, targetSrc]);
16024
16313
  return {
@@ -16039,7 +16328,7 @@ var useReviewRuler = ({
16039
16328
  onCancelReviewMode,
16040
16329
  onCloseTransientPanels
16041
16330
  }) => {
16042
- const [isRulerVisible, setIsRulerVisible] = useState12(false);
16331
+ const [isRulerVisible, setIsRulerVisible] = useState13(false);
16043
16332
  const isRulerAvailable = ruler?.enabled !== false && typeof size.designWidth === "number" && size.designWidth > 0;
16044
16333
  const rulerUnit = ruler?.unit ?? "px";
16045
16334
  const rulerScaleX = isRulerAvailable && size.designWidth ? size.width / size.designWidth : 1;
@@ -16078,7 +16367,7 @@ var useReviewRuler = ({
16078
16367
  onCancelReviewMode,
16079
16368
  onCloseTransientPanels
16080
16369
  ]);
16081
- useEffect14(() => {
16370
+ useEffect15(() => {
16082
16371
  if (!isRulerVisible || isRulerAvailable) return;
16083
16372
  closeRuler();
16084
16373
  }, [closeRuler, isRulerAvailable, isRulerVisible]);
@@ -16175,7 +16464,7 @@ var useReviewShellActionsValue = ({
16175
16464
 
16176
16465
  // src/react-shell/hooks/use.review.shell.effects.ts
16177
16466
  import {
16178
- useEffect as useEffect15
16467
+ useEffect as useEffect16
16179
16468
  } from "react";
16180
16469
  var useReviewShellEffects = ({
16181
16470
  frameScrollRef,
@@ -16189,7 +16478,7 @@ var useReviewShellEffects = ({
16189
16478
  syncTargetViewport,
16190
16479
  targetSrc
16191
16480
  }) => {
16192
- useEffect15(() => {
16481
+ useEffect16(() => {
16193
16482
  const itemId = pendingInitialItemIdRef.current;
16194
16483
  if (!itemId) return;
16195
16484
  const item = items.find(
@@ -16198,7 +16487,7 @@ var useReviewShellEffects = ({
16198
16487
  if (!item) return;
16199
16488
  restoreReviewItem(item);
16200
16489
  }, [items, pendingInitialItemIdRef, restoreReviewItem]);
16201
- useEffect15(() => {
16490
+ useEffect16(() => {
16202
16491
  const frameScroll = frameScrollRef.current;
16203
16492
  if (!frameScroll) return void 0;
16204
16493
  const centerFrameScroll = () => {
@@ -16223,7 +16512,7 @@ var useReviewShellEffects = ({
16223
16512
  syncTargetViewport,
16224
16513
  targetSrc
16225
16514
  ]);
16226
- useEffect15(() => {
16515
+ useEffect16(() => {
16227
16516
  const targetDocument = iframeRef.current?.contentDocument;
16228
16517
  setTargetFigmaOverlayLocked(targetDocument, mode === "element");
16229
16518
  return () => {
@@ -16440,10 +16729,10 @@ import { useMemo as useMemo16 } from "react";
16440
16729
  // src/react-shell/hooks/use.review.presence.ts
16441
16730
  import {
16442
16731
  useCallback as useCallback18,
16443
- useEffect as useEffect16,
16732
+ useEffect as useEffect17,
16444
16733
  useMemo as useMemo15,
16445
- useRef as useRef11,
16446
- useState as useState13
16734
+ useRef as useRef12,
16735
+ useState as useState14
16447
16736
  } from "react";
16448
16737
 
16449
16738
  // src/react-shell/presence/presence.ts
@@ -16659,9 +16948,9 @@ var useReviewPresence = ({
16659
16948
  size,
16660
16949
  source
16661
16950
  }) => {
16662
- const presenceSessionRef = useRef11(null);
16663
- const [presenceUsers, setPresenceUsers] = useState13([]);
16664
- const [presenceSessionVersion, setPresenceSessionVersion] = useState13(0);
16951
+ const presenceSessionRef = useRef12(null);
16952
+ const [presenceUsers, setPresenceUsers] = useState14([]);
16953
+ const [presenceSessionVersion, setPresenceSessionVersion] = useState14(0);
16665
16954
  const presenceSessionId = useMemo15(getReviewPresenceSessionId, []);
16666
16955
  const normalizedReviewUserId = reviewUserId.trim();
16667
16956
  const presenceDisplayName = getReviewPresenceDisplayName(
@@ -16740,9 +17029,9 @@ var useReviewPresence = ({
16740
17029
  source
16741
17030
  ]
16742
17031
  );
16743
- const getCurrentPresenceStateRef = useRef11(getCurrentPresenceState);
17032
+ const getCurrentPresenceStateRef = useRef12(getCurrentPresenceState);
16744
17033
  getCurrentPresenceStateRef.current = getCurrentPresenceState;
16745
- useEffect16(() => {
17034
+ useEffect17(() => {
16746
17035
  if (!presence || !normalizedReviewUserId) {
16747
17036
  const session = presenceSessionRef.current;
16748
17037
  presenceSessionRef.current = null;
@@ -16792,7 +17081,7 @@ var useReviewPresence = ({
16792
17081
  presenceSessionId,
16793
17082
  projectId
16794
17083
  ]);
16795
- useEffect16(() => {
17084
+ useEffect17(() => {
16796
17085
  const session = presenceSessionRef.current;
16797
17086
  if (!session || !normalizedReviewUserId) return;
16798
17087
  void session.update(getCurrentPresenceState());
@@ -16850,7 +17139,7 @@ var useReviewShellPresenceState = ({
16850
17139
  };
16851
17140
 
16852
17141
  // src/react-shell/hooks/use.review.settings.ts
16853
- import { useCallback as useCallback19, useEffect as useEffect17, useState as useState14 } from "react";
17142
+ import { useCallback as useCallback19, useEffect as useEffect18, useState as useState15 } from "react";
16854
17143
  var useReviewSettings = ({
16855
17144
  defaultReviewUserId = "",
16856
17145
  onCancelReviewMode,
@@ -16858,26 +17147,26 @@ var useReviewSettings = ({
16858
17147
  onCloseSitemap,
16859
17148
  onReloadTargetFrame
16860
17149
  }) => {
16861
- const [figmaTokenDraft, setFigmaTokenDraft] = useState14(getStoredFigmaToken);
16862
- const [reviewUserId, setReviewUserId] = useState14(
17150
+ const [figmaTokenDraft, setFigmaTokenDraft] = useState15(getStoredFigmaToken);
17151
+ const [reviewUserId, setReviewUserId] = useState15(
16863
17152
  () => getStoredReviewUserId(defaultReviewUserId)
16864
17153
  );
16865
- const [reviewUserIdDraft, setReviewUserIdDraft] = useState14(
17154
+ const [reviewUserIdDraft, setReviewUserIdDraft] = useState15(
16866
17155
  () => getStoredReviewUserId(defaultReviewUserId)
16867
17156
  );
16868
- const [reviewTheme, setReviewTheme] = useState14(getStoredReviewTheme);
16869
- const [reviewThemeDraft, setReviewThemeDraft] = useState14(getStoredReviewTheme);
16870
- const [areTooltipsEnabled, setAreTooltipsEnabled] = useState14(
17157
+ const [reviewTheme, setReviewTheme] = useState15(getStoredReviewTheme);
17158
+ const [reviewThemeDraft, setReviewThemeDraft] = useState15(getStoredReviewTheme);
17159
+ const [areTooltipsEnabled, setAreTooltipsEnabled] = useState15(
16871
17160
  getStoredReviewTooltipsEnabled
16872
17161
  );
16873
- const [areTooltipsEnabledDraft, setAreTooltipsEnabledDraft] = useState14(
17162
+ const [areTooltipsEnabledDraft, setAreTooltipsEnabledDraft] = useState15(
16874
17163
  getStoredReviewTooltipsEnabled
16875
17164
  );
16876
- const [systemReviewTheme, setSystemReviewTheme] = useState14(getSystemReviewTheme);
16877
- const [figmaSettingsStatus, setFigmaSettingsStatus] = useState14("");
16878
- const [isFigmaSettingsOpen, setIsFigmaSettingsOpen] = useState14(false);
16879
- const [isFigmaTokenVisible, setIsFigmaTokenVisible] = useState14(false);
16880
- const [isFigmaTokenGuideOpen, setIsFigmaTokenGuideOpen] = useState14(false);
17165
+ const [systemReviewTheme, setSystemReviewTheme] = useState15(getSystemReviewTheme);
17166
+ const [figmaSettingsStatus, setFigmaSettingsStatus] = useState15("");
17167
+ const [isFigmaSettingsOpen, setIsFigmaSettingsOpen] = useState15(false);
17168
+ const [isFigmaTokenVisible, setIsFigmaTokenVisible] = useState15(false);
17169
+ const [isFigmaTokenGuideOpen, setIsFigmaTokenGuideOpen] = useState15(false);
16881
17170
  const effectiveReviewTheme = reviewTheme === "system" ? systemReviewTheme : reviewTheme;
16882
17171
  const closeFigmaSettings = useCallback19(() => {
16883
17172
  setIsFigmaSettingsOpen(false);
@@ -16932,13 +17221,13 @@ var useReviewSettings = ({
16932
17221
  },
16933
17222
  [closeFigmaSettings, onReloadTargetFrame]
16934
17223
  );
16935
- useEffect17(() => {
17224
+ useEffect18(() => {
16936
17225
  if (getStoredReviewUserId()) return;
16937
17226
  const nextDefaultUserId = defaultReviewUserId.trim();
16938
17227
  setReviewUserId(nextDefaultUserId);
16939
17228
  setReviewUserIdDraft(nextDefaultUserId);
16940
17229
  }, [defaultReviewUserId]);
16941
- useEffect17(() => {
17230
+ useEffect18(() => {
16942
17231
  if (typeof window === "undefined" || !window.matchMedia) return void 0;
16943
17232
  const query = window.matchMedia("(prefers-color-scheme: light)");
16944
17233
  const syncSystemTheme = () => {
@@ -16952,7 +17241,7 @@ var useReviewSettings = ({
16952
17241
  query.addListener(syncSystemTheme);
16953
17242
  return () => query.removeListener(syncSystemTheme);
16954
17243
  }, []);
16955
- useEffect17(() => {
17244
+ useEffect18(() => {
16956
17245
  document.body.classList.toggle(
16957
17246
  "df-review-theme-light",
16958
17247
  effectiveReviewTheme === "light"
@@ -17106,7 +17395,7 @@ var useReviewShellLoadTargetFrame = ({
17106
17395
  ]);
17107
17396
 
17108
17397
  // src/react-shell/hooks/use.review.shell.hotkeys.ts
17109
- import { useEffect as useEffect18 } from "react";
17398
+ import { useEffect as useEffect19 } from "react";
17110
17399
  var useReviewShellHotkeys = ({
17111
17400
  isRailHotkeyBlocked,
17112
17401
  isFigmaSettingsOpen,
@@ -17135,7 +17424,7 @@ var useReviewShellHotkeys = ({
17135
17424
  const setIsSitemapOpen = useReviewShellStore(
17136
17425
  (state) => state.setIsSitemapOpen
17137
17426
  );
17138
- useEffect18(() => {
17427
+ useEffect19(() => {
17139
17428
  if (mode === "idle" && !isRulerVisible && !isInitialPromptOpen && !isSitemapOpen && !isFigmaSettingsOpen) {
17140
17429
  return;
17141
17430
  }
@@ -17179,7 +17468,7 @@ var useReviewShellHotkeys = ({
17179
17468
  setIsInitialPromptOpen,
17180
17469
  setIsSitemapOpen
17181
17470
  ]);
17182
- useEffect18(() => {
17471
+ useEffect19(() => {
17183
17472
  const handleHotkey = (event) => {
17184
17473
  if (event.metaKey || event.ctrlKey || event.altKey || event.shiftKey) {
17185
17474
  return;
@@ -17212,7 +17501,7 @@ var useReviewShellHotkeys = ({
17212
17501
  onToggleRuler,
17213
17502
  onToggleTargetOverlay
17214
17503
  ]);
17215
- useEffect18(() => {
17504
+ useEffect19(() => {
17216
17505
  const handleRailHotkey = (event) => {
17217
17506
  if (isRailHotkeyBlocked || isEditableEventTarget(event)) return;
17218
17507
  const actions = [
@@ -17239,8 +17528,8 @@ var useReviewShellHotkeys = ({
17239
17528
  // src/react-shell/hooks/use.review.shell.refresh.ts
17240
17529
  import {
17241
17530
  useCallback as useCallback21,
17242
- useEffect as useEffect19,
17243
- useRef as useRef12
17531
+ useEffect as useEffect20,
17532
+ useRef as useRef13
17244
17533
  } from "react";
17245
17534
  var useReviewShellRefresh = ({
17246
17535
  activeAdapterEntry,
@@ -17253,7 +17542,7 @@ var useReviewShellRefresh = ({
17253
17542
  remoteAdapterEntry,
17254
17543
  storeApi
17255
17544
  }) => {
17256
- const itemRefreshIdRef = useRef12(0);
17545
+ const itemRefreshIdRef = useRef13(0);
17257
17546
  const refreshItems = useCallback21(
17258
17547
  async () => {
17259
17548
  const requestId = ++itemRefreshIdRef.current;
@@ -17291,13 +17580,13 @@ var useReviewShellRefresh = ({
17291
17580
  }),
17292
17581
  [localAdapterEntry, projectId, remoteAdapterEntry, storeApi]
17293
17582
  );
17294
- useEffect19(() => {
17583
+ useEffect20(() => {
17295
17584
  void refreshItems();
17296
17585
  }, [refreshItems]);
17297
- useEffect19(() => {
17586
+ useEffect20(() => {
17298
17587
  void refreshSitemapItems();
17299
17588
  }, [refreshSitemapItems]);
17300
- useEffect19(() => {
17589
+ useEffect20(() => {
17301
17590
  if (!isSitemapOpen) return;
17302
17591
  void refreshSitemapItems();
17303
17592
  }, [isSitemapOpen, refreshSitemapItems]);
@@ -17398,7 +17687,7 @@ var useReviewShellState = () => {
17398
17687
  // src/react-shell/hooks/use.review.shell.target.figma.ts
17399
17688
  import {
17400
17689
  useCallback as useCallback22,
17401
- useState as useState15
17690
+ useState as useState16
17402
17691
  } from "react";
17403
17692
  var useReviewShellTargetFigma = ({
17404
17693
  iframeRef,
@@ -17406,7 +17695,7 @@ var useReviewShellTargetFigma = ({
17406
17695
  isViewportFigmaOverlayAvailable,
17407
17696
  targetSrc
17408
17697
  }) => {
17409
- const [targetFigmaState, setTargetFigmaState] = useState15(null);
17698
+ const [targetFigmaState, setTargetFigmaState] = useState16(null);
17410
17699
  const targetFigmaConfig = targetFigmaState?.targetSrc === targetSrc ? targetFigmaState.config : null;
17411
17700
  const isFigmaOverlayAvailable = !isFigmaImageManagementEnabled && isViewportFigmaOverlayAvailable && Boolean(targetFigmaConfig);
17412
17701
  const refreshTargetFigmaConfig = useCallback22(() => {
@@ -17424,7 +17713,7 @@ var useReviewShellTargetFigma = ({
17424
17713
  // src/react-shell/hooks/use.review.side.panel.ts
17425
17714
  import {
17426
17715
  useCallback as useCallback23,
17427
- useEffect as useEffect20
17716
+ useEffect as useEffect21
17428
17717
  } from "react";
17429
17718
  var getAvailableSidePanel = (sidePanel, {
17430
17719
  isFigmaImageManagementEnabled,
@@ -17450,7 +17739,7 @@ var useReviewSidePanel = ({
17450
17739
  const isQaPanelVisible = isListVisible && sidePanel === "qa";
17451
17740
  const isSourceTreePanelVisible = isSourceInspectorEnabled && isListVisible && sidePanel === "source";
17452
17741
  const isFigmaImagesPanelVisible = isFigmaImageManagementEnabled && isListVisible && sidePanel === "figma-images";
17453
- useEffect20(() => {
17742
+ useEffect21(() => {
17454
17743
  const state = storeApi.getState();
17455
17744
  const availableSidePanel = getAvailableSidePanel(state.sidePanel, {
17456
17745
  isFigmaImageManagementEnabled,
@@ -17460,10 +17749,10 @@ var useReviewSidePanel = ({
17460
17749
  state.setSidePanel(availableSidePanel);
17461
17750
  }
17462
17751
  }, [isFigmaImageManagementEnabled, isSourceInspectorEnabled, storeApi]);
17463
- useEffect20(() => {
17752
+ useEffect21(() => {
17464
17753
  writeStoredReviewSidePanel(sidePanel);
17465
17754
  }, [sidePanel]);
17466
- useEffect20(() => {
17755
+ useEffect21(() => {
17467
17756
  writeStoredReviewSidePanelVisible(isListVisible);
17468
17757
  }, [isListVisible]);
17469
17758
  const openSidePanel = useCallback23(
@@ -17509,7 +17798,7 @@ var useReviewSidePanel = ({
17509
17798
  };
17510
17799
 
17511
17800
  // src/react-shell/hooks/use.review.source.inspector.ts
17512
- import { useCallback as useCallback24, useEffect as useEffect21, useRef as useRef13, useState as useState16 } from "react";
17801
+ import { useCallback as useCallback24, useEffect as useEffect22, useRef as useRef14, useState as useState17 } from "react";
17513
17802
 
17514
17803
  // src/react-shell/review/source.shortcut.style.ts
17515
17804
  function createSourceShortcutStyle(optionAttribute, fontOverlayAttribute) {
@@ -17595,9 +17884,9 @@ function useReviewSourceInspector({
17595
17884
  onCancelReviewMode
17596
17885
  }) {
17597
17886
  const showToast = useReviewToast();
17598
- const sourceShortcutCleanupRef = useRef13(null);
17599
- const sourceInspectorInteractionRef = useRef13(false);
17600
- const [sourceInspectorState, setSourceInspectorState] = useState16(null);
17887
+ const sourceShortcutCleanupRef = useRef14(null);
17888
+ const sourceInspectorInteractionRef = useRef14(false);
17889
+ const [sourceInspectorState, setSourceInspectorState] = useState17(null);
17601
17890
  const clearSourceInspector = useCallback24(() => {
17602
17891
  sourceInspectorInteractionRef.current = false;
17603
17892
  setSourceInspectorState(null);
@@ -17946,10 +18235,10 @@ function useReviewSourceInspector({
17946
18235
  showSourceOutlineForTarget,
17947
18236
  showSourceInspectorForTarget
17948
18237
  ]);
17949
- useEffect21(() => {
18238
+ useEffect22(() => {
17950
18239
  return cleanupSourceOpenShortcut;
17951
18240
  }, [cleanupSourceOpenShortcut]);
17952
- useEffect21(() => {
18241
+ useEffect22(() => {
17953
18242
  const frame = window.requestAnimationFrame(bindSourceOpenShortcut);
17954
18243
  return () => window.cancelAnimationFrame(frame);
17955
18244
  }, [bindSourceOpenShortcut, targetSrc]);
@@ -18530,6 +18819,7 @@ var ReviewShell = (props) => {
18530
18819
  [
18531
18820
  props.adapters,
18532
18821
  props.initialPrompt,
18822
+ props.qaPrompt,
18533
18823
  props.pages,
18534
18824
  props.presets,
18535
18825
  props.projectId,
@@ -18538,10 +18828,10 @@ var ReviewShell = (props) => {
18538
18828
  props.sourceRoot
18539
18829
  ]
18540
18830
  );
18541
- const [store] = useState17(
18831
+ const [store] = useState18(
18542
18832
  () => createReviewShellStore({ target: getInitialTargetSliceState(config) })
18543
18833
  );
18544
- const [refs] = useState17(createReviewShellRefs);
18834
+ const [refs] = useState18(createReviewShellRefs);
18545
18835
  return /* @__PURE__ */ jsx40(ReviewShellConfigProvider, { value: config, children: /* @__PURE__ */ jsx40(ReviewShellStoreProvider, { value: store, children: /* @__PURE__ */ jsx40(ReviewShellRefsProvider, { value: refs, children: /* @__PURE__ */ jsx40(ReviewShellContent, { ...props }) }) }) });
18546
18836
  };
18547
18837
  var ReviewShellContent = (props) => {
@@ -18566,9 +18856,9 @@ var ReviewShellContent = (props) => {
18566
18856
 
18567
18857
  // src/react-shell/figma/dev-overlay.tsx
18568
18858
  import React, {
18569
- useEffect as useEffect22,
18859
+ useEffect as useEffect23,
18570
18860
  useMemo as useMemo19,
18571
- useState as useState18
18861
+ useState as useState19
18572
18862
  } from "react";
18573
18863
  import { createRoot } from "react-dom/client";
18574
18864
  import { jsx as jsx41, jsxs as jsxs29 } from "react/jsx-runtime";
@@ -18642,9 +18932,9 @@ var FigmaDevOverlayWidget = ({
18642
18932
  store: matchedViewport ? figmaImageStore : null,
18643
18933
  viewport: activeViewport
18644
18934
  });
18645
- const [isPanelOpen, setIsPanelOpen] = useState18(false);
18646
- const [isWidgetVisible, setIsWidgetVisible] = useState18(false);
18647
- const [offsetYDraftByImageId, setOffsetYDraftByImageId] = useState18({});
18935
+ const [isPanelOpen, setIsPanelOpen] = useState19(false);
18936
+ const [isWidgetVisible, setIsWidgetVisible] = useState19(false);
18937
+ const [offsetYDraftByImageId, setOffsetYDraftByImageId] = useState19({});
18648
18938
  const selectedImage = selectedImageId ? images.find((image) => image.id === selectedImageId) ?? null : null;
18649
18939
  const selectedImageIndex = selectedImage ? images.indexOf(selectedImage) : -1;
18650
18940
  const selectedImageLabel = selectedImage ? getFigmaImageLabel(selectedImage, selectedImageIndex) : "Figma layer";
@@ -18658,7 +18948,7 @@ var FigmaDevOverlayWidget = ({
18658
18948
  }),
18659
18949
  [imageOverlayStates, images]
18660
18950
  );
18661
- useEffect22(() => {
18951
+ useEffect23(() => {
18662
18952
  if (!isWidgetVisible || !matchedViewport) {
18663
18953
  removeTargetFigmaImageOverlays(document);
18664
18954
  return;
@@ -18675,13 +18965,13 @@ var FigmaDevOverlayWidget = ({
18675
18965
  matchedViewport,
18676
18966
  setImageOverlayOffsetY
18677
18967
  ]);
18678
- useEffect22(
18968
+ useEffect23(
18679
18969
  () => () => {
18680
18970
  removeTargetFigmaImageOverlays(document);
18681
18971
  },
18682
18972
  []
18683
18973
  );
18684
- useEffect22(() => {
18974
+ useEffect23(() => {
18685
18975
  const handleKeyDown = (event) => {
18686
18976
  if (!isHotkey(event, "Shift+F") || isEditableFigmaDevOverlayEventTarget(event)) {
18687
18977
  return;
@@ -18828,10 +19118,10 @@ var FigmaDevOverlayWidget = ({
18828
19118
  );
18829
19119
  };
18830
19120
  function useCurrentPageUrl(pageUrl, reviewPathPrefix) {
18831
- const [currentPageUrl, setCurrentPageUrl] = useState18(
19121
+ const [currentPageUrl, setCurrentPageUrl] = useState19(
18832
19122
  () => getFigmaDevOverlayPageUrl(pageUrl, reviewPathPrefix)
18833
19123
  );
18834
- useEffect22(() => {
19124
+ useEffect23(() => {
18835
19125
  const updatePageUrl = () => {
18836
19126
  setCurrentPageUrl(getFigmaDevOverlayPageUrl(pageUrl, reviewPathPrefix));
18837
19127
  };
@@ -18852,8 +19142,8 @@ function isEditableFigmaDevOverlayEventTarget(event) {
18852
19142
  return tagName === "INPUT" || tagName === "TEXTAREA" || tagName === "SELECT" || element.isContentEditable === true;
18853
19143
  }
18854
19144
  function useCurrentViewport() {
18855
- const [viewport, setViewport] = useState18(getCurrentViewportSize);
18856
- useEffect22(() => {
19145
+ const [viewport, setViewport] = useState19(getCurrentViewportSize);
19146
+ useEffect23(() => {
18857
19147
  const updateViewport = () => setViewport(getCurrentViewportSize());
18858
19148
  window.addEventListener("resize", updateViewport);
18859
19149
  window.addEventListener("orientationchange", updateViewport);
@@ -19446,8 +19736,10 @@ lucide-react/dist/esm/context.mjs:
19446
19736
  lucide-react/dist/esm/Icon.mjs:
19447
19737
  lucide-react/dist/esm/createLucideIcon.mjs:
19448
19738
  lucide-react/dist/esm/icons/bot.mjs:
19739
+ lucide-react/dist/esm/icons/check-check.mjs:
19449
19740
  lucide-react/dist/esm/icons/chevron-down.mjs:
19450
19741
  lucide-react/dist/esm/icons/chevron-right.mjs:
19742
+ lucide-react/dist/esm/icons/chevron-up.mjs:
19451
19743
  lucide-react/dist/esm/icons/circle-question-mark.mjs:
19452
19744
  lucide-react/dist/esm/icons/code-xml.mjs:
19453
19745
  lucide-react/dist/esm/icons/contrast.mjs: