@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.
@@ -40,7 +40,7 @@ __export(react_shell_exports, {
40
40
  mountReviewShell: () => mountReviewShell
41
41
  });
42
42
  module.exports = __toCommonJS(react_shell_exports);
43
- var import_react57 = __toESM(require("react"), 1);
43
+ var import_react58 = __toESM(require("react"), 1);
44
44
  var import_client2 = require("react-dom/client");
45
45
 
46
46
  // src/core/typography.tokens.ts
@@ -2485,7 +2485,9 @@ var reviewShellQaPanelStyle = `
2485
2485
  .df-review-status-toggle-row {
2486
2486
  display: flex;
2487
2487
  align-items: center;
2488
+ justify-content: space-between;
2488
2489
  gap: 6px;
2490
+ width: 100%;
2489
2491
  min-width: 0;
2490
2492
  overflow-x: auto;
2491
2493
  overflow-y: hidden;
@@ -2529,10 +2531,31 @@ var reviewShellQaPanelStyle = `
2529
2531
  opacity: 0.72;
2530
2532
  }
2531
2533
 
2534
+ .df-review-status-preset-toggle {
2535
+ width: 34px;
2536
+ min-width: 34px;
2537
+ padding: 0;
2538
+ }
2539
+
2540
+ .df-review-status-preset-toggle svg {
2541
+ width: 14px;
2542
+ height: 14px;
2543
+ }
2544
+
2532
2545
  .df-review-status-toggle.is-active {
2533
2546
  color: var(--df-review-text);
2534
2547
  }
2535
2548
 
2549
+ .df-review-status-preset-toggle.is-active {
2550
+ border-color: var(--df-review-line);
2551
+ color: var(--df-review-muted);
2552
+ background: var(--df-review-line-soft);
2553
+ }
2554
+
2555
+ .df-review-status-toggle.is-status-todo {
2556
+ flex: 1 1 auto;
2557
+ }
2558
+
2536
2559
  .df-review-status-toggle.is-status-todo.is-active {
2537
2560
  border-color: var(--df-review-line);
2538
2561
  color: var(--df-review-muted);
@@ -2557,10 +2580,15 @@ var reviewShellQaPanelStyle = `
2557
2580
  background: var(--df-review-purple-soft);
2558
2581
  }
2559
2582
 
2583
+ .df-review-status-toggle.is-status-done {
2584
+ margin-right: var(--df-review-space-2);
2585
+ color: var(--df-review-muted);
2586
+ }
2587
+
2560
2588
  .df-review-status-toggle.is-status-done.is-active {
2561
- border-color: rgba(99, 215, 199, 0.34);
2562
- color: var(--df-review-area);
2563
- background: var(--df-review-area-soft);
2589
+ border-color: var(--df-review-line);
2590
+ color: var(--df-review-muted);
2591
+ background: var(--df-review-line-soft);
2564
2592
  }
2565
2593
 
2566
2594
  .df-review-filter-tabs {
@@ -2714,7 +2742,8 @@ var reviewShellQaPanelStyle = `
2714
2742
  box-shadow: inset 0 0 0 1px var(--df-review-accent-hover), 0 0 0 3px rgba(124, 199, 255, 0.12);
2715
2743
  }
2716
2744
 
2717
- .df-review-item-card.is-overlay-hidden .df-review-item-main {
2745
+ .df-review-item-card.is-overlay-hidden .df-review-item-main,
2746
+ .df-review-item-card.is-overlay-hidden .df-review-item-body {
2718
2747
  opacity: 0.68;
2719
2748
  }
2720
2749
 
@@ -2726,7 +2755,8 @@ var reviewShellQaPanelStyle = `
2726
2755
  min-width: 0;
2727
2756
  }
2728
2757
 
2729
- .df-review-item-main {
2758
+ .df-review-item-main,
2759
+ .df-review-item-body {
2730
2760
  display: grid;
2731
2761
  gap: 4px;
2732
2762
  min-width: 0;
@@ -2738,7 +2768,7 @@ var reviewShellQaPanelStyle = `
2738
2768
  }
2739
2769
 
2740
2770
  .df-review-item-main strong,
2741
- .df-review-item-main p {
2771
+ .df-review-item-body p {
2742
2772
  margin: 0;
2743
2773
  }
2744
2774
 
@@ -2762,6 +2792,73 @@ var reviewShellQaPanelStyle = `
2762
2792
  white-space: pre-wrap;
2763
2793
  }
2764
2794
 
2795
+ .df-review-item-comment-shell {
2796
+ display: grid;
2797
+ gap: 2px;
2798
+ min-width: 0;
2799
+ }
2800
+
2801
+ .df-review-item-comment-more {
2802
+ display: flex;
2803
+ align-items: center;
2804
+ justify-content: center;
2805
+ gap: 5px;
2806
+ width: 100%;
2807
+ min-width: 0;
2808
+ min-height: 37px;
2809
+ border: 0;
2810
+ padding: 10px 0 7px;
2811
+ color: var(--df-review-muted);
2812
+ background: transparent;
2813
+ cursor: pointer;
2814
+ font-size: var(--df-review-font-size-xs);
2815
+ font-weight: var(--df-review-font-weight-normal);
2816
+ line-height: 1;
2817
+ transition: color 140ms ease;
2818
+ }
2819
+
2820
+ .df-review-item-comment-more::before,
2821
+ .df-review-item-comment-more::after {
2822
+ content: '';
2823
+ flex: 1 1 auto;
2824
+ height: 1px;
2825
+ border-radius: var(--df-review-radius-pill);
2826
+ background: var(--df-review-line-soft);
2827
+ }
2828
+
2829
+ .df-review-item-comment-more span {
2830
+ flex: 0 0 auto;
2831
+ }
2832
+
2833
+ .df-review-item-comment-more:hover,
2834
+ .df-review-item-comment-more:focus-visible {
2835
+ color: var(--df-review-accent);
2836
+ outline: none;
2837
+ }
2838
+
2839
+ .df-review-item-comment-more svg {
2840
+ flex: 0 0 auto;
2841
+ width: 14px;
2842
+ height: 14px;
2843
+ fill: none;
2844
+ stroke: currentColor;
2845
+ stroke-linecap: round;
2846
+ stroke-linejoin: round;
2847
+ stroke-width: 2;
2848
+ }
2849
+
2850
+ .df-review-item-comment.is-collapsed {
2851
+ max-height: 140px;
2852
+ overflow-x: hidden;
2853
+ overflow-y: auto;
2854
+ scrollbar-width: thin;
2855
+ }
2856
+
2857
+ .df-review-item-comment.is-expanded {
2858
+ max-height: none;
2859
+ overflow: visible;
2860
+ }
2861
+
2765
2862
  .df-review-item-comment.is-primary {
2766
2863
  padding: 5px 0;
2767
2864
  color: var(--df-review-text);
@@ -2823,7 +2920,7 @@ var reviewShellQaPanelStyle = `
2823
2920
  white-space: nowrap;
2824
2921
  }
2825
2922
 
2826
- .df-review-item-main small {
2923
+ .df-review-item-body small {
2827
2924
  color: var(--df-review-subtle);
2828
2925
  font-size: var(--df-review-font-size-xs);
2829
2926
  }
@@ -4174,11 +4271,17 @@ var reviewShellStageStyle = `
4174
4271
 
4175
4272
  .df-review-outside-marker {
4176
4273
  --df-review-outside-marker-color: #7cc7ff;
4274
+ --df-review-outside-marker-connector-top: 10px;
4275
+ --df-review-outside-marker-connector-stem-top: 10px;
4276
+ --df-review-outside-marker-connector-stem-height: 0px;
4277
+ --df-review-outside-marker-z-index: 1;
4177
4278
  position: absolute;
4178
4279
  right: 10px;
4280
+ z-index: var(--df-review-outside-marker-z-index);
4179
4281
  display: inline-flex;
4180
4282
  align-items: center;
4181
4283
  justify-content: center;
4284
+ width: max-content;
4182
4285
  min-width: 28px;
4183
4286
  height: 22px;
4184
4287
  padding: 0 6px;
@@ -4190,21 +4293,33 @@ var reviewShellStageStyle = `
4190
4293
  font-size: var(--df-review-font-size-2xs);
4191
4294
  font-weight: var(--df-review-font-weight-emphasis);
4192
4295
  line-height: 1;
4296
+ white-space: nowrap;
4193
4297
  pointer-events: auto;
4194
4298
  }
4195
4299
 
4300
+ .df-review-outside-marker::before,
4196
4301
  .df-review-outside-marker::after {
4197
4302
  content: "";
4198
4303
  position: absolute;
4199
- left: 100%;
4200
- top: 10px;
4201
- width: 10px;
4202
- height: 1px;
4203
4304
  background: var(--df-review-outside-marker-color);
4204
4305
  opacity: 0.72;
4205
4306
  pointer-events: none;
4206
4307
  }
4207
4308
 
4309
+ .df-review-outside-marker::before {
4310
+ left: 100%;
4311
+ top: var(--df-review-outside-marker-connector-stem-top);
4312
+ width: 1px;
4313
+ height: var(--df-review-outside-marker-connector-stem-height);
4314
+ }
4315
+
4316
+ .df-review-outside-marker::after {
4317
+ left: 100%;
4318
+ top: var(--df-review-outside-marker-connector-top);
4319
+ width: 10px;
4320
+ height: 1px;
4321
+ }
4322
+
4208
4323
  .df-review-outside-marker.is-scope-tablet {
4209
4324
  --df-review-outside-marker-color: #63d7c7;
4210
4325
  }
@@ -5241,7 +5356,7 @@ function ensureReviewShellStyle() {
5241
5356
  }
5242
5357
 
5243
5358
  // src/react-shell/review/shell.tsx
5244
- var import_react55 = require("react");
5359
+ var import_react56 = require("react");
5245
5360
 
5246
5361
  // src/react-shell/store/store.context.tsx
5247
5362
  var import_react = require("react");
@@ -5391,69 +5506,80 @@ var __iconNode = [
5391
5506
  ];
5392
5507
  var Bot = createLucideIcon("bot", __iconNode);
5393
5508
 
5509
+ // node_modules/.pnpm/lucide-react@1.20.0_react@19.2.7/node_modules/lucide-react/dist/esm/icons/check-check.mjs
5510
+ var __iconNode2 = [
5511
+ ["path", { d: "M18 6 7 17l-5-5", key: "116fxf" }],
5512
+ ["path", { d: "m22 10-7.5 7.5L13 16", key: "ke71qq" }]
5513
+ ];
5514
+ var CheckCheck = createLucideIcon("check-check", __iconNode2);
5515
+
5394
5516
  // node_modules/.pnpm/lucide-react@1.20.0_react@19.2.7/node_modules/lucide-react/dist/esm/icons/chevron-down.mjs
5395
- var __iconNode2 = [["path", { d: "m6 9 6 6 6-6", key: "qrunsl" }]];
5396
- var ChevronDown = createLucideIcon("chevron-down", __iconNode2);
5517
+ var __iconNode3 = [["path", { d: "m6 9 6 6 6-6", key: "qrunsl" }]];
5518
+ var ChevronDown = createLucideIcon("chevron-down", __iconNode3);
5397
5519
 
5398
5520
  // node_modules/.pnpm/lucide-react@1.20.0_react@19.2.7/node_modules/lucide-react/dist/esm/icons/chevron-right.mjs
5399
- var __iconNode3 = [["path", { d: "m9 18 6-6-6-6", key: "mthhwq" }]];
5400
- var ChevronRight = createLucideIcon("chevron-right", __iconNode3);
5521
+ var __iconNode4 = [["path", { d: "m9 18 6-6-6-6", key: "mthhwq" }]];
5522
+ var ChevronRight = createLucideIcon("chevron-right", __iconNode4);
5523
+
5524
+ // node_modules/.pnpm/lucide-react@1.20.0_react@19.2.7/node_modules/lucide-react/dist/esm/icons/chevron-up.mjs
5525
+ var __iconNode5 = [["path", { d: "m18 15-6-6-6 6", key: "153udz" }]];
5526
+ var ChevronUp = createLucideIcon("chevron-up", __iconNode5);
5401
5527
 
5402
5528
  // node_modules/.pnpm/lucide-react@1.20.0_react@19.2.7/node_modules/lucide-react/dist/esm/icons/circle-question-mark.mjs
5403
- var __iconNode4 = [
5529
+ var __iconNode6 = [
5404
5530
  ["circle", { cx: "12", cy: "12", r: "10", key: "1mglay" }],
5405
5531
  ["path", { d: "M9.09 9a3 3 0 0 1 5.83 1c0 2-3 3-3 3", key: "1u773s" }],
5406
5532
  ["path", { d: "M12 17h.01", key: "p32p05" }]
5407
5533
  ];
5408
- var CircleQuestionMark = createLucideIcon("circle-question-mark", __iconNode4);
5534
+ var CircleQuestionMark = createLucideIcon("circle-question-mark", __iconNode6);
5409
5535
 
5410
5536
  // node_modules/.pnpm/lucide-react@1.20.0_react@19.2.7/node_modules/lucide-react/dist/esm/icons/code-xml.mjs
5411
- var __iconNode5 = [
5537
+ var __iconNode7 = [
5412
5538
  ["path", { d: "m18 16 4-4-4-4", key: "1inbqp" }],
5413
5539
  ["path", { d: "m6 8-4 4 4 4", key: "15zrgr" }],
5414
5540
  ["path", { d: "m14.5 4-5 16", key: "e7oirm" }]
5415
5541
  ];
5416
- var CodeXml = createLucideIcon("code-xml", __iconNode5);
5542
+ var CodeXml = createLucideIcon("code-xml", __iconNode7);
5417
5543
 
5418
5544
  // node_modules/.pnpm/lucide-react@1.20.0_react@19.2.7/node_modules/lucide-react/dist/esm/icons/contrast.mjs
5419
- var __iconNode6 = [
5545
+ var __iconNode8 = [
5420
5546
  ["circle", { cx: "12", cy: "12", r: "10", key: "1mglay" }],
5421
5547
  ["path", { d: "M12 18a6 6 0 0 0 0-12v12z", key: "j4l70d" }]
5422
5548
  ];
5423
- var Contrast = createLucideIcon("contrast", __iconNode6);
5549
+ var Contrast = createLucideIcon("contrast", __iconNode8);
5424
5550
 
5425
5551
  // node_modules/.pnpm/lucide-react@1.20.0_react@19.2.7/node_modules/lucide-react/dist/esm/icons/copy.mjs
5426
- var __iconNode7 = [
5552
+ var __iconNode9 = [
5427
5553
  ["rect", { width: "14", height: "14", x: "8", y: "8", rx: "2", ry: "2", key: "17jyea" }],
5428
5554
  ["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" }]
5429
5555
  ];
5430
- var Copy = createLucideIcon("copy", __iconNode7);
5556
+ var Copy = createLucideIcon("copy", __iconNode9);
5431
5557
 
5432
5558
  // node_modules/.pnpm/lucide-react@1.20.0_react@19.2.7/node_modules/lucide-react/dist/esm/icons/corner-up-right.mjs
5433
- var __iconNode8 = [
5559
+ var __iconNode10 = [
5434
5560
  ["path", { d: "m15 14 5-5-5-5", key: "12vg1m" }],
5435
5561
  ["path", { d: "M4 20v-7a4 4 0 0 1 4-4h12", key: "1lu4f8" }]
5436
5562
  ];
5437
- var CornerUpRight = createLucideIcon("corner-up-right", __iconNode8);
5563
+ var CornerUpRight = createLucideIcon("corner-up-right", __iconNode10);
5438
5564
 
5439
5565
  // node_modules/.pnpm/lucide-react@1.20.0_react@19.2.7/node_modules/lucide-react/dist/esm/icons/database.mjs
5440
- var __iconNode9 = [
5566
+ var __iconNode11 = [
5441
5567
  ["ellipse", { cx: "12", cy: "5", rx: "9", ry: "3", key: "msslwz" }],
5442
5568
  ["path", { d: "M3 5V19A9 3 0 0 0 21 19V5", key: "1wlel7" }],
5443
5569
  ["path", { d: "M3 12A9 3 0 0 0 21 12", key: "mv7ke4" }]
5444
5570
  ];
5445
- var Database = createLucideIcon("database", __iconNode9);
5571
+ var Database = createLucideIcon("database", __iconNode11);
5446
5572
 
5447
5573
  // node_modules/.pnpm/lucide-react@1.20.0_react@19.2.7/node_modules/lucide-react/dist/esm/icons/external-link.mjs
5448
- var __iconNode10 = [
5574
+ var __iconNode12 = [
5449
5575
  ["path", { d: "M15 3h6v6", key: "1q9fwt" }],
5450
5576
  ["path", { d: "M10 14 21 3", key: "gplh6r" }],
5451
5577
  ["path", { d: "M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6", key: "a6xqqp" }]
5452
5578
  ];
5453
- var ExternalLink = createLucideIcon("external-link", __iconNode10);
5579
+ var ExternalLink = createLucideIcon("external-link", __iconNode12);
5454
5580
 
5455
5581
  // node_modules/.pnpm/lucide-react@1.20.0_react@19.2.7/node_modules/lucide-react/dist/esm/icons/eye-off.mjs
5456
- var __iconNode11 = [
5582
+ var __iconNode13 = [
5457
5583
  [
5458
5584
  "path",
5459
5585
  {
@@ -5471,10 +5597,10 @@ var __iconNode11 = [
5471
5597
  ],
5472
5598
  ["path", { d: "m2 2 20 20", key: "1ooewy" }]
5473
5599
  ];
5474
- var EyeOff = createLucideIcon("eye-off", __iconNode11);
5600
+ var EyeOff = createLucideIcon("eye-off", __iconNode13);
5475
5601
 
5476
5602
  // node_modules/.pnpm/lucide-react@1.20.0_react@19.2.7/node_modules/lucide-react/dist/esm/icons/eye.mjs
5477
- var __iconNode12 = [
5603
+ var __iconNode14 = [
5478
5604
  [
5479
5605
  "path",
5480
5606
  {
@@ -5484,59 +5610,59 @@ var __iconNode12 = [
5484
5610
  ],
5485
5611
  ["circle", { cx: "12", cy: "12", r: "3", key: "1v7zrd" }]
5486
5612
  ];
5487
- var Eye = createLucideIcon("eye", __iconNode12);
5613
+ var Eye = createLucideIcon("eye", __iconNode14);
5488
5614
 
5489
5615
  // node_modules/.pnpm/lucide-react@1.20.0_react@19.2.7/node_modules/lucide-react/dist/esm/icons/image.mjs
5490
- var __iconNode13 = [
5616
+ var __iconNode15 = [
5491
5617
  ["rect", { width: "18", height: "18", x: "3", y: "3", rx: "2", ry: "2", key: "1m3agn" }],
5492
5618
  ["circle", { cx: "9", cy: "9", r: "2", key: "af1f0g" }],
5493
5619
  ["path", { d: "m21 15-3.086-3.086a2 2 0 0 0-2.828 0L6 21", key: "1xmnt7" }]
5494
5620
  ];
5495
- var Image2 = createLucideIcon("image", __iconNode13);
5621
+ var Image2 = createLucideIcon("image", __iconNode15);
5496
5622
 
5497
5623
  // node_modules/.pnpm/lucide-react@1.20.0_react@19.2.7/node_modules/lucide-react/dist/esm/icons/layout-grid.mjs
5498
- var __iconNode14 = [
5624
+ var __iconNode16 = [
5499
5625
  ["rect", { width: "7", height: "7", x: "3", y: "3", rx: "1", key: "1g98yp" }],
5500
5626
  ["rect", { width: "7", height: "7", x: "14", y: "3", rx: "1", key: "6d4xhi" }],
5501
5627
  ["rect", { width: "7", height: "7", x: "14", y: "14", rx: "1", key: "nxv5o0" }],
5502
5628
  ["rect", { width: "7", height: "7", x: "3", y: "14", rx: "1", key: "1bb6yr" }]
5503
5629
  ];
5504
- var LayoutGrid = createLucideIcon("layout-grid", __iconNode14);
5630
+ var LayoutGrid = createLucideIcon("layout-grid", __iconNode16);
5505
5631
 
5506
5632
  // node_modules/.pnpm/lucide-react@1.20.0_react@19.2.7/node_modules/lucide-react/dist/esm/icons/link-2.mjs
5507
- var __iconNode15 = [
5633
+ var __iconNode17 = [
5508
5634
  ["path", { d: "M9 17H7A5 5 0 0 1 7 7h2", key: "8i5ue5" }],
5509
5635
  ["path", { d: "M15 7h2a5 5 0 1 1 0 10h-2", key: "1b9ql8" }],
5510
5636
  ["line", { x1: "8", x2: "16", y1: "12", y2: "12", key: "1jonct" }]
5511
5637
  ];
5512
- var Link2 = createLucideIcon("link-2", __iconNode15);
5638
+ var Link2 = createLucideIcon("link-2", __iconNode17);
5513
5639
 
5514
5640
  // node_modules/.pnpm/lucide-react@1.20.0_react@19.2.7/node_modules/lucide-react/dist/esm/icons/list-checks.mjs
5515
- var __iconNode16 = [
5641
+ var __iconNode18 = [
5516
5642
  ["path", { d: "M13 5h8", key: "a7qcls" }],
5517
5643
  ["path", { d: "M13 12h8", key: "h98zly" }],
5518
5644
  ["path", { d: "M13 19h8", key: "c3s6r1" }],
5519
5645
  ["path", { d: "m3 17 2 2 4-4", key: "1jhpwq" }],
5520
5646
  ["path", { d: "m3 7 2 2 4-4", key: "1obspn" }]
5521
5647
  ];
5522
- var ListChecks = createLucideIcon("list-checks", __iconNode16);
5648
+ var ListChecks = createLucideIcon("list-checks", __iconNode18);
5523
5649
 
5524
5650
  // node_modules/.pnpm/lucide-react@1.20.0_react@19.2.7/node_modules/lucide-react/dist/esm/icons/lock-open.mjs
5525
- var __iconNode17 = [
5651
+ var __iconNode19 = [
5526
5652
  ["rect", { width: "18", height: "11", x: "3", y: "11", rx: "2", ry: "2", key: "1w4ew1" }],
5527
5653
  ["path", { d: "M7 11V7a5 5 0 0 1 9.9-1", key: "1mm8w8" }]
5528
5654
  ];
5529
- var LockOpen = createLucideIcon("lock-open", __iconNode17);
5655
+ var LockOpen = createLucideIcon("lock-open", __iconNode19);
5530
5656
 
5531
5657
  // node_modules/.pnpm/lucide-react@1.20.0_react@19.2.7/node_modules/lucide-react/dist/esm/icons/lock.mjs
5532
- var __iconNode18 = [
5658
+ var __iconNode20 = [
5533
5659
  ["rect", { width: "18", height: "11", x: "3", y: "11", rx: "2", ry: "2", key: "1w4ew1" }],
5534
5660
  ["path", { d: "M7 11V7a5 5 0 0 1 10 0v4", key: "fwvmzm" }]
5535
5661
  ];
5536
- var Lock = createLucideIcon("lock", __iconNode18);
5662
+ var Lock = createLucideIcon("lock", __iconNode20);
5537
5663
 
5538
5664
  // node_modules/.pnpm/lucide-react@1.20.0_react@19.2.7/node_modules/lucide-react/dist/esm/icons/map.mjs
5539
- var __iconNode19 = [
5665
+ var __iconNode21 = [
5540
5666
  [
5541
5667
  "path",
5542
5668
  {
@@ -5547,27 +5673,27 @@ var __iconNode19 = [
5547
5673
  ["path", { d: "M15 5.764v15", key: "1pn4in" }],
5548
5674
  ["path", { d: "M9 3.236v15", key: "1uimfh" }]
5549
5675
  ];
5550
- var Map2 = createLucideIcon("map", __iconNode19);
5676
+ var Map2 = createLucideIcon("map", __iconNode21);
5551
5677
 
5552
5678
  // node_modules/.pnpm/lucide-react@1.20.0_react@19.2.7/node_modules/lucide-react/dist/esm/icons/maximize-2.mjs
5553
- var __iconNode20 = [
5679
+ var __iconNode22 = [
5554
5680
  ["path", { d: "M15 3h6v6", key: "1q9fwt" }],
5555
5681
  ["path", { d: "m21 3-7 7", key: "1l2asr" }],
5556
5682
  ["path", { d: "m3 21 7-7", key: "tjx5ai" }],
5557
5683
  ["path", { d: "M9 21H3v-6", key: "wtvkvv" }]
5558
5684
  ];
5559
- var Maximize2 = createLucideIcon("maximize-2", __iconNode20);
5685
+ var Maximize2 = createLucideIcon("maximize-2", __iconNode22);
5560
5686
 
5561
5687
  // node_modules/.pnpm/lucide-react@1.20.0_react@19.2.7/node_modules/lucide-react/dist/esm/icons/monitor.mjs
5562
- var __iconNode21 = [
5688
+ var __iconNode23 = [
5563
5689
  ["rect", { width: "20", height: "14", x: "2", y: "3", rx: "2", key: "48i651" }],
5564
5690
  ["line", { x1: "8", x2: "16", y1: "21", y2: "21", key: "1svkeh" }],
5565
5691
  ["line", { x1: "12", x2: "12", y1: "17", y2: "21", key: "vw1qmm" }]
5566
5692
  ];
5567
- var Monitor = createLucideIcon("monitor", __iconNode21);
5693
+ var Monitor = createLucideIcon("monitor", __iconNode23);
5568
5694
 
5569
5695
  // node_modules/.pnpm/lucide-react@1.20.0_react@19.2.7/node_modules/lucide-react/dist/esm/icons/moon.mjs
5570
- var __iconNode22 = [
5696
+ var __iconNode24 = [
5571
5697
  [
5572
5698
  "path",
5573
5699
  {
@@ -5576,28 +5702,28 @@ var __iconNode22 = [
5576
5702
  }
5577
5703
  ]
5578
5704
  ];
5579
- var Moon = createLucideIcon("moon", __iconNode22);
5705
+ var Moon = createLucideIcon("moon", __iconNode24);
5580
5706
 
5581
5707
  // node_modules/.pnpm/lucide-react@1.20.0_react@19.2.7/node_modules/lucide-react/dist/esm/icons/move-vertical.mjs
5582
- var __iconNode23 = [
5708
+ var __iconNode25 = [
5583
5709
  ["path", { d: "M12 2v20", key: "t6zp3m" }],
5584
5710
  ["path", { d: "m8 18 4 4 4-4", key: "bh5tu3" }],
5585
5711
  ["path", { d: "m8 6 4-4 4 4", key: "ybng9g" }]
5586
5712
  ];
5587
- var MoveVertical = createLucideIcon("move-vertical", __iconNode23);
5713
+ var MoveVertical = createLucideIcon("move-vertical", __iconNode25);
5588
5714
 
5589
5715
  // node_modules/.pnpm/lucide-react@1.20.0_react@19.2.7/node_modules/lucide-react/dist/esm/icons/network.mjs
5590
- var __iconNode24 = [
5716
+ var __iconNode26 = [
5591
5717
  ["rect", { x: "16", y: "16", width: "6", height: "6", rx: "1", key: "4q2zg0" }],
5592
5718
  ["rect", { x: "2", y: "16", width: "6", height: "6", rx: "1", key: "8cvhb9" }],
5593
5719
  ["rect", { x: "9", y: "2", width: "6", height: "6", rx: "1", key: "1egb70" }],
5594
5720
  ["path", { d: "M5 16v-3a1 1 0 0 1 1-1h12a1 1 0 0 1 1 1v3", key: "1jsf9p" }],
5595
5721
  ["path", { d: "M12 12V8", key: "2874zd" }]
5596
5722
  ];
5597
- var Network = createLucideIcon("network", __iconNode24);
5723
+ var Network = createLucideIcon("network", __iconNode26);
5598
5724
 
5599
5725
  // node_modules/.pnpm/lucide-react@1.20.0_react@19.2.7/node_modules/lucide-react/dist/esm/icons/pencil.mjs
5600
- var __iconNode25 = [
5726
+ var __iconNode27 = [
5601
5727
  [
5602
5728
  "path",
5603
5729
  {
@@ -5607,32 +5733,32 @@ var __iconNode25 = [
5607
5733
  ],
5608
5734
  ["path", { d: "m15 5 4 4", key: "1mk7zo" }]
5609
5735
  ];
5610
- var Pencil = createLucideIcon("pencil", __iconNode25);
5736
+ var Pencil = createLucideIcon("pencil", __iconNode27);
5611
5737
 
5612
5738
  // node_modules/.pnpm/lucide-react@1.20.0_react@19.2.7/node_modules/lucide-react/dist/esm/icons/plus.mjs
5613
- var __iconNode26 = [
5739
+ var __iconNode28 = [
5614
5740
  ["path", { d: "M5 12h14", key: "1ays0h" }],
5615
5741
  ["path", { d: "M12 5v14", key: "s699le" }]
5616
5742
  ];
5617
- var Plus = createLucideIcon("plus", __iconNode26);
5743
+ var Plus = createLucideIcon("plus", __iconNode28);
5618
5744
 
5619
5745
  // node_modules/.pnpm/lucide-react@1.20.0_react@19.2.7/node_modules/lucide-react/dist/esm/icons/rectangle-horizontal.mjs
5620
- var __iconNode27 = [
5746
+ var __iconNode29 = [
5621
5747
  ["rect", { width: "20", height: "12", x: "2", y: "6", rx: "2", key: "9lu3g6" }]
5622
5748
  ];
5623
- var RectangleHorizontal = createLucideIcon("rectangle-horizontal", __iconNode27);
5749
+ var RectangleHorizontal = createLucideIcon("rectangle-horizontal", __iconNode29);
5624
5750
 
5625
5751
  // node_modules/.pnpm/lucide-react@1.20.0_react@19.2.7/node_modules/lucide-react/dist/esm/icons/refresh-cw.mjs
5626
- var __iconNode28 = [
5752
+ var __iconNode30 = [
5627
5753
  ["path", { d: "M3 12a9 9 0 0 1 9-9 9.75 9.75 0 0 1 6.74 2.74L21 8", key: "v9h5vc" }],
5628
5754
  ["path", { d: "M21 3v5h-5", key: "1q7to0" }],
5629
5755
  ["path", { d: "M21 12a9 9 0 0 1-9 9 9.75 9.75 0 0 1-6.74-2.74L3 16", key: "3uifl3" }],
5630
5756
  ["path", { d: "M8 16H3v5", key: "1cv678" }]
5631
5757
  ];
5632
- var RefreshCw = createLucideIcon("refresh-cw", __iconNode28);
5758
+ var RefreshCw = createLucideIcon("refresh-cw", __iconNode30);
5633
5759
 
5634
5760
  // node_modules/.pnpm/lucide-react@1.20.0_react@19.2.7/node_modules/lucide-react/dist/esm/icons/ruler.mjs
5635
- var __iconNode29 = [
5761
+ var __iconNode31 = [
5636
5762
  [
5637
5763
  "path",
5638
5764
  {
@@ -5645,26 +5771,26 @@ var __iconNode29 = [
5645
5771
  ["path", { d: "m8.5 6.5 2-2", key: "vc6u1g" }],
5646
5772
  ["path", { d: "m17.5 15.5 2-2", key: "wo5hmg" }]
5647
5773
  ];
5648
- var Ruler = createLucideIcon("ruler", __iconNode29);
5774
+ var Ruler = createLucideIcon("ruler", __iconNode31);
5649
5775
 
5650
5776
  // node_modules/.pnpm/lucide-react@1.20.0_react@19.2.7/node_modules/lucide-react/dist/esm/icons/scan.mjs
5651
- var __iconNode30 = [
5777
+ var __iconNode32 = [
5652
5778
  ["path", { d: "M3 7V5a2 2 0 0 1 2-2h2", key: "aa7l1z" }],
5653
5779
  ["path", { d: "M17 3h2a2 2 0 0 1 2 2v2", key: "4qcy5o" }],
5654
5780
  ["path", { d: "M21 17v2a2 2 0 0 1-2 2h-2", key: "6vwrx8" }],
5655
5781
  ["path", { d: "M7 21H5a2 2 0 0 1-2-2v-2", key: "ioqczr" }]
5656
5782
  ];
5657
- var Scan = createLucideIcon("scan", __iconNode30);
5783
+ var Scan = createLucideIcon("scan", __iconNode32);
5658
5784
 
5659
5785
  // node_modules/.pnpm/lucide-react@1.20.0_react@19.2.7/node_modules/lucide-react/dist/esm/icons/search.mjs
5660
- var __iconNode31 = [
5786
+ var __iconNode33 = [
5661
5787
  ["path", { d: "m21 21-4.34-4.34", key: "14j7rj" }],
5662
5788
  ["circle", { cx: "11", cy: "11", r: "8", key: "4ej97u" }]
5663
5789
  ];
5664
- var Search = createLucideIcon("search", __iconNode31);
5790
+ var Search = createLucideIcon("search", __iconNode33);
5665
5791
 
5666
5792
  // node_modules/.pnpm/lucide-react@1.20.0_react@19.2.7/node_modules/lucide-react/dist/esm/icons/settings.mjs
5667
- var __iconNode32 = [
5793
+ var __iconNode34 = [
5668
5794
  [
5669
5795
  "path",
5670
5796
  {
@@ -5674,17 +5800,17 @@ var __iconNode32 = [
5674
5800
  ],
5675
5801
  ["circle", { cx: "12", cy: "12", r: "3", key: "1v7zrd" }]
5676
5802
  ];
5677
- var Settings = createLucideIcon("settings", __iconNode32);
5803
+ var Settings = createLucideIcon("settings", __iconNode34);
5678
5804
 
5679
5805
  // node_modules/.pnpm/lucide-react@1.20.0_react@19.2.7/node_modules/lucide-react/dist/esm/icons/smartphone.mjs
5680
- var __iconNode33 = [
5806
+ var __iconNode35 = [
5681
5807
  ["rect", { width: "14", height: "20", x: "5", y: "2", rx: "2", ry: "2", key: "1yt0o3" }],
5682
5808
  ["path", { d: "M12 18h.01", key: "mhygvu" }]
5683
5809
  ];
5684
- var Smartphone = createLucideIcon("smartphone", __iconNode33);
5810
+ var Smartphone = createLucideIcon("smartphone", __iconNode35);
5685
5811
 
5686
5812
  // node_modules/.pnpm/lucide-react@1.20.0_react@19.2.7/node_modules/lucide-react/dist/esm/icons/square-mouse-pointer.mjs
5687
- var __iconNode34 = [
5813
+ var __iconNode36 = [
5688
5814
  [
5689
5815
  "path",
5690
5816
  {
@@ -5694,10 +5820,10 @@ var __iconNode34 = [
5694
5820
  ],
5695
5821
  ["path", { d: "M21 11V5a2 2 0 0 0-2-2H5a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h6", key: "14rsvq" }]
5696
5822
  ];
5697
- var SquareMousePointer = createLucideIcon("square-mouse-pointer", __iconNode34);
5823
+ var SquareMousePointer = createLucideIcon("square-mouse-pointer", __iconNode36);
5698
5824
 
5699
5825
  // node_modules/.pnpm/lucide-react@1.20.0_react@19.2.7/node_modules/lucide-react/dist/esm/icons/sun.mjs
5700
- var __iconNode35 = [
5826
+ var __iconNode37 = [
5701
5827
  ["circle", { cx: "12", cy: "12", r: "4", key: "4exip2" }],
5702
5828
  ["path", { d: "M12 2v2", key: "tus03m" }],
5703
5829
  ["path", { d: "M12 20v2", key: "1lh1kg" }],
@@ -5708,40 +5834,40 @@ var __iconNode35 = [
5708
5834
  ["path", { d: "m6.34 17.66-1.41 1.41", key: "1m8zz5" }],
5709
5835
  ["path", { d: "m19.07 4.93-1.41 1.41", key: "1shlcs" }]
5710
5836
  ];
5711
- var Sun = createLucideIcon("sun", __iconNode35);
5837
+ var Sun = createLucideIcon("sun", __iconNode37);
5712
5838
 
5713
5839
  // node_modules/.pnpm/lucide-react@1.20.0_react@19.2.7/node_modules/lucide-react/dist/esm/icons/trash-2.mjs
5714
- var __iconNode36 = [
5840
+ var __iconNode38 = [
5715
5841
  ["path", { d: "M10 11v6", key: "nco0om" }],
5716
5842
  ["path", { d: "M14 11v6", key: "outv1u" }],
5717
5843
  ["path", { d: "M19 6v14a2 2 0 0 1-2 2H7a2 2 0 0 1-2-2V6", key: "miytrc" }],
5718
5844
  ["path", { d: "M3 6h18", key: "d0wm0j" }],
5719
5845
  ["path", { d: "M8 6V4a2 2 0 0 1 2-2h4a2 2 0 0 1 2 2v2", key: "e791ji" }]
5720
5846
  ];
5721
- var Trash2 = createLucideIcon("trash-2", __iconNode36);
5847
+ var Trash2 = createLucideIcon("trash-2", __iconNode38);
5722
5848
 
5723
5849
  // node_modules/.pnpm/lucide-react@1.20.0_react@19.2.7/node_modules/lucide-react/dist/esm/icons/type.mjs
5724
- var __iconNode37 = [
5850
+ var __iconNode39 = [
5725
5851
  ["path", { d: "M12 4v16", key: "1654pz" }],
5726
5852
  ["path", { d: "M4 7V5a1 1 0 0 1 1-1h14a1 1 0 0 1 1 1v2", key: "e0r10z" }],
5727
5853
  ["path", { d: "M9 20h6", key: "s66wpe" }]
5728
5854
  ];
5729
- var Type = createLucideIcon("type", __iconNode37);
5855
+ var Type = createLucideIcon("type", __iconNode39);
5730
5856
 
5731
5857
  // node_modules/.pnpm/lucide-react@1.20.0_react@19.2.7/node_modules/lucide-react/dist/esm/icons/upload.mjs
5732
- var __iconNode38 = [
5858
+ var __iconNode40 = [
5733
5859
  ["path", { d: "M12 3v12", key: "1x0j5s" }],
5734
5860
  ["path", { d: "m17 8-5-5-5 5", key: "7q97r8" }],
5735
5861
  ["path", { d: "M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4", key: "ih7n3h" }]
5736
5862
  ];
5737
- var Upload = createLucideIcon("upload", __iconNode38);
5863
+ var Upload = createLucideIcon("upload", __iconNode40);
5738
5864
 
5739
5865
  // node_modules/.pnpm/lucide-react@1.20.0_react@19.2.7/node_modules/lucide-react/dist/esm/icons/x.mjs
5740
- var __iconNode39 = [
5866
+ var __iconNode41 = [
5741
5867
  ["path", { d: "M18 6 6 18", key: "1bl5f8" }],
5742
5868
  ["path", { d: "m6 6 12 12", key: "d8bk6v" }]
5743
5869
  ];
5744
- var X = createLucideIcon("x", __iconNode39);
5870
+ var X = createLucideIcon("x", __iconNode41);
5745
5871
 
5746
5872
  // src/react-shell/figma/image.overlay.controller.ts
5747
5873
  var import_react7 = require("react");
@@ -6657,6 +6783,7 @@ var FigmaImageLayerStateButtons = ({
6657
6783
  "aria-pressed": overlayState.isVisible,
6658
6784
  className: `df-review-figma-image-state-button${overlayState.isVisible ? " is-active" : ""}`,
6659
6785
  "data-review-tooltip": overlayState.isVisible ? "Hide overlay" : "Show overlay",
6786
+ "data-review-tooltip-placement": "left",
6660
6787
  title: overlayState.isVisible ? "Hide overlay" : "Show overlay",
6661
6788
  type: "button",
6662
6789
  onClick: (event) => {
@@ -6673,6 +6800,7 @@ var FigmaImageLayerStateButtons = ({
6673
6800
  "aria-pressed": overlayState.isLocked,
6674
6801
  className: `df-review-figma-image-state-button${overlayState.isLocked ? " is-active" : ""}`,
6675
6802
  "data-review-tooltip": overlayState.isLocked ? "Unlock" : "Lock",
6803
+ "data-review-tooltip-placement": "left",
6676
6804
  title: overlayState.isLocked ? "Unlock" : "Lock",
6677
6805
  type: "button",
6678
6806
  onClick: (event) => {
@@ -6689,6 +6817,7 @@ var FigmaImageLayerStateButtons = ({
6689
6817
  "aria-pressed": overlayState.mode === "invert",
6690
6818
  className: `df-review-figma-image-state-button${overlayState.mode === "invert" ? " is-active" : ""}`,
6691
6819
  "data-review-tooltip": "Invert",
6820
+ "data-review-tooltip-placement": "left",
6692
6821
  title: "Invert",
6693
6822
  type: "button",
6694
6823
  onClick: (event) => {
@@ -7558,9 +7687,10 @@ var formatPromptSourceHint = (item) => {
7558
7687
  `Section id: ${source.sectionId ?? "(none)"}`
7559
7688
  ].join("\n");
7560
7689
  };
7561
- var buildReviewItemPrompt = (numberedItem, reviewPathPrefix) => {
7690
+ var buildReviewItemPrompt = (numberedItem, reviewPathPrefix, qaPrompt = "") => {
7562
7691
  const { item } = numberedItem;
7563
7692
  const anchor = item.anchor;
7693
+ const qaPromptText = qaPrompt.trim();
7564
7694
  const candidates = getPromptAnchorCandidates(item);
7565
7695
  const candidateLines = candidates.length > 0 ? candidates.map((candidate, index) => {
7566
7696
  const confidence = typeof candidate.confidence === "number" ? `, confidence=${Math.round(candidate.confidence * 100)}%` : "";
@@ -7568,6 +7698,7 @@ var buildReviewItemPrompt = (numberedItem, reviewPathPrefix) => {
7568
7698
  return `${index + 1}. ${candidate.selector} (${candidate.strategy}${confidence}${fingerprint})`;
7569
7699
  }).join("\n") : "(none)";
7570
7700
  return [
7701
+ ...qaPromptText ? [qaPromptText, ""] : [],
7571
7702
  "Fix this df-web-review-kit QA issue.",
7572
7703
  "",
7573
7704
  `Page: ${getItemTarget(item, reviewPathPrefix)}`,
@@ -7879,6 +8010,7 @@ var createReviewShellConfig = ({
7879
8010
  pages,
7880
8011
  adapters,
7881
8012
  initialPrompt = DEFAULT_INITIAL_REVIEW_PROMPT,
8013
+ qaPrompt = "",
7882
8014
  presets = DEFAULT_REVIEW_VIEWPORT_PRESETS,
7883
8015
  reviewPathPrefix = DEFAULT_REVIEW_PATH_PREFIX,
7884
8016
  sourceInspector,
@@ -7895,6 +8027,7 @@ var createReviewShellConfig = ({
7895
8027
  const isSourceInspectorEnabled = resolvedSourceInspector?.enabled !== false && Boolean(resolvedSourceRoot?.trim());
7896
8028
  return {
7897
8029
  initialPrompt,
8030
+ qaPrompt,
7898
8031
  projectId,
7899
8032
  pages,
7900
8033
  reviewPathPrefix,
@@ -8259,7 +8392,7 @@ function useReviewItemActions({
8259
8392
  onClearSelectedItem,
8260
8393
  onRefreshReviewData
8261
8394
  }) {
8262
- const { reviewPathPrefix, viewportPresets } = useReviewShellConfig();
8395
+ const { qaPrompt, reviewPathPrefix, viewportPresets } = useReviewShellConfig();
8263
8396
  const {
8264
8397
  activeAdapterEntry,
8265
8398
  isRemoteSource,
@@ -8388,7 +8521,7 @@ function useReviewItemActions({
8388
8521
  onToast: showToast
8389
8522
  });
8390
8523
  const copyItemPrompt = (numberedItem) => copyPrompt(
8391
- buildReviewItemPrompt(numberedItem, reviewPathPrefix),
8524
+ buildReviewItemPrompt(numberedItem, reviewPathPrefix, qaPrompt),
8392
8525
  `qa:${numberedItem.item.id}`,
8393
8526
  "QA prompt copied"
8394
8527
  );
@@ -8611,6 +8744,9 @@ var QaItemEditModal = ({
8611
8744
  };
8612
8745
 
8613
8746
  // src/react-shell/qa/panel.tsx
8747
+ var import_react15 = require("react");
8748
+
8749
+ // src/react-shell/qa/item.card.tsx
8614
8750
  var import_react14 = require("react");
8615
8751
 
8616
8752
  // src/react-shell/qa/item.assignee.actions.tsx
@@ -9061,6 +9197,30 @@ var QaItemCard = ({
9061
9197
  const canEditItem = activeAdapterEntry.canUpdate && !isSubmitting && !isMutating;
9062
9198
  const itemTitle = fields.title ? item.title?.trim() : "";
9063
9199
  const itemMeta = [formatItemCardDate(item.createdAt), itemAuthor].filter(Boolean).join(" | ");
9200
+ const commentRef = (0, import_react14.useRef)(null);
9201
+ const [isCommentExpanded, setIsCommentExpanded] = (0, import_react14.useState)(false);
9202
+ const [isCommentOverflowing, setIsCommentOverflowing] = (0, import_react14.useState)(false);
9203
+ const showCommentToggle = isCommentExpanded || isCommentOverflowing;
9204
+ (0, import_react14.useEffect)(() => {
9205
+ setIsCommentExpanded(false);
9206
+ setIsCommentOverflowing(false);
9207
+ }, [item.id, itemComment]);
9208
+ (0, import_react14.useEffect)(() => {
9209
+ if (isCommentExpanded) return void 0;
9210
+ const element = commentRef.current;
9211
+ if (!element) return void 0;
9212
+ const updateCommentOverflow = () => {
9213
+ setIsCommentOverflowing(
9214
+ element.scrollHeight > element.clientHeight + 1
9215
+ );
9216
+ };
9217
+ updateCommentOverflow();
9218
+ const ResizeObserverClass = element.ownerDocument.defaultView?.ResizeObserver;
9219
+ if (!ResizeObserverClass) return void 0;
9220
+ const observer = new ResizeObserverClass(updateCommentOverflow);
9221
+ observer.observe(element);
9222
+ return () => observer.disconnect();
9223
+ }, [isCommentExpanded, itemComment]);
9064
9224
  return /* @__PURE__ */ (0, import_jsx_runtime11.jsxs)(
9065
9225
  "article",
9066
9226
  {
@@ -9109,22 +9269,7 @@ var QaItemCard = ({
9109
9269
  itemMode
9110
9270
  ] })
9111
9271
  ] }),
9112
- itemTitle && /* @__PURE__ */ (0, import_jsx_runtime11.jsx)("strong", { className: "df-review-item-title", children: itemTitle }),
9113
- /* @__PURE__ */ (0, import_jsx_runtime11.jsx)(
9114
- "p",
9115
- {
9116
- className: `df-review-item-comment${itemTitle ? "" : " is-primary"}`,
9117
- children: itemComment
9118
- }
9119
- ),
9120
- item.attachments && /* @__PURE__ */ (0, import_jsx_runtime11.jsx)(QaItemAttachments, { attachments: item.attachments }),
9121
- !isRemoteSource && /* @__PURE__ */ (0, import_jsx_runtime11.jsx)(QaItemExternalLinks, { item }),
9122
- /* @__PURE__ */ (0, import_jsx_runtime11.jsx)("small", { className: "df-review-item-meta", children: itemMeta }),
9123
- isMutating && /* @__PURE__ */ (0, import_jsx_runtime11.jsxs)("small", { className: "df-review-item-saving", "aria-live": "polite", children: [
9124
- /* @__PURE__ */ (0, import_jsx_runtime11.jsx)("span", { className: "df-review-spinner", "aria-hidden": "true" }),
9125
- "Saving QA..."
9126
- ] }),
9127
- item.submitError && /* @__PURE__ */ (0, import_jsx_runtime11.jsx)("small", { className: "df-review-item-error", children: item.submitError })
9272
+ itemTitle && /* @__PURE__ */ (0, import_jsx_runtime11.jsx)("strong", { className: "df-review-item-title", children: itemTitle })
9128
9273
  ] }),
9129
9274
  /* @__PURE__ */ (0, import_jsx_runtime11.jsxs)(
9130
9275
  "div",
@@ -9182,6 +9327,50 @@ var QaItemCard = ({
9182
9327
  }
9183
9328
  )
9184
9329
  ] }),
9330
+ /* @__PURE__ */ (0, import_jsx_runtime11.jsxs)("div", { className: "df-review-item-body", children: [
9331
+ /* @__PURE__ */ (0, import_jsx_runtime11.jsxs)(
9332
+ "div",
9333
+ {
9334
+ className: `df-review-item-comment-shell${showCommentToggle ? " has-toggle" : ""}${isCommentExpanded ? " is-expanded" : " is-collapsed"}`,
9335
+ children: [
9336
+ /* @__PURE__ */ (0, import_jsx_runtime11.jsx)(
9337
+ "p",
9338
+ {
9339
+ className: `df-review-item-comment${itemTitle ? "" : " is-primary"}${isCommentExpanded ? " is-expanded" : " is-collapsed"}`,
9340
+ ref: commentRef,
9341
+ children: itemComment
9342
+ }
9343
+ ),
9344
+ showCommentToggle && /* @__PURE__ */ (0, import_jsx_runtime11.jsxs)(
9345
+ "button",
9346
+ {
9347
+ "aria-expanded": isCommentExpanded,
9348
+ "aria-label": isCommentExpanded ? "Collapse QA content" : "Expand QA content",
9349
+ className: "df-review-item-comment-more",
9350
+ title: isCommentExpanded ? "Collapse QA content" : "Expand QA content",
9351
+ type: "button",
9352
+ onClick: (event) => {
9353
+ event.stopPropagation();
9354
+ setIsCommentExpanded((current) => !current);
9355
+ },
9356
+ children: [
9357
+ /* @__PURE__ */ (0, import_jsx_runtime11.jsx)("span", { children: isCommentExpanded ? "Less" : "More" }),
9358
+ isCommentExpanded ? /* @__PURE__ */ (0, import_jsx_runtime11.jsx)(ChevronUp, { "aria-hidden": "true" }) : /* @__PURE__ */ (0, import_jsx_runtime11.jsx)(ChevronDown, { "aria-hidden": "true" })
9359
+ ]
9360
+ }
9361
+ )
9362
+ ]
9363
+ }
9364
+ ),
9365
+ item.attachments && /* @__PURE__ */ (0, import_jsx_runtime11.jsx)(QaItemAttachments, { attachments: item.attachments }),
9366
+ !isRemoteSource && /* @__PURE__ */ (0, import_jsx_runtime11.jsx)(QaItemExternalLinks, { item }),
9367
+ /* @__PURE__ */ (0, import_jsx_runtime11.jsx)("small", { className: "df-review-item-meta", children: itemMeta }),
9368
+ isMutating && /* @__PURE__ */ (0, import_jsx_runtime11.jsxs)("small", { className: "df-review-item-saving", "aria-live": "polite", children: [
9369
+ /* @__PURE__ */ (0, import_jsx_runtime11.jsx)("span", { className: "df-review-spinner", "aria-hidden": "true" }),
9370
+ "Saving QA..."
9371
+ ] }),
9372
+ item.submitError && /* @__PURE__ */ (0, import_jsx_runtime11.jsx)("small", { className: "df-review-item-error", children: item.submitError })
9373
+ ] }),
9185
9374
  /* @__PURE__ */ (0, import_jsx_runtime11.jsxs)("div", { className: "df-review-item-actions", children: [
9186
9375
  /* @__PURE__ */ (0, import_jsx_runtime11.jsxs)("div", { className: "df-review-item-workflow-actions", children: [
9187
9376
  /* @__PURE__ */ (0, import_jsx_runtime11.jsx)(
@@ -9288,6 +9477,7 @@ var QaPanelHeader = ({
9288
9477
  sourceEntries,
9289
9478
  statusOptions,
9290
9479
  onChangeReviewSource,
9480
+ onEnableActiveQaStatusFilters,
9291
9481
  onQaStatusFilterToggle,
9292
9482
  onRefreshReviewData
9293
9483
  }) => {
@@ -9331,30 +9521,45 @@ var QaPanelHeader = ({
9331
9521
  )
9332
9522
  ] })
9333
9523
  ] }),
9334
- /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(
9524
+ /* @__PURE__ */ (0, import_jsx_runtime12.jsxs)(
9335
9525
  "div",
9336
9526
  {
9337
9527
  className: "df-review-status-toggle-row",
9338
9528
  "aria-label": "QA status filters",
9339
- children: statusFilterOptions.map((statusOption) => {
9340
- const isActive = qaStatusFilters.includes(statusOption.value);
9341
- const count = qaStatusFilterCounts.get(statusOption.value) ?? 0;
9342
- return /* @__PURE__ */ (0, import_jsx_runtime12.jsxs)(
9529
+ children: [
9530
+ /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(
9343
9531
  "button",
9344
9532
  {
9345
- "aria-label": `${statusOption.label} QA (${count})`,
9346
- "aria-pressed": isActive,
9347
- className: `df-review-status-toggle is-status-${statusOption.value}${isActive ? " is-active" : ""}`,
9533
+ "aria-label": "Show all non-done QA",
9534
+ "aria-pressed": !hasActiveFilter,
9535
+ className: `df-review-status-toggle df-review-status-preset-toggle${!hasActiveFilter ? " is-active" : ""}`,
9536
+ "data-review-tooltip": "Show all non-done QA",
9537
+ title: "Show all non-done QA",
9348
9538
  type: "button",
9349
- onClick: () => onQaStatusFilterToggle(statusOption.value),
9350
- children: [
9351
- /* @__PURE__ */ (0, import_jsx_runtime12.jsx)("span", { children: statusOption.label }),
9352
- /* @__PURE__ */ (0, import_jsx_runtime12.jsx)("strong", { children: count })
9353
- ]
9354
- },
9355
- statusOption.value
9356
- );
9357
- })
9539
+ onClick: onEnableActiveQaStatusFilters,
9540
+ children: /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(CheckCheck, { "aria-hidden": "true" })
9541
+ }
9542
+ ),
9543
+ statusFilterOptions.map((statusOption) => {
9544
+ const isActive = qaStatusFilters.includes(statusOption.value);
9545
+ const count = qaStatusFilterCounts.get(statusOption.value) ?? 0;
9546
+ return /* @__PURE__ */ (0, import_jsx_runtime12.jsxs)(
9547
+ "button",
9548
+ {
9549
+ "aria-label": `${statusOption.label} QA (${count})`,
9550
+ "aria-pressed": isActive,
9551
+ className: `df-review-status-toggle is-status-${statusOption.value}${isActive ? " is-active" : ""}`,
9552
+ type: "button",
9553
+ onClick: () => onQaStatusFilterToggle(statusOption.value),
9554
+ children: [
9555
+ /* @__PURE__ */ (0, import_jsx_runtime12.jsx)("span", { children: statusOption.label }),
9556
+ /* @__PURE__ */ (0, import_jsx_runtime12.jsx)("strong", { children: count })
9557
+ ]
9558
+ },
9559
+ statusOption.value
9560
+ );
9561
+ })
9562
+ ]
9358
9563
  }
9359
9564
  )
9360
9565
  ] });
@@ -9412,6 +9617,7 @@ var ReviewQaPanel = ({
9412
9617
  onCopyItemPrompt,
9413
9618
  onCopyRemoteIssuePath,
9414
9619
  onEditItem,
9620
+ onEnableActiveQaStatusFilters,
9415
9621
  onQaStatusFilterToggle,
9416
9622
  onRefreshReviewData,
9417
9623
  onRemoveItem,
@@ -9419,9 +9625,9 @@ var ReviewQaPanel = ({
9419
9625
  onSubmitItem,
9420
9626
  onToggleItemOverlayVisibility
9421
9627
  }) => {
9422
- const listRef = (0, import_react14.useRef)(null);
9628
+ const listRef = (0, import_react15.useRef)(null);
9423
9629
  const emptyMessage = isAllQaVisible ? `No ${activeAdapterEntry.label} QA.` : isRemoteSource ? `No ${activeAdapterEntry.label} QA on this page.` : "No QA on this page.";
9424
- (0, import_react14.useEffect)(() => {
9630
+ (0, import_react15.useEffect)(() => {
9425
9631
  if (!isListVisible || !selectedItemId) return;
9426
9632
  const selectedCard = Array.from(
9427
9633
  listRef.current?.querySelectorAll(
@@ -9451,6 +9657,7 @@ var ReviewQaPanel = ({
9451
9657
  sourceEntries,
9452
9658
  statusOptions: activeAdapterEntry.statusOptions,
9453
9659
  onChangeReviewSource,
9660
+ onEnableActiveQaStatusFilters,
9454
9661
  onQaStatusFilterToggle,
9455
9662
  onRefreshReviewData
9456
9663
  }
@@ -9519,7 +9726,7 @@ var ReviewQaPanel = ({
9519
9726
  };
9520
9727
 
9521
9728
  // src/react-shell/qa/use.review.qa.panel.data.ts
9522
- var import_react15 = require("react");
9729
+ var import_react16 = require("react");
9523
9730
 
9524
9731
  // src/core/review/scope.ts
9525
9732
  var DEFAULT_REVIEW_VIEWPORTS = [
@@ -9910,11 +10117,11 @@ var useReviewQaPanelData = () => {
9910
10117
  (state) => state.setQaStatusFilters
9911
10118
  );
9912
10119
  const { isRemoteSource } = useReviewShellAdapterState();
9913
- const sitemapSourceItems = (0, import_react15.useMemo)(
10120
+ const sitemapSourceItems = (0, import_react16.useMemo)(
9914
10121
  () => isRemoteSource ? sitemapItems.remote : sitemapItems.local,
9915
10122
  [isRemoteSource, sitemapItems]
9916
10123
  );
9917
- const activeItems = (0, import_react15.useMemo)(
10124
+ const activeItems = (0, import_react16.useMemo)(
9918
10125
  () => getActiveReviewItems({
9919
10126
  activeRoute,
9920
10127
  isAllQaVisible,
@@ -9924,23 +10131,23 @@ var useReviewQaPanelData = () => {
9924
10131
  }),
9925
10132
  [activeRoute, isAllQaVisible, items, reviewPathPrefix, sitemapSourceItems]
9926
10133
  );
9927
- const numberedActiveItems = (0, import_react15.useMemo)(
10134
+ const numberedActiveItems = (0, import_react16.useMemo)(
9928
10135
  () => getNumberedReviewItems(activeItems, reviewViewportPresets),
9929
10136
  [activeItems, reviewViewportPresets]
9930
10137
  );
9931
- const scopeFilteredNumberedActiveItems = (0, import_react15.useMemo)(
10138
+ const scopeFilteredNumberedActiveItems = (0, import_react16.useMemo)(
9932
10139
  () => qaFilter === "all" ? numberedActiveItems : numberedActiveItems.filter(
9933
10140
  (numberedItem) => numberedItem.scope === qaFilter
9934
10141
  ),
9935
10142
  [numberedActiveItems, qaFilter]
9936
10143
  );
9937
- const filteredNumberedActiveItems = (0, import_react15.useMemo)(
10144
+ const filteredNumberedActiveItems = (0, import_react16.useMemo)(
9938
10145
  () => scopeFilteredNumberedActiveItems.filter(
9939
10146
  (numberedItem) => matchesReviewQaStatusFilters(numberedItem.item.status, qaStatusFilters)
9940
10147
  ),
9941
10148
  [qaStatusFilters, scopeFilteredNumberedActiveItems]
9942
10149
  );
9943
- const qaStatusFilterCounts = (0, import_react15.useMemo)(() => {
10150
+ const qaStatusFilterCounts = (0, import_react16.useMemo)(() => {
9944
10151
  const counts = /* @__PURE__ */ new Map();
9945
10152
  scopeFilteredNumberedActiveItems.forEach((numberedItem) => {
9946
10153
  const status = normalizeReviewItemStatus(numberedItem.item.status);
@@ -9948,13 +10155,13 @@ var useReviewQaPanelData = () => {
9948
10155
  });
9949
10156
  return counts;
9950
10157
  }, [scopeFilteredNumberedActiveItems]);
9951
- const activeRemainingItemCount = (0, import_react15.useMemo)(
10158
+ const activeRemainingItemCount = (0, import_react16.useMemo)(
9952
10159
  () => activeItems.filter(
9953
10160
  (item) => normalizeReviewItemStatus(item.status) !== SITEMAP_STATUS_DONE
9954
10161
  ).length,
9955
10162
  [activeItems]
9956
10163
  );
9957
- const getItemPresetScope = (0, import_react15.useCallback)(
10164
+ const getItemPresetScope = (0, import_react16.useCallback)(
9958
10165
  (item) => getViewportPresetKind(
9959
10166
  findViewportPreset(
9960
10167
  viewportPresets,
@@ -9964,7 +10171,7 @@ var useReviewQaPanelData = () => {
9964
10171
  ),
9965
10172
  [viewportPresets]
9966
10173
  );
9967
- const toggleQaStatusFilter = (0, import_react15.useCallback)(
10174
+ const toggleQaStatusFilter = (0, import_react16.useCallback)(
9968
10175
  (filter) => {
9969
10176
  const normalizedFilters = normalizeReviewQaStatusFilters(qaStatusFilters);
9970
10177
  const nextFilters = normalizedFilters.includes(filter) ? normalizedFilters.filter((item) => item !== filter) : [...normalizedFilters, filter];
@@ -9975,6 +10182,11 @@ var useReviewQaPanelData = () => {
9975
10182
  },
9976
10183
  [qaStatusFilters, setQaStatusFiltersState]
9977
10184
  );
10185
+ const showActiveQaStatusFilters = (0, import_react16.useCallback)(() => {
10186
+ const defaultFilters = getDefaultReviewQaStatusFilters();
10187
+ setQaStatusFiltersState(defaultFilters);
10188
+ writeStoredReviewQaStatusFilters(defaultFilters);
10189
+ }, [setQaStatusFiltersState]);
9978
10190
  const currentPresetScope = getViewportPresetKind(size);
9979
10191
  return {
9980
10192
  activeItems,
@@ -9983,6 +10195,7 @@ var useReviewQaPanelData = () => {
9983
10195
  filteredNumberedActiveItems,
9984
10196
  getItemPresetScope,
9985
10197
  qaStatusFilterCounts,
10198
+ showActiveQaStatusFilters,
9986
10199
  toggleQaStatusFilter
9987
10200
  };
9988
10201
  };
@@ -10027,6 +10240,7 @@ var QaPanelContainer = () => {
10027
10240
  filteredNumberedActiveItems,
10028
10241
  getItemPresetScope,
10029
10242
  qaStatusFilterCounts,
10243
+ showActiveQaStatusFilters,
10030
10244
  toggleQaStatusFilter
10031
10245
  } = useReviewQaPanelData();
10032
10246
  const {
@@ -10091,6 +10305,7 @@ var QaPanelContainer = () => {
10091
10305
  onCopyItemPrompt: (numberedItem) => void copyItemPrompt(numberedItem),
10092
10306
  onCopyRemoteIssuePath: copyRemoteIssuePath,
10093
10307
  onEditItem: setEditingItem,
10308
+ onEnableActiveQaStatusFilters: showActiveQaStatusFilters,
10094
10309
  onQaStatusFilterToggle: toggleQaStatusFilter,
10095
10310
  onRefreshReviewData: refreshReviewData2,
10096
10311
  onRemoveItem: removeItem,
@@ -10103,7 +10318,7 @@ var QaPanelContainer = () => {
10103
10318
  };
10104
10319
 
10105
10320
  // src/react-shell/hooks/use.review.section.outline.ts
10106
- var import_react17 = require("react");
10321
+ var import_react18 = require("react");
10107
10322
 
10108
10323
  // src/core/geometry.ts
10109
10324
  function rectanglesIntersect(a, b) {
@@ -11095,7 +11310,7 @@ function encodePathForFileScheme(path) {
11095
11310
  }
11096
11311
 
11097
11312
  // src/react-shell/store/shell.refs.tsx
11098
- var import_react16 = require("react");
11313
+ var import_react17 = require("react");
11099
11314
  var createReviewShellRefs = () => ({
11100
11315
  cleanupTargetRef: { current: null },
11101
11316
  controllerRef: { current: null },
@@ -11104,10 +11319,10 @@ var createReviewShellRefs = () => ({
11104
11319
  pendingInitialItemIdRef: { current: getInitialItemId() },
11105
11320
  pendingRestoreRef: { current: null }
11106
11321
  });
11107
- var ReviewShellRefsContext = (0, import_react16.createContext)(null);
11322
+ var ReviewShellRefsContext = (0, import_react17.createContext)(null);
11108
11323
  var ReviewShellRefsProvider = ReviewShellRefsContext.Provider;
11109
11324
  var useReviewShellRefs = () => {
11110
- const refs = (0, import_react16.useContext)(ReviewShellRefsContext);
11325
+ const refs = (0, import_react17.useContext)(ReviewShellRefsContext);
11111
11326
  if (!refs) {
11112
11327
  throw new Error(
11113
11328
  "useReviewShellRefs must be used within a ReviewShell provider"
@@ -11135,19 +11350,19 @@ function useReviewSectionOutline({
11135
11350
  const setMode = useReviewShellStore((state) => state.setMode);
11136
11351
  const showToast = useReviewToast();
11137
11352
  const isPanelVisible = isListVisible && sidePanel === "source";
11138
- const targetSrc = (0, import_react17.useMemo)(() => buildTargetSrc(target), [target]);
11139
- const sectionOutlineCountRef = (0, import_react17.useRef)(0);
11140
- const [sectionOutline, setSectionOutline] = (0, import_react17.useState)(null);
11141
- const [sectionOutlineFilter, setSectionOutlineFilter] = (0, import_react17.useState)(
11353
+ const targetSrc = (0, import_react18.useMemo)(() => buildTargetSrc(target), [target]);
11354
+ const sectionOutlineCountRef = (0, import_react18.useRef)(0);
11355
+ const [sectionOutline, setSectionOutline] = (0, import_react18.useState)(null);
11356
+ const [sectionOutlineFilter, setSectionOutlineFilter] = (0, import_react18.useState)(
11142
11357
  () => getStoredSourceTreeFilter()
11143
11358
  );
11144
- const [sectionOutlineMetaVisibility, setSectionOutlineMetaVisibility] = (0, import_react17.useState)(() => getStoredSourceTreeMetaVisibility());
11145
- const [collapsedSectionOutlineIds, setCollapsedSectionOutlineIds] = (0, import_react17.useState)(() => /* @__PURE__ */ new Set());
11146
- const updateSectionOutlineFilter = (0, import_react17.useCallback)((nextFilter) => {
11359
+ const [sectionOutlineMetaVisibility, setSectionOutlineMetaVisibility] = (0, import_react18.useState)(() => getStoredSourceTreeMetaVisibility());
11360
+ const [collapsedSectionOutlineIds, setCollapsedSectionOutlineIds] = (0, import_react18.useState)(() => /* @__PURE__ */ new Set());
11361
+ const updateSectionOutlineFilter = (0, import_react18.useCallback)((nextFilter) => {
11147
11362
  setSectionOutlineFilter(nextFilter);
11148
11363
  writeStoredSourceTreeFilter(nextFilter);
11149
11364
  }, []);
11150
- const updateSectionOutlineMetaVisibility = (0, import_react17.useCallback)(
11365
+ const updateSectionOutlineMetaVisibility = (0, import_react18.useCallback)(
11151
11366
  (key) => {
11152
11367
  setSectionOutlineMetaVisibility((current) => {
11153
11368
  const next = { ...current, [key]: !current[key] };
@@ -11157,32 +11372,32 @@ function useReviewSectionOutline({
11157
11372
  },
11158
11373
  []
11159
11374
  );
11160
- const sectionOutlineFilterTerms = (0, import_react17.useMemo)(
11375
+ const sectionOutlineFilterTerms = (0, import_react18.useMemo)(
11161
11376
  () => getSectionOutlineFilterTerms(sectionOutlineFilter),
11162
11377
  [sectionOutlineFilter]
11163
11378
  );
11164
- const filteredSectionOutline = (0, import_react17.useMemo)(
11379
+ const filteredSectionOutline = (0, import_react18.useMemo)(
11165
11380
  () => sectionOutline ? filterSectionOutlineEntries(sectionOutline, sectionOutlineFilterTerms) : [],
11166
11381
  [sectionOutline, sectionOutlineFilterTerms]
11167
11382
  );
11168
- const sectionOutlineTotalCount = (0, import_react17.useMemo)(
11383
+ const sectionOutlineTotalCount = (0, import_react18.useMemo)(
11169
11384
  () => getSectionOutlineEntryCount(sectionOutline ?? []),
11170
11385
  [sectionOutline]
11171
11386
  );
11172
- const filteredSectionOutlineCount = (0, import_react17.useMemo)(
11387
+ const filteredSectionOutlineCount = (0, import_react18.useMemo)(
11173
11388
  () => getSectionOutlineEntryCount(filteredSectionOutline),
11174
11389
  [filteredSectionOutline]
11175
11390
  );
11176
11391
  const isSectionOutlineFiltering = sectionOutlineFilterTerms.length > 0;
11177
- (0, import_react17.useEffect)(() => {
11392
+ (0, import_react18.useEffect)(() => {
11178
11393
  sectionOutlineCountRef.current = sectionOutlineTotalCount;
11179
11394
  }, [sectionOutlineTotalCount]);
11180
- (0, import_react17.useEffect)(() => {
11395
+ (0, import_react18.useEffect)(() => {
11181
11396
  onClearSourceInspector();
11182
11397
  setCollapsedSectionOutlineIds(/* @__PURE__ */ new Set());
11183
11398
  setSectionOutline(null);
11184
11399
  }, [onClearSourceInspector, targetSrc]);
11185
- const getCurrentSectionOutline = (0, import_react17.useCallback)(
11400
+ const getCurrentSectionOutline = (0, import_react18.useCallback)(
11186
11401
  () => {
11187
11402
  let frameDocument = null;
11188
11403
  try {
@@ -11197,7 +11412,7 @@ function useReviewSectionOutline({
11197
11412
  },
11198
11413
  [iframeRef, sectionOutlineOptions]
11199
11414
  );
11200
- const refreshCurrentSectionOutline = (0, import_react17.useCallback)(
11415
+ const refreshCurrentSectionOutline = (0, import_react18.useCallback)(
11201
11416
  (resetCollapse = false) => {
11202
11417
  const nextSectionOutline = getCurrentSectionOutline();
11203
11418
  if (!nextSectionOutline) return false;
@@ -11214,7 +11429,7 @@ function useReviewSectionOutline({
11214
11429
  },
11215
11430
  [getCurrentSectionOutline]
11216
11431
  );
11217
- (0, import_react17.useEffect)(() => {
11432
+ (0, import_react18.useEffect)(() => {
11218
11433
  if (!isPanelVisible) return void 0;
11219
11434
  const refreshSectionOutline = () => {
11220
11435
  refreshCurrentSectionOutline(true);
@@ -11235,7 +11450,7 @@ function useReviewSectionOutline({
11235
11450
  targetFrameLoadVersion,
11236
11451
  targetSrc
11237
11452
  ]);
11238
- (0, import_react17.useEffect)(() => {
11453
+ (0, import_react18.useEffect)(() => {
11239
11454
  if (!isPanelVisible) return void 0;
11240
11455
  const frameDocument = iframeRef.current?.contentDocument;
11241
11456
  const body = frameDocument?.body;
@@ -11262,7 +11477,7 @@ function useReviewSectionOutline({
11262
11477
  targetFrameLoadVersion,
11263
11478
  targetSrc
11264
11479
  ]);
11265
- const toggleSectionOutlineEntry = (0, import_react17.useCallback)((entryId) => {
11480
+ const toggleSectionOutlineEntry = (0, import_react18.useCallback)((entryId) => {
11266
11481
  setCollapsedSectionOutlineIds((current) => {
11267
11482
  const next = new Set(current);
11268
11483
  if (next.has(entryId)) {
@@ -11273,7 +11488,7 @@ function useReviewSectionOutline({
11273
11488
  return next;
11274
11489
  });
11275
11490
  }, []);
11276
- const scrollToSection = (0, import_react17.useCallback)((entry) => {
11491
+ const scrollToSection = (0, import_react18.useCallback)((entry) => {
11277
11492
  scrollElementInTarget(entry.element, "start");
11278
11493
  centerFrameScrollOnElement(
11279
11494
  frameScrollRef.current,
@@ -11281,7 +11496,7 @@ function useReviewSectionOutline({
11281
11496
  entry.element
11282
11497
  );
11283
11498
  }, [frameScrollRef, iframeRef]);
11284
- const openSectionSource = (0, import_react17.useCallback)(
11499
+ const openSectionSource = (0, import_react18.useCallback)(
11285
11500
  (entry) => {
11286
11501
  const didOpen = openSourceInEditor(entry.source, {
11287
11502
  ...sourceOpenOptions,
@@ -11291,7 +11506,7 @@ function useReviewSectionOutline({
11291
11506
  },
11292
11507
  [showToast, sourceOpenOptions]
11293
11508
  );
11294
- const openSectionUsageSource = (0, import_react17.useCallback)(
11509
+ const openSectionUsageSource = (0, import_react18.useCallback)(
11295
11510
  (entry) => {
11296
11511
  const didOpen = openSourceInEditor(
11297
11512
  entry.metadata.usage?.source,
@@ -11301,14 +11516,14 @@ function useReviewSectionOutline({
11301
11516
  },
11302
11517
  [showToast, sourceOpenOptions]
11303
11518
  );
11304
- const openSectionData = (0, import_react17.useCallback)(
11519
+ const openSectionData = (0, import_react18.useCallback)(
11305
11520
  (entry) => {
11306
11521
  const didOpen = openSourceInEditor(entry.data, sourceOpenOptions);
11307
11522
  showToast(didOpen ? "Data opened" : "Data hint not found");
11308
11523
  },
11309
11524
  [showToast, sourceOpenOptions]
11310
11525
  );
11311
- const startSectionDomReview = (0, import_react17.useCallback)(
11526
+ const startSectionDomReview = (0, import_react18.useCallback)(
11312
11527
  (entry) => {
11313
11528
  if (!canWriteDom) {
11314
11529
  showToast("DOM QA unavailable");
@@ -11824,11 +12039,11 @@ var SectionOutlineContainer = () => {
11824
12039
  };
11825
12040
 
11826
12041
  // src/react-shell/presence/presence.context.tsx
11827
- var import_react18 = require("react");
11828
- var ReviewPresenceContext = (0, import_react18.createContext)(null);
12042
+ var import_react19 = require("react");
12043
+ var ReviewPresenceContext = (0, import_react19.createContext)(null);
11829
12044
  var ReviewPresenceProvider = ReviewPresenceContext.Provider;
11830
12045
  var useReviewPresenceState = () => {
11831
- const state = (0, import_react18.useContext)(ReviewPresenceContext);
12046
+ const state = (0, import_react19.useContext)(ReviewPresenceContext);
11832
12047
  if (!state) {
11833
12048
  throw new Error(
11834
12049
  "useReviewPresenceState must be used within a ReviewPresence provider"
@@ -11873,7 +12088,7 @@ function FigmaRailIcon() {
11873
12088
  }
11874
12089
 
11875
12090
  // src/react-shell/presence/overlay.tsx
11876
- var import_react19 = require("react");
12091
+ var import_react20 = require("react");
11877
12092
  var import_jsx_runtime18 = require("react/jsx-runtime");
11878
12093
  var getPresenceName = (user) => user.displayName || user.userId;
11879
12094
  var PresenceUserIcon = () => /* @__PURE__ */ (0, import_jsx_runtime18.jsxs)("svg", { "aria-hidden": "true", viewBox: "0 0 30 30", children: [
@@ -11902,7 +12117,7 @@ var PresenceOverlay = ({
11902
12117
  presenceSessionId,
11903
12118
  users
11904
12119
  }) => {
11905
- const [isExpanded, setIsExpanded] = (0, import_react19.useState)(false);
12120
+ const [isExpanded, setIsExpanded] = (0, import_react20.useState)(false);
11906
12121
  if (users.length === 0) return null;
11907
12122
  return /* @__PURE__ */ (0, import_jsx_runtime18.jsxs)(
11908
12123
  "div",
@@ -12134,7 +12349,7 @@ var ReviewSideRailContainer = () => {
12134
12349
  };
12135
12350
 
12136
12351
  // src/react-shell/review/shell.frame.tsx
12137
- var import_react20 = require("react");
12352
+ var import_react21 = require("react");
12138
12353
  var import_jsx_runtime22 = require("react/jsx-runtime");
12139
12354
  var getTooltipElements = (root) => Array.from(root.querySelectorAll("[data-review-tooltip]"));
12140
12355
  var restoreNativeTooltipTitles = (root) => {
@@ -12168,8 +12383,8 @@ var ReviewShellFrame = ({
12168
12383
  isListVisible,
12169
12384
  slots
12170
12385
  }) => {
12171
- const rootRef = (0, import_react20.useRef)(null);
12172
- (0, import_react20.useEffect)(() => {
12386
+ const rootRef = (0, import_react21.useRef)(null);
12387
+ (0, import_react21.useEffect)(() => {
12173
12388
  const root = rootRef.current;
12174
12389
  if (!root) return void 0;
12175
12390
  syncNativeTooltipTitles(root, areTooltipsEnabled);
@@ -12208,11 +12423,11 @@ var ReviewShellFrame = ({
12208
12423
  };
12209
12424
 
12210
12425
  // src/react-shell/review/settings.context.tsx
12211
- var import_react21 = require("react");
12212
- var ReviewSettingsContext = (0, import_react21.createContext)(null);
12426
+ var import_react22 = require("react");
12427
+ var ReviewSettingsContext = (0, import_react22.createContext)(null);
12213
12428
  var ReviewSettingsProvider = ReviewSettingsContext.Provider;
12214
12429
  var useReviewSettingsState = () => {
12215
- const state = (0, import_react21.useContext)(ReviewSettingsContext);
12430
+ const state = (0, import_react22.useContext)(ReviewSettingsContext);
12216
12431
  if (!state) {
12217
12432
  throw new Error(
12218
12433
  "useReviewSettingsState must be used within a ReviewSettings provider"
@@ -12240,7 +12455,7 @@ var ReviewShellFrameContainer = ({
12240
12455
  };
12241
12456
 
12242
12457
  // src/react-shell/review/shell.modals.container.tsx
12243
- var import_react24 = require("react");
12458
+ var import_react25 = require("react");
12244
12459
 
12245
12460
  // src/react-shell/review/modal.tsx
12246
12461
  var import_jsx_runtime24 = require("react/jsx-runtime");
@@ -12643,7 +12858,7 @@ var ReviewSettingsModal = ({
12643
12858
  };
12644
12859
 
12645
12860
  // src/react-shell/sitemap/modal.tsx
12646
- var import_react22 = require("react");
12861
+ var import_react23 = require("react");
12647
12862
 
12648
12863
  // src/react-shell/sitemap/tree.ts
12649
12864
  var WORKFLOW_STATUSES = [
@@ -12931,16 +13146,16 @@ var SitemapModal = ({
12931
13146
  onSelectAllQa,
12932
13147
  onSelectPage
12933
13148
  }) => {
12934
- const [sort, setSort] = (0, import_react22.useState)({
13149
+ const [sort, setSort] = (0, import_react23.useState)({
12935
13150
  key: "page",
12936
13151
  direction: "asc"
12937
13152
  });
12938
- const [collapsedFolderHrefs, setCollapsedFolderHrefs] = (0, import_react22.useState)(
13153
+ const [collapsedFolderHrefs, setCollapsedFolderHrefs] = (0, import_react23.useState)(
12939
13154
  () => /* @__PURE__ */ new Set()
12940
13155
  );
12941
- const [searchQuery, setSearchQuery] = (0, import_react22.useState)("");
13156
+ const [searchQuery, setSearchQuery] = (0, import_react23.useState)("");
12942
13157
  const trimmedSearchQuery = searchQuery.trim();
12943
- const allQaUsers = (0, import_react22.useMemo)(
13158
+ const allQaUsers = (0, import_react23.useMemo)(
12944
13159
  () => mergePresenceUsers(Array.from(pagePresenceUsers.values()).flat()),
12945
13160
  [pagePresenceUsers]
12946
13161
  );
@@ -13195,7 +13410,7 @@ var SitemapRowContent = ({
13195
13410
  ] });
13196
13411
 
13197
13412
  // src/react-shell/hooks/use.review.shell.data.ts
13198
- var import_react23 = require("react");
13413
+ var import_react24 = require("react");
13199
13414
  var SITEMAP_STATUS_DONE2 = "done";
13200
13415
  var useReviewShellData = () => {
13201
13416
  const { pages, reviewPathPrefix, reviewViewportPresets, viewportPresets } = useReviewShellConfig();
@@ -13210,18 +13425,18 @@ var useReviewShellData = () => {
13210
13425
  const qaStatusFilters = useReviewShellStore((state) => state.qaStatusFilters);
13211
13426
  const selectedItemId = useReviewShellStore((state) => state.selectedItemId);
13212
13427
  const isAllQaVisible = useReviewShellStore((state) => state.isAllQaVisible);
13213
- const targetSrc = (0, import_react23.useMemo)(() => buildTargetSrc(target), [target]);
13214
- const pageTargets = (0, import_react23.useMemo)(
13428
+ const targetSrc = (0, import_react24.useMemo)(() => buildTargetSrc(target), [target]);
13429
+ const pageTargets = (0, import_react24.useMemo)(
13215
13430
  () => new Set(
13216
13431
  pages.map((page) => normalizeTarget(page.href, reviewPathPrefix))
13217
13432
  ),
13218
13433
  [pages, reviewPathPrefix]
13219
13434
  );
13220
- const sitemapSourceItems = (0, import_react23.useMemo)(
13435
+ const sitemapSourceItems = (0, import_react24.useMemo)(
13221
13436
  () => isRemoteSource ? sitemapItems.remote : sitemapItems.local,
13222
13437
  [isRemoteSource, sitemapItems]
13223
13438
  );
13224
- const activeItems = (0, import_react23.useMemo)(
13439
+ const activeItems = (0, import_react24.useMemo)(
13225
13440
  () => getActiveReviewItems({
13226
13441
  activeRoute,
13227
13442
  isAllQaVisible,
@@ -13231,11 +13446,11 @@ var useReviewShellData = () => {
13231
13446
  }),
13232
13447
  [activeRoute, isAllQaVisible, items, reviewPathPrefix, sitemapSourceItems]
13233
13448
  );
13234
- const numberedActiveItems = (0, import_react23.useMemo)(
13449
+ const numberedActiveItems = (0, import_react24.useMemo)(
13235
13450
  () => getNumberedReviewItems(activeItems, reviewViewportPresets),
13236
13451
  [activeItems, reviewViewportPresets]
13237
13452
  );
13238
- const hiddenOverlayItemIdList = (0, import_react23.useMemo)(
13453
+ const hiddenOverlayItemIdList = (0, import_react24.useMemo)(
13239
13454
  () => {
13240
13455
  const nextHiddenItemIds = new Set(hiddenOverlayItemIds);
13241
13456
  activeItems.forEach((item) => {
@@ -13247,7 +13462,7 @@ var useReviewShellData = () => {
13247
13462
  },
13248
13463
  [activeItems, hiddenOverlayItemIds, qaStatusFilters]
13249
13464
  );
13250
- const getItemPreset = (0, import_react23.useCallback)(
13465
+ const getItemPreset = (0, import_react24.useCallback)(
13251
13466
  (item) => findViewportPreset(
13252
13467
  viewportPresets,
13253
13468
  item.viewport?.width ?? 0,
@@ -13255,11 +13470,11 @@ var useReviewShellData = () => {
13255
13470
  ),
13256
13471
  [viewportPresets]
13257
13472
  );
13258
- const getItemPresetScope = (0, import_react23.useCallback)(
13473
+ const getItemPresetScope = (0, import_react24.useCallback)(
13259
13474
  (item) => getViewportPresetKind(getItemPreset(item)),
13260
13475
  [getItemPreset]
13261
13476
  );
13262
- const getItemPresetColumn = (0, import_react23.useCallback)(
13477
+ const getItemPresetColumn = (0, import_react24.useCallback)(
13263
13478
  (item) => {
13264
13479
  const preset = getItemPreset(item);
13265
13480
  const presetIndex = Math.max(0, viewportPresets.indexOf(preset));
@@ -13267,19 +13482,20 @@ var useReviewShellData = () => {
13267
13482
  },
13268
13483
  [getItemPreset, viewportPresets]
13269
13484
  );
13270
- const getItemCountScope = (0, import_react23.useCallback)(
13485
+ const getItemCountScope = (0, import_react24.useCallback)(
13271
13486
  (item) => item.scope === "dom" ? "dom" : getItemPresetScope(item),
13272
13487
  [getItemPresetScope]
13273
13488
  );
13274
- const presetScopeCounts = (0, import_react23.useMemo)(() => {
13489
+ const presetScopeCounts = (0, import_react24.useMemo)(() => {
13275
13490
  const counts = /* @__PURE__ */ new Map();
13276
13491
  activeItems.forEach((item) => {
13492
+ if (normalizeReviewItemStatus(item.status) === SITEMAP_STATUS_DONE2) return;
13277
13493
  const scope = getItemPresetScope(item);
13278
13494
  counts.set(scope, (counts.get(scope) ?? 0) + 1);
13279
13495
  });
13280
13496
  return counts;
13281
13497
  }, [activeItems, getItemPresetScope]);
13282
- const pageQaCounts = (0, import_react23.useMemo)(() => {
13498
+ const pageQaCounts = (0, import_react24.useMemo)(() => {
13283
13499
  const counts = /* @__PURE__ */ new Map();
13284
13500
  const addItems = (sourceKey, sourceItems) => {
13285
13501
  sourceItems.forEach((item) => {
@@ -13321,14 +13537,14 @@ var useReviewShellData = () => {
13321
13537
  addItems("remote", sitemapItems.remote);
13322
13538
  return counts;
13323
13539
  }, [getItemCountScope, getItemPresetColumn, reviewPathPrefix, sitemapItems]);
13324
- const allQaCount = (0, import_react23.useMemo)(
13540
+ const allQaCount = (0, import_react24.useMemo)(
13325
13541
  () => Array.from(pageQaCounts.values()).reduce(
13326
13542
  addSitemapQaCounts,
13327
13543
  createEmptySitemapQaCount()
13328
13544
  ),
13329
13545
  [pageQaCounts]
13330
13546
  );
13331
- const selectedNumberedItem = (0, import_react23.useMemo)(
13547
+ const selectedNumberedItem = (0, import_react24.useMemo)(
13332
13548
  () => selectedItemId ? numberedActiveItems.find(
13333
13549
  (numberedItem) => numberedItem.item.id === selectedItemId
13334
13550
  ) : void 0,
@@ -13406,7 +13622,7 @@ var ReviewShellModalsContainer = () => {
13406
13622
  );
13407
13623
  const showToast = useReviewToast();
13408
13624
  const initialPromptText = initialPrompt.trim();
13409
- const copyInitialPrompt = (0, import_react24.useCallback)(
13625
+ const copyInitialPrompt = (0, import_react25.useCallback)(
13410
13626
  (value, key) => copyReviewPrompt({
13411
13627
  key,
13412
13628
  value,
@@ -13466,11 +13682,11 @@ var ReviewShellModalsContainer = () => {
13466
13682
  };
13467
13683
 
13468
13684
  // src/react-shell/store/figma.overlay.context.tsx
13469
- var import_react25 = require("react");
13470
- var ReviewFigmaOverlayContext = (0, import_react25.createContext)(null);
13685
+ var import_react26 = require("react");
13686
+ var ReviewFigmaOverlayContext = (0, import_react26.createContext)(null);
13471
13687
  var ReviewFigmaOverlayProvider = ReviewFigmaOverlayContext.Provider;
13472
13688
  var useReviewFigmaOverlayState = () => {
13473
- const state = (0, import_react25.useContext)(ReviewFigmaOverlayContext);
13689
+ const state = (0, import_react26.useContext)(ReviewFigmaOverlayContext);
13474
13690
  if (!state) {
13475
13691
  throw new Error(
13476
13692
  "useReviewFigmaOverlayState must be used within a ReviewFigmaOverlay provider"
@@ -13480,11 +13696,11 @@ var useReviewFigmaOverlayState = () => {
13480
13696
  };
13481
13697
 
13482
13698
  // src/react-shell/store/ruler.context.tsx
13483
- var import_react26 = require("react");
13484
- var ReviewRulerContext = (0, import_react26.createContext)(null);
13699
+ var import_react27 = require("react");
13700
+ var ReviewRulerContext = (0, import_react27.createContext)(null);
13485
13701
  var ReviewRulerProvider = ReviewRulerContext.Provider;
13486
13702
  var useReviewRulerState = () => {
13487
- const state = (0, import_react26.useContext)(ReviewRulerContext);
13703
+ const state = (0, import_react27.useContext)(ReviewRulerContext);
13488
13704
  if (!state) {
13489
13705
  throw new Error(
13490
13706
  "useReviewRulerState must be used within a ReviewRuler provider"
@@ -13494,11 +13710,11 @@ var useReviewRulerState = () => {
13494
13710
  };
13495
13711
 
13496
13712
  // src/react-shell/review/source.inspector.context.tsx
13497
- var import_react27 = require("react");
13498
- var ReviewSourceInspectorContext = (0, import_react27.createContext)(null);
13713
+ var import_react28 = require("react");
13714
+ var ReviewSourceInspectorContext = (0, import_react28.createContext)(null);
13499
13715
  var ReviewSourceInspectorProvider = ReviewSourceInspectorContext.Provider;
13500
13716
  var useReviewSourceInspectorState = () => {
13501
- const state = (0, import_react27.useContext)(ReviewSourceInspectorContext);
13717
+ const state = (0, import_react28.useContext)(ReviewSourceInspectorContext);
13502
13718
  if (!state) {
13503
13719
  throw new Error(
13504
13720
  "useReviewSourceInspectorState must be used within a ReviewSourceInspector provider"
@@ -13617,7 +13833,7 @@ var SourceInspectorOverlayContainer = () => {
13617
13833
  };
13618
13834
 
13619
13835
  // src/react-shell/target/frame.tsx
13620
- var import_react30 = require("react");
13836
+ var import_react31 = require("react");
13621
13837
 
13622
13838
  // src/react-shell/review/mode.toolbar.tsx
13623
13839
  var import_jsx_runtime33 = require("react/jsx-runtime");
@@ -13796,7 +14012,7 @@ var RulerOverlay = () => {
13796
14012
  };
13797
14013
 
13798
14014
  // src/react-shell/target/figma.image.overlay.ts
13799
- var import_react28 = require("react");
14015
+ var import_react29 = require("react");
13800
14016
 
13801
14017
  // src/react-shell/target/target.ts
13802
14018
  var HIDE_SCROLLBAR_STYLE_ID = "df-review-hide-scrollbar";
@@ -13986,11 +14202,11 @@ var useTargetFigmaImageOverlays = ({
13986
14202
  size,
13987
14203
  targetSrc
13988
14204
  }) => {
13989
- const targetDocumentRef = (0, import_react28.useRef)(null);
14205
+ const targetDocumentRef = (0, import_react29.useRef)(null);
13990
14206
  const overlaySignature = createTargetFigmaImageOverlaySignature(
13991
14207
  figmaImageOverlays
13992
14208
  );
13993
- const syncTargetFigmaImageOverlays = (0, import_react28.useCallback)(() => {
14209
+ const syncTargetFigmaImageOverlays = (0, import_react29.useCallback)(() => {
13994
14210
  let targetDocument;
13995
14211
  try {
13996
14212
  targetDocument = iframeRef.current?.contentDocument;
@@ -14015,10 +14231,10 @@ var useTargetFigmaImageOverlays = ({
14015
14231
  size,
14016
14232
  targetSrc
14017
14233
  ]);
14018
- (0, import_react28.useEffect)(() => {
14234
+ (0, import_react29.useEffect)(() => {
14019
14235
  syncTargetFigmaImageOverlays();
14020
14236
  }, [syncTargetFigmaImageOverlays]);
14021
- (0, import_react28.useEffect)(() => {
14237
+ (0, import_react29.useEffect)(() => {
14022
14238
  return () => {
14023
14239
  if (!targetDocumentRef.current) return;
14024
14240
  removeTargetFigmaImageOverlays(targetDocumentRef.current);
@@ -14228,7 +14444,7 @@ function normalizeTargetFigmaImageOffsetY(value) {
14228
14444
  }
14229
14445
 
14230
14446
  // src/react-shell/target/outside.markers.tsx
14231
- var import_react29 = require("react");
14447
+ var import_react30 = require("react");
14232
14448
 
14233
14449
  // src/core/dom.anchor.ts
14234
14450
  var COMMON_ANCHOR_ATTRIBUTES = [
@@ -14958,6 +15174,66 @@ function isDomReviewItem(item) {
14958
15174
  // src/react-shell/target/outside.markers.tsx
14959
15175
  var import_jsx_runtime36 = require("react/jsx-runtime");
14960
15176
  var OUTSIDE_MARKER_HEIGHT = 22;
15177
+ var OUTSIDE_MARKER_CONNECTOR_TOP = 10;
15178
+ var OUTSIDE_MARKER_GAP = 6;
15179
+ var OUTSIDE_MARKER_SPACING = OUTSIDE_MARKER_HEIGHT + OUTSIDE_MARKER_GAP;
15180
+ var clampMarkerTop = (top, maxTop) => Math.max(0, Math.min(maxTop, top));
15181
+ var toMarkerPixel = (value) => Math.round(value * 100) / 100;
15182
+ var arrangeOutsideMarkerLayout = (markers, viewportHeight) => {
15183
+ if (markers.length === 0) return [];
15184
+ const maxTop = Math.max(0, viewportHeight - OUTSIDE_MARKER_HEIGHT);
15185
+ const sorted = markers.map((marker, index) => ({
15186
+ marker,
15187
+ index,
15188
+ anchorTop: clampMarkerTop(marker.anchorTop, maxTop),
15189
+ top: clampMarkerTop(marker.anchorTop, maxTop)
15190
+ })).sort(
15191
+ (a, b) => a.anchorTop - b.anchorTop || a.index - b.index
15192
+ );
15193
+ for (let index = 1; index < sorted.length; index += 1) {
15194
+ sorted[index].top = Math.max(
15195
+ sorted[index].top,
15196
+ sorted[index - 1].top + OUTSIDE_MARKER_SPACING
15197
+ );
15198
+ }
15199
+ if (sorted[sorted.length - 1].top > maxTop) {
15200
+ sorted[sorted.length - 1].top = maxTop;
15201
+ for (let index = sorted.length - 2; index >= 0; index -= 1) {
15202
+ sorted[index].top = Math.min(
15203
+ sorted[index].top,
15204
+ sorted[index + 1].top - OUTSIDE_MARKER_SPACING
15205
+ );
15206
+ }
15207
+ }
15208
+ if (sorted[0].top < 0) {
15209
+ const spacing = sorted.length > 1 ? maxTop / (sorted.length - 1) : 0;
15210
+ sorted.forEach((marker, index) => {
15211
+ marker.top = index * spacing;
15212
+ });
15213
+ }
15214
+ return sorted.map(({ marker, index, anchorTop, top }) => {
15215
+ const safeTop = clampMarkerTop(top, maxTop);
15216
+ const connectorTop = anchorTop - safeTop + OUTSIDE_MARKER_CONNECTOR_TOP;
15217
+ const connectorStemTop = Math.min(
15218
+ OUTSIDE_MARKER_CONNECTOR_TOP,
15219
+ connectorTop
15220
+ );
15221
+ const connectorStemHeight = Math.abs(
15222
+ connectorTop - OUTSIDE_MARKER_CONNECTOR_TOP
15223
+ );
15224
+ return {
15225
+ index,
15226
+ marker: {
15227
+ ...marker,
15228
+ anchorTop: toMarkerPixel(anchorTop),
15229
+ top: toMarkerPixel(safeTop),
15230
+ connectorTop: toMarkerPixel(connectorTop),
15231
+ connectorStemTop: toMarkerPixel(connectorStemTop),
15232
+ connectorStemHeight: toMarkerPixel(connectorStemHeight)
15233
+ }
15234
+ };
15235
+ }).sort((a, b) => a.index - b.index).map(({ marker }) => marker);
15236
+ };
14961
15237
  var createTargetEnvironment = (iframe) => {
14962
15238
  const targetWindow = iframe?.contentWindow;
14963
15239
  const targetDocument = iframe?.contentDocument;
@@ -15010,9 +15286,9 @@ var ReviewOutsideMarkers = () => {
15010
15286
  (state) => state.setIsListVisible
15011
15287
  );
15012
15288
  const setSidePanel = useReviewShellStore((state) => state.setSidePanel);
15013
- const [layoutVersion, setLayoutVersion] = (0, import_react29.useState)(0);
15014
- const frameUpdateRef = (0, import_react29.useRef)(null);
15015
- (0, import_react29.useEffect)(() => {
15289
+ const [layoutVersion, setLayoutVersion] = (0, import_react30.useState)(0);
15290
+ const frameUpdateRef = (0, import_react30.useRef)(null);
15291
+ (0, import_react30.useEffect)(() => {
15016
15292
  const targetWindow = iframeRef.current?.contentWindow;
15017
15293
  const frameScroll = frameScrollRef.current;
15018
15294
  if (!targetWindow) return void 0;
@@ -15039,32 +15315,31 @@ var ReviewOutsideMarkers = () => {
15039
15315
  frameScroll?.removeEventListener("scroll", scheduleUpdate);
15040
15316
  };
15041
15317
  }, [frameScrollRef, iframeRef, targetFrameLoadVersion]);
15042
- const markers = (0, import_react29.useMemo)(() => {
15318
+ const markers = (0, import_react30.useMemo)(() => {
15043
15319
  const environment = createTargetEnvironment(iframeRef.current);
15044
15320
  if (!environment) return [];
15045
15321
  const hiddenItemIds = new Set(hiddenOverlayItemIdList);
15046
15322
  const currentScope = getReviewViewportScope(size, reviewViewportPresets);
15047
- return getNumberedReviewItems(activeItems, reviewViewportPresets).flatMap(
15048
- (numberedItem) => {
15049
- const { item, scope, displayLabel } = numberedItem;
15050
- if (hiddenItemIds.has(item.id)) return [];
15051
- if (!shouldShowMarkerForScope(scope, currentScope)) return [];
15052
- const top = getOutsideMarkerTop(item, environment);
15053
- if (typeof top !== "number") return [];
15054
- const hostTop = toHostPoint({ x: 0, y: top }, environment).y;
15055
- return {
15056
- item,
15057
- label: displayLabel,
15058
- scope,
15059
- top: Math.max(
15060
- 0,
15061
- Math.min(
15062
- environment.viewportRect.height - OUTSIDE_MARKER_HEIGHT,
15063
- hostTop
15064
- )
15065
- )
15066
- };
15067
- }
15323
+ const rawMarkers = getNumberedReviewItems(
15324
+ activeItems,
15325
+ reviewViewportPresets
15326
+ ).flatMap((numberedItem) => {
15327
+ const { item, scope, displayLabel } = numberedItem;
15328
+ if (hiddenItemIds.has(item.id)) return [];
15329
+ if (!shouldShowMarkerForScope(scope, currentScope)) return [];
15330
+ const top = getOutsideMarkerTop(item, environment);
15331
+ if (typeof top !== "number") return [];
15332
+ const hostTop = toHostPoint({ x: 0, y: top }, environment).y;
15333
+ return {
15334
+ item,
15335
+ label: displayLabel,
15336
+ scope,
15337
+ anchorTop: hostTop
15338
+ };
15339
+ });
15340
+ return arrangeOutsideMarkerLayout(
15341
+ rawMarkers,
15342
+ environment.viewportRect.height
15068
15343
  );
15069
15344
  }, [
15070
15345
  activeItems,
@@ -15075,24 +15350,34 @@ var ReviewOutsideMarkers = () => {
15075
15350
  size
15076
15351
  ]);
15077
15352
  if (markers.length === 0) return null;
15078
- return /* @__PURE__ */ (0, import_jsx_runtime36.jsx)("div", { className: "df-review-outside-marker-layer", "aria-label": "QA markers", children: markers.map((marker) => /* @__PURE__ */ (0, import_jsx_runtime36.jsx)(
15079
- "button",
15080
- {
15081
- "aria-label": `Focus ${marker.label}`,
15082
- className: `df-review-outside-marker is-scope-${marker.scope}${marker.item.id === selectedItemId ? " is-active" : ""}`,
15083
- style: { top: `${marker.top}px` },
15084
- type: "button",
15085
- onClick: (event) => {
15086
- event.preventDefault();
15087
- event.stopPropagation();
15088
- setSidePanel("qa");
15089
- setIsListVisible(true);
15090
- restoreReviewItem(marker.item);
15353
+ return /* @__PURE__ */ (0, import_jsx_runtime36.jsx)("div", { className: "df-review-outside-marker-layer", "aria-label": "QA markers", children: markers.map((marker) => {
15354
+ const isActive = marker.item.id === selectedItemId;
15355
+ const style = {
15356
+ top: `${marker.top}px`,
15357
+ "--df-review-outside-marker-connector-top": `${marker.connectorTop}px`,
15358
+ "--df-review-outside-marker-connector-stem-top": `${marker.connectorStemTop}px`,
15359
+ "--df-review-outside-marker-connector-stem-height": `${marker.connectorStemHeight}px`,
15360
+ "--df-review-outside-marker-z-index": isActive ? 2 : 1
15361
+ };
15362
+ return /* @__PURE__ */ (0, import_jsx_runtime36.jsx)(
15363
+ "button",
15364
+ {
15365
+ "aria-label": `Focus ${marker.label}`,
15366
+ className: `df-review-outside-marker is-scope-${marker.scope}${isActive ? " is-active" : ""}`,
15367
+ style,
15368
+ type: "button",
15369
+ onClick: (event) => {
15370
+ event.preventDefault();
15371
+ event.stopPropagation();
15372
+ setSidePanel("qa");
15373
+ setIsListVisible(true);
15374
+ restoreReviewItem(marker.item);
15375
+ },
15376
+ children: marker.label
15091
15377
  },
15092
- children: marker.label
15093
- },
15094
- marker.item.id
15095
- )) });
15378
+ marker.item.id
15379
+ );
15380
+ }) });
15096
15381
  };
15097
15382
 
15098
15383
  // src/react-shell/target/frame.tsx
@@ -15109,7 +15394,7 @@ var ReviewTargetFrame = () => {
15109
15394
  const mode = useReviewShellStore((state) => state.mode);
15110
15395
  const size = useReviewShellStore((state) => state.size);
15111
15396
  const target = useReviewShellStore((state) => state.target);
15112
- const targetSrc = (0, import_react30.useMemo)(() => buildTargetSrc(target), [target]);
15397
+ const targetSrc = (0, import_react31.useMemo)(() => buildTargetSrc(target), [target]);
15113
15398
  const showRuler = isRulerVisible && isRulerAvailable;
15114
15399
  const syncTargetFigmaImageOverlays = useTargetFigmaImageOverlays({
15115
15400
  figmaImageOverlays,
@@ -15174,7 +15459,7 @@ var ReviewTargetFrame = () => {
15174
15459
  };
15175
15460
 
15176
15461
  // src/react-shell/topbar.container.tsx
15177
- var import_react31 = require("react");
15462
+ var import_react32 = require("react");
15178
15463
 
15179
15464
  // src/react-shell/topbar.tsx
15180
15465
  var import_jsx_runtime38 = require("react/jsx-runtime");
@@ -15417,7 +15702,7 @@ var TopbarContainer = () => {
15417
15702
  (state) => state.setIsSitemapOpen
15418
15703
  );
15419
15704
  const setSize = useReviewShellStore((state) => state.setSize);
15420
- const [copyLabel, setCopyLabel] = (0, import_react31.useState)("Copy URL");
15705
+ const [copyLabel, setCopyLabel] = (0, import_react32.useState)("Copy URL");
15421
15706
  const copyCurrentUrl = () => copyCurrentReviewUrl({
15422
15707
  onCopyLabelChange: setCopyLabel
15423
15708
  });
@@ -15456,10 +15741,10 @@ var ReviewToastContainer = () => {
15456
15741
  };
15457
15742
 
15458
15743
  // src/react-shell/hooks/use.review.shell.runtime.ts
15459
- var import_react54 = require("react");
15744
+ var import_react55 = require("react");
15460
15745
 
15461
15746
  // src/react-shell/hooks/use.review.command.key.ts
15462
- var import_react32 = require("react");
15747
+ var import_react33 = require("react");
15463
15748
  var isCommandModifierKeyEvent = (event) => event.key === "Meta" || event.code === "MetaLeft" || event.code === "MetaRight";
15464
15749
  var isCommandKeyDownEvent = (event) => isCommandModifierKeyEvent(event) || event.metaKey;
15465
15750
  function useReviewCommandKey({
@@ -15467,8 +15752,8 @@ function useReviewCommandKey({
15467
15752
  targetFrameLoadVersion,
15468
15753
  targetSrc
15469
15754
  }) {
15470
- const [isCommandKeyPressed, setIsCommandKeyPressed] = (0, import_react32.useState)(false);
15471
- (0, import_react32.useEffect)(() => {
15755
+ const [isCommandKeyPressed, setIsCommandKeyPressed] = (0, import_react33.useState)(false);
15756
+ (0, import_react33.useEffect)(() => {
15472
15757
  const targetDocument = iframeRef.current?.contentDocument;
15473
15758
  const targetWindow = iframeRef.current?.contentWindow;
15474
15759
  const setCommandKeyPressed = (pressed) => {
@@ -15510,10 +15795,10 @@ function useReviewCommandKey({
15510
15795
  }
15511
15796
 
15512
15797
  // src/react-shell/hooks/use.review.controller.ts
15513
- var import_react37 = require("react");
15798
+ var import_react38 = require("react");
15514
15799
 
15515
15800
  // src/react-shell/hooks/use.review.item.restore.ts
15516
- var import_react33 = require("react");
15801
+ var import_react34 = require("react");
15517
15802
  function runWithAutoScrollBehavior2(targetDocument, callback) {
15518
15803
  const elements = [
15519
15804
  targetDocument?.documentElement,
@@ -15593,7 +15878,7 @@ var useReviewItemRestore = ({
15593
15878
  onTargetChange
15594
15879
  }) => {
15595
15880
  const storeApi = useReviewShellStoreApi();
15596
- const clearSelectedItem = (0, import_react33.useCallback)(() => {
15881
+ const clearSelectedItem = (0, import_react34.useCallback)(() => {
15597
15882
  pendingRestoreRef.current = null;
15598
15883
  onSelectedItemIdChange(null);
15599
15884
  controllerRef.current?.highlightItem(void 0);
@@ -15602,7 +15887,7 @@ var useReviewItemRestore = ({
15602
15887
  onSelectedItemIdChange,
15603
15888
  pendingRestoreRef
15604
15889
  ]);
15605
- const applyItemScroll = (0, import_react33.useCallback)(
15890
+ const applyItemScroll = (0, import_react34.useCallback)(
15606
15891
  async (item) => {
15607
15892
  if (storeApi.getState().selectedItemId !== item.id) return false;
15608
15893
  const targetWindow = iframeRef.current?.contentWindow;
@@ -15650,7 +15935,7 @@ var useReviewItemRestore = ({
15650
15935
  },
15651
15936
  [controllerRef, iframeRef, onSyncTargetViewport, storeApi]
15652
15937
  );
15653
- const applyPendingRestore = (0, import_react33.useCallback)(() => {
15938
+ const applyPendingRestore = (0, import_react34.useCallback)(() => {
15654
15939
  const item = pendingRestoreRef.current;
15655
15940
  if (!item) return;
15656
15941
  void applyItemScroll(item).then((didApply) => {
@@ -15659,7 +15944,7 @@ var useReviewItemRestore = ({
15659
15944
  }
15660
15945
  });
15661
15946
  }, [applyItemScroll, pendingRestoreRef]);
15662
- const restoreReviewItem = (0, import_react33.useCallback)(
15947
+ const restoreReviewItem = (0, import_react34.useCallback)(
15663
15948
  (item) => {
15664
15949
  const nextRoute = getItemTarget(item, reviewPathPrefix);
15665
15950
  const nextTarget = getItemFrameTarget(item, reviewPathPrefix);
@@ -15692,7 +15977,7 @@ var useReviewItemRestore = ({
15692
15977
  viewportPresets
15693
15978
  ]
15694
15979
  );
15695
- const restoreInitialItem = (0, import_react33.useCallback)(async () => {
15980
+ const restoreInitialItem = (0, import_react34.useCallback)(async () => {
15696
15981
  const itemId = pendingInitialItemIdRef.current;
15697
15982
  if (!itemId) return;
15698
15983
  try {
@@ -15724,7 +16009,7 @@ function highlightControllerItem(item, controller, isCurrent) {
15724
16009
  }
15725
16010
 
15726
16011
  // src/react-shell/hooks/use.review.kit.lifecycle.ts
15727
- var import_react34 = require("react");
16012
+ var import_react35 = require("react");
15728
16013
 
15729
16014
  // src/route.ts
15730
16015
  function getItemRouteKey(item) {
@@ -20489,14 +20774,14 @@ var useReviewKitLifecycle = ({
20489
20774
  onSyncTargetViewport
20490
20775
  }) => {
20491
20776
  const storeApi = useReviewShellStoreApi();
20492
- const hiddenOverlayItemIdListRef = (0, import_react34.useRef)(hiddenOverlayItemIdList);
20493
- const destroyReviewKit = (0, import_react34.useCallback)(() => {
20777
+ const hiddenOverlayItemIdListRef = (0, import_react35.useRef)(hiddenOverlayItemIdList);
20778
+ const destroyReviewKit = (0, import_react35.useCallback)(() => {
20494
20779
  cleanupTargetRef.current?.();
20495
20780
  cleanupTargetRef.current = null;
20496
20781
  controllerRef.current?.destroy();
20497
20782
  controllerRef.current = null;
20498
20783
  }, [cleanupTargetRef, controllerRef]);
20499
- const initReviewKit = (0, import_react34.useCallback)(() => {
20784
+ const initReviewKit = (0, import_react35.useCallback)(() => {
20500
20785
  destroyReviewKit();
20501
20786
  const iframe = iframeRef.current;
20502
20787
  const targetWindow = iframe?.contentWindow;
@@ -20589,23 +20874,23 @@ var useReviewKitLifecycle = ({
20589
20874
  adjustmentLabel,
20590
20875
  storeApi
20591
20876
  ]);
20592
- const reloadReviewKit = (0, import_react34.useCallback)(async () => {
20877
+ const reloadReviewKit = (0, import_react35.useCallback)(async () => {
20593
20878
  await controllerRef.current?.reload();
20594
20879
  }, [controllerRef]);
20595
- const setControllerReviewMode = (0, import_react34.useCallback)(
20880
+ const setControllerReviewMode = (0, import_react35.useCallback)(
20596
20881
  (nextMode) => {
20597
20882
  controllerRef.current?.setMode(nextMode);
20598
20883
  onModeChange(controllerRef.current?.getMode() ?? "idle");
20599
20884
  },
20600
20885
  [controllerRef, onModeChange]
20601
20886
  );
20602
- (0, import_react34.useEffect)(() => destroyReviewKit, [destroyReviewKit]);
20603
- (0, import_react34.useEffect)(() => {
20887
+ (0, import_react35.useEffect)(() => destroyReviewKit, [destroyReviewKit]);
20888
+ (0, import_react35.useEffect)(() => {
20604
20889
  const frameDocument = iframeRef.current?.contentDocument;
20605
20890
  if (!frameDocument || frameDocument.readyState !== "complete") return;
20606
20891
  initReviewKit();
20607
20892
  }, [iframeRef, initReviewKit]);
20608
- (0, import_react34.useEffect)(() => {
20893
+ (0, import_react35.useEffect)(() => {
20609
20894
  hiddenOverlayItemIdListRef.current = hiddenOverlayItemIdList;
20610
20895
  controllerRef.current?.setHiddenItemIds(hiddenOverlayItemIdList);
20611
20896
  }, [controllerRef, hiddenOverlayItemIdList]);
@@ -20618,7 +20903,7 @@ var useReviewKitLifecycle = ({
20618
20903
  };
20619
20904
 
20620
20905
  // src/react-shell/hooks/use.review.target.overlay.ts
20621
- var import_react35 = require("react");
20906
+ var import_react36 = require("react");
20622
20907
  var TARGET_OVERLAY_REFRESH_DELAYS = [80, 240, 600];
20623
20908
  var useReviewTargetOverlay = ({
20624
20909
  iframeRef,
@@ -20626,26 +20911,26 @@ var useReviewTargetOverlay = ({
20626
20911
  targetOverlayState,
20627
20912
  onTargetOverlayStateChange
20628
20913
  }) => {
20629
- const refreshTimersRef = (0, import_react35.useRef)([]);
20630
- const clearRefreshTimers = (0, import_react35.useCallback)(() => {
20914
+ const refreshTimersRef = (0, import_react36.useRef)([]);
20915
+ const clearRefreshTimers = (0, import_react36.useCallback)(() => {
20631
20916
  refreshTimersRef.current.forEach((timer) => window.clearTimeout(timer));
20632
20917
  refreshTimersRef.current = [];
20633
20918
  }, []);
20634
- const updateTargetOverlayState = (0, import_react35.useCallback)(() => {
20919
+ const updateTargetOverlayState = (0, import_react36.useCallback)(() => {
20635
20920
  const targetDocument = iframeRef.current?.contentDocument ?? void 0;
20636
20921
  ensureTargetOverlayStackingStyle(targetDocument);
20637
20922
  const state = getTargetOverlayState(targetDocument);
20638
20923
  onTargetOverlayStateChange(state);
20639
20924
  return state;
20640
20925
  }, [iframeRef, onTargetOverlayStateChange]);
20641
- const refreshTargetOverlayState = (0, import_react35.useCallback)(() => {
20926
+ const refreshTargetOverlayState = (0, import_react36.useCallback)(() => {
20642
20927
  clearRefreshTimers();
20643
20928
  updateTargetOverlayState();
20644
20929
  refreshTimersRef.current = TARGET_OVERLAY_REFRESH_DELAYS.map(
20645
20930
  (delay) => window.setTimeout(updateTargetOverlayState, delay)
20646
20931
  );
20647
20932
  }, [clearRefreshTimers, updateTargetOverlayState]);
20648
- const dispatchTargetOverlayHotkey = (0, import_react35.useCallback)(
20933
+ const dispatchTargetOverlayHotkey = (0, import_react36.useCallback)(
20649
20934
  (overlay) => {
20650
20935
  const targetWindow = iframeRef.current?.contentWindow;
20651
20936
  if (!targetWindow) return false;
@@ -20667,7 +20952,7 @@ var useReviewTargetOverlay = ({
20667
20952
  },
20668
20953
  [iframeRef, refreshTargetOverlayState]
20669
20954
  );
20670
- const toggleTargetOverlay = (0, import_react35.useCallback)(
20955
+ const toggleTargetOverlay = (0, import_react36.useCallback)(
20671
20956
  (overlay) => {
20672
20957
  if (overlay === "figma" && !isFigmaOverlayAvailable) {
20673
20958
  refreshTargetOverlayState();
@@ -20681,7 +20966,7 @@ var useReviewTargetOverlay = ({
20681
20966
  refreshTargetOverlayState
20682
20967
  ]
20683
20968
  );
20684
- const closeTargetOverlay = (0, import_react35.useCallback)(
20969
+ const closeTargetOverlay = (0, import_react36.useCallback)(
20685
20970
  (overlay) => {
20686
20971
  const currentState = updateTargetOverlayState();
20687
20972
  if (!currentState[overlay]) return false;
@@ -20689,11 +20974,11 @@ var useReviewTargetOverlay = ({
20689
20974
  },
20690
20975
  [dispatchTargetOverlayHotkey, updateTargetOverlayState]
20691
20976
  );
20692
- (0, import_react35.useEffect)(() => {
20977
+ (0, import_react36.useEffect)(() => {
20693
20978
  if (isFigmaOverlayAvailable || !targetOverlayState.figma) return;
20694
20979
  closeTargetOverlay("figma");
20695
20980
  }, [closeTargetOverlay, isFigmaOverlayAvailable, targetOverlayState.figma]);
20696
- (0, import_react35.useEffect)(() => clearRefreshTimers, [clearRefreshTimers]);
20981
+ (0, import_react36.useEffect)(() => clearRefreshTimers, [clearRefreshTimers]);
20697
20982
  return {
20698
20983
  closeTargetOverlay,
20699
20984
  refreshTargetOverlayState,
@@ -20702,7 +20987,7 @@ var useReviewTargetOverlay = ({
20702
20987
  };
20703
20988
 
20704
20989
  // src/react-shell/hooks/use.review.target.sync.ts
20705
- var import_react36 = require("react");
20990
+ var import_react37 = require("react");
20706
20991
  var useReviewTargetSync = ({
20707
20992
  iframeRef,
20708
20993
  reviewPathPrefix,
@@ -20716,7 +21001,7 @@ var useReviewTargetSync = ({
20716
21001
  onTargetChange
20717
21002
  }) => {
20718
21003
  const storeApi = useReviewShellStoreApi();
20719
- const syncShellTarget = (0, import_react36.useCallback)(
21004
+ const syncShellTarget = (0, import_react37.useCallback)(
20720
21005
  (nextTarget) => {
20721
21006
  const normalizedTarget = normalizeTarget(nextTarget, reviewPathPrefix);
20722
21007
  const nextRouteKey = getTargetRouteKey(
@@ -20751,10 +21036,10 @@ var useReviewTargetSync = ({
20751
21036
  storeApi
20752
21037
  ]
20753
21038
  );
20754
- (0, import_react36.useEffect)(() => {
21039
+ (0, import_react37.useEffect)(() => {
20755
21040
  onActiveRouteChange(getTargetRouteKey(target, reviewPathPrefix));
20756
21041
  }, [onActiveRouteChange, reviewPathPrefix, target]);
20757
- (0, import_react36.useEffect)(() => {
21042
+ (0, import_react37.useEffect)(() => {
20758
21043
  const { target: currentTarget, selectedItemId } = storeApi.getState();
20759
21044
  if (selectedItemId) {
20760
21045
  updateShellUrlForItem(currentTarget, size, selectedItemId, source);
@@ -20825,10 +21110,10 @@ var useReviewController = ({
20825
21110
  const setTargetOverlayState = useReviewShellStore(
20826
21111
  (state) => state.setTargetOverlayState
20827
21112
  );
20828
- const syncTargetViewport = (0, import_react37.useCallback)(() => {
21113
+ const syncTargetViewport = (0, import_react38.useCallback)(() => {
20829
21114
  window.dispatchEvent(new Event("resize"));
20830
21115
  }, []);
20831
- const pageTargets = (0, import_react37.useMemo)(
21116
+ const pageTargets = (0, import_react38.useMemo)(
20832
21117
  () => new Set(
20833
21118
  pages.map((page) => normalizeTarget(page.href, reviewPathPrefix))
20834
21119
  ),
@@ -20923,10 +21208,10 @@ var useReviewController = ({
20923
21208
  };
20924
21209
 
20925
21210
  // src/react-shell/hooks/use.review.ruler.ts
20926
- var import_react39 = require("react");
21211
+ var import_react40 = require("react");
20927
21212
 
20928
21213
  // src/react-shell/hooks/use.review.ruler.drag.ts
20929
- var import_react38 = require("react");
21214
+ var import_react39 = require("react");
20930
21215
 
20931
21216
  // src/react-shell/ruler/ruler.ts
20932
21217
  var getRulerPointFromRect = (clientX, clientY, rect) => {
@@ -20955,19 +21240,19 @@ var useReviewRulerDrag = ({
20955
21240
  size,
20956
21241
  targetSrc
20957
21242
  }) => {
20958
- const rulerOverlayRef = (0, import_react38.useRef)(null);
20959
- const rulerDragRectRef = (0, import_react38.useRef)(null);
20960
- const isRulerDraggingRef = (0, import_react38.useRef)(false);
20961
- const sizeRef = (0, import_react38.useRef)(size);
20962
- const [rulerStart, setRulerStart] = (0, import_react38.useState)(null);
20963
- const [rulerPoint, setRulerPoint] = (0, import_react38.useState)(null);
20964
- const [rulerHover, setRulerHover] = (0, import_react38.useState)(null);
20965
- const [isRulerDragging, setIsRulerDragging] = (0, import_react38.useState)(false);
20966
- const rulerMeasure = (0, import_react38.useMemo)(
21243
+ const rulerOverlayRef = (0, import_react39.useRef)(null);
21244
+ const rulerDragRectRef = (0, import_react39.useRef)(null);
21245
+ const isRulerDraggingRef = (0, import_react39.useRef)(false);
21246
+ const sizeRef = (0, import_react39.useRef)(size);
21247
+ const [rulerStart, setRulerStart] = (0, import_react39.useState)(null);
21248
+ const [rulerPoint, setRulerPoint] = (0, import_react39.useState)(null);
21249
+ const [rulerHover, setRulerHover] = (0, import_react39.useState)(null);
21250
+ const [isRulerDragging, setIsRulerDragging] = (0, import_react39.useState)(false);
21251
+ const rulerMeasure = (0, import_react39.useMemo)(
20967
21252
  () => getRulerMeasure(rulerStart, rulerPoint),
20968
21253
  [rulerPoint, rulerStart]
20969
21254
  );
20970
- const clearRulerMeasure = (0, import_react38.useCallback)(() => {
21255
+ const clearRulerMeasure = (0, import_react39.useCallback)(() => {
20971
21256
  rulerDragRectRef.current = null;
20972
21257
  isRulerDraggingRef.current = false;
20973
21258
  setRulerStart(null);
@@ -20975,7 +21260,7 @@ var useReviewRulerDrag = ({
20975
21260
  setRulerHover(null);
20976
21261
  setIsRulerDragging(false);
20977
21262
  }, []);
20978
- const finishRulerDrag = (0, import_react38.useCallback)((point) => {
21263
+ const finishRulerDrag = (0, import_react39.useCallback)((point) => {
20979
21264
  if (point) {
20980
21265
  setRulerPoint(point);
20981
21266
  }
@@ -20983,7 +21268,7 @@ var useReviewRulerDrag = ({
20983
21268
  isRulerDraggingRef.current = false;
20984
21269
  setIsRulerDragging(false);
20985
21270
  }, []);
20986
- const startRulerDrag = (0, import_react38.useCallback)(
21271
+ const startRulerDrag = (0, import_react39.useCallback)(
20987
21272
  (clientX, clientY, rect) => {
20988
21273
  const point = getRulerPointFromRect(clientX, clientY, rect);
20989
21274
  rulerDragRectRef.current = rect;
@@ -20994,10 +21279,10 @@ var useReviewRulerDrag = ({
20994
21279
  },
20995
21280
  []
20996
21281
  );
20997
- (0, import_react38.useEffect)(() => {
21282
+ (0, import_react39.useEffect)(() => {
20998
21283
  sizeRef.current = size;
20999
21284
  }, [size]);
21000
- (0, import_react38.useEffect)(() => {
21285
+ (0, import_react39.useEffect)(() => {
21001
21286
  if (!isRulerVisible || !isRulerAvailable) return void 0;
21002
21287
  const getRulerEventClientPoint = (event) => {
21003
21288
  const frame2 = iframeRef.current;
@@ -21111,7 +21396,7 @@ var useReviewRulerDrag = ({
21111
21396
  isRulerVisible,
21112
21397
  startRulerDrag
21113
21398
  ]);
21114
- (0, import_react38.useEffect)(() => {
21399
+ (0, import_react39.useEffect)(() => {
21115
21400
  clearRulerMeasure();
21116
21401
  }, [clearRulerMeasure, size.height, size.width, targetSrc]);
21117
21402
  return {
@@ -21132,7 +21417,7 @@ var useReviewRuler = ({
21132
21417
  onCancelReviewMode,
21133
21418
  onCloseTransientPanels
21134
21419
  }) => {
21135
- const [isRulerVisible, setIsRulerVisible] = (0, import_react39.useState)(false);
21420
+ const [isRulerVisible, setIsRulerVisible] = (0, import_react40.useState)(false);
21136
21421
  const isRulerAvailable = ruler?.enabled !== false && typeof size.designWidth === "number" && size.designWidth > 0;
21137
21422
  const rulerUnit = ruler?.unit ?? "px";
21138
21423
  const rulerScaleX = isRulerAvailable && size.designWidth ? size.width / size.designWidth : 1;
@@ -21153,13 +21438,13 @@ var useReviewRuler = ({
21153
21438
  const rulerMeasureLabel = rulerMeasure ? `${Math.round(rulerMeasure.width / rulerScaleX)} \xD7 ${Math.round(
21154
21439
  rulerMeasure.height / rulerScaleY
21155
21440
  )} ${rulerUnit}` : "";
21156
- const closeRuler = (0, import_react39.useCallback)(() => {
21441
+ const closeRuler = (0, import_react40.useCallback)(() => {
21157
21442
  if (!isRulerVisible) return false;
21158
21443
  setIsRulerVisible(false);
21159
21444
  clearRulerMeasure();
21160
21445
  return true;
21161
21446
  }, [clearRulerMeasure, isRulerVisible]);
21162
- const toggleRuler = (0, import_react39.useCallback)(() => {
21447
+ const toggleRuler = (0, import_react40.useCallback)(() => {
21163
21448
  if (!isRulerAvailable) return;
21164
21449
  onCancelReviewMode();
21165
21450
  onCloseTransientPanels();
@@ -21171,7 +21456,7 @@ var useReviewRuler = ({
21171
21456
  onCancelReviewMode,
21172
21457
  onCloseTransientPanels
21173
21458
  ]);
21174
- (0, import_react39.useEffect)(() => {
21459
+ (0, import_react40.useEffect)(() => {
21175
21460
  if (!isRulerVisible || isRulerAvailable) return;
21176
21461
  closeRuler();
21177
21462
  }, [closeRuler, isRulerAvailable, isRulerVisible]);
@@ -21192,7 +21477,7 @@ var useReviewRuler = ({
21192
21477
  };
21193
21478
 
21194
21479
  // src/react-shell/hooks/use.review.shell.actions.value.ts
21195
- var import_react40 = require("react");
21480
+ var import_react41 = require("react");
21196
21481
  var useReviewShellActionsValue = ({
21197
21482
  applyTarget,
21198
21483
  changeReviewSource,
@@ -21215,7 +21500,7 @@ var useReviewShellActionsValue = ({
21215
21500
  toggleQaPanel,
21216
21501
  toggleSourceTreePanel,
21217
21502
  toggleTargetOverlay
21218
- }) => (0, import_react40.useMemo)(
21503
+ }) => (0, import_react41.useMemo)(
21219
21504
  () => ({
21220
21505
  applyTarget: () => {
21221
21506
  void applyTarget();
@@ -21267,7 +21552,7 @@ var useReviewShellActionsValue = ({
21267
21552
  );
21268
21553
 
21269
21554
  // src/react-shell/hooks/use.review.shell.effects.ts
21270
- var import_react41 = require("react");
21555
+ var import_react42 = require("react");
21271
21556
  var useReviewShellEffects = ({
21272
21557
  frameScrollRef,
21273
21558
  iframeRef,
@@ -21280,7 +21565,7 @@ var useReviewShellEffects = ({
21280
21565
  syncTargetViewport,
21281
21566
  targetSrc
21282
21567
  }) => {
21283
- (0, import_react41.useEffect)(() => {
21568
+ (0, import_react42.useEffect)(() => {
21284
21569
  const itemId = pendingInitialItemIdRef.current;
21285
21570
  if (!itemId) return;
21286
21571
  const item = items.find(
@@ -21289,7 +21574,7 @@ var useReviewShellEffects = ({
21289
21574
  if (!item) return;
21290
21575
  restoreReviewItem(item);
21291
21576
  }, [items, pendingInitialItemIdRef, restoreReviewItem]);
21292
- (0, import_react41.useEffect)(() => {
21577
+ (0, import_react42.useEffect)(() => {
21293
21578
  const frameScroll = frameScrollRef.current;
21294
21579
  if (!frameScroll) return void 0;
21295
21580
  const centerFrameScroll = () => {
@@ -21314,7 +21599,7 @@ var useReviewShellEffects = ({
21314
21599
  syncTargetViewport,
21315
21600
  targetSrc
21316
21601
  ]);
21317
- (0, import_react41.useEffect)(() => {
21602
+ (0, import_react42.useEffect)(() => {
21318
21603
  const targetDocument = iframeRef.current?.contentDocument;
21319
21604
  setTargetFigmaOverlayLocked(targetDocument, mode === "element");
21320
21605
  return () => {
@@ -21348,7 +21633,7 @@ function normalizeFigmaNodeValue(value) {
21348
21633
  }
21349
21634
 
21350
21635
  // src/react-shell/hooks/use.review.figma.images.ts
21351
- var import_react42 = require("react");
21636
+ var import_react43 = require("react");
21352
21637
  var useReviewFigmaImages = ({
21353
21638
  imageFormat = DEFAULT_REVIEW_FIGMA_IMAGE_FORMAT,
21354
21639
  pageUrl,
@@ -21356,7 +21641,7 @@ var useReviewFigmaImages = ({
21356
21641
  store,
21357
21642
  viewport
21358
21643
  }) => {
21359
- const target = (0, import_react42.useMemo)(
21644
+ const target = (0, import_react43.useMemo)(
21360
21645
  () => createReviewFigmaRouteTarget({
21361
21646
  pageUrl,
21362
21647
  projectId,
@@ -21419,7 +21704,7 @@ var useReviewFigmaImages = ({
21419
21704
  isLoading,
21420
21705
  target
21421
21706
  });
21422
- const addImage = (0, import_react42.useCallback)(
21707
+ const addImage = (0, import_react43.useCallback)(
21423
21708
  async (figmaUrl, label) => {
21424
21709
  const image = await addStoreImage(figmaUrl, label);
21425
21710
  if (image) showImage(image.id);
@@ -21500,14 +21785,14 @@ var useReviewShellFigmaImages = ({
21500
21785
  };
21501
21786
 
21502
21787
  // src/react-shell/hooks/use.review.shell.figma.overlay.ts
21503
- var import_react43 = require("react");
21788
+ var import_react44 = require("react");
21504
21789
  var useReviewShellFigmaOverlay = ({
21505
21790
  figmaImagesController,
21506
21791
  isFigmaImageManagementEnabled,
21507
21792
  isFigmaOverlayAvailable,
21508
21793
  isTargetFigmaOverlayActive,
21509
21794
  onToggleTargetOverlay
21510
- }) => (0, import_react43.useMemo)(
21795
+ }) => (0, import_react44.useMemo)(
21511
21796
  () => ({
21512
21797
  figmaOverlayUnavailableMessage: isFigmaImageManagementEnabled ? "No Figma images on this viewport." : void 0,
21513
21798
  isFigmaOverlayActive: isFigmaImageManagementEnabled ? figmaImagesController.isAnyImageOverlayVisible : isTargetFigmaOverlayActive,
@@ -21526,10 +21811,10 @@ var useReviewShellFigmaOverlay = ({
21526
21811
  );
21527
21812
 
21528
21813
  // src/react-shell/hooks/use.review.shell.presence.state.ts
21529
- var import_react45 = require("react");
21814
+ var import_react46 = require("react");
21530
21815
 
21531
21816
  // src/react-shell/hooks/use.review.presence.ts
21532
- var import_react44 = require("react");
21817
+ var import_react45 = require("react");
21533
21818
 
21534
21819
  // src/react-shell/presence/presence.ts
21535
21820
  var REVIEW_PRESENCE_SESSION_KEY = "df-review-presence-session-id";
@@ -21744,10 +22029,10 @@ var useReviewPresence = ({
21744
22029
  size,
21745
22030
  source
21746
22031
  }) => {
21747
- const presenceSessionRef = (0, import_react44.useRef)(null);
21748
- const [presenceUsers, setPresenceUsers] = (0, import_react44.useState)([]);
21749
- const [presenceSessionVersion, setPresenceSessionVersion] = (0, import_react44.useState)(0);
21750
- const presenceSessionId = (0, import_react44.useMemo)(getReviewPresenceSessionId, []);
22032
+ const presenceSessionRef = (0, import_react45.useRef)(null);
22033
+ const [presenceUsers, setPresenceUsers] = (0, import_react45.useState)([]);
22034
+ const [presenceSessionVersion, setPresenceSessionVersion] = (0, import_react45.useState)(0);
22035
+ const presenceSessionId = (0, import_react45.useMemo)(getReviewPresenceSessionId, []);
21751
22036
  const normalizedReviewUserId = reviewUserId.trim();
21752
22037
  const presenceDisplayName = getReviewPresenceDisplayName(
21753
22038
  normalizedReviewUserId
@@ -21755,7 +22040,7 @@ var useReviewPresence = ({
21755
22040
  const presenceColor = getReviewPresenceColor(
21756
22041
  normalizedReviewUserId || presenceSessionId
21757
22042
  );
21758
- const presenceViewport = (0, import_react44.useMemo)(
22043
+ const presenceViewport = (0, import_react45.useMemo)(
21759
22044
  () => ({
21760
22045
  label: size.label,
21761
22046
  width: size.width,
@@ -21765,7 +22050,7 @@ var useReviewPresence = ({
21765
22050
  [size]
21766
22051
  );
21767
22052
  const presenceStatus = mode === "idle" ? "reviewing" : "editing";
21768
- const visiblePresenceUsers = (0, import_react44.useMemo)(
22053
+ const visiblePresenceUsers = (0, import_react45.useMemo)(
21769
22054
  () => {
21770
22055
  const projectPresenceUsers = presenceUsers.filter(
21771
22056
  (user) => user.projectId === projectId && user.userId.trim()
@@ -21777,14 +22062,14 @@ var useReviewPresence = ({
21777
22062
  },
21778
22063
  [presenceUsers, projectId, reviewPathPrefix]
21779
22064
  );
21780
- const currentPagePresenceUsers = (0, import_react44.useMemo)(
22065
+ const currentPagePresenceUsers = (0, import_react45.useMemo)(
21781
22066
  () => visiblePresenceUsers.filter((user) => {
21782
22067
  const userTarget = getPresenceUserTarget(user, reviewPathPrefix);
21783
22068
  return userTarget === activeRoute;
21784
22069
  }),
21785
22070
  [activeRoute, reviewPathPrefix, visiblePresenceUsers]
21786
22071
  );
21787
- const pagePresenceUsers = (0, import_react44.useMemo)(() => {
22072
+ const pagePresenceUsers = (0, import_react45.useMemo)(() => {
21788
22073
  const usersByTarget = /* @__PURE__ */ new Map();
21789
22074
  visiblePresenceUsers.forEach((user) => {
21790
22075
  const userTarget = getPresenceUserTarget(user, reviewPathPrefix);
@@ -21794,7 +22079,7 @@ var useReviewPresence = ({
21794
22079
  });
21795
22080
  return usersByTarget;
21796
22081
  }, [reviewPathPrefix, visiblePresenceUsers]);
21797
- const getCurrentPresenceState = (0, import_react44.useCallback)(
22082
+ const getCurrentPresenceState = (0, import_react45.useCallback)(
21798
22083
  () => ({
21799
22084
  projectId,
21800
22085
  sessionId: presenceSessionId,
@@ -21825,9 +22110,9 @@ var useReviewPresence = ({
21825
22110
  source
21826
22111
  ]
21827
22112
  );
21828
- const getCurrentPresenceStateRef = (0, import_react44.useRef)(getCurrentPresenceState);
22113
+ const getCurrentPresenceStateRef = (0, import_react45.useRef)(getCurrentPresenceState);
21829
22114
  getCurrentPresenceStateRef.current = getCurrentPresenceState;
21830
- (0, import_react44.useEffect)(() => {
22115
+ (0, import_react45.useEffect)(() => {
21831
22116
  if (!presence || !normalizedReviewUserId) {
21832
22117
  const session = presenceSessionRef.current;
21833
22118
  presenceSessionRef.current = null;
@@ -21877,7 +22162,7 @@ var useReviewPresence = ({
21877
22162
  presenceSessionId,
21878
22163
  projectId
21879
22164
  ]);
21880
- (0, import_react44.useEffect)(() => {
22165
+ (0, import_react45.useEffect)(() => {
21881
22166
  const session = presenceSessionRef.current;
21882
22167
  if (!session || !normalizedReviewUserId) return;
21883
22168
  void session.update(getCurrentPresenceState());
@@ -21920,7 +22205,7 @@ var useReviewShellPresenceState = ({
21920
22205
  size,
21921
22206
  source
21922
22207
  });
21923
- return (0, import_react45.useMemo)(
22208
+ return (0, import_react46.useMemo)(
21924
22209
  () => ({
21925
22210
  currentPagePresenceUsers,
21926
22211
  pagePresenceUsers,
@@ -21935,7 +22220,7 @@ var useReviewShellPresenceState = ({
21935
22220
  };
21936
22221
 
21937
22222
  // src/react-shell/hooks/use.review.settings.ts
21938
- var import_react46 = require("react");
22223
+ var import_react47 = require("react");
21939
22224
  var useReviewSettings = ({
21940
22225
  defaultReviewUserId = "",
21941
22226
  onCancelReviewMode,
@@ -21943,34 +22228,34 @@ var useReviewSettings = ({
21943
22228
  onCloseSitemap,
21944
22229
  onReloadTargetFrame
21945
22230
  }) => {
21946
- const [figmaTokenDraft, setFigmaTokenDraft] = (0, import_react46.useState)(getStoredFigmaToken);
21947
- const [reviewUserId, setReviewUserId] = (0, import_react46.useState)(
22231
+ const [figmaTokenDraft, setFigmaTokenDraft] = (0, import_react47.useState)(getStoredFigmaToken);
22232
+ const [reviewUserId, setReviewUserId] = (0, import_react47.useState)(
21948
22233
  () => getStoredReviewUserId(defaultReviewUserId)
21949
22234
  );
21950
- const [reviewUserIdDraft, setReviewUserIdDraft] = (0, import_react46.useState)(
22235
+ const [reviewUserIdDraft, setReviewUserIdDraft] = (0, import_react47.useState)(
21951
22236
  () => getStoredReviewUserId(defaultReviewUserId)
21952
22237
  );
21953
- const [reviewTheme, setReviewTheme] = (0, import_react46.useState)(getStoredReviewTheme);
21954
- const [reviewThemeDraft, setReviewThemeDraft] = (0, import_react46.useState)(getStoredReviewTheme);
21955
- const [areTooltipsEnabled, setAreTooltipsEnabled] = (0, import_react46.useState)(
22238
+ const [reviewTheme, setReviewTheme] = (0, import_react47.useState)(getStoredReviewTheme);
22239
+ const [reviewThemeDraft, setReviewThemeDraft] = (0, import_react47.useState)(getStoredReviewTheme);
22240
+ const [areTooltipsEnabled, setAreTooltipsEnabled] = (0, import_react47.useState)(
21956
22241
  getStoredReviewTooltipsEnabled
21957
22242
  );
21958
- const [areTooltipsEnabledDraft, setAreTooltipsEnabledDraft] = (0, import_react46.useState)(
22243
+ const [areTooltipsEnabledDraft, setAreTooltipsEnabledDraft] = (0, import_react47.useState)(
21959
22244
  getStoredReviewTooltipsEnabled
21960
22245
  );
21961
- const [systemReviewTheme, setSystemReviewTheme] = (0, import_react46.useState)(getSystemReviewTheme);
21962
- const [figmaSettingsStatus, setFigmaSettingsStatus] = (0, import_react46.useState)("");
21963
- const [isFigmaSettingsOpen, setIsFigmaSettingsOpen] = (0, import_react46.useState)(false);
21964
- const [isFigmaTokenVisible, setIsFigmaTokenVisible] = (0, import_react46.useState)(false);
21965
- const [isFigmaTokenGuideOpen, setIsFigmaTokenGuideOpen] = (0, import_react46.useState)(false);
22246
+ const [systemReviewTheme, setSystemReviewTheme] = (0, import_react47.useState)(getSystemReviewTheme);
22247
+ const [figmaSettingsStatus, setFigmaSettingsStatus] = (0, import_react47.useState)("");
22248
+ const [isFigmaSettingsOpen, setIsFigmaSettingsOpen] = (0, import_react47.useState)(false);
22249
+ const [isFigmaTokenVisible, setIsFigmaTokenVisible] = (0, import_react47.useState)(false);
22250
+ const [isFigmaTokenGuideOpen, setIsFigmaTokenGuideOpen] = (0, import_react47.useState)(false);
21966
22251
  const effectiveReviewTheme = reviewTheme === "system" ? systemReviewTheme : reviewTheme;
21967
- const closeFigmaSettings = (0, import_react46.useCallback)(() => {
22252
+ const closeFigmaSettings = (0, import_react47.useCallback)(() => {
21968
22253
  setIsFigmaSettingsOpen(false);
21969
22254
  setFigmaSettingsStatus("");
21970
22255
  setIsFigmaTokenVisible(false);
21971
22256
  setIsFigmaTokenGuideOpen(false);
21972
22257
  }, []);
21973
- const openFigmaSettings = (0, import_react46.useCallback)(() => {
22258
+ const openFigmaSettings = (0, import_react47.useCallback)(() => {
21974
22259
  onCancelReviewMode();
21975
22260
  onCloseSitemap();
21976
22261
  onCloseInitialPrompt();
@@ -21990,7 +22275,7 @@ var useReviewSettings = ({
21990
22275
  areTooltipsEnabled,
21991
22276
  reviewTheme
21992
22277
  ]);
21993
- const saveReviewSettings = (0, import_react46.useCallback)(
22278
+ const saveReviewSettings = (0, import_react47.useCallback)(
21994
22279
  (token, userId, theme, tooltipsEnabled) => {
21995
22280
  const nextToken = token.trim();
21996
22281
  const nextUserId = userId.trim();
@@ -22017,13 +22302,13 @@ var useReviewSettings = ({
22017
22302
  },
22018
22303
  [closeFigmaSettings, onReloadTargetFrame]
22019
22304
  );
22020
- (0, import_react46.useEffect)(() => {
22305
+ (0, import_react47.useEffect)(() => {
22021
22306
  if (getStoredReviewUserId()) return;
22022
22307
  const nextDefaultUserId = defaultReviewUserId.trim();
22023
22308
  setReviewUserId(nextDefaultUserId);
22024
22309
  setReviewUserIdDraft(nextDefaultUserId);
22025
22310
  }, [defaultReviewUserId]);
22026
- (0, import_react46.useEffect)(() => {
22311
+ (0, import_react47.useEffect)(() => {
22027
22312
  if (typeof window === "undefined" || !window.matchMedia) return void 0;
22028
22313
  const query = window.matchMedia("(prefers-color-scheme: light)");
22029
22314
  const syncSystemTheme = () => {
@@ -22037,7 +22322,7 @@ var useReviewSettings = ({
22037
22322
  query.addListener(syncSystemTheme);
22038
22323
  return () => query.removeListener(syncSystemTheme);
22039
22324
  }, []);
22040
- (0, import_react46.useEffect)(() => {
22325
+ (0, import_react47.useEffect)(() => {
22041
22326
  document.body.classList.toggle(
22042
22327
  "df-review-theme-light",
22043
22328
  effectiveReviewTheme === "light"
@@ -22079,7 +22364,7 @@ var useReviewSettings = ({
22079
22364
  };
22080
22365
 
22081
22366
  // src/react-shell/hooks/use.review.shell.runtime.actions.ts
22082
- var import_react47 = require("react");
22367
+ var import_react48 = require("react");
22083
22368
  var useReviewShellTransientActions = ({
22084
22369
  controllerRef,
22085
22370
  iframeRef,
@@ -22087,20 +22372,20 @@ var useReviewShellTransientActions = ({
22087
22372
  setIsSitemapOpen,
22088
22373
  setMode
22089
22374
  }) => {
22090
- const cancelReviewMode = (0, import_react47.useCallback)(() => {
22375
+ const cancelReviewMode = (0, import_react48.useCallback)(() => {
22091
22376
  const controller = controllerRef.current;
22092
22377
  if (!controller || controller.getMode() === "idle") return false;
22093
22378
  controller.setMode("idle");
22094
22379
  setMode(controller.getMode());
22095
22380
  return true;
22096
22381
  }, [controllerRef, setMode]);
22097
- const closePromptModal = (0, import_react47.useCallback)(() => {
22382
+ const closePromptModal = (0, import_react48.useCallback)(() => {
22098
22383
  setIsInitialPromptOpen(false);
22099
22384
  }, [setIsInitialPromptOpen]);
22100
- const closeSitemap = (0, import_react47.useCallback)(() => {
22385
+ const closeSitemap = (0, import_react48.useCallback)(() => {
22101
22386
  setIsSitemapOpen(false);
22102
22387
  }, [setIsSitemapOpen]);
22103
- const reloadTargetFrame = (0, import_react47.useCallback)(() => {
22388
+ const reloadTargetFrame = (0, import_react48.useCallback)(() => {
22104
22389
  try {
22105
22390
  iframeRef.current?.contentWindow?.location.reload();
22106
22391
  } catch {
@@ -22119,14 +22404,14 @@ var useReviewShellPanelActions = ({
22119
22404
  isSourceInspectorEnabled,
22120
22405
  toggleSidePanel
22121
22406
  }) => {
22122
- const toggleQaPanel = (0, import_react47.useCallback)(() => {
22407
+ const toggleQaPanel = (0, import_react48.useCallback)(() => {
22123
22408
  toggleSidePanel("qa");
22124
22409
  }, [toggleSidePanel]);
22125
- const toggleSourceTreePanel = (0, import_react47.useCallback)(() => {
22410
+ const toggleSourceTreePanel = (0, import_react48.useCallback)(() => {
22126
22411
  if (!isSourceInspectorEnabled) return;
22127
22412
  toggleSidePanel("source");
22128
22413
  }, [isSourceInspectorEnabled, toggleSidePanel]);
22129
- const toggleFigmaImagesPanel = (0, import_react47.useCallback)(() => {
22414
+ const toggleFigmaImagesPanel = (0, import_react48.useCallback)(() => {
22130
22415
  if (!isFigmaImageManagementEnabled) return;
22131
22416
  toggleSidePanel("figma-images");
22132
22417
  }, [
@@ -22145,7 +22430,7 @@ var useReviewShellModeSetter = ({
22145
22430
  openSidePanel,
22146
22431
  setControllerReviewMode,
22147
22432
  writeModes
22148
- }) => (0, import_react47.useCallback)(
22433
+ }) => (0, import_react48.useCallback)(
22149
22434
  (nextMode) => {
22150
22435
  const writeMode = getReviewModeWriteMode(nextMode);
22151
22436
  if (writeMode && !writeModes.includes(writeMode)) return;
@@ -22170,7 +22455,7 @@ var useReviewShellLoadTargetFrame = ({
22170
22455
  initReviewKit,
22171
22456
  mode,
22172
22457
  refreshTargetFigmaConfig
22173
- }) => (0, import_react47.useCallback)(() => {
22458
+ }) => (0, import_react48.useCallback)(() => {
22174
22459
  bumpTargetFrameLoadVersion();
22175
22460
  initReviewKit();
22176
22461
  refreshTargetFigmaConfig();
@@ -22189,7 +22474,7 @@ var useReviewShellLoadTargetFrame = ({
22189
22474
  ]);
22190
22475
 
22191
22476
  // src/react-shell/hooks/use.review.shell.hotkeys.ts
22192
- var import_react48 = require("react");
22477
+ var import_react49 = require("react");
22193
22478
  var useReviewShellHotkeys = ({
22194
22479
  isRailHotkeyBlocked,
22195
22480
  isFigmaSettingsOpen,
@@ -22218,7 +22503,7 @@ var useReviewShellHotkeys = ({
22218
22503
  const setIsSitemapOpen = useReviewShellStore(
22219
22504
  (state) => state.setIsSitemapOpen
22220
22505
  );
22221
- (0, import_react48.useEffect)(() => {
22506
+ (0, import_react49.useEffect)(() => {
22222
22507
  if (mode === "idle" && !isRulerVisible && !isInitialPromptOpen && !isSitemapOpen && !isFigmaSettingsOpen) {
22223
22508
  return;
22224
22509
  }
@@ -22262,7 +22547,7 @@ var useReviewShellHotkeys = ({
22262
22547
  setIsInitialPromptOpen,
22263
22548
  setIsSitemapOpen
22264
22549
  ]);
22265
- (0, import_react48.useEffect)(() => {
22550
+ (0, import_react49.useEffect)(() => {
22266
22551
  const handleHotkey = (event) => {
22267
22552
  if (event.metaKey || event.ctrlKey || event.altKey || event.shiftKey) {
22268
22553
  return;
@@ -22295,7 +22580,7 @@ var useReviewShellHotkeys = ({
22295
22580
  onToggleRuler,
22296
22581
  onToggleTargetOverlay
22297
22582
  ]);
22298
- (0, import_react48.useEffect)(() => {
22583
+ (0, import_react49.useEffect)(() => {
22299
22584
  const handleRailHotkey = (event) => {
22300
22585
  if (isRailHotkeyBlocked || isEditableEventTarget(event)) return;
22301
22586
  const actions = [
@@ -22320,7 +22605,7 @@ var useReviewShellHotkeys = ({
22320
22605
  };
22321
22606
 
22322
22607
  // src/react-shell/hooks/use.review.shell.refresh.ts
22323
- var import_react49 = require("react");
22608
+ var import_react50 = require("react");
22324
22609
  var useReviewShellRefresh = ({
22325
22610
  activeAdapterEntry,
22326
22611
  activeRoute,
@@ -22332,8 +22617,8 @@ var useReviewShellRefresh = ({
22332
22617
  remoteAdapterEntry,
22333
22618
  storeApi
22334
22619
  }) => {
22335
- const itemRefreshIdRef = (0, import_react49.useRef)(0);
22336
- const refreshItems = (0, import_react49.useCallback)(
22620
+ const itemRefreshIdRef = (0, import_react50.useRef)(0);
22621
+ const refreshItems = (0, import_react50.useCallback)(
22337
22622
  async () => {
22338
22623
  const requestId = ++itemRefreshIdRef.current;
22339
22624
  storeApi.getState().setIsItemsLoading(true);
@@ -22361,7 +22646,7 @@ var useReviewShellRefresh = ({
22361
22646
  storeApi
22362
22647
  ]
22363
22648
  );
22364
- const refreshSitemapItems = (0, import_react49.useCallback)(
22649
+ const refreshSitemapItems = (0, import_react50.useCallback)(
22365
22650
  () => refreshSitemapReviewItems({
22366
22651
  localAdapterEntry,
22367
22652
  projectId,
@@ -22370,13 +22655,13 @@ var useReviewShellRefresh = ({
22370
22655
  }),
22371
22656
  [localAdapterEntry, projectId, remoteAdapterEntry, storeApi]
22372
22657
  );
22373
- (0, import_react49.useEffect)(() => {
22658
+ (0, import_react50.useEffect)(() => {
22374
22659
  void refreshItems();
22375
22660
  }, [refreshItems]);
22376
- (0, import_react49.useEffect)(() => {
22661
+ (0, import_react50.useEffect)(() => {
22377
22662
  void refreshSitemapItems();
22378
22663
  }, [refreshSitemapItems]);
22379
- (0, import_react49.useEffect)(() => {
22664
+ (0, import_react50.useEffect)(() => {
22380
22665
  if (!isSitemapOpen) return;
22381
22666
  void refreshSitemapItems();
22382
22667
  }, [isSitemapOpen, refreshSitemapItems]);
@@ -22475,17 +22760,17 @@ var useReviewShellState = () => {
22475
22760
  };
22476
22761
 
22477
22762
  // src/react-shell/hooks/use.review.shell.target.figma.ts
22478
- var import_react50 = require("react");
22763
+ var import_react51 = require("react");
22479
22764
  var useReviewShellTargetFigma = ({
22480
22765
  iframeRef,
22481
22766
  isFigmaImageManagementEnabled,
22482
22767
  isViewportFigmaOverlayAvailable,
22483
22768
  targetSrc
22484
22769
  }) => {
22485
- const [targetFigmaState, setTargetFigmaState] = (0, import_react50.useState)(null);
22770
+ const [targetFigmaState, setTargetFigmaState] = (0, import_react51.useState)(null);
22486
22771
  const targetFigmaConfig = targetFigmaState?.targetSrc === targetSrc ? targetFigmaState.config : null;
22487
22772
  const isFigmaOverlayAvailable = !isFigmaImageManagementEnabled && isViewportFigmaOverlayAvailable && Boolean(targetFigmaConfig);
22488
- const refreshTargetFigmaConfig = (0, import_react50.useCallback)(() => {
22773
+ const refreshTargetFigmaConfig = (0, import_react51.useCallback)(() => {
22489
22774
  const config = getTargetFigmaFrameConfig(
22490
22775
  iframeRef.current?.contentWindow
22491
22776
  );
@@ -22498,7 +22783,7 @@ var useReviewShellTargetFigma = ({
22498
22783
  };
22499
22784
 
22500
22785
  // src/react-shell/hooks/use.review.side.panel.ts
22501
- var import_react51 = require("react");
22786
+ var import_react52 = require("react");
22502
22787
  var getAvailableSidePanel = (sidePanel, {
22503
22788
  isFigmaImageManagementEnabled,
22504
22789
  isSourceInspectorEnabled
@@ -22523,7 +22808,7 @@ var useReviewSidePanel = ({
22523
22808
  const isQaPanelVisible = isListVisible && sidePanel === "qa";
22524
22809
  const isSourceTreePanelVisible = isSourceInspectorEnabled && isListVisible && sidePanel === "source";
22525
22810
  const isFigmaImagesPanelVisible = isFigmaImageManagementEnabled && isListVisible && sidePanel === "figma-images";
22526
- (0, import_react51.useEffect)(() => {
22811
+ (0, import_react52.useEffect)(() => {
22527
22812
  const state = storeApi.getState();
22528
22813
  const availableSidePanel = getAvailableSidePanel(state.sidePanel, {
22529
22814
  isFigmaImageManagementEnabled,
@@ -22533,13 +22818,13 @@ var useReviewSidePanel = ({
22533
22818
  state.setSidePanel(availableSidePanel);
22534
22819
  }
22535
22820
  }, [isFigmaImageManagementEnabled, isSourceInspectorEnabled, storeApi]);
22536
- (0, import_react51.useEffect)(() => {
22821
+ (0, import_react52.useEffect)(() => {
22537
22822
  writeStoredReviewSidePanel(sidePanel);
22538
22823
  }, [sidePanel]);
22539
- (0, import_react51.useEffect)(() => {
22824
+ (0, import_react52.useEffect)(() => {
22540
22825
  writeStoredReviewSidePanelVisible(isListVisible);
22541
22826
  }, [isListVisible]);
22542
- const openSidePanel = (0, import_react51.useCallback)(
22827
+ const openSidePanel = (0, import_react52.useCallback)(
22543
22828
  (nextSidePanel) => {
22544
22829
  const state = storeApi.getState();
22545
22830
  state.setSidePanel(
@@ -22552,7 +22837,7 @@ var useReviewSidePanel = ({
22552
22837
  },
22553
22838
  [isFigmaImageManagementEnabled, isSourceInspectorEnabled, storeApi]
22554
22839
  );
22555
- const toggleSidePanel = (0, import_react51.useCallback)(
22840
+ const toggleSidePanel = (0, import_react52.useCallback)(
22556
22841
  (nextSidePanel) => {
22557
22842
  const state = storeApi.getState();
22558
22843
  const currentSidePanel = getAvailableSidePanel(state.sidePanel, {
@@ -22582,7 +22867,7 @@ var useReviewSidePanel = ({
22582
22867
  };
22583
22868
 
22584
22869
  // src/react-shell/hooks/use.review.source.inspector.ts
22585
- var import_react52 = require("react");
22870
+ var import_react53 = require("react");
22586
22871
 
22587
22872
  // src/react-shell/review/source.shortcut.style.ts
22588
22873
  function createSourceShortcutStyle(optionAttribute, fontOverlayAttribute) {
@@ -22668,14 +22953,14 @@ function useReviewSourceInspector({
22668
22953
  onCancelReviewMode
22669
22954
  }) {
22670
22955
  const showToast = useReviewToast();
22671
- const sourceShortcutCleanupRef = (0, import_react52.useRef)(null);
22672
- const sourceInspectorInteractionRef = (0, import_react52.useRef)(false);
22673
- const [sourceInspectorState, setSourceInspectorState] = (0, import_react52.useState)(null);
22674
- const clearSourceInspector = (0, import_react52.useCallback)(() => {
22956
+ const sourceShortcutCleanupRef = (0, import_react53.useRef)(null);
22957
+ const sourceInspectorInteractionRef = (0, import_react53.useRef)(false);
22958
+ const [sourceInspectorState, setSourceInspectorState] = (0, import_react53.useState)(null);
22959
+ const clearSourceInspector = (0, import_react53.useCallback)(() => {
22675
22960
  sourceInspectorInteractionRef.current = false;
22676
22961
  setSourceInspectorState(null);
22677
22962
  }, []);
22678
- const getSourceInspectorRect = (0, import_react52.useCallback)(
22963
+ const getSourceInspectorRect = (0, import_react53.useCallback)(
22679
22964
  (element) => {
22680
22965
  const frame = iframeRef.current;
22681
22966
  if (!frame) return null;
@@ -22700,7 +22985,7 @@ function useReviewSourceInspector({
22700
22985
  },
22701
22986
  [iframeRef]
22702
22987
  );
22703
- const getSourceInspectorPanelPosition = (0, import_react52.useCallback)(
22988
+ const getSourceInspectorPanelPosition = (0, import_react53.useCallback)(
22704
22989
  (rect) => {
22705
22990
  const margin = 12;
22706
22991
  const gap = 10;
@@ -22726,7 +23011,7 @@ function useReviewSourceInspector({
22726
23011
  },
22727
23012
  []
22728
23013
  );
22729
- const showSourceInspectorForTarget = (0, import_react52.useCallback)(
23014
+ const showSourceInspectorForTarget = (0, import_react53.useCallback)(
22730
23015
  (target, isPinned = false) => {
22731
23016
  const candidates = getSourceCandidates(target, sourceCandidateOptions).map(
22732
23017
  (candidate) => ({
@@ -22762,7 +23047,7 @@ function useReviewSourceInspector({
22762
23047
  sourceOpenOptions
22763
23048
  ]
22764
23049
  );
22765
- const showSourceOutlineForTarget = (0, import_react52.useCallback)(
23050
+ const showSourceOutlineForTarget = (0, import_react53.useCallback)(
22766
23051
  (target) => {
22767
23052
  const firstCandidate = getSourceCandidates(
22768
23053
  target,
@@ -22786,7 +23071,7 @@ function useReviewSourceInspector({
22786
23071
  },
22787
23072
  [getSourceInspectorRect, sourceCandidateOptions]
22788
23073
  );
22789
- const showSourceOutlineForElement = (0, import_react52.useCallback)(
23074
+ const showSourceOutlineForElement = (0, import_react53.useCallback)(
22790
23075
  (element) => {
22791
23076
  if (!isSourceTreeHoverOutlineEnabled) return;
22792
23077
  const rect = getSourceInspectorRect(element);
@@ -22810,10 +23095,10 @@ function useReviewSourceInspector({
22810
23095
  },
22811
23096
  [getSourceInspectorRect, isSourceTreeHoverOutlineEnabled]
22812
23097
  );
22813
- const clearSourceOutlineHover = (0, import_react52.useCallback)(() => {
23098
+ const clearSourceOutlineHover = (0, import_react53.useCallback)(() => {
22814
23099
  setSourceInspectorState((current) => current?.isPinned ? current : null);
22815
23100
  }, []);
22816
- const openSourceCandidate = (0, import_react52.useCallback)(
23101
+ const openSourceCandidate = (0, import_react53.useCallback)(
22817
23102
  (candidate) => {
22818
23103
  const didOpen = openSourceInEditor(candidate.source, {
22819
23104
  ...sourceOpenOptions,
@@ -22824,11 +23109,11 @@ function useReviewSourceInspector({
22824
23109
  },
22825
23110
  [clearSourceInspector, showToast, sourceOpenOptions]
22826
23111
  );
22827
- const cleanupSourceOpenShortcut = (0, import_react52.useCallback)(() => {
23112
+ const cleanupSourceOpenShortcut = (0, import_react53.useCallback)(() => {
22828
23113
  sourceShortcutCleanupRef.current?.();
22829
23114
  sourceShortcutCleanupRef.current = null;
22830
23115
  }, []);
22831
- const bindSourceOpenShortcut = (0, import_react52.useCallback)(() => {
23116
+ const bindSourceOpenShortcut = (0, import_react53.useCallback)(() => {
22832
23117
  cleanupSourceOpenShortcut();
22833
23118
  let frameDocument = null;
22834
23119
  try {
@@ -23019,10 +23304,10 @@ function useReviewSourceInspector({
23019
23304
  showSourceOutlineForTarget,
23020
23305
  showSourceInspectorForTarget
23021
23306
  ]);
23022
- (0, import_react52.useEffect)(() => {
23307
+ (0, import_react53.useEffect)(() => {
23023
23308
  return cleanupSourceOpenShortcut;
23024
23309
  }, [cleanupSourceOpenShortcut]);
23025
- (0, import_react52.useEffect)(() => {
23310
+ (0, import_react53.useEffect)(() => {
23026
23311
  const frame = window.requestAnimationFrame(bindSourceOpenShortcut);
23027
23312
  return () => window.cancelAnimationFrame(frame);
23028
23313
  }, [bindSourceOpenShortcut, targetSrc]);
@@ -23038,7 +23323,7 @@ function useReviewSourceInspector({
23038
23323
  }
23039
23324
 
23040
23325
  // src/react-shell/hooks/use.review.target.navigation.ts
23041
- var import_react53 = require("react");
23326
+ var import_react54 = require("react");
23042
23327
  var useReviewTargetNavigation = ({
23043
23328
  onCancelReviewMode,
23044
23329
  onClearSelectedItem,
@@ -23048,11 +23333,11 @@ var useReviewTargetNavigation = ({
23048
23333
  const { reviewPathPrefix, viewportPresets } = useReviewShellConfig();
23049
23334
  const { activeAdapterEntry, source, sourceEntries } = useReviewShellAdapterState();
23050
23335
  const storeApi = useReviewShellStoreApi();
23051
- const getPageTarget = (0, import_react53.useCallback)(
23336
+ const getPageTarget = (0, import_react54.useCallback)(
23052
23337
  (href) => normalizeTarget(href, reviewPathPrefix),
23053
23338
  [reviewPathPrefix]
23054
23339
  );
23055
- const applyTarget = (0, import_react53.useCallback)(async () => {
23340
+ const applyTarget = (0, import_react54.useCallback)(async () => {
23056
23341
  const state = storeApi.getState();
23057
23342
  const parsedInput = parseReviewAddressInput(
23058
23343
  state.draftTarget,
@@ -23101,7 +23386,7 @@ var useReviewTargetNavigation = ({
23101
23386
  storeApi,
23102
23387
  viewportPresets
23103
23388
  ]);
23104
- const selectPage = (0, import_react53.useCallback)(
23389
+ const selectPage = (0, import_react54.useCallback)(
23105
23390
  (href) => {
23106
23391
  const normalizedTarget = getPageTarget(href);
23107
23392
  const normalizedRoute = getTargetRouteKey(
@@ -23125,17 +23410,17 @@ var useReviewTargetNavigation = ({
23125
23410
  storeApi
23126
23411
  ]
23127
23412
  );
23128
- const selectAllQa = (0, import_react53.useCallback)(() => {
23413
+ const selectAllQa = (0, import_react54.useCallback)(() => {
23129
23414
  const state = storeApi.getState();
23130
23415
  state.setIsAllQaVisible(true);
23131
23416
  state.setIsSitemapOpen(false);
23132
23417
  }, [storeApi]);
23133
- const clearSelectedReviewItem = (0, import_react53.useCallback)(() => {
23418
+ const clearSelectedReviewItem = (0, import_react54.useCallback)(() => {
23134
23419
  onClearSelectedItem();
23135
23420
  const state = storeApi.getState();
23136
23421
  updateShellUrl(state.target, state.size, source);
23137
23422
  }, [onClearSelectedItem, source, storeApi]);
23138
- const changeReviewSource = (0, import_react53.useCallback)(
23423
+ const changeReviewSource = (0, import_react54.useCallback)(
23139
23424
  (nextSource) => {
23140
23425
  if (!sourceEntries.some((entry) => entry.label === nextSource)) return;
23141
23426
  onCancelReviewMode();
@@ -23233,7 +23518,7 @@ var useReviewShellRuntime = ({
23233
23518
  targetFrameLoadVersion,
23234
23519
  targetSrc
23235
23520
  });
23236
- const effectiveHiddenOverlayItemIdList = (0, import_react54.useMemo)(() => {
23521
+ const effectiveHiddenOverlayItemIdList = (0, import_react55.useMemo)(() => {
23237
23522
  if (!isCommandKeyPressed) return hiddenOverlayItemIdList;
23238
23523
  const itemIds = new Set(hiddenOverlayItemIdList);
23239
23524
  activeItems.forEach((item) => itemIds.add(item.id));
@@ -23284,7 +23569,7 @@ var useReviewShellRuntime = ({
23284
23569
  size,
23285
23570
  source
23286
23571
  });
23287
- const closeRulerPanels = (0, import_react54.useCallback)(() => {
23572
+ const closeRulerPanels = (0, import_react55.useCallback)(() => {
23288
23573
  closeSitemap();
23289
23574
  closeFigmaSettings();
23290
23575
  }, [closeFigmaSettings, closeSitemap]);
@@ -23334,7 +23619,7 @@ var useReviewShellRuntime = ({
23334
23619
  onCloseRuler: closeRuler,
23335
23620
  onItemsRefresh: refreshItems
23336
23621
  });
23337
- const refreshReviewData2 = (0, import_react54.useCallback)(() => {
23622
+ const refreshReviewData2 = (0, import_react55.useCallback)(() => {
23338
23623
  return refreshReviewData({
23339
23624
  onRefreshItems: refreshItems,
23340
23625
  onRefreshSitemapItems: refreshSitemapItems,
@@ -23598,11 +23883,12 @@ var createReviewShellStore = (init) => (0, import_zustand2.createStore)()((...ar
23598
23883
  // src/react-shell/review/shell.tsx
23599
23884
  var import_jsx_runtime41 = require("react/jsx-runtime");
23600
23885
  var ReviewShell = (props) => {
23601
- const config = (0, import_react55.useMemo)(
23886
+ const config = (0, import_react56.useMemo)(
23602
23887
  () => createReviewShellConfig(props),
23603
23888
  [
23604
23889
  props.adapters,
23605
23890
  props.initialPrompt,
23891
+ props.qaPrompt,
23606
23892
  props.pages,
23607
23893
  props.presets,
23608
23894
  props.projectId,
@@ -23611,10 +23897,10 @@ var ReviewShell = (props) => {
23611
23897
  props.sourceRoot
23612
23898
  ]
23613
23899
  );
23614
- const [store] = (0, import_react55.useState)(
23900
+ const [store] = (0, import_react56.useState)(
23615
23901
  () => createReviewShellStore({ target: getInitialTargetSliceState(config) })
23616
23902
  );
23617
- const [refs] = (0, import_react55.useState)(createReviewShellRefs);
23903
+ const [refs] = (0, import_react56.useState)(createReviewShellRefs);
23618
23904
  return /* @__PURE__ */ (0, import_jsx_runtime41.jsx)(ReviewShellConfigProvider, { value: config, children: /* @__PURE__ */ (0, import_jsx_runtime41.jsx)(ReviewShellStoreProvider, { value: store, children: /* @__PURE__ */ (0, import_jsx_runtime41.jsx)(ReviewShellRefsProvider, { value: refs, children: /* @__PURE__ */ (0, import_jsx_runtime41.jsx)(ReviewShellContent, { ...props }) }) }) });
23619
23905
  };
23620
23906
  var ReviewShellContent = (props) => {
@@ -23638,7 +23924,7 @@ var ReviewShellContent = (props) => {
23638
23924
  };
23639
23925
 
23640
23926
  // src/react-shell/figma/dev-overlay.tsx
23641
- var import_react56 = __toESM(require("react"), 1);
23927
+ var import_react57 = __toESM(require("react"), 1);
23642
23928
  var import_client = require("react-dom/client");
23643
23929
  var import_jsx_runtime42 = require("react/jsx-runtime");
23644
23930
  var FIGMA_DEV_OVERLAY_ROOT_ID = "df-review-figma-dev-overlay-root";
@@ -23661,7 +23947,7 @@ var mountFigmaDevOverlay = (options) => {
23661
23947
  document.body.appendChild(host);
23662
23948
  const root = (0, import_client.createRoot)(mountNode);
23663
23949
  root.render(
23664
- /* @__PURE__ */ (0, import_jsx_runtime42.jsx)(import_react56.default.StrictMode, { children: /* @__PURE__ */ (0, import_jsx_runtime42.jsx)(FigmaDevOverlayWidget, { ...options }) })
23950
+ /* @__PURE__ */ (0, import_jsx_runtime42.jsx)(import_react57.default.StrictMode, { children: /* @__PURE__ */ (0, import_jsx_runtime42.jsx)(FigmaDevOverlayWidget, { ...options }) })
23665
23951
  );
23666
23952
  return {
23667
23953
  destroy() {
@@ -23681,11 +23967,11 @@ var FigmaDevOverlayWidget = ({
23681
23967
  const figmaImageStore = getReviewFigmaImageStore(figmaImages);
23682
23968
  const viewport = useCurrentViewport();
23683
23969
  const currentPageUrl = useCurrentPageUrl(pageUrl, reviewPathPrefix);
23684
- const viewportBoundaries = (0, import_react56.useMemo)(
23970
+ const viewportBoundaries = (0, import_react57.useMemo)(
23685
23971
  () => getFigmaDevViewportBoundaries(presets),
23686
23972
  [presets]
23687
23973
  );
23688
- const matchedViewportMatch = (0, import_react56.useMemo)(
23974
+ const matchedViewportMatch = (0, import_react57.useMemo)(
23689
23975
  () => findBoundaryFigmaDevViewportMatch(presets, viewport.width),
23690
23976
  [presets, viewport.width]
23691
23977
  );
@@ -23711,23 +23997,23 @@ var FigmaDevOverlayWidget = ({
23711
23997
  store: matchedViewport ? figmaImageStore : null,
23712
23998
  viewport: activeViewport
23713
23999
  });
23714
- const [isPanelOpen, setIsPanelOpen] = (0, import_react56.useState)(false);
23715
- const [isWidgetVisible, setIsWidgetVisible] = (0, import_react56.useState)(false);
23716
- const [offsetYDraftByImageId, setOffsetYDraftByImageId] = (0, import_react56.useState)({});
24000
+ const [isPanelOpen, setIsPanelOpen] = (0, import_react57.useState)(false);
24001
+ const [isWidgetVisible, setIsWidgetVisible] = (0, import_react57.useState)(false);
24002
+ const [offsetYDraftByImageId, setOffsetYDraftByImageId] = (0, import_react57.useState)({});
23717
24003
  const selectedImage = selectedImageId ? images.find((image) => image.id === selectedImageId) ?? null : null;
23718
24004
  const selectedImageIndex = selectedImage ? images.indexOf(selectedImage) : -1;
23719
24005
  const selectedImageLabel = selectedImage ? getFigmaImageLabel(selectedImage, selectedImageIndex) : "Figma layer";
23720
24006
  const selectedOverlayState = selectedImage ? imageOverlayStates[selectedImage.id] ?? DEFAULT_FIGMA_IMAGE_LAYER_STATE : DEFAULT_FIGMA_IMAGE_LAYER_STATE;
23721
24007
  const selectedOpacityPercent = selectedImage ? getSnappedOpacityPercent(selectedOverlayState.opacity) : 0;
23722
24008
  const selectedOffsetYDraft = selectedImage ? offsetYDraftByImageId[selectedImage.id] ?? String(selectedOverlayState.offsetY) : "";
23723
- const figmaImageOverlays = (0, import_react56.useMemo)(
24009
+ const figmaImageOverlays = (0, import_react57.useMemo)(
23724
24010
  () => createReviewTargetFigmaImageOverlays({
23725
24011
  imageOverlayStates,
23726
24012
  images
23727
24013
  }),
23728
24014
  [imageOverlayStates, images]
23729
24015
  );
23730
- (0, import_react56.useEffect)(() => {
24016
+ (0, import_react57.useEffect)(() => {
23731
24017
  if (!isWidgetVisible || !matchedViewport) {
23732
24018
  removeTargetFigmaImageOverlays(document);
23733
24019
  return;
@@ -23744,13 +24030,13 @@ var FigmaDevOverlayWidget = ({
23744
24030
  matchedViewport,
23745
24031
  setImageOverlayOffsetY
23746
24032
  ]);
23747
- (0, import_react56.useEffect)(
24033
+ (0, import_react57.useEffect)(
23748
24034
  () => () => {
23749
24035
  removeTargetFigmaImageOverlays(document);
23750
24036
  },
23751
24037
  []
23752
24038
  );
23753
- (0, import_react56.useEffect)(() => {
24039
+ (0, import_react57.useEffect)(() => {
23754
24040
  const handleKeyDown = (event) => {
23755
24041
  if (!isHotkey(event, "Shift+F") || isEditableFigmaDevOverlayEventTarget(event)) {
23756
24042
  return;
@@ -23897,10 +24183,10 @@ var FigmaDevOverlayWidget = ({
23897
24183
  );
23898
24184
  };
23899
24185
  function useCurrentPageUrl(pageUrl, reviewPathPrefix) {
23900
- const [currentPageUrl, setCurrentPageUrl] = (0, import_react56.useState)(
24186
+ const [currentPageUrl, setCurrentPageUrl] = (0, import_react57.useState)(
23901
24187
  () => getFigmaDevOverlayPageUrl(pageUrl, reviewPathPrefix)
23902
24188
  );
23903
- (0, import_react56.useEffect)(() => {
24189
+ (0, import_react57.useEffect)(() => {
23904
24190
  const updatePageUrl = () => {
23905
24191
  setCurrentPageUrl(getFigmaDevOverlayPageUrl(pageUrl, reviewPathPrefix));
23906
24192
  };
@@ -23921,8 +24207,8 @@ function isEditableFigmaDevOverlayEventTarget(event) {
23921
24207
  return tagName === "INPUT" || tagName === "TEXTAREA" || tagName === "SELECT" || element.isContentEditable === true;
23922
24208
  }
23923
24209
  function useCurrentViewport() {
23924
- const [viewport, setViewport] = (0, import_react56.useState)(getCurrentViewportSize);
23925
- (0, import_react56.useEffect)(() => {
24210
+ const [viewport, setViewport] = (0, import_react57.useState)(getCurrentViewportSize);
24211
+ (0, import_react57.useEffect)(() => {
23926
24212
  const updateViewport = () => setViewport(getCurrentViewportSize());
23927
24213
  window.addEventListener("resize", updateViewport);
23928
24214
  window.addEventListener("orientationchange", updateViewport);
@@ -24490,7 +24776,7 @@ var mountReviewShell = (options) => {
24490
24776
  root.style.height = "100%";
24491
24777
  root.style.margin = "0";
24492
24778
  (0, import_client2.createRoot)(root).render(
24493
- /* @__PURE__ */ (0, import_jsx_runtime43.jsx)(import_react57.default.StrictMode, { children: /* @__PURE__ */ (0, import_jsx_runtime43.jsx)(ReviewShell, { ...shellProps }) })
24779
+ /* @__PURE__ */ (0, import_jsx_runtime43.jsx)(import_react58.default.StrictMode, { children: /* @__PURE__ */ (0, import_jsx_runtime43.jsx)(ReviewShell, { ...shellProps }) })
24494
24780
  );
24495
24781
  };
24496
24782
  // Annotate the CommonJS export names for ESM import in node:
@@ -24516,8 +24802,10 @@ lucide-react/dist/esm/context.mjs:
24516
24802
  lucide-react/dist/esm/Icon.mjs:
24517
24803
  lucide-react/dist/esm/createLucideIcon.mjs:
24518
24804
  lucide-react/dist/esm/icons/bot.mjs:
24805
+ lucide-react/dist/esm/icons/check-check.mjs:
24519
24806
  lucide-react/dist/esm/icons/chevron-down.mjs:
24520
24807
  lucide-react/dist/esm/icons/chevron-right.mjs:
24808
+ lucide-react/dist/esm/icons/chevron-up.mjs:
24521
24809
  lucide-react/dist/esm/icons/circle-question-mark.mjs:
24522
24810
  lucide-react/dist/esm/icons/code-xml.mjs:
24523
24811
  lucide-react/dist/esm/icons/contrast.mjs: