@designfever/web-review-kit 0.5.0 → 0.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -5,7 +5,7 @@ import {
5
5
  getNumberedReviewItems,
6
6
  normalizeReviewItemStatus,
7
7
  runWithAutoScrollBehavior
8
- } from "./chunk-TWCSIBMY.js";
8
+ } from "./chunk-IN36JHEU.js";
9
9
 
10
10
  // src/react-shell.tsx
11
11
  import React2 from "react";
@@ -263,6 +263,7 @@ function ensureReviewShellStyle() {
263
263
 
264
264
  .df-review-shell {
265
265
  --df-review-frame-gutter-x: var(--df-review-space-4);
266
+ position: relative;
266
267
  display: grid;
267
268
  grid-template-columns: minmax(0, 1fr) 0 48px;
268
269
  grid-template-rows: auto auto minmax(0, 1fr);
@@ -294,7 +295,7 @@ function ensureReviewShellStyle() {
294
295
 
295
296
  .df-review-address {
296
297
  display: grid;
297
- grid-template-columns: auto minmax(160px, 1fr) auto auto;
298
+ grid-template-columns: auto minmax(160px, 1fr) auto;
298
299
  align-items: stretch;
299
300
  gap: var(--df-review-space-2);
300
301
  width: 100%;
@@ -302,6 +303,13 @@ function ensureReviewShellStyle() {
302
303
  margin: 0 auto;
303
304
  }
304
305
 
306
+ .df-review-address-actions {
307
+ display: flex;
308
+ align-items: stretch;
309
+ gap: 4px;
310
+ min-width: 0;
311
+ }
312
+
305
313
  .df-review-address input {
306
314
  width: 100%;
307
315
  height: var(--df-review-control-height-md);
@@ -380,6 +388,24 @@ function ensureReviewShellStyle() {
380
388
  color: var(--df-review-accent);
381
389
  }
382
390
 
391
+ .df-review-address-refresh {
392
+ display: inline-grid;
393
+ place-items: center;
394
+ width: var(--df-review-control-height-md);
395
+ min-width: var(--df-review-control-height-md);
396
+ padding: 0;
397
+ }
398
+
399
+ .df-review-address-refresh svg {
400
+ width: 16px;
401
+ height: 16px;
402
+ fill: none;
403
+ stroke: currentColor;
404
+ stroke-linecap: round;
405
+ stroke-linejoin: round;
406
+ stroke-width: 1.9;
407
+ }
408
+
383
409
  .df-review-sitemap-button svg,
384
410
  .df-review-sitemap-header button svg {
385
411
  width: 18px;
@@ -1331,8 +1357,7 @@ function ensureReviewShellStyle() {
1331
1357
  }
1332
1358
 
1333
1359
  .df-review-presets,
1334
- .df-review-mode,
1335
- .df-review-overlays {
1360
+ .df-review-mode {
1336
1361
  display: flex;
1337
1362
  align-items: center;
1338
1363
  gap: var(--df-review-space-1-5);
@@ -1344,6 +1369,24 @@ function ensureReviewShellStyle() {
1344
1369
  background: var(--df-review-card);
1345
1370
  }
1346
1371
 
1372
+ .df-review-overlays {
1373
+ display: flex;
1374
+ align-items: center;
1375
+ gap: 4px;
1376
+ height: var(--df-review-control-height-md);
1377
+ min-height: var(--df-review-control-height-md);
1378
+ padding: 0;
1379
+ border: 0;
1380
+ border-radius: 0;
1381
+ background: transparent;
1382
+ box-shadow: none;
1383
+ }
1384
+
1385
+ .df-review-mode {
1386
+ gap: 3px;
1387
+ padding: 3px;
1388
+ }
1389
+
1347
1390
  .df-review-tool-divider,
1348
1391
  .df-review-mode-divider {
1349
1392
  display: inline-flex;
@@ -1463,6 +1506,35 @@ function ensureReviewShellStyle() {
1463
1506
  color: var(--df-review-muted);
1464
1507
  }
1465
1508
 
1509
+ .df-review-overlay-button {
1510
+ border: 1px solid var(--df-review-line-soft);
1511
+ border-radius: var(--df-review-radius-sm);
1512
+ background: var(--df-review-control);
1513
+ box-shadow: var(--df-review-shadow-control);
1514
+ }
1515
+
1516
+ .df-review-overlay-button:hover,
1517
+ .df-review-overlay-button:focus-visible {
1518
+ border-color: var(--df-review-accent);
1519
+ background: var(--df-review-control-hover);
1520
+ color: var(--df-review-text);
1521
+ outline: 0;
1522
+ }
1523
+
1524
+ .df-review-overlay-button.is-active {
1525
+ border-color: var(--df-review-accent);
1526
+ background: var(--df-review-accent-soft);
1527
+ box-shadow: inset 0 0 0 1px var(--df-review-accent-hover);
1528
+ color: var(--df-review-accent);
1529
+ }
1530
+
1531
+ .df-review-mode-button {
1532
+ width: calc(var(--df-review-control-height-md) - 6px);
1533
+ min-width: calc(var(--df-review-control-height-md) - 6px);
1534
+ height: calc(var(--df-review-control-height-md) - 6px);
1535
+ min-height: calc(var(--df-review-control-height-md) - 6px);
1536
+ }
1537
+
1466
1538
  .df-review-overlays-menu {
1467
1539
  position: relative;
1468
1540
  display: none;
@@ -1582,20 +1654,19 @@ function ensureReviewShellStyle() {
1582
1654
 
1583
1655
  .df-review-preset-select {
1584
1656
  display: block;
1585
- flex: 0 1 190px;
1586
- width: clamp(154px, 26vw, 190px);
1657
+ flex: 0 1 150px;
1658
+ min-width: 128px;
1659
+ width: clamp(128px, 20vw, 150px);
1587
1660
  }
1588
1661
 
1589
- .df-review-overlays {
1590
- display: none;
1591
- }
1592
-
1593
- .df-review-overlays-menu {
1594
- display: block;
1662
+ .df-review-tool-divider,
1663
+ .df-review-active-size {
1664
+ display: none;
1595
1665
  }
1596
- }
1597
1666
 
1598
- .df-review-side-rail {
1667
+ }
1668
+
1669
+ .df-review-side-rail {
1599
1670
  grid-column: 3;
1600
1671
  grid-row: 1 / span 3;
1601
1672
  position: relative;
@@ -1612,11 +1683,11 @@ function ensureReviewShellStyle() {
1612
1683
 
1613
1684
  .df-review-side-toggle {
1614
1685
  position: relative;
1615
- flex: 0 0 58px;
1686
+ flex: 0 0 48px;
1616
1687
  display: grid;
1617
1688
  place-items: center;
1618
1689
  width: 100%;
1619
- min-height: 58px;
1690
+ min-height: 48px;
1620
1691
  border: 0;
1621
1692
  border-radius: 0;
1622
1693
  padding: 0;
@@ -1635,9 +1706,9 @@ function ensureReviewShellStyle() {
1635
1706
 
1636
1707
  .df-review-side-toggle.is-active::after {
1637
1708
  position: absolute;
1638
- top: 12px;
1709
+ top: 9px;
1639
1710
  right: 0;
1640
- bottom: 12px;
1711
+ bottom: 9px;
1641
1712
  width: 3px;
1642
1713
  border-radius: 3px 0 0 3px;
1643
1714
  background: var(--df-review-accent);
@@ -1672,17 +1743,29 @@ function ensureReviewShellStyle() {
1672
1743
  stroke-width: 1.55;
1673
1744
  }
1674
1745
 
1746
+ .df-review-side-actions {
1747
+ display: flex;
1748
+ flex-direction: column;
1749
+ align-items: stretch;
1750
+ width: 100%;
1751
+ margin-top: auto;
1752
+ }
1753
+
1675
1754
  .df-review-presence-overlay {
1676
1755
  position: relative;
1677
1756
  margin-top: auto;
1678
1757
  }
1679
1758
 
1759
+ .df-review-side-actions .df-review-presence-overlay {
1760
+ margin-top: 0;
1761
+ }
1762
+
1680
1763
  .df-review-presence-button {
1681
1764
  position: relative;
1682
1765
  display: grid;
1683
1766
  place-items: center;
1684
1767
  width: 100%;
1685
- min-height: 58px;
1768
+ min-height: 48px;
1686
1769
  border: 0;
1687
1770
  border-radius: 0;
1688
1771
  padding: 0;
@@ -1717,8 +1800,8 @@ function ensureReviewShellStyle() {
1717
1800
 
1718
1801
  .df-review-presence-badge {
1719
1802
  position: absolute;
1720
- top: 10px;
1721
- right: 7px;
1803
+ top: 6px;
1804
+ right: 6px;
1722
1805
  display: grid;
1723
1806
  place-items: center;
1724
1807
  min-width: 17px;
@@ -1738,38 +1821,46 @@ function ensureReviewShellStyle() {
1738
1821
  position: absolute;
1739
1822
  right: calc(100% + 8px);
1740
1823
  bottom: 8px;
1741
- display: grid;
1824
+ display: flex;
1825
+ flex-direction: column;
1826
+ align-items: flex-end;
1742
1827
  gap: 5px;
1743
- min-width: 132px;
1828
+ width: max-content;
1829
+ min-width: 0;
1744
1830
  max-width: 220px;
1745
- border: 1px solid var(--df-review-line);
1746
- border-radius: var(--df-review-radius-md);
1747
- padding: 8px;
1748
- background: var(--df-review-panel);
1749
- box-shadow: var(--df-review-shadow-modal);
1750
1831
  }
1751
1832
 
1752
1833
  .df-review-presence-chip {
1753
1834
  --df-review-presence-color: var(--df-review-accent);
1754
- display: flex;
1835
+ display: inline-flex;
1755
1836
  align-items: center;
1837
+ width: fit-content;
1838
+ max-width: 180px;
1756
1839
  min-width: 0;
1757
- min-height: 24px;
1758
- border-left: 2px solid var(--df-review-presence-color);
1759
- border-radius: var(--df-review-radius-sm);
1760
- padding: 0 8px;
1840
+ min-height: 22px;
1841
+ justify-content: flex-end;
1842
+ border: 1px solid var(--df-review-line-soft);
1843
+ border-radius: var(--df-review-radius-pill);
1844
+ padding: 0 9px;
1761
1845
  color: var(--df-review-text);
1762
1846
  background: var(--df-review-control);
1763
1847
  font-size: var(--df-review-font-size-xs);
1764
1848
  font-weight: 500;
1765
1849
  line-height: 1.1;
1850
+ white-space: nowrap;
1851
+ }
1852
+
1853
+ .df-review-presence-chip span {
1854
+ min-width: 0;
1766
1855
  overflow: hidden;
1767
1856
  text-overflow: ellipsis;
1857
+ text-align: right;
1768
1858
  white-space: nowrap;
1769
1859
  }
1770
1860
 
1771
1861
  .df-review-presence-chip.is-self {
1772
1862
  color: var(--df-review-accent);
1863
+ border-color: var(--df-review-accent-soft);
1773
1864
  background: var(--df-review-accent-soft);
1774
1865
  }
1775
1866
 
@@ -1779,7 +1870,7 @@ function ensureReviewShellStyle() {
1779
1870
  position: relative;
1780
1871
  z-index: 600;
1781
1872
  display: grid;
1782
- grid-template-rows: minmax(0, 1fr);
1873
+ grid-template-rows: minmax(0, 1fr) auto;
1783
1874
  min-width: 0;
1784
1875
  min-height: 0;
1785
1876
  overflow: hidden;
@@ -1788,6 +1879,25 @@ function ensureReviewShellStyle() {
1788
1879
  linear-gradient(180deg, var(--df-review-panel), var(--df-review-bg));
1789
1880
  }
1790
1881
 
1882
+ .df-review-qa-draft-host {
1883
+ position: relative;
1884
+ z-index: 2;
1885
+ display: none;
1886
+ justify-self: end;
1887
+ width: calc(100% - var(--df-review-space-4));
1888
+ margin: 0 var(--df-review-space-2) var(--df-review-space-2) auto;
1889
+ min-width: 0;
1890
+ }
1891
+
1892
+ .df-review-qa-draft-host[data-has-draft-composer="true"] {
1893
+ display: block;
1894
+ }
1895
+
1896
+ .df-review-qa-panel[data-has-draft-composer="true"] .df-review-panel-body {
1897
+ opacity: 0.36;
1898
+ pointer-events: none;
1899
+ }
1900
+
1791
1901
  .df-review-shell:not(.is-list-visible) .df-review-qa-panel,
1792
1902
  .df-review-qa-panel[aria-hidden="true"] {
1793
1903
  visibility: hidden;
@@ -1872,13 +1982,14 @@ function ensureReviewShellStyle() {
1872
1982
  .df-review-list-meta span {
1873
1983
  min-width: 0;
1874
1984
  overflow: hidden;
1985
+ color: #fff;
1875
1986
  text-overflow: ellipsis;
1876
1987
  white-space: nowrap;
1877
1988
  }
1878
1989
 
1879
1990
  .df-review-list-meta strong {
1880
1991
  flex: 0 0 auto;
1881
- color: var(--df-review-muted);
1992
+ color: #fff;
1882
1993
  font-size: var(--df-review-font-size-xs);
1883
1994
  font-variant-numeric: tabular-nums;
1884
1995
  font-weight: 500;
@@ -1936,27 +2047,28 @@ function ensureReviewShellStyle() {
1936
2047
  display: flex;
1937
2048
  align-items: center;
1938
2049
  justify-self: end;
1939
- gap: var(--df-review-space-1-5);
1940
- height: var(--df-review-control-height-md);
1941
- min-height: var(--df-review-control-height-md);
2050
+ gap: 2px;
2051
+ height: 26px;
2052
+ min-height: 26px;
1942
2053
  padding: 0;
1943
- border: 1px solid var(--df-review-line-soft);
1944
- border-radius: var(--df-review-radius-md);
1945
- background: var(--df-review-card);
1946
- box-shadow: var(--df-review-shadow-control);
2054
+ border: 0;
2055
+ border-radius: 0;
2056
+ background: transparent;
2057
+ box-shadow: none;
1947
2058
  }
1948
2059
 
1949
2060
  .df-review-filter-tab {
1950
2061
  position: relative;
1951
2062
  display: grid;
1952
2063
  place-items: center;
1953
- width: var(--df-review-control-height-md);
1954
- min-width: var(--df-review-control-height-md);
1955
- height: var(--df-review-control-height-md);
2064
+ width: 26px;
2065
+ min-width: 26px;
2066
+ height: 26px;
1956
2067
  border: 0;
1957
- border-radius: var(--df-review-radius-sm);
2068
+ border-radius: 0;
1958
2069
  background: transparent;
1959
2070
  color: var(--df-review-subtle);
2071
+ opacity: 0.3;
1960
2072
  }
1961
2073
 
1962
2074
  .df-review-filter-icon {
@@ -1977,18 +2089,18 @@ function ensureReviewShellStyle() {
1977
2089
 
1978
2090
  .df-review-filter-tab:hover,
1979
2091
  .df-review-filter-tab.is-active {
1980
- background: var(--df-review-accent-soft);
1981
2092
  color: var(--df-review-text);
2093
+ opacity: 1;
1982
2094
  }
1983
2095
 
1984
2096
  .df-review-filter-tab.is-active {
1985
- box-shadow: inset 0 0 0 1px rgba(124, 199, 255, 0.42);
2097
+ box-shadow: none;
1986
2098
  color: var(--df-review-accent);
1987
2099
  }
1988
2100
 
1989
2101
  .df-review-filter-icon svg {
1990
- width: 18px;
1991
- height: 18px;
2102
+ width: 14px;
2103
+ height: 14px;
1992
2104
  fill: none;
1993
2105
  stroke: currentColor;
1994
2106
  stroke-linecap: round;
@@ -2134,9 +2246,21 @@ function ensureReviewShellStyle() {
2134
2246
  }
2135
2247
 
2136
2248
  .df-review-item-id {
2249
+ appearance: none;
2137
2250
  border-color: var(--df-review-line);
2138
2251
  background: rgba(255, 255, 255, 0.03);
2139
2252
  color: var(--df-review-text);
2253
+ cursor: copy;
2254
+ font-family: inherit;
2255
+ }
2256
+
2257
+ .df-review-item-id:hover,
2258
+ .df-review-item-id:focus-visible,
2259
+ .df-review-item-id.is-copied {
2260
+ border-color: var(--df-review-accent);
2261
+ background: var(--df-review-accent-soft);
2262
+ color: var(--df-review-accent);
2263
+ outline: none;
2140
2264
  }
2141
2265
 
2142
2266
  .df-review-item-scope {
@@ -2756,30 +2880,44 @@ function ensureReviewShellStyle() {
2756
2880
  var(--df-review-control-height-md)
2757
2881
  var(--df-review-control-height-md);
2758
2882
  align-items: center;
2759
- gap: 8px;
2883
+ gap: var(--df-review-space-2);
2760
2884
  min-width: 0;
2761
2885
  padding: var(--df-review-space-3) var(--df-review-frame-gutter-x);
2762
2886
  border-bottom: 1px solid var(--df-review-line-soft);
2763
2887
  background: var(--df-review-card);
2764
2888
  color: var(--df-review-muted);
2889
+ font-size: var(--df-review-font-size-sm);
2890
+ font-weight: 500;
2765
2891
  }
2766
2892
 
2767
- .df-review-section-outline-head span {
2893
+ .df-review-section-outline-summary {
2768
2894
  display: grid;
2769
- gap: 2px;
2895
+ grid-template-columns: minmax(0, 1fr) auto;
2896
+ align-items: center;
2897
+ gap: 8px;
2898
+ min-height: var(--df-review-control-height-md);
2899
+ min-width: 0;
2900
+ }
2901
+
2902
+ .df-review-section-outline-summary span {
2903
+ display: inline-flex;
2904
+ align-items: baseline;
2905
+ gap: 6px;
2770
2906
  min-width: 0;
2771
2907
  }
2772
2908
 
2773
2909
  .df-review-section-outline-head strong {
2774
2910
  overflow: hidden;
2775
2911
  color: var(--df-review-text);
2776
- font-size: var(--df-review-font-size-lg);
2912
+ font-size: inherit;
2777
2913
  font-weight: 600;
2914
+ line-height: 1;
2778
2915
  text-overflow: ellipsis;
2779
2916
  white-space: nowrap;
2780
2917
  }
2781
2918
 
2782
2919
  .df-review-section-outline-head small {
2920
+ flex: 0 0 auto;
2783
2921
  overflow: hidden;
2784
2922
  color: var(--df-review-muted);
2785
2923
  font-size: var(--df-review-font-size-xs);
@@ -2788,6 +2926,60 @@ function ensureReviewShellStyle() {
2788
2926
  white-space: nowrap;
2789
2927
  }
2790
2928
 
2929
+ .df-review-section-outline-meta-controls {
2930
+ display: inline-flex;
2931
+ align-items: center;
2932
+ justify-content: flex-end;
2933
+ gap: 2px;
2934
+ height: 26px;
2935
+ min-height: 26px;
2936
+ min-width: 0;
2937
+ border: 0;
2938
+ border-radius: 0;
2939
+ padding: 0;
2940
+ background: transparent;
2941
+ box-shadow: none;
2942
+ }
2943
+
2944
+ .df-review-section-outline-meta-toggle {
2945
+ display: inline-grid;
2946
+ place-items: center;
2947
+ width: 26px;
2948
+ min-width: 26px;
2949
+ height: 26px;
2950
+ border: 0;
2951
+ border-radius: 0;
2952
+ padding: 0;
2953
+ color: var(--df-review-subtle);
2954
+ background: transparent;
2955
+ box-shadow: none;
2956
+ cursor: pointer;
2957
+ opacity: 0.3;
2958
+ }
2959
+
2960
+ .df-review-section-outline-meta-toggle:hover,
2961
+ .df-review-section-outline-meta-toggle:focus-visible,
2962
+ .df-review-section-outline-meta-toggle.is-active {
2963
+ color: var(--df-review-text);
2964
+ opacity: 1;
2965
+ outline: 0;
2966
+ }
2967
+
2968
+ .df-review-section-outline-meta-toggle.is-active {
2969
+ box-shadow: none;
2970
+ color: var(--df-review-accent);
2971
+ }
2972
+
2973
+ .df-review-section-outline-meta-toggle svg {
2974
+ width: 14px;
2975
+ height: 14px;
2976
+ fill: none;
2977
+ stroke: currentColor;
2978
+ stroke-linecap: round;
2979
+ stroke-linejoin: round;
2980
+ stroke-width: 2;
2981
+ }
2982
+
2791
2983
  .df-review-section-outline-filter {
2792
2984
  display: grid;
2793
2985
  grid-template-columns: 18px minmax(0, 1fr) auto;
@@ -2798,7 +2990,7 @@ function ensureReviewShellStyle() {
2798
2990
  height: var(--df-review-control-height-md);
2799
2991
  min-height: var(--df-review-control-height-md);
2800
2992
  border: 1px solid var(--df-review-line-soft);
2801
- border-radius: var(--df-review-radius-md);
2993
+ border-radius: var(--df-review-radius-sm);
2802
2994
  padding: 0 7px 0 11px;
2803
2995
  color: var(--df-review-muted);
2804
2996
  background: var(--df-review-control);
@@ -2880,6 +3072,15 @@ function ensureReviewShellStyle() {
2880
3072
  display: grid;
2881
3073
  }
2882
3074
 
3075
+ .df-review-section-outline-entry-body {
3076
+ display: grid;
3077
+ border-radius: var(--df-review-radius-sm);
3078
+ }
3079
+
3080
+ .df-review-section-outline-entry-body:hover {
3081
+ background: var(--df-review-accent-soft);
3082
+ }
3083
+
2883
3084
  .df-review-section-outline-item.is-depth-1:not(:last-child) {
2884
3085
  margin-bottom: 7px;
2885
3086
  padding-bottom: 7px;
@@ -2895,10 +3096,6 @@ function ensureReviewShellStyle() {
2895
3096
  padding: 7px 6px;
2896
3097
  }
2897
3098
 
2898
- .df-review-section-outline-row:hover {
2899
- background: var(--df-review-accent-soft);
2900
- }
2901
-
2902
3099
  .df-review-section-outline-toggle {
2903
3100
  display: grid;
2904
3101
  place-items: center;
@@ -2970,6 +3167,86 @@ function ensureReviewShellStyle() {
2970
3167
  color: var(--df-review-accent);
2971
3168
  }
2972
3169
 
3170
+ .df-review-section-outline-meta {
3171
+ display: grid;
3172
+ gap: 3px;
3173
+ min-width: 0;
3174
+ padding: 0 6px 7px;
3175
+ }
3176
+
3177
+ .df-review-section-outline-meta-row {
3178
+ display: grid;
3179
+ grid-template-columns: 52px minmax(0, 1fr);
3180
+ align-items: start;
3181
+ gap: 6px;
3182
+ min-width: 0;
3183
+ color: var(--df-review-muted);
3184
+ font-family: var(--df-review-font-mono);
3185
+ font-size: var(--df-review-font-size-2xs);
3186
+ line-height: 1.35;
3187
+ }
3188
+
3189
+ .df-review-section-outline-meta-row b {
3190
+ color: var(--df-review-subtle);
3191
+ font-weight: 600;
3192
+ }
3193
+
3194
+ .df-review-section-outline-meta-row code {
3195
+ min-width: 0;
3196
+ overflow-wrap: anywhere;
3197
+ color: var(--df-review-muted);
3198
+ font-family: inherit;
3199
+ }
3200
+
3201
+ .df-review-section-outline-meta-row.is-text code {
3202
+ color: var(--df-review-text);
3203
+ }
3204
+
3205
+ .df-review-section-outline-meta-row.is-media code {
3206
+ color: var(--df-review-accent);
3207
+ }
3208
+
3209
+ .df-review-section-outline-media-link {
3210
+ display: block;
3211
+ min-width: 0;
3212
+ color: var(--df-review-accent);
3213
+ text-decoration: none;
3214
+ }
3215
+
3216
+ .df-review-section-outline-media-link:hover,
3217
+ .df-review-section-outline-media-link:focus-visible {
3218
+ color: var(--df-review-text);
3219
+ outline: 0;
3220
+ }
3221
+
3222
+ .df-review-section-outline-meta-row.is-class code {
3223
+ color: var(--df-review-source-popover-data-subtle);
3224
+ }
3225
+
3226
+ .df-review-section-outline-meta-row.is-class {
3227
+ align-items: center;
3228
+ }
3229
+
3230
+ .df-review-section-outline-class-tags {
3231
+ display: flex;
3232
+ align-items: center;
3233
+ flex-wrap: wrap;
3234
+ gap: 3px;
3235
+ min-width: 0;
3236
+ }
3237
+
3238
+ .df-review-section-outline-class-tags code {
3239
+ display: inline-flex;
3240
+ align-items: center;
3241
+ max-width: 100%;
3242
+ min-height: 20px;
3243
+ border: 1px solid var(--df-review-line-soft);
3244
+ border-radius: var(--df-review-radius-pill);
3245
+ padding: 0 6px;
3246
+ background: var(--df-review-control);
3247
+ line-height: 1;
3248
+ }
3249
+
2973
3250
  .df-review-section-outline-links {
2974
3251
  display: inline-flex;
2975
3252
  align-items: center;
@@ -3473,24 +3750,16 @@ var __iconNode6 = [
3473
3750
  ];
3474
3751
  var Database = createLucideIcon("database", __iconNode6);
3475
3752
 
3476
- // node_modules/.pnpm/lucide-react@1.20.0_react@19.2.7/node_modules/lucide-react/dist/esm/icons/ellipsis.mjs
3477
- var __iconNode7 = [
3478
- ["circle", { cx: "12", cy: "12", r: "1", key: "41hilf" }],
3479
- ["circle", { cx: "19", cy: "12", r: "1", key: "1wjl8i" }],
3480
- ["circle", { cx: "5", cy: "12", r: "1", key: "1pcz8c" }]
3481
- ];
3482
- var Ellipsis = createLucideIcon("ellipsis", __iconNode7);
3483
-
3484
3753
  // node_modules/.pnpm/lucide-react@1.20.0_react@19.2.7/node_modules/lucide-react/dist/esm/icons/external-link.mjs
3485
- var __iconNode8 = [
3754
+ var __iconNode7 = [
3486
3755
  ["path", { d: "M15 3h6v6", key: "1q9fwt" }],
3487
3756
  ["path", { d: "M10 14 21 3", key: "gplh6r" }],
3488
3757
  ["path", { d: "M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6", key: "a6xqqp" }]
3489
3758
  ];
3490
- var ExternalLink = createLucideIcon("external-link", __iconNode8);
3759
+ var ExternalLink = createLucideIcon("external-link", __iconNode7);
3491
3760
 
3492
3761
  // node_modules/.pnpm/lucide-react@1.20.0_react@19.2.7/node_modules/lucide-react/dist/esm/icons/eye-off.mjs
3493
- var __iconNode9 = [
3762
+ var __iconNode8 = [
3494
3763
  [
3495
3764
  "path",
3496
3765
  {
@@ -3508,10 +3777,10 @@ var __iconNode9 = [
3508
3777
  ],
3509
3778
  ["path", { d: "m2 2 20 20", key: "1ooewy" }]
3510
3779
  ];
3511
- var EyeOff = createLucideIcon("eye-off", __iconNode9);
3780
+ var EyeOff = createLucideIcon("eye-off", __iconNode8);
3512
3781
 
3513
3782
  // node_modules/.pnpm/lucide-react@1.20.0_react@19.2.7/node_modules/lucide-react/dist/esm/icons/eye.mjs
3514
- var __iconNode10 = [
3783
+ var __iconNode9 = [
3515
3784
  [
3516
3785
  "path",
3517
3786
  {
@@ -3521,10 +3790,10 @@ var __iconNode10 = [
3521
3790
  ],
3522
3791
  ["circle", { cx: "12", cy: "12", r: "3", key: "1v7zrd" }]
3523
3792
  ];
3524
- var Eye = createLucideIcon("eye", __iconNode10);
3793
+ var Eye = createLucideIcon("eye", __iconNode9);
3525
3794
 
3526
3795
  // node_modules/.pnpm/lucide-react@1.20.0_react@19.2.7/node_modules/lucide-react/dist/esm/icons/file-text.mjs
3527
- var __iconNode11 = [
3796
+ var __iconNode10 = [
3528
3797
  [
3529
3798
  "path",
3530
3799
  {
@@ -3537,43 +3806,43 @@ var __iconNode11 = [
3537
3806
  ["path", { d: "M16 13H8", key: "t4e002" }],
3538
3807
  ["path", { d: "M16 17H8", key: "z1uh3a" }]
3539
3808
  ];
3540
- var FileText = createLucideIcon("file-text", __iconNode11);
3809
+ var FileText = createLucideIcon("file-text", __iconNode10);
3541
3810
 
3542
3811
  // node_modules/.pnpm/lucide-react@1.20.0_react@19.2.7/node_modules/lucide-react/dist/esm/icons/image.mjs
3543
- var __iconNode12 = [
3812
+ var __iconNode11 = [
3544
3813
  ["rect", { width: "18", height: "18", x: "3", y: "3", rx: "2", ry: "2", key: "1m3agn" }],
3545
3814
  ["circle", { cx: "9", cy: "9", r: "2", key: "af1f0g" }],
3546
3815
  ["path", { d: "m21 15-3.086-3.086a2 2 0 0 0-2.828 0L6 21", key: "1xmnt7" }]
3547
3816
  ];
3548
- var Image = createLucideIcon("image", __iconNode12);
3817
+ var Image = createLucideIcon("image", __iconNode11);
3549
3818
 
3550
3819
  // node_modules/.pnpm/lucide-react@1.20.0_react@19.2.7/node_modules/lucide-react/dist/esm/icons/layout-grid.mjs
3551
- var __iconNode13 = [
3820
+ var __iconNode12 = [
3552
3821
  ["rect", { width: "7", height: "7", x: "3", y: "3", rx: "1", key: "1g98yp" }],
3553
3822
  ["rect", { width: "7", height: "7", x: "14", y: "3", rx: "1", key: "6d4xhi" }],
3554
3823
  ["rect", { width: "7", height: "7", x: "14", y: "14", rx: "1", key: "nxv5o0" }],
3555
3824
  ["rect", { width: "7", height: "7", x: "3", y: "14", rx: "1", key: "1bb6yr" }]
3556
3825
  ];
3557
- var LayoutGrid = createLucideIcon("layout-grid", __iconNode13);
3826
+ var LayoutGrid = createLucideIcon("layout-grid", __iconNode12);
3558
3827
 
3559
3828
  // node_modules/.pnpm/lucide-react@1.20.0_react@19.2.7/node_modules/lucide-react/dist/esm/icons/link-2.mjs
3560
- var __iconNode14 = [
3829
+ var __iconNode13 = [
3561
3830
  ["path", { d: "M9 17H7A5 5 0 0 1 7 7h2", key: "8i5ue5" }],
3562
3831
  ["path", { d: "M15 7h2a5 5 0 1 1 0 10h-2", key: "1b9ql8" }],
3563
3832
  ["line", { x1: "8", x2: "16", y1: "12", y2: "12", key: "1jonct" }]
3564
3833
  ];
3565
- var Link2 = createLucideIcon("link-2", __iconNode14);
3834
+ var Link2 = createLucideIcon("link-2", __iconNode13);
3566
3835
 
3567
3836
  // node_modules/.pnpm/lucide-react@1.20.0_react@19.2.7/node_modules/lucide-react/dist/esm/icons/list-filter.mjs
3568
- var __iconNode15 = [
3837
+ var __iconNode14 = [
3569
3838
  ["path", { d: "M2 5h20", key: "1fs1ex" }],
3570
3839
  ["path", { d: "M6 12h12", key: "8npq4p" }],
3571
3840
  ["path", { d: "M9 19h6", key: "456am0" }]
3572
3841
  ];
3573
- var ListFilter = createLucideIcon("list-filter", __iconNode15);
3842
+ var ListFilter = createLucideIcon("list-filter", __iconNode14);
3574
3843
 
3575
3844
  // node_modules/.pnpm/lucide-react@1.20.0_react@19.2.7/node_modules/lucide-react/dist/esm/icons/map.mjs
3576
- var __iconNode16 = [
3845
+ var __iconNode15 = [
3577
3846
  [
3578
3847
  "path",
3579
3848
  {
@@ -3584,27 +3853,27 @@ var __iconNode16 = [
3584
3853
  ["path", { d: "M15 5.764v15", key: "1pn4in" }],
3585
3854
  ["path", { d: "M9 3.236v15", key: "1uimfh" }]
3586
3855
  ];
3587
- var Map2 = createLucideIcon("map", __iconNode16);
3856
+ var Map2 = createLucideIcon("map", __iconNode15);
3588
3857
 
3589
3858
  // node_modules/.pnpm/lucide-react@1.20.0_react@19.2.7/node_modules/lucide-react/dist/esm/icons/maximize-2.mjs
3590
- var __iconNode17 = [
3859
+ var __iconNode16 = [
3591
3860
  ["path", { d: "M15 3h6v6", key: "1q9fwt" }],
3592
3861
  ["path", { d: "m21 3-7 7", key: "1l2asr" }],
3593
3862
  ["path", { d: "m3 21 7-7", key: "tjx5ai" }],
3594
3863
  ["path", { d: "M9 21H3v-6", key: "wtvkvv" }]
3595
3864
  ];
3596
- var Maximize2 = createLucideIcon("maximize-2", __iconNode17);
3865
+ var Maximize2 = createLucideIcon("maximize-2", __iconNode16);
3597
3866
 
3598
3867
  // node_modules/.pnpm/lucide-react@1.20.0_react@19.2.7/node_modules/lucide-react/dist/esm/icons/monitor.mjs
3599
- var __iconNode18 = [
3868
+ var __iconNode17 = [
3600
3869
  ["rect", { width: "20", height: "14", x: "2", y: "3", rx: "2", key: "48i651" }],
3601
3870
  ["line", { x1: "8", x2: "16", y1: "21", y2: "21", key: "1svkeh" }],
3602
3871
  ["line", { x1: "12", x2: "12", y1: "17", y2: "21", key: "vw1qmm" }]
3603
3872
  ];
3604
- var Monitor = createLucideIcon("monitor", __iconNode18);
3873
+ var Monitor = createLucideIcon("monitor", __iconNode17);
3605
3874
 
3606
3875
  // node_modules/.pnpm/lucide-react@1.20.0_react@19.2.7/node_modules/lucide-react/dist/esm/icons/moon.mjs
3607
- var __iconNode19 = [
3876
+ var __iconNode18 = [
3608
3877
  [
3609
3878
  "path",
3610
3879
  {
@@ -3613,10 +3882,10 @@ var __iconNode19 = [
3613
3882
  }
3614
3883
  ]
3615
3884
  ];
3616
- var Moon = createLucideIcon("moon", __iconNode19);
3885
+ var Moon = createLucideIcon("moon", __iconNode18);
3617
3886
 
3618
3887
  // node_modules/.pnpm/lucide-react@1.20.0_react@19.2.7/node_modules/lucide-react/dist/esm/icons/pencil.mjs
3619
- var __iconNode20 = [
3888
+ var __iconNode19 = [
3620
3889
  [
3621
3890
  "path",
3622
3891
  {
@@ -3626,25 +3895,25 @@ var __iconNode20 = [
3626
3895
  ],
3627
3896
  ["path", { d: "m15 5 4 4", key: "1mk7zo" }]
3628
3897
  ];
3629
- var Pencil = createLucideIcon("pencil", __iconNode20);
3898
+ var Pencil = createLucideIcon("pencil", __iconNode19);
3630
3899
 
3631
3900
  // node_modules/.pnpm/lucide-react@1.20.0_react@19.2.7/node_modules/lucide-react/dist/esm/icons/rectangle-horizontal.mjs
3632
- var __iconNode21 = [
3901
+ var __iconNode20 = [
3633
3902
  ["rect", { width: "20", height: "12", x: "2", y: "6", rx: "2", key: "9lu3g6" }]
3634
3903
  ];
3635
- var RectangleHorizontal = createLucideIcon("rectangle-horizontal", __iconNode21);
3904
+ var RectangleHorizontal = createLucideIcon("rectangle-horizontal", __iconNode20);
3636
3905
 
3637
3906
  // node_modules/.pnpm/lucide-react@1.20.0_react@19.2.7/node_modules/lucide-react/dist/esm/icons/refresh-cw.mjs
3638
- var __iconNode22 = [
3907
+ var __iconNode21 = [
3639
3908
  ["path", { d: "M3 12a9 9 0 0 1 9-9 9.75 9.75 0 0 1 6.74 2.74L21 8", key: "v9h5vc" }],
3640
3909
  ["path", { d: "M21 3v5h-5", key: "1q7to0" }],
3641
3910
  ["path", { d: "M21 12a9 9 0 0 1-9 9 9.75 9.75 0 0 1-6.74-2.74L3 16", key: "3uifl3" }],
3642
3911
  ["path", { d: "M8 16H3v5", key: "1cv678" }]
3643
3912
  ];
3644
- var RefreshCw = createLucideIcon("refresh-cw", __iconNode22);
3913
+ var RefreshCw = createLucideIcon("refresh-cw", __iconNode21);
3645
3914
 
3646
3915
  // node_modules/.pnpm/lucide-react@1.20.0_react@19.2.7/node_modules/lucide-react/dist/esm/icons/ruler.mjs
3647
- var __iconNode23 = [
3916
+ var __iconNode22 = [
3648
3917
  [
3649
3918
  "path",
3650
3919
  {
@@ -3657,26 +3926,26 @@ var __iconNode23 = [
3657
3926
  ["path", { d: "m8.5 6.5 2-2", key: "vc6u1g" }],
3658
3927
  ["path", { d: "m17.5 15.5 2-2", key: "wo5hmg" }]
3659
3928
  ];
3660
- var Ruler = createLucideIcon("ruler", __iconNode23);
3929
+ var Ruler = createLucideIcon("ruler", __iconNode22);
3661
3930
 
3662
3931
  // node_modules/.pnpm/lucide-react@1.20.0_react@19.2.7/node_modules/lucide-react/dist/esm/icons/scan.mjs
3663
- var __iconNode24 = [
3932
+ var __iconNode23 = [
3664
3933
  ["path", { d: "M3 7V5a2 2 0 0 1 2-2h2", key: "aa7l1z" }],
3665
3934
  ["path", { d: "M17 3h2a2 2 0 0 1 2 2v2", key: "4qcy5o" }],
3666
3935
  ["path", { d: "M21 17v2a2 2 0 0 1-2 2h-2", key: "6vwrx8" }],
3667
3936
  ["path", { d: "M7 21H5a2 2 0 0 1-2-2v-2", key: "ioqczr" }]
3668
3937
  ];
3669
- var Scan = createLucideIcon("scan", __iconNode24);
3938
+ var Scan = createLucideIcon("scan", __iconNode23);
3670
3939
 
3671
3940
  // node_modules/.pnpm/lucide-react@1.20.0_react@19.2.7/node_modules/lucide-react/dist/esm/icons/search.mjs
3672
- var __iconNode25 = [
3941
+ var __iconNode24 = [
3673
3942
  ["path", { d: "m21 21-4.34-4.34", key: "14j7rj" }],
3674
3943
  ["circle", { cx: "11", cy: "11", r: "8", key: "4ej97u" }]
3675
3944
  ];
3676
- var Search = createLucideIcon("search", __iconNode25);
3945
+ var Search = createLucideIcon("search", __iconNode24);
3677
3946
 
3678
3947
  // node_modules/.pnpm/lucide-react@1.20.0_react@19.2.7/node_modules/lucide-react/dist/esm/icons/settings.mjs
3679
- var __iconNode26 = [
3948
+ var __iconNode25 = [
3680
3949
  [
3681
3950
  "path",
3682
3951
  {
@@ -3686,14 +3955,31 @@ var __iconNode26 = [
3686
3955
  ],
3687
3956
  ["circle", { cx: "12", cy: "12", r: "3", key: "1v7zrd" }]
3688
3957
  ];
3689
- var Settings = createLucideIcon("settings", __iconNode26);
3958
+ var Settings = createLucideIcon("settings", __iconNode25);
3690
3959
 
3691
3960
  // node_modules/.pnpm/lucide-react@1.20.0_react@19.2.7/node_modules/lucide-react/dist/esm/icons/smartphone.mjs
3692
- var __iconNode27 = [
3961
+ var __iconNode26 = [
3693
3962
  ["rect", { width: "14", height: "20", x: "5", y: "2", rx: "2", ry: "2", key: "1yt0o3" }],
3694
3963
  ["path", { d: "M12 18h.01", key: "mhygvu" }]
3695
3964
  ];
3696
- var Smartphone = createLucideIcon("smartphone", __iconNode27);
3965
+ var Smartphone = createLucideIcon("smartphone", __iconNode26);
3966
+
3967
+ // node_modules/.pnpm/lucide-react@1.20.0_react@19.2.7/node_modules/lucide-react/dist/esm/icons/square-dashed.mjs
3968
+ var __iconNode27 = [
3969
+ ["path", { d: "M5 3a2 2 0 0 0-2 2", key: "y57alp" }],
3970
+ ["path", { d: "M19 3a2 2 0 0 1 2 2", key: "18rm91" }],
3971
+ ["path", { d: "M21 19a2 2 0 0 1-2 2", key: "1j7049" }],
3972
+ ["path", { d: "M5 21a2 2 0 0 1-2-2", key: "sbafld" }],
3973
+ ["path", { d: "M9 3h1", key: "1yesri" }],
3974
+ ["path", { d: "M9 21h1", key: "15o7lz" }],
3975
+ ["path", { d: "M14 3h1", key: "1ec4yj" }],
3976
+ ["path", { d: "M14 21h1", key: "v9vybs" }],
3977
+ ["path", { d: "M3 9v1", key: "1r0deq" }],
3978
+ ["path", { d: "M21 9v1", key: "mxsmne" }],
3979
+ ["path", { d: "M3 14v1", key: "vnatye" }],
3980
+ ["path", { d: "M21 14v1", key: "169vum" }]
3981
+ ];
3982
+ var SquareDashed = createLucideIcon("square-dashed", __iconNode27);
3697
3983
 
3698
3984
  // node_modules/.pnpm/lucide-react@1.20.0_react@19.2.7/node_modules/lucide-react/dist/esm/icons/square-mouse-pointer.mjs
3699
3985
  var __iconNode28 = [
@@ -3735,27 +4021,36 @@ var __iconNode30 = [
3735
4021
  ];
3736
4022
  var Sun = createLucideIcon("sun", __iconNode30);
3737
4023
 
3738
- // node_modules/.pnpm/lucide-react@1.20.0_react@19.2.7/node_modules/lucide-react/dist/esm/icons/upload.mjs
4024
+ // node_modules/.pnpm/lucide-react@1.20.0_react@19.2.7/node_modules/lucide-react/dist/esm/icons/type.mjs
3739
4025
  var __iconNode31 = [
4026
+ ["path", { d: "M12 4v16", key: "1654pz" }],
4027
+ ["path", { d: "M4 7V5a1 1 0 0 1 1-1h14a1 1 0 0 1 1 1v2", key: "e0r10z" }],
4028
+ ["path", { d: "M9 20h6", key: "s66wpe" }]
4029
+ ];
4030
+ var Type = createLucideIcon("type", __iconNode31);
4031
+
4032
+ // node_modules/.pnpm/lucide-react@1.20.0_react@19.2.7/node_modules/lucide-react/dist/esm/icons/upload.mjs
4033
+ var __iconNode32 = [
3740
4034
  ["path", { d: "M12 3v12", key: "1x0j5s" }],
3741
4035
  ["path", { d: "m17 8-5-5-5 5", key: "7q97r8" }],
3742
4036
  ["path", { d: "M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4", key: "ih7n3h" }]
3743
4037
  ];
3744
- var Upload = createLucideIcon("upload", __iconNode31);
4038
+ var Upload = createLucideIcon("upload", __iconNode32);
3745
4039
 
3746
- // node_modules/.pnpm/lucide-react@1.20.0_react@19.2.7/node_modules/lucide-react/dist/esm/icons/user-round.mjs
3747
- var __iconNode32 = [
3748
- ["circle", { cx: "12", cy: "8", r: "5", key: "1hypcn" }],
3749
- ["path", { d: "M20 21a8 8 0 0 0-16 0", key: "rfgkzh" }]
4040
+ // node_modules/.pnpm/lucide-react@1.20.0_react@19.2.7/node_modules/lucide-react/dist/esm/icons/workflow.mjs
4041
+ var __iconNode33 = [
4042
+ ["rect", { width: "8", height: "8", x: "3", y: "3", rx: "2", key: "by2w9f" }],
4043
+ ["path", { d: "M7 11v4a2 2 0 0 0 2 2h4", key: "xkn7yn" }],
4044
+ ["rect", { width: "8", height: "8", x: "13", y: "13", rx: "2", key: "1cgmvn" }]
3750
4045
  ];
3751
- var UserRound = createLucideIcon("user-round", __iconNode32);
4046
+ var Workflow = createLucideIcon("workflow", __iconNode33);
3752
4047
 
3753
4048
  // node_modules/.pnpm/lucide-react@1.20.0_react@19.2.7/node_modules/lucide-react/dist/esm/icons/x.mjs
3754
- var __iconNode33 = [
4049
+ var __iconNode34 = [
3755
4050
  ["path", { d: "M18 6 6 18", key: "1bl5f8" }],
3756
4051
  ["path", { d: "m6 6 12 12", key: "d8bk6v" }]
3757
4052
  ];
3758
- var X = createLucideIcon("x", __iconNode33);
4053
+ var X = createLucideIcon("x", __iconNode34);
3759
4054
 
3760
4055
  // src/react-shell/constants.ts
3761
4056
  var REVIEW_QA_FILTERS = [
@@ -3769,6 +4064,11 @@ var FIGMA_OVERLAY_UNAVAILABLE_MESSAGE = "\uD53C\uADF8\uB9C8 \uC624\uBC84\uB808\u
3769
4064
  var FIGMA_TOKEN_STORAGE_KEY = "figma-token";
3770
4065
  var REVIEW_USER_ID_STORAGE_KEY = "user-id";
3771
4066
  var REVIEW_THEME_STORAGE_KEY = "df-review-theme";
4067
+ var REVIEW_SIDE_PANEL_STORAGE_KEY = "df-review-side-panel";
4068
+ var REVIEW_SIDE_PANEL_VISIBLE_STORAGE_KEY = "df-review-side-panel-visible";
4069
+ var REVIEW_SOURCE_TREE_FILTER_STORAGE_KEY = "df-review-source-tree-filter";
4070
+ var REVIEW_SOURCE_TREE_META_STORAGE_KEY = "df-review-source-tree-meta-visibility";
4071
+ var REVIEW_QA_STATUS_FILTER_STORAGE_KEY = "df-review-qa-status-filter";
3772
4072
  var DEFAULT_REVIEW_THEME = "dark";
3773
4073
  var FIGMA_TOKEN_GUIDE_ID = "df-review-figma-token-guide";
3774
4074
  var DEFAULT_INITIAL_REVIEW_PROMPT = "You are fixing QA issues collected with df-web-review-kit. Use the copied QA prompt as the source of truth for page, viewport, selector, DOM metadata, coordinates, and user comment. Make the smallest code or CSS change that fixes the issue, preserve unrelated behavior, then verify the target viewport again.";
@@ -4194,7 +4494,35 @@ var PromptModal = ({
4194
4494
  };
4195
4495
 
4196
4496
  // src/react-shell/settings.ts
4497
+ var DEFAULT_SOURCE_TREE_META_VISIBILITY = {
4498
+ box: true,
4499
+ font: true,
4500
+ media: true,
4501
+ className: false
4502
+ };
4503
+ var REVIEW_QA_STATUS_FILTER_VALUES = /* @__PURE__ */ new Set([
4504
+ "all",
4505
+ "todo",
4506
+ "doing",
4507
+ "review",
4508
+ "hold",
4509
+ "done"
4510
+ ]);
4197
4511
  var normalizeReviewTheme = (value) => value === "light" || value === "system" || value === "dark" ? value : DEFAULT_REVIEW_THEME;
4512
+ var normalizeStoredReviewSidePanel = (value) => value === "source" ? "source" : "qa";
4513
+ var normalizeStoredReviewQaStatusFilter = (value) => value && REVIEW_QA_STATUS_FILTER_VALUES.has(value) ? value : "all";
4514
+ var normalizeStoredSourceTreeMetaVisibility = (value) => {
4515
+ if (!value || typeof value !== "object") {
4516
+ return DEFAULT_SOURCE_TREE_META_VISIBILITY;
4517
+ }
4518
+ const metaVisibility = value;
4519
+ return {
4520
+ box: typeof metaVisibility.box === "boolean" ? metaVisibility.box : DEFAULT_SOURCE_TREE_META_VISIBILITY.box,
4521
+ font: typeof metaVisibility.font === "boolean" ? metaVisibility.font : DEFAULT_SOURCE_TREE_META_VISIBILITY.font,
4522
+ media: typeof metaVisibility.media === "boolean" ? metaVisibility.media : DEFAULT_SOURCE_TREE_META_VISIBILITY.media,
4523
+ className: typeof metaVisibility.className === "boolean" ? metaVisibility.className : DEFAULT_SOURCE_TREE_META_VISIBILITY.className
4524
+ };
4525
+ };
4198
4526
  var getStoredFigmaToken = () => {
4199
4527
  if (typeof window === "undefined") return "";
4200
4528
  try {
@@ -4257,6 +4585,118 @@ var writeStoredReviewTheme = (theme) => {
4257
4585
  return;
4258
4586
  }
4259
4587
  };
4588
+ var getStoredReviewSidePanel = () => {
4589
+ if (typeof window === "undefined") return "qa";
4590
+ try {
4591
+ return normalizeStoredReviewSidePanel(
4592
+ window.localStorage.getItem(REVIEW_SIDE_PANEL_STORAGE_KEY)
4593
+ );
4594
+ } catch {
4595
+ return "qa";
4596
+ }
4597
+ };
4598
+ var writeStoredReviewSidePanel = (sidePanel) => {
4599
+ if (typeof window === "undefined") return;
4600
+ try {
4601
+ window.localStorage.setItem(
4602
+ REVIEW_SIDE_PANEL_STORAGE_KEY,
4603
+ normalizeStoredReviewSidePanel(sidePanel)
4604
+ );
4605
+ } catch {
4606
+ return;
4607
+ }
4608
+ };
4609
+ var getStoredReviewSidePanelVisible = () => {
4610
+ if (typeof window === "undefined") return true;
4611
+ try {
4612
+ const value = window.localStorage.getItem(
4613
+ REVIEW_SIDE_PANEL_VISIBLE_STORAGE_KEY
4614
+ );
4615
+ return value === null ? true : value === "true";
4616
+ } catch {
4617
+ return true;
4618
+ }
4619
+ };
4620
+ var writeStoredReviewSidePanelVisible = (isVisible) => {
4621
+ if (typeof window === "undefined") return;
4622
+ try {
4623
+ window.localStorage.setItem(
4624
+ REVIEW_SIDE_PANEL_VISIBLE_STORAGE_KEY,
4625
+ isVisible ? "true" : "false"
4626
+ );
4627
+ } catch {
4628
+ return;
4629
+ }
4630
+ };
4631
+ var getStoredReviewQaStatusFilter = () => {
4632
+ if (typeof window === "undefined") return "all";
4633
+ try {
4634
+ return normalizeStoredReviewQaStatusFilter(
4635
+ window.localStorage.getItem(REVIEW_QA_STATUS_FILTER_STORAGE_KEY)
4636
+ );
4637
+ } catch {
4638
+ return "all";
4639
+ }
4640
+ };
4641
+ var writeStoredReviewQaStatusFilter = (filter) => {
4642
+ if (typeof window === "undefined") return;
4643
+ try {
4644
+ const normalizedFilter = normalizeStoredReviewQaStatusFilter(filter);
4645
+ if (normalizedFilter === "all") {
4646
+ window.localStorage.removeItem(REVIEW_QA_STATUS_FILTER_STORAGE_KEY);
4647
+ } else {
4648
+ window.localStorage.setItem(
4649
+ REVIEW_QA_STATUS_FILTER_STORAGE_KEY,
4650
+ normalizedFilter
4651
+ );
4652
+ }
4653
+ } catch {
4654
+ return;
4655
+ }
4656
+ };
4657
+ var getStoredSourceTreeFilter = () => {
4658
+ if (typeof window === "undefined") return "";
4659
+ try {
4660
+ return window.localStorage.getItem(REVIEW_SOURCE_TREE_FILTER_STORAGE_KEY) ?? "";
4661
+ } catch {
4662
+ return "";
4663
+ }
4664
+ };
4665
+ var writeStoredSourceTreeFilter = (filter) => {
4666
+ if (typeof window === "undefined") return;
4667
+ try {
4668
+ if (filter) {
4669
+ window.localStorage.setItem(REVIEW_SOURCE_TREE_FILTER_STORAGE_KEY, filter);
4670
+ } else {
4671
+ window.localStorage.removeItem(REVIEW_SOURCE_TREE_FILTER_STORAGE_KEY);
4672
+ }
4673
+ } catch {
4674
+ return;
4675
+ }
4676
+ };
4677
+ var getStoredSourceTreeMetaVisibility = () => {
4678
+ if (typeof window === "undefined") return DEFAULT_SOURCE_TREE_META_VISIBILITY;
4679
+ try {
4680
+ const value = window.localStorage.getItem(
4681
+ REVIEW_SOURCE_TREE_META_STORAGE_KEY
4682
+ );
4683
+ if (!value) return DEFAULT_SOURCE_TREE_META_VISIBILITY;
4684
+ return normalizeStoredSourceTreeMetaVisibility(JSON.parse(value));
4685
+ } catch {
4686
+ return DEFAULT_SOURCE_TREE_META_VISIBILITY;
4687
+ }
4688
+ };
4689
+ var writeStoredSourceTreeMetaVisibility = (metaVisibility) => {
4690
+ if (typeof window === "undefined") return;
4691
+ try {
4692
+ window.localStorage.setItem(
4693
+ REVIEW_SOURCE_TREE_META_STORAGE_KEY,
4694
+ JSON.stringify(normalizeStoredSourceTreeMetaVisibility(metaVisibility))
4695
+ );
4696
+ } catch {
4697
+ return;
4698
+ }
4699
+ };
4260
4700
  var getSystemReviewTheme = () => {
4261
4701
  if (typeof window === "undefined" || !window.matchMedia) return "dark";
4262
4702
  return window.matchMedia("(prefers-color-scheme: light)").matches ? "light" : "dark";
@@ -5324,6 +5764,7 @@ var QaItemCard = ({
5324
5764
  onChangeItemStatus,
5325
5765
  onClearSelectedItem,
5326
5766
  onRemoveItem,
5767
+ onCopyItemLabel,
5327
5768
  onCopyItemLink,
5328
5769
  onCopyItemPrompt,
5329
5770
  onEditItem,
@@ -5339,8 +5780,10 @@ var QaItemCard = ({
5339
5780
  const itemComment = item.comment.trim() || getItemTitle(item);
5340
5781
  const itemAuthor = item.createdBy?.trim();
5341
5782
  const promptCopyKey = `qa:${item.id}`;
5783
+ const labelCopyKey = `label:${item.id}`;
5342
5784
  const linkCopyKey = `link:${item.id}`;
5343
5785
  const isPromptCopied = copiedPromptKey === promptCopyKey;
5786
+ const isLabelCopied = copiedPromptKey === labelCopyKey;
5344
5787
  const isLinkCopied = copiedPromptKey === linkCopyKey;
5345
5788
  const statusOptions = activeAdapterEntry.statusOptions;
5346
5789
  const isActive = item.id === selectedItemId;
@@ -5362,7 +5805,20 @@ var QaItemCard = ({
5362
5805
  /* @__PURE__ */ jsxs6("div", { className: "df-review-item-header", children: [
5363
5806
  /* @__PURE__ */ jsxs6("div", { className: "df-review-item-main", children: [
5364
5807
  /* @__PURE__ */ jsxs6("span", { className: "df-review-item-badges", children: [
5365
- /* @__PURE__ */ jsx8("span", { className: "df-review-item-id", children: numberedItem.displayLabel }),
5808
+ /* @__PURE__ */ jsx8(
5809
+ "button",
5810
+ {
5811
+ "aria-label": isLabelCopied ? "Copied QA number" : "Copy QA number",
5812
+ className: `df-review-item-id${isLabelCopied ? " is-copied" : ""}`,
5813
+ title: isLabelCopied ? "Copied QA number" : "Copy QA number",
5814
+ type: "button",
5815
+ onClick: (event) => {
5816
+ event.stopPropagation();
5817
+ onCopyItemLabel(numberedItem);
5818
+ },
5819
+ children: numberedItem.displayLabel
5820
+ }
5821
+ ),
5366
5822
  /* @__PURE__ */ jsxs6(
5367
5823
  "span",
5368
5824
  {
@@ -5503,7 +5959,36 @@ var QaPanelHeader = ({
5503
5959
  }) => {
5504
5960
  const statusFilterOptions = getStatusFilterOptions(statusOptions);
5505
5961
  const hasActiveFilter = qaFilter !== "all" || qaStatusFilter !== "all";
5962
+ const displayLabel = getQaSourceDisplayLabel(label);
5506
5963
  return /* @__PURE__ */ jsxs7("div", { className: "df-review-list-header", children: [
5964
+ /* @__PURE__ */ jsxs7("div", { className: "df-review-list-title", children: [
5965
+ /* @__PURE__ */ jsxs7("span", { className: "df-review-list-meta", children: [
5966
+ /* @__PURE__ */ jsx9("span", { children: isAllQaVisible ? `${displayLabel} QA \xB7 All pages` : `${displayLabel} QA` }),
5967
+ /* @__PURE__ */ jsx9(
5968
+ "strong",
5969
+ {
5970
+ title: `${activeRemainingItemCount} remaining of ${activeItemCount}`,
5971
+ children: !hasActiveFilter ? `${activeRemainingItemCount}/${activeItemCount}` : `${filteredItemCount}/${activeItemCount}`
5972
+ }
5973
+ )
5974
+ ] }),
5975
+ /* @__PURE__ */ jsx9("div", { className: "df-review-filter-tabs", "aria-label": "QA filters", children: REVIEW_QA_FILTERS.map((filter) => {
5976
+ const count = qaFilterCounts.get(filter.key) ?? 0;
5977
+ const isActive = qaFilter === filter.key;
5978
+ return /* @__PURE__ */ jsx9(
5979
+ "button",
5980
+ {
5981
+ "aria-label": `${filter.label} QA (${count})`,
5982
+ "aria-pressed": isActive,
5983
+ className: `df-review-filter-tab${isActive ? " is-active" : ""}`,
5984
+ type: "button",
5985
+ onClick: () => onQaFilterChange(filter.key),
5986
+ children: /* @__PURE__ */ jsx9("span", { className: "df-review-filter-icon", children: filter.scope ? /* @__PURE__ */ jsx9(ReviewScopeIcon, { scope: filter.scope }) : /* @__PURE__ */ jsx9(ListFilter, { "aria-hidden": "true" }) })
5987
+ },
5988
+ filter.key
5989
+ );
5990
+ }) })
5991
+ ] }),
5507
5992
  /* @__PURE__ */ jsxs7("div", { className: "df-review-list-toolbar", children: [
5508
5993
  /* @__PURE__ */ jsxs7("div", { className: "df-review-list-controls", children: [
5509
5994
  showSourceSelect && /* @__PURE__ */ jsx9(
@@ -5542,37 +6027,12 @@ var QaPanelHeader = ({
5542
6027
  ]
5543
6028
  }
5544
6029
  )
5545
- ] }),
5546
- /* @__PURE__ */ jsxs7("div", { className: "df-review-list-title", children: [
5547
- /* @__PURE__ */ jsxs7("span", { className: "df-review-list-meta", children: [
5548
- /* @__PURE__ */ jsx9("span", { children: isAllQaVisible ? `${label} QA \xB7 All pages` : `${label} QA` }),
5549
- /* @__PURE__ */ jsx9(
5550
- "strong",
5551
- {
5552
- title: `${activeRemainingItemCount} remaining of ${activeItemCount}`,
5553
- children: !hasActiveFilter ? `${activeRemainingItemCount}/${activeItemCount}` : `${filteredItemCount}/${activeItemCount}`
5554
- }
5555
- )
5556
- ] }),
5557
- /* @__PURE__ */ jsx9("div", { className: "df-review-filter-tabs", "aria-label": "QA filters", children: REVIEW_QA_FILTERS.map((filter) => {
5558
- const count = qaFilterCounts.get(filter.key) ?? 0;
5559
- const isActive = qaFilter === filter.key;
5560
- return /* @__PURE__ */ jsx9(
5561
- "button",
5562
- {
5563
- "aria-label": `${filter.label} QA (${count})`,
5564
- "aria-pressed": isActive,
5565
- className: `df-review-filter-tab${isActive ? " is-active" : ""}`,
5566
- type: "button",
5567
- onClick: () => onQaFilterChange(filter.key),
5568
- children: /* @__PURE__ */ jsx9("span", { className: "df-review-filter-icon", children: filter.scope ? /* @__PURE__ */ jsx9(ReviewScopeIcon, { scope: filter.scope }) : /* @__PURE__ */ jsx9(ListFilter, { "aria-hidden": "true" }) })
5569
- },
5570
- filter.key
5571
- );
5572
- }) })
5573
6030
  ] })
5574
6031
  ] });
5575
6032
  };
6033
+ function getQaSourceDisplayLabel(label) {
6034
+ return label === "local" ? "Local" : label;
6035
+ }
5576
6036
  function getStatusFilterOptions(statusOptions) {
5577
6037
  const seen = /* @__PURE__ */ new Set();
5578
6038
  return statusOptions.flatMap((statusOption) => {
@@ -5612,6 +6072,7 @@ var ReviewQaPanel = ({
5612
6072
  onChangeItemStatus,
5613
6073
  onClearSelectedItem,
5614
6074
  onChangeReviewSource,
6075
+ onCopyItemLabel,
5615
6076
  onCopyItemLink,
5616
6077
  onCopyItemPrompt,
5617
6078
  onEditItem,
@@ -5624,78 +6085,104 @@ var ReviewQaPanel = ({
5624
6085
  onToggleItemOverlayVisibility
5625
6086
  }) => {
5626
6087
  const emptyMessage = isAllQaVisible ? `No ${activeAdapterEntry.label} QA.` : isRemoteSource ? `No ${activeAdapterEntry.label} QA on this page.` : "No QA on this page.";
5627
- return /* @__PURE__ */ jsx10("aside", { className: "df-review-qa-panel", "aria-hidden": !isListVisible, children: /* @__PURE__ */ jsx10("div", { className: "df-review-panel-body", children: /* @__PURE__ */ jsxs8("section", { className: "df-review-item-list", children: [
5628
- /* @__PURE__ */ jsx10(
5629
- QaPanelHeader,
5630
- {
5631
- activeItemCount: activeItems.length,
5632
- activeRemainingItemCount,
5633
- filteredItemCount: filteredNumberedActiveItems.length,
5634
- isAllQaVisible,
5635
- label: activeAdapterEntry.label,
5636
- qaFilter,
5637
- qaFilterCounts,
5638
- qaStatusFilter,
5639
- qaStatusFilterCounts,
5640
- showSourceSelect,
5641
- source,
5642
- sourceEntries,
5643
- statusOptions: activeAdapterEntry.statusOptions,
5644
- onChangeReviewSource,
5645
- onQaFilterChange,
5646
- onQaStatusFilterChange,
5647
- onRefreshReviewData
5648
- }
5649
- ),
5650
- /* @__PURE__ */ jsxs8(
5651
- "div",
5652
- {
5653
- className: "df-review-list-scroll",
5654
- onClick: (event) => {
5655
- if (event.target === event.currentTarget) {
5656
- onClearSelectedItem();
5657
- }
5658
- },
5659
- children: [
5660
- activeItems.length === 0 && /* @__PURE__ */ jsx10("p", { className: "df-review-empty", children: emptyMessage }),
5661
- activeItems.length > 0 && filteredNumberedActiveItems.length === 0 && /* @__PURE__ */ jsx10("p", { className: "df-review-empty", children: "No QA in this filter." }),
5662
- filteredNumberedActiveItems.map((numberedItem) => {
5663
- const { item } = numberedItem;
5664
- return /* @__PURE__ */ jsx10(
5665
- QaItemCard,
5666
- {
5667
- activeAdapterEntry,
5668
- currentPresetScope,
5669
- getItemPresetScope,
5670
- isOverlayVisible: !hiddenOverlayItemIds.has(item.id),
5671
- isRemoteSource,
5672
- numberedItem,
5673
- remoteAdapterEntry,
5674
- copiedPromptKey,
5675
- selectedItemId,
5676
- onChangeItemStatus,
5677
- onClearSelectedItem,
5678
- onCopyItemLink,
5679
- onCopyItemPrompt,
5680
- onEditItem,
5681
- onRemoveItem,
5682
- onRestoreReviewItem,
5683
- onSubmitItem,
5684
- onToggleItemOverlayVisibility
5685
- },
5686
- item.id
5687
- );
5688
- })
5689
- ]
5690
- }
5691
- )
5692
- ] }) }) });
6088
+ return /* @__PURE__ */ jsxs8("aside", { className: "df-review-qa-panel", "aria-hidden": !isListVisible, children: [
6089
+ /* @__PURE__ */ jsx10("div", { className: "df-review-panel-body", children: /* @__PURE__ */ jsxs8("section", { className: "df-review-item-list", children: [
6090
+ /* @__PURE__ */ jsx10(
6091
+ QaPanelHeader,
6092
+ {
6093
+ activeItemCount: activeItems.length,
6094
+ activeRemainingItemCount,
6095
+ filteredItemCount: filteredNumberedActiveItems.length,
6096
+ isAllQaVisible,
6097
+ label: activeAdapterEntry.label,
6098
+ qaFilter,
6099
+ qaFilterCounts,
6100
+ qaStatusFilter,
6101
+ qaStatusFilterCounts,
6102
+ showSourceSelect,
6103
+ source,
6104
+ sourceEntries,
6105
+ statusOptions: activeAdapterEntry.statusOptions,
6106
+ onChangeReviewSource,
6107
+ onQaFilterChange,
6108
+ onQaStatusFilterChange,
6109
+ onRefreshReviewData
6110
+ }
6111
+ ),
6112
+ /* @__PURE__ */ jsxs8(
6113
+ "div",
6114
+ {
6115
+ className: "df-review-list-scroll",
6116
+ onClick: (event) => {
6117
+ if (event.target === event.currentTarget) {
6118
+ onClearSelectedItem();
6119
+ }
6120
+ },
6121
+ children: [
6122
+ activeItems.length === 0 && /* @__PURE__ */ jsx10("p", { className: "df-review-empty", children: emptyMessage }),
6123
+ activeItems.length > 0 && filteredNumberedActiveItems.length === 0 && /* @__PURE__ */ jsx10("p", { className: "df-review-empty", children: "No QA in this filter." }),
6124
+ filteredNumberedActiveItems.map((numberedItem) => {
6125
+ const { item } = numberedItem;
6126
+ return /* @__PURE__ */ jsx10(
6127
+ QaItemCard,
6128
+ {
6129
+ activeAdapterEntry,
6130
+ currentPresetScope,
6131
+ getItemPresetScope,
6132
+ isOverlayVisible: !hiddenOverlayItemIds.has(item.id),
6133
+ isRemoteSource,
6134
+ numberedItem,
6135
+ remoteAdapterEntry,
6136
+ copiedPromptKey,
6137
+ selectedItemId,
6138
+ onChangeItemStatus,
6139
+ onClearSelectedItem,
6140
+ onCopyItemLabel,
6141
+ onCopyItemLink,
6142
+ onCopyItemPrompt,
6143
+ onEditItem,
6144
+ onRemoveItem,
6145
+ onRestoreReviewItem,
6146
+ onSubmitItem,
6147
+ onToggleItemOverlayVisibility
6148
+ },
6149
+ item.id
6150
+ );
6151
+ })
6152
+ ]
6153
+ }
6154
+ )
6155
+ ] }) }),
6156
+ /* @__PURE__ */ jsx10("div", { className: "df-review-qa-draft-host" })
6157
+ ] });
5693
6158
  };
5694
6159
 
5695
6160
  // src/react-shell/presence/overlay.tsx
5696
6161
  import { useState as useState3 } from "react";
5697
6162
  import { jsx as jsx11, jsxs as jsxs9 } from "react/jsx-runtime";
5698
6163
  var getPresenceName = (user) => user.displayName || user.userId;
6164
+ var PresenceUserIcon = () => /* @__PURE__ */ jsxs9("svg", { "aria-hidden": "true", viewBox: "0 0 30 30", children: [
6165
+ /* @__PURE__ */ jsx11(
6166
+ "circle",
6167
+ {
6168
+ cx: "15",
6169
+ cy: "15",
6170
+ r: "12.5",
6171
+ fill: "none",
6172
+ stroke: "currentColor",
6173
+ strokeWidth: "2.6"
6174
+ }
6175
+ ),
6176
+ /* @__PURE__ */ jsx11("circle", { cx: "15", cy: "10.5", r: "3.4", fill: "currentColor", stroke: "none" }),
6177
+ /* @__PURE__ */ jsx11(
6178
+ "path",
6179
+ {
6180
+ d: "M7.8 22.1c.9-4.1 3.4-6.1 7.2-6.1s6.3 2 7.2 6.1c-1.7 1.5-4.1 2.4-7.2 2.4s-5.5-.9-7.2-2.4z",
6181
+ fill: "currentColor",
6182
+ stroke: "none"
6183
+ }
6184
+ )
6185
+ ] });
5699
6186
  var PresenceOverlay = ({
5700
6187
  presenceSessionId,
5701
6188
  users
@@ -5717,7 +6204,7 @@ var PresenceOverlay = ({
5717
6204
  type: "button",
5718
6205
  onClick: () => setIsExpanded((current) => !current),
5719
6206
  children: [
5720
- /* @__PURE__ */ jsx11(UserRound, { "aria-hidden": "true" }),
6207
+ /* @__PURE__ */ jsx11(PresenceUserIcon, {}),
5721
6208
  /* @__PURE__ */ jsx11("span", { className: "df-review-presence-badge", children: users.length })
5722
6209
  ]
5723
6210
  }
@@ -5731,7 +6218,7 @@ var PresenceOverlay = ({
5731
6218
  "--df-review-presence-color": user.color
5732
6219
  },
5733
6220
  title: getPresenceName(user),
5734
- children: getPresenceName(user)
6221
+ children: /* @__PURE__ */ jsx11("span", { children: getPresenceName(user) })
5735
6222
  },
5736
6223
  user.sessionId
5737
6224
  )) })
@@ -5799,7 +6286,7 @@ var getSectionOutline = (root, options) => {
5799
6286
  if (source?.file) {
5800
6287
  addSourceFileCompareKey(seen, getOutlineSourceKey(source));
5801
6288
  }
5802
- return {
6289
+ return createSectionOutlineEntry({
5803
6290
  id: `${label}-${index}`,
5804
6291
  label,
5805
6292
  depth: 1,
@@ -5814,7 +6301,7 @@ var getSectionOutline = (root, options) => {
5814
6301
  seen,
5815
6302
  options
5816
6303
  )
5817
- };
6304
+ });
5818
6305
  });
5819
6306
  };
5820
6307
  function getSectionOutlineRoots(root, options) {
@@ -5844,7 +6331,7 @@ function getSectionOutlineChildren(parent, depth, maxDepth, seen, options) {
5844
6331
  if (source?.file && isNewSource) {
5845
6332
  const childSeen = new Set(seen);
5846
6333
  addSourceFileCompareKey(childSeen, sourceKey);
5847
- entries.push({
6334
+ entries.push(createSectionOutlineEntry({
5848
6335
  id: `${sourceKey}-${getElementOutlinePath(child)}-${entries.length}`,
5849
6336
  label,
5850
6337
  depth,
@@ -5859,7 +6346,7 @@ function getSectionOutlineChildren(parent, depth, maxDepth, seen, options) {
5859
6346
  childSeen,
5860
6347
  options
5861
6348
  )
5862
- });
6349
+ }));
5863
6350
  continue;
5864
6351
  }
5865
6352
  entries.push(
@@ -5877,6 +6364,114 @@ function getElementOutlinePath(element) {
5877
6364
  }
5878
6365
  return indices.join("-");
5879
6366
  }
6367
+ function createSectionOutlineEntry(entry) {
6368
+ return {
6369
+ ...entry,
6370
+ metadata: getSectionOutlineMetadata(entry.element, entry.label, entry.source)
6371
+ };
6372
+ }
6373
+ var truncateOutlineValue = (value, maxLength) => value.length > maxLength ? `${value.slice(0, maxLength - 1)}\u2026` : value;
6374
+ var normalizeOutlineValue = (value) => value?.replace(/\s+/g, " ").trim() ?? "";
6375
+ function getSectionOutlineMetadata(element, label, source) {
6376
+ const textElement = getPlacerTextElement(element, label, source?.file);
6377
+ return {
6378
+ rect: getSectionOutlineRect(element),
6379
+ textValue: textElement ? truncateOutlineValue(
6380
+ normalizeOutlineValue(textElement.textContent),
6381
+ 180
6382
+ ) : void 0,
6383
+ fontLabel: textElement ? getFontLabel(textElement) : void 0,
6384
+ mediaItems: getPlacerMediaItems(element, label, source?.file),
6385
+ classNames: getElementClassNames(element)
6386
+ };
6387
+ }
6388
+ function getSectionOutlineRect(element) {
6389
+ const rect = element.getBoundingClientRect();
6390
+ return {
6391
+ top: Math.round(rect.top),
6392
+ left: Math.round(rect.left),
6393
+ width: Math.round(rect.width),
6394
+ height: Math.round(rect.height)
6395
+ };
6396
+ }
6397
+ function getElementClassNames(element) {
6398
+ const classNames = Array.from(element.classList).filter(Boolean);
6399
+ return classNames.length > 0 ? classNames : void 0;
6400
+ }
6401
+ function getPlacerTextElement(element, label, file) {
6402
+ if (!isPlacerTextOutlineNode(label, file) && !element.hasAttribute("data-font")) {
6403
+ return null;
6404
+ }
6405
+ return element.hasAttribute("data-font") ? element : element.querySelector("[data-font]");
6406
+ }
6407
+ function isPlacerTextOutlineNode(label, file) {
6408
+ return `${label} ${file ?? ""}`.toLowerCase().includes("placertext");
6409
+ }
6410
+ function getFontLabel(element) {
6411
+ const dataFont = element.getAttribute("data-font");
6412
+ if (dataFont) {
6413
+ return dataFont.replace(/\bs\b/g, "sb").replace(/\bsemibold\b/g, "sb").replace(/\bregular\b/g, "r");
6414
+ }
6415
+ const style = window.getComputedStyle(element);
6416
+ return `${Math.round(parseFloat(style.fontSize))}px ${style.fontWeight}`;
6417
+ }
6418
+ function getPlacerMediaItems(element, label, file) {
6419
+ if (!isPlacerMediaOutlineNode(label, file)) return void 0;
6420
+ const mediaItems = [];
6421
+ const seen = /* @__PURE__ */ new Set();
6422
+ const addMediaItem = (target, type, url) => {
6423
+ const normalizedUrl = normalizeOutlineValue(url);
6424
+ if (!normalizedUrl) return;
6425
+ const variant = getPlacerMediaVariant(target, element);
6426
+ const key = `${variant}:${type}:${normalizedUrl}`;
6427
+ if (seen.has(key)) return;
6428
+ seen.add(key);
6429
+ mediaItems.push({ type, url: normalizedUrl, variant });
6430
+ };
6431
+ if (element instanceof HTMLVideoElement) {
6432
+ addMediaItem(element, "video", getVideoElementUrl(element));
6433
+ addMediaItem(element, "image", element.getAttribute("poster"));
6434
+ }
6435
+ if (element instanceof HTMLImageElement) {
6436
+ addMediaItem(element, "image", getMediaElementUrl(element));
6437
+ }
6438
+ if (element instanceof HTMLSourceElement) {
6439
+ addMediaItem(element, "video", getSourceElementUrl(element));
6440
+ }
6441
+ Array.from(element.querySelectorAll("video")).forEach((video) => {
6442
+ addMediaItem(video, "video", getVideoElementUrl(video));
6443
+ addMediaItem(video, "image", video.getAttribute("poster"));
6444
+ });
6445
+ Array.from(element.querySelectorAll("source")).forEach((source) => {
6446
+ addMediaItem(source, "video", getSourceElementUrl(source));
6447
+ });
6448
+ Array.from(element.querySelectorAll("img")).forEach((img) => {
6449
+ addMediaItem(img, "image", getMediaElementUrl(img));
6450
+ });
6451
+ return mediaItems.length > 0 ? mediaItems : void 0;
6452
+ }
6453
+ function isPlacerMediaOutlineNode(label, file) {
6454
+ return `${label} ${file ?? ""}`.toLowerCase().includes("placermedia");
6455
+ }
6456
+ function getPlacerMediaVariant(target, root) {
6457
+ let current = target;
6458
+ while (current) {
6459
+ if (current.classList.contains("d-block-pc")) return "desktop";
6460
+ if (current.classList.contains("d-block-m")) return "mobile";
6461
+ if (current === root) break;
6462
+ current = current.parentElement;
6463
+ }
6464
+ return "media";
6465
+ }
6466
+ function getVideoElementUrl(video) {
6467
+ return video.currentSrc || video.getAttribute("src") || video.querySelector("source")?.getAttribute("src") || video.getAttribute("poster") || video.src;
6468
+ }
6469
+ function getSourceElementUrl(source) {
6470
+ return source.getAttribute("src") || source.src;
6471
+ }
6472
+ function getMediaElementUrl(img) {
6473
+ return img.currentSrc || img.getAttribute("src") || img.src;
6474
+ }
5880
6475
  function getOutlineSourceKey(source) {
5881
6476
  return getSourceFileCompareKey(source.file);
5882
6477
  }
@@ -6494,7 +7089,7 @@ var getStoredOverlayState = (targetDocument, overlay) => {
6494
7089
  };
6495
7090
  var getTargetOverlayState = (targetDocument) => ({
6496
7091
  grid: Boolean(
6497
- targetDocument?.body.classList.contains("is-help") || targetDocument?.querySelector(".helper.onShow") || getStoredOverlayState(targetDocument, "grid")
7092
+ targetDocument?.body?.classList.contains("is-help") || targetDocument?.querySelector(".helper.onShow") || getStoredOverlayState(targetDocument, "grid")
6498
7093
  ),
6499
7094
  figma: Boolean(
6500
7095
  targetDocument?.querySelector(
@@ -6534,9 +7129,7 @@ var ReviewTopbar = ({
6534
7129
  onCopyCurrentUrl,
6535
7130
  onSizeChange,
6536
7131
  onToggleRuler,
6537
- onToggleTargetOverlay,
6538
- onOpenInitialPrompt,
6539
- onOpenSettings
7132
+ onToggleTargetOverlay
6540
7133
  }) => {
6541
7134
  const selectedPresetValue = getPresetSelectValue(size);
6542
7135
  const handlePresetSelectChange = (event) => {
@@ -6573,8 +7166,19 @@ var ReviewTopbar = ({
6573
7166
  onChange: (event) => onDraftTargetChange(event.target.value)
6574
7167
  }
6575
7168
  ),
6576
- /* @__PURE__ */ jsx16("button", { type: "submit", children: "Load" }),
6577
- /* @__PURE__ */ jsx16("button", { type: "button", onClick: onCopyCurrentUrl, children: copyLabel })
7169
+ /* @__PURE__ */ jsxs14("div", { className: "df-review-address-actions", children: [
7170
+ /* @__PURE__ */ jsx16(
7171
+ "button",
7172
+ {
7173
+ "aria-label": "Refresh target",
7174
+ className: "df-review-address-refresh",
7175
+ title: "Refresh target",
7176
+ type: "submit",
7177
+ children: /* @__PURE__ */ jsx16(RefreshCw, { "aria-hidden": "true" })
7178
+ }
7179
+ ),
7180
+ /* @__PURE__ */ jsx16("button", { type: "button", onClick: onCopyCurrentUrl, children: copyLabel })
7181
+ ] })
6578
7182
  ]
6579
7183
  }
6580
7184
  ),
@@ -6654,86 +7258,7 @@ var ReviewTopbar = ({
6654
7258
  onClick: () => onToggleTargetOverlay("figma"),
6655
7259
  children: /* @__PURE__ */ jsx16(Image, { "aria-hidden": "true" })
6656
7260
  }
6657
- ),
6658
- /* @__PURE__ */ jsx16("span", { className: "df-review-tool-divider", "aria-hidden": "true", children: "|" }),
6659
- /* @__PURE__ */ jsx16(
6660
- "button",
6661
- {
6662
- "aria-label": "Open initial prompt",
6663
- className: "df-review-overlay-button is-prompt",
6664
- type: "button",
6665
- onClick: onOpenInitialPrompt,
6666
- children: /* @__PURE__ */ jsx16(CircleQuestionMark, { "aria-hidden": "true" })
6667
- }
6668
- ),
6669
- /* @__PURE__ */ jsx16(
6670
- "button",
6671
- {
6672
- "aria-label": "Open settings",
6673
- className: "df-review-overlay-button is-settings",
6674
- type: "button",
6675
- onClick: onOpenSettings,
6676
- children: /* @__PURE__ */ jsx16(Settings, { "aria-hidden": "true" })
6677
- }
6678
7261
  )
6679
- ] }),
6680
- /* @__PURE__ */ jsxs14("details", { className: "df-review-overlays-menu", children: [
6681
- /* @__PURE__ */ jsx16("summary", { "aria-label": "Open target tools", title: "Tools", children: /* @__PURE__ */ jsx16(Ellipsis, { "aria-hidden": "true" }) }),
6682
- /* @__PURE__ */ jsxs14("div", { className: "df-review-overlays-popover", "aria-label": "Target tools", children: [
6683
- isRulerAvailable && /* @__PURE__ */ jsx16(
6684
- "button",
6685
- {
6686
- "aria-label": "Toggle ruler",
6687
- className: `df-review-overlay-button is-ruler${isRulerVisible ? " is-active" : ""}`,
6688
- type: "button",
6689
- onClick: onToggleRuler,
6690
- children: /* @__PURE__ */ jsx16(Ruler, { "aria-hidden": "true" })
6691
- }
6692
- ),
6693
- /* @__PURE__ */ jsx16(
6694
- "button",
6695
- {
6696
- "aria-label": "Toggle grid overlay",
6697
- className: `df-review-overlay-button is-grid${targetOverlayState.grid ? " is-active" : ""}`,
6698
- type: "button",
6699
- onClick: () => onToggleTargetOverlay("grid"),
6700
- children: /* @__PURE__ */ jsx16(LayoutGrid, { "aria-hidden": "true" })
6701
- }
6702
- ),
6703
- /* @__PURE__ */ jsx16(
6704
- "button",
6705
- {
6706
- "aria-disabled": !isFigmaOverlayAvailable,
6707
- "aria-label": isFigmaOverlayAvailable ? "Toggle Figma overlay" : FIGMA_OVERLAY_UNAVAILABLE_MESSAGE,
6708
- className: `df-review-overlay-button is-figma${targetOverlayState.figma ? " is-active" : ""}${isFigmaOverlayAvailable ? "" : " is-disabled"}`,
6709
- disabled: !isFigmaOverlayAvailable,
6710
- type: "button",
6711
- onClick: () => onToggleTargetOverlay("figma"),
6712
- children: /* @__PURE__ */ jsx16(Image, { "aria-hidden": "true" })
6713
- }
6714
- ),
6715
- /* @__PURE__ */ jsx16("span", { className: "df-review-tool-divider", "aria-hidden": "true", children: "|" }),
6716
- /* @__PURE__ */ jsx16(
6717
- "button",
6718
- {
6719
- "aria-label": "Open initial prompt",
6720
- className: "df-review-overlay-button is-prompt",
6721
- type: "button",
6722
- onClick: onOpenInitialPrompt,
6723
- children: /* @__PURE__ */ jsx16(CircleQuestionMark, { "aria-hidden": "true" })
6724
- }
6725
- ),
6726
- /* @__PURE__ */ jsx16(
6727
- "button",
6728
- {
6729
- "aria-label": "Open settings",
6730
- className: "df-review-overlay-button is-settings",
6731
- type: "button",
6732
- onClick: onOpenSettings,
6733
- children: /* @__PURE__ */ jsx16(Settings, { "aria-hidden": "true" })
6734
- }
6735
- )
6736
- ] })
6737
7262
  ] })
6738
7263
  ] })
6739
7264
  ] });
@@ -7037,7 +7562,8 @@ var getReviewKitTarget = ({
7037
7562
  width: Math.max(0, right - left),
7038
7563
  height: Math.max(0, bottom - top)
7039
7564
  };
7040
- }
7565
+ },
7566
+ getComposerHost: () => document.querySelector(".df-review-qa-draft-host")
7041
7567
  };
7042
7568
  };
7043
7569
 
@@ -8194,7 +8720,7 @@ var useReviewSettings = ({
8194
8720
  const nextToken = token.trim();
8195
8721
  const nextUserId = userId.trim();
8196
8722
  const nextTheme = normalizeReviewTheme(theme);
8197
- const shouldReload = nextToken !== getStoredFigmaToken() || nextUserId !== getStoredReviewUserId();
8723
+ const shouldReload = nextToken !== getStoredFigmaToken();
8198
8724
  writeStoredFigmaToken(nextToken);
8199
8725
  writeStoredReviewUserId(nextUserId);
8200
8726
  writeStoredReviewTheme(nextTheme);
@@ -8285,7 +8811,7 @@ var useReviewShellData = ({
8285
8811
  () => /* @__PURE__ */ new Set()
8286
8812
  );
8287
8813
  const [qaFilter, setQaFilter] = useState8("all");
8288
- const [qaStatusFilter, setQaStatusFilter] = useState8("all");
8814
+ const [qaStatusFilter, setQaStatusFilterState] = useState8(getStoredReviewQaStatusFilter);
8289
8815
  const [sitemapItems, setSitemapItems] = useState8(() => ({
8290
8816
  local: [],
8291
8817
  remote: []
@@ -8404,6 +8930,10 @@ var useReviewShellData = ({
8404
8930
  return counts;
8405
8931
  }, [activeItems, getItemPresetScope]);
8406
8932
  const currentPresetScope = getViewportPresetKind(size);
8933
+ const setQaStatusFilter = useCallback10((filter) => {
8934
+ setQaStatusFilterState(filter);
8935
+ writeStoredReviewQaStatusFilter(filter);
8936
+ }, []);
8407
8937
  const pageQaCounts = useMemo5(() => {
8408
8938
  const counts = /* @__PURE__ */ new Map();
8409
8939
  const addItems = (sourceKey, sourceItems) => {
@@ -8778,7 +9308,9 @@ var useReviewShellState = ({
8778
9308
  figma: false
8779
9309
  });
8780
9310
  const [selectedItemId, setSelectedItemId] = useState9(getInitialItemId());
8781
- const [isListVisible, setIsListVisible] = useState9(true);
9311
+ const [isListVisible, setIsListVisible] = useState9(
9312
+ getStoredReviewSidePanelVisible
9313
+ );
8782
9314
  const [isSitemapOpen, setIsSitemapOpen] = useState9(false);
8783
9315
  const [isInitialPromptOpen, setIsInitialPromptOpen] = useState9(false);
8784
9316
  const [copyLabel, setCopyLabel] = useState9("Copy URL");
@@ -8842,34 +9374,40 @@ var useReviewShellState = ({
8842
9374
  };
8843
9375
 
8844
9376
  // src/react-shell/review/shell.actions.ts
9377
+ var writeClipboardTextFallback = (value) => {
9378
+ const selection = document.getSelection();
9379
+ const activeElement = document.activeElement instanceof HTMLElement ? document.activeElement : null;
9380
+ const ranges = selection ? Array.from(
9381
+ { length: selection.rangeCount },
9382
+ (_, index) => selection.getRangeAt(index)
9383
+ ) : [];
9384
+ const textarea = document.createElement("textarea");
9385
+ textarea.value = value;
9386
+ textarea.setAttribute("readonly", "");
9387
+ textarea.style.position = "fixed";
9388
+ textarea.style.left = "-9999px";
9389
+ textarea.style.top = "0";
9390
+ document.body.appendChild(textarea);
9391
+ textarea.focus();
9392
+ textarea.select();
9393
+ const isCopied = document.execCommand("copy");
9394
+ textarea.remove();
9395
+ selection?.removeAllRanges();
9396
+ ranges.forEach((range) => selection?.addRange(range));
9397
+ activeElement?.focus();
9398
+ if (!isCopied) {
9399
+ throw new Error("Failed to copy to clipboard");
9400
+ }
9401
+ };
8845
9402
  var writeClipboardText = async (value) => {
8846
9403
  try {
8847
- await navigator.clipboard.writeText(value);
9404
+ writeClipboardTextFallback(value);
8848
9405
  return;
8849
- } catch {
8850
- const selection = document.getSelection();
8851
- const activeElement = document.activeElement instanceof HTMLElement ? document.activeElement : null;
8852
- const ranges = selection ? Array.from(
8853
- { length: selection.rangeCount },
8854
- (_, index) => selection.getRangeAt(index)
8855
- ) : [];
8856
- const textarea = document.createElement("textarea");
8857
- textarea.value = value;
8858
- textarea.setAttribute("readonly", "");
8859
- textarea.style.position = "fixed";
8860
- textarea.style.left = "-9999px";
8861
- textarea.style.top = "0";
8862
- document.body.appendChild(textarea);
8863
- textarea.focus();
8864
- textarea.select();
8865
- const isCopied = document.execCommand("copy");
8866
- textarea.remove();
8867
- selection?.removeAllRanges();
8868
- ranges.forEach((range) => selection?.addRange(range));
8869
- activeElement?.focus();
8870
- if (!isCopied) {
8871
- throw new Error("Failed to copy to clipboard");
9406
+ } catch (error) {
9407
+ if (!navigator.clipboard?.writeText) {
9408
+ throw error;
8872
9409
  }
9410
+ await navigator.clipboard.writeText(value);
8873
9411
  }
8874
9412
  };
8875
9413
  var listReviewItems = async ({
@@ -9157,12 +9695,10 @@ var getSectionOutlineEntryCount = (entries) => entries.reduce(
9157
9695
  (count, entry) => count + 1 + getSectionOutlineEntryCount(entry.children),
9158
9696
  0
9159
9697
  );
9160
- var DEFAULT_COLLAPSED_ROOT_LABELS = /* @__PURE__ */ new Set(["FrameHeader", "FrameFooter"]);
9161
9698
  var getDefaultCollapsedSectionOutlineIds = (entries) => {
9162
9699
  const collapsedIds = /* @__PURE__ */ new Set();
9163
9700
  const visit = (entry) => {
9164
- const shouldCollapseRoot = entry.depth === 1 && DEFAULT_COLLAPSED_ROOT_LABELS.has(entry.label);
9165
- if ((entry.depth >= 2 || shouldCollapseRoot) && entry.children.length > 0) {
9701
+ if (entry.children.length > 0) {
9166
9702
  collapsedIds.add(entry.id);
9167
9703
  }
9168
9704
  entry.children.forEach(visit);
@@ -9170,13 +9706,27 @@ var getDefaultCollapsedSectionOutlineIds = (entries) => {
9170
9706
  entries.forEach(visit);
9171
9707
  return collapsedIds;
9172
9708
  };
9709
+ var getLiveSectionOutlineRect = (entry) => {
9710
+ if (!entry.element.isConnected) return entry.metadata.rect;
9711
+ const rect = entry.element.getBoundingClientRect();
9712
+ return {
9713
+ top: Math.round(rect.top),
9714
+ left: Math.round(rect.left),
9715
+ width: Math.round(rect.width),
9716
+ height: Math.round(rect.height)
9717
+ };
9718
+ };
9173
9719
  var matchesSectionOutlineFilter = (entry, terms) => {
9174
9720
  if (terms.length === 0) return true;
9175
9721
  const text = [
9176
9722
  entry.label,
9177
9723
  entry.filePath,
9178
9724
  entry.source?.file,
9179
- entry.data?.file
9725
+ entry.data?.file,
9726
+ entry.metadata.textValue,
9727
+ entry.metadata.fontLabel,
9728
+ entry.metadata.mediaItems?.map((mediaItem) => `${mediaItem.variant} ${mediaItem.type} ${mediaItem.url}`).join(" "),
9729
+ entry.metadata.classNames?.join(" ")
9180
9730
  ].filter(Boolean).join(" ").toLowerCase();
9181
9731
  return terms.every((term) => text.includes(term));
9182
9732
  };
@@ -9261,10 +9811,16 @@ var ReviewShell = ({
9261
9811
  });
9262
9812
  const sourceShortcutCleanupRef = useRef5(null);
9263
9813
  const sourceInspectorInteractionRef = useRef5(false);
9264
- const [sidePanel, setSidePanel] = useState10("qa");
9265
9814
  const [sourceInspectorState, setSourceInspectorState] = useState10(null);
9266
9815
  const [sectionOutline, setSectionOutline] = useState10(null);
9267
- const [sectionOutlineFilter, setSectionOutlineFilter] = useState10("");
9816
+ const [sectionOutlineFilter, setSectionOutlineFilter] = useState10(
9817
+ () => getStoredSourceTreeFilter()
9818
+ );
9819
+ const [sectionOutlineMetaVisibility, setSectionOutlineMetaVisibility] = useState10(() => getStoredSourceTreeMetaVisibility());
9820
+ const isSectionOutlineBoxMetaVisible = sectionOutlineMetaVisibility.box;
9821
+ const isSectionOutlineFontMetaVisible = sectionOutlineMetaVisibility.font;
9822
+ const isSectionOutlineMediaMetaVisible = sectionOutlineMetaVisibility.media;
9823
+ const isSectionOutlineClassMetaVisible = sectionOutlineMetaVisibility.className;
9268
9824
  const [collapsedSectionOutlineIds, setCollapsedSectionOutlineIds] = useState10(() => /* @__PURE__ */ new Set());
9269
9825
  const [isAllQaVisible, setIsAllQaVisible] = useState10(false);
9270
9826
  const sourceOpenOptions = useMemo7(
@@ -9290,9 +9846,36 @@ var ReviewShell = ({
9290
9846
  [sourceInspector]
9291
9847
  );
9292
9848
  const isSourceInspectorEnabled = sourceInspector?.enabled !== false;
9849
+ const [sidePanel, setSidePanel] = useState10(
9850
+ () => isSourceInspectorEnabled ? getStoredReviewSidePanel() : "qa"
9851
+ );
9293
9852
  const isSourceTreeHoverOutlineEnabled = sourceInspector?.hoverOutline !== false;
9294
9853
  const isQaPanelVisible = isListVisible && sidePanel === "qa";
9295
9854
  const isSourceTreePanelVisible = isSourceInspectorEnabled && isListVisible && sidePanel === "source";
9855
+ useEffect10(() => {
9856
+ if (isSourceInspectorEnabled || sidePanel !== "source") return;
9857
+ setSidePanel("qa");
9858
+ }, [isSourceInspectorEnabled, sidePanel]);
9859
+ useEffect10(() => {
9860
+ writeStoredReviewSidePanel(sidePanel);
9861
+ }, [sidePanel]);
9862
+ useEffect10(() => {
9863
+ writeStoredReviewSidePanelVisible(isListVisible);
9864
+ }, [isListVisible]);
9865
+ const updateSectionOutlineFilter = useCallback11((nextFilter) => {
9866
+ setSectionOutlineFilter(nextFilter);
9867
+ writeStoredSourceTreeFilter(nextFilter);
9868
+ }, []);
9869
+ const updateSectionOutlineMetaVisibility = useCallback11(
9870
+ (key) => {
9871
+ setSectionOutlineMetaVisibility((current) => {
9872
+ const next = { ...current, [key]: !current[key] };
9873
+ writeStoredSourceTreeMetaVisibility(next);
9874
+ return next;
9875
+ });
9876
+ },
9877
+ []
9878
+ );
9296
9879
  const sectionOutlineFilterTerms = useMemo7(
9297
9880
  () => getSectionOutlineFilterTerms(sectionOutlineFilter),
9298
9881
  [sectionOutlineFilter]
@@ -9560,6 +10143,7 @@ var ReviewShell = ({
9560
10143
  parsedInput.height
9561
10144
  ) : sizeRef.current;
9562
10145
  const nextAdapter = sourceEntries.find((entry) => entry.label === nextSource) ?? activeAdapterEntry;
10146
+ const isCurrentTarget = targetRef.current === normalizedTarget && source === nextSource && sizeRef.current.width === nextSize.width && sizeRef.current.height === nextSize.height;
9563
10147
  if (parsedInput.itemId) {
9564
10148
  const item = await nextAdapter.adapter.get(parsedInput.itemId);
9565
10149
  if (item) {
@@ -9578,6 +10162,7 @@ var ReviewShell = ({
9578
10162
  setSize(nextSize);
9579
10163
  setTarget(normalizedTarget);
9580
10164
  updateShellUrl(normalizedTarget, nextSize, nextSource);
10165
+ if (isCurrentTarget) reloadTargetFrame();
9581
10166
  };
9582
10167
  const selectPage = (href) => {
9583
10168
  const normalizedTarget = normalizeTarget(href, reviewPathPrefix);
@@ -9598,6 +10183,10 @@ var ReviewShell = ({
9598
10183
  const writeMode = getReviewModeWriteMode(nextMode);
9599
10184
  if (writeMode && !activeAdapterEntry.writeModes.includes(writeMode)) return;
9600
10185
  closeRuler();
10186
+ if (writeMode && mode !== nextMode) {
10187
+ setSidePanel("qa");
10188
+ setIsListVisible(true);
10189
+ }
9601
10190
  setControllerReviewMode(nextMode);
9602
10191
  };
9603
10192
  useReviewShellHotkeys({
@@ -9647,7 +10236,6 @@ var ReviewShell = ({
9647
10236
  }, []);
9648
10237
  useEffect10(() => {
9649
10238
  clearSourceInspector();
9650
- setSectionOutlineFilter("");
9651
10239
  setCollapsedSectionOutlineIds(/* @__PURE__ */ new Set());
9652
10240
  setSectionOutline(null);
9653
10241
  }, [clearSourceInspector, targetSrc]);
@@ -9808,7 +10396,10 @@ var ReviewShell = ({
9808
10396
  } catch {
9809
10397
  frameDocument = null;
9810
10398
  }
9811
- return frameDocument ? getSectionOutline(frameDocument, sectionOutlineOptions) : [];
10399
+ if (!frameDocument || frameDocument.readyState !== "complete") {
10400
+ return null;
10401
+ }
10402
+ return getSectionOutline(frameDocument, sectionOutlineOptions);
9812
10403
  },
9813
10404
  [iframeRef, sectionOutlineOptions]
9814
10405
  );
@@ -9824,7 +10415,9 @@ var ReviewShell = ({
9824
10415
  useEffect10(() => {
9825
10416
  if (sidePanel !== "source" || !isListVisible) return void 0;
9826
10417
  const refreshSectionOutline = () => {
9827
- setSectionOutlineWithDefaultCollapse(getCurrentSectionOutline());
10418
+ const nextSectionOutline = getCurrentSectionOutline();
10419
+ if (!nextSectionOutline) return;
10420
+ setSectionOutlineWithDefaultCollapse(nextSectionOutline);
9828
10421
  };
9829
10422
  const animationFrame = window.requestAnimationFrame(refreshSectionOutline);
9830
10423
  const firstTimeout = window.setTimeout(refreshSectionOutline, 120);
@@ -9852,7 +10445,10 @@ var ReviewShell = ({
9852
10445
  return;
9853
10446
  }
9854
10447
  setSidePanel("source");
9855
- setSectionOutlineWithDefaultCollapse(getCurrentSectionOutline());
10448
+ const nextSectionOutline = getCurrentSectionOutline();
10449
+ if (nextSectionOutline) {
10450
+ setSectionOutlineWithDefaultCollapse(nextSectionOutline);
10451
+ }
9856
10452
  setIsListVisible(true);
9857
10453
  }, [
9858
10454
  getCurrentSectionOutline,
@@ -9905,7 +10501,8 @@ var ReviewShell = ({
9905
10501
  return;
9906
10502
  }
9907
10503
  clearSourceInspector();
9908
- setIsListVisible(false);
10504
+ setSidePanel("qa");
10505
+ setIsListVisible(true);
9909
10506
  let targetWindow = null;
9910
10507
  try {
9911
10508
  targetWindow = entry.element.ownerDocument.defaultView ?? iframeRef.current?.contentWindow ?? null;
@@ -10215,7 +10812,10 @@ var ReviewShell = ({
10215
10812
  );
10216
10813
  bindSourceOpenShortcut();
10217
10814
  if (sidePanel === "source" && isListVisible) {
10218
- setSectionOutlineWithDefaultCollapse(getCurrentSectionOutline());
10815
+ const nextSectionOutline = getCurrentSectionOutline();
10816
+ if (nextSectionOutline) {
10817
+ setSectionOutlineWithDefaultCollapse(nextSectionOutline);
10818
+ }
10219
10819
  }
10220
10820
  }, [
10221
10821
  bindSourceOpenShortcut,
@@ -10282,6 +10882,11 @@ var ReviewShell = ({
10282
10882
  `qa:${numberedItem.item.id}`,
10283
10883
  "QA prompt copied"
10284
10884
  );
10885
+ const copyItemLabel = (numberedItem) => copyPrompt(
10886
+ numberedItem.displayLabel,
10887
+ `label:${numberedItem.item.id}`,
10888
+ "QA number copied"
10889
+ );
10285
10890
  const copyItemLink = (numberedItem) => {
10286
10891
  const { item } = numberedItem;
10287
10892
  return copyPrompt(
@@ -10307,6 +10912,99 @@ var ReviewShell = ({
10307
10912
  onRefreshReviewData: refreshReviewData2,
10308
10913
  onToast: showToast
10309
10914
  });
10915
+ const renderSectionOutlineMeta = (entry) => {
10916
+ const { metadata } = entry;
10917
+ const rows = [];
10918
+ const metaPaddingLeft = Math.max(0, entry.depth - 1) * 12 + 29;
10919
+ const rect = getLiveSectionOutlineRect(entry);
10920
+ if (isSectionOutlineBoxMetaVisible) {
10921
+ rows.push(
10922
+ /* @__PURE__ */ jsxs15("span", { className: "df-review-section-outline-meta-row", children: [
10923
+ /* @__PURE__ */ jsx17("b", { children: "box" }),
10924
+ /* @__PURE__ */ jsxs15("code", { children: [
10925
+ "top ",
10926
+ rect.top,
10927
+ " / left ",
10928
+ rect.left,
10929
+ " / width ",
10930
+ rect.width,
10931
+ " / height",
10932
+ " ",
10933
+ rect.height
10934
+ ] })
10935
+ ] }, "box")
10936
+ );
10937
+ }
10938
+ if (metadata.textValue) {
10939
+ rows.push(
10940
+ /* @__PURE__ */ jsxs15(
10941
+ "span",
10942
+ {
10943
+ className: "df-review-section-outline-meta-row is-text",
10944
+ children: [
10945
+ /* @__PURE__ */ jsx17("b", { children: "text" }),
10946
+ /* @__PURE__ */ jsx17("code", { children: metadata.textValue })
10947
+ ]
10948
+ },
10949
+ "text"
10950
+ )
10951
+ );
10952
+ }
10953
+ if (isSectionOutlineFontMetaVisible && metadata.fontLabel) {
10954
+ rows.push(
10955
+ /* @__PURE__ */ jsxs15("span", { className: "df-review-section-outline-meta-row", children: [
10956
+ /* @__PURE__ */ jsx17("b", { children: "font" }),
10957
+ /* @__PURE__ */ jsx17("code", { children: metadata.fontLabel })
10958
+ ] }, "font")
10959
+ );
10960
+ }
10961
+ if (isSectionOutlineMediaMetaVisible && metadata.mediaItems?.length) {
10962
+ metadata.mediaItems.forEach((mediaItem) => {
10963
+ const mediaKey = `${mediaItem.variant}:${mediaItem.type}:${mediaItem.url}`;
10964
+ const mediaLabel = mediaItem.variant === "media" ? mediaItem.type : mediaItem.variant;
10965
+ rows.push(
10966
+ /* @__PURE__ */ jsxs15(
10967
+ "span",
10968
+ {
10969
+ className: "df-review-section-outline-meta-row is-media",
10970
+ children: [
10971
+ /* @__PURE__ */ jsx17("b", { children: mediaLabel }),
10972
+ /* @__PURE__ */ jsx17(
10973
+ "a",
10974
+ {
10975
+ className: "df-review-section-outline-media-link",
10976
+ href: mediaItem.url,
10977
+ rel: "noopener noreferrer",
10978
+ target: "_blank",
10979
+ title: `${mediaLabel} ${mediaItem.type}`,
10980
+ children: /* @__PURE__ */ jsx17("code", { children: mediaItem.url })
10981
+ }
10982
+ )
10983
+ ]
10984
+ },
10985
+ mediaKey
10986
+ )
10987
+ );
10988
+ });
10989
+ }
10990
+ if (isSectionOutlineClassMetaVisible && metadata.classNames?.length) {
10991
+ rows.push(
10992
+ /* @__PURE__ */ jsxs15("span", { className: "df-review-section-outline-meta-row is-class", children: [
10993
+ /* @__PURE__ */ jsx17("b", { children: "class" }),
10994
+ /* @__PURE__ */ jsx17("span", { className: "df-review-section-outline-class-tags", children: metadata.classNames.map((className) => /* @__PURE__ */ jsx17("code", { children: className }, className)) })
10995
+ ] }, "class")
10996
+ );
10997
+ }
10998
+ if (rows.length === 0) return null;
10999
+ return /* @__PURE__ */ jsx17(
11000
+ "div",
11001
+ {
11002
+ className: "df-review-section-outline-meta",
11003
+ style: { paddingLeft: `${metaPaddingLeft}px` },
11004
+ children: rows
11005
+ }
11006
+ );
11007
+ };
10310
11008
  const renderSectionOutlineEntry = (entry) => {
10311
11009
  const hasChildren = entry.children.length > 0;
10312
11010
  const isCollapsed = !isSectionOutlineFiltering && collapsedSectionOutlineIds.has(entry.id);
@@ -10318,8 +11016,7 @@ var ReviewShell = ({
10318
11016
  /* @__PURE__ */ jsxs15(
10319
11017
  "div",
10320
11018
  {
10321
- className: "df-review-section-outline-row",
10322
- style: { paddingLeft: `${Math.max(0, entry.depth - 1) * 12 + 6}px` },
11019
+ className: "df-review-section-outline-entry-body",
10323
11020
  onMouseEnter: () => showSourceOutlineForElement(entry.element),
10324
11021
  onMouseLeave: clearSourceOutlineHover,
10325
11022
  onMouseOver: () => showSourceOutlineForElement(entry.element),
@@ -10332,78 +11029,88 @@ var ReviewShell = ({
10332
11029
  onPointerEnter: () => showSourceOutlineForElement(entry.element),
10333
11030
  onPointerLeave: clearSourceOutlineHover,
10334
11031
  children: [
10335
- hasChildren ? /* @__PURE__ */ jsx17(
10336
- "button",
10337
- {
10338
- "aria-label": isCollapsed ? `Expand ${entry.label}` : `Collapse ${entry.label}`,
10339
- "aria-expanded": !isCollapsed,
10340
- className: `df-review-section-outline-toggle${isCollapsed ? " is-collapsed" : ""}`,
10341
- type: "button",
10342
- onClick: () => toggleSectionOutlineEntry(entry.id),
10343
- children: /* @__PURE__ */ jsx17(ChevronDown, { "aria-hidden": "true" })
10344
- }
10345
- ) : /* @__PURE__ */ jsx17(
10346
- "span",
10347
- {
10348
- "aria-hidden": "true",
10349
- className: "df-review-section-outline-toggle is-placeholder"
10350
- }
10351
- ),
10352
- /* @__PURE__ */ jsx17(
10353
- "button",
11032
+ /* @__PURE__ */ jsxs15(
11033
+ "div",
10354
11034
  {
10355
- className: "df-review-section-outline-name",
10356
- type: "button",
10357
- onClick: () => scrollToSection(entry),
10358
- children: /* @__PURE__ */ jsx17("span", { children: entry.label })
11035
+ className: "df-review-section-outline-row",
11036
+ style: { paddingLeft: `${Math.max(0, entry.depth - 1) * 12 + 6}px` },
11037
+ children: [
11038
+ hasChildren ? /* @__PURE__ */ jsx17(
11039
+ "button",
11040
+ {
11041
+ "aria-label": isCollapsed ? `Expand ${entry.label}` : `Collapse ${entry.label}`,
11042
+ "aria-expanded": !isCollapsed,
11043
+ className: `df-review-section-outline-toggle${isCollapsed ? " is-collapsed" : ""}`,
11044
+ type: "button",
11045
+ onClick: () => toggleSectionOutlineEntry(entry.id),
11046
+ children: /* @__PURE__ */ jsx17(ChevronDown, { "aria-hidden": "true" })
11047
+ }
11048
+ ) : /* @__PURE__ */ jsx17(
11049
+ "span",
11050
+ {
11051
+ "aria-hidden": "true",
11052
+ className: "df-review-section-outline-toggle is-placeholder"
11053
+ }
11054
+ ),
11055
+ /* @__PURE__ */ jsx17(
11056
+ "button",
11057
+ {
11058
+ className: "df-review-section-outline-name",
11059
+ type: "button",
11060
+ onClick: () => scrollToSection(entry),
11061
+ children: /* @__PURE__ */ jsx17("span", { children: entry.label })
11062
+ }
11063
+ ),
11064
+ /* @__PURE__ */ jsxs15("span", { className: "df-review-section-outline-links", children: [
11065
+ /* @__PURE__ */ jsx17(
11066
+ "button",
11067
+ {
11068
+ "aria-label": `Open ${entry.label} data`,
11069
+ className: "df-review-section-outline-link",
11070
+ title: "Open data",
11071
+ type: "button",
11072
+ disabled: !entry.data?.file,
11073
+ onClick: () => openSectionData(entry),
11074
+ children: /* @__PURE__ */ jsx17(Database, { "aria-hidden": "true" })
11075
+ }
11076
+ ),
11077
+ /* @__PURE__ */ jsx17(
11078
+ "button",
11079
+ {
11080
+ "aria-label": `Open ${entry.label} source`,
11081
+ className: "df-review-section-outline-link",
11082
+ title: "Open source",
11083
+ type: "button",
11084
+ disabled: !entry.source?.file,
11085
+ onClick: () => openSectionSource(entry),
11086
+ children: /* @__PURE__ */ jsx17(CodeXml, { "aria-hidden": "true" })
11087
+ }
11088
+ ),
11089
+ /* @__PURE__ */ jsx17(
11090
+ "span",
11091
+ {
11092
+ "aria-hidden": "true",
11093
+ className: "df-review-section-outline-divider",
11094
+ children: "|"
11095
+ }
11096
+ ),
11097
+ /* @__PURE__ */ jsx17(
11098
+ "button",
11099
+ {
11100
+ "aria-label": `Start DOM QA for ${entry.label}`,
11101
+ className: "df-review-section-outline-link is-dom-select",
11102
+ title: "DOM select",
11103
+ type: "button",
11104
+ disabled: !canWriteDom,
11105
+ onClick: () => startSectionDomReview(entry),
11106
+ children: /* @__PURE__ */ jsx17(SquareMousePointer, { "aria-hidden": "true" })
11107
+ }
11108
+ )
11109
+ ] })
11110
+ ]
10359
11111
  }
10360
11112
  ),
10361
- /* @__PURE__ */ jsxs15("span", { className: "df-review-section-outline-links", children: [
10362
- /* @__PURE__ */ jsx17(
10363
- "button",
10364
- {
10365
- "aria-label": `Open ${entry.label} data`,
10366
- className: "df-review-section-outline-link",
10367
- title: "Open data",
10368
- type: "button",
10369
- disabled: !entry.data?.file,
10370
- onClick: () => openSectionData(entry),
10371
- children: /* @__PURE__ */ jsx17(Database, { "aria-hidden": "true" })
10372
- }
10373
- ),
10374
- /* @__PURE__ */ jsx17(
10375
- "button",
10376
- {
10377
- "aria-label": `Open ${entry.label} source`,
10378
- className: "df-review-section-outline-link",
10379
- title: "Open source",
10380
- type: "button",
10381
- disabled: !entry.source?.file,
10382
- onClick: () => openSectionSource(entry),
10383
- children: /* @__PURE__ */ jsx17(CodeXml, { "aria-hidden": "true" })
10384
- }
10385
- ),
10386
- /* @__PURE__ */ jsx17(
10387
- "span",
10388
- {
10389
- "aria-hidden": "true",
10390
- className: "df-review-section-outline-divider",
10391
- children: "|"
10392
- }
10393
- ),
10394
- /* @__PURE__ */ jsx17(
10395
- "button",
10396
- {
10397
- "aria-label": `Start DOM QA for ${entry.label}`,
10398
- className: "df-review-section-outline-link is-dom-select",
10399
- title: "DOM select",
10400
- type: "button",
10401
- disabled: !canWriteDom,
10402
- onClick: () => startSectionDomReview(entry),
10403
- children: /* @__PURE__ */ jsx17(SquareMousePointer, { "aria-hidden": "true" })
10404
- }
10405
- )
10406
- ] })
11113
+ renderSectionOutlineMeta(entry)
10407
11114
  ]
10408
11115
  }
10409
11116
  ),
@@ -10436,11 +11143,7 @@ var ReviewShell = ({
10436
11143
  onCopyCurrentUrl: () => void copyCurrentUrl(),
10437
11144
  onSizeChange: setSize,
10438
11145
  onToggleRuler: toggleRuler,
10439
- onToggleTargetOverlay: toggleTargetOverlay,
10440
- onOpenInitialPrompt: () => {
10441
- setIsInitialPromptOpen(true);
10442
- },
10443
- onOpenSettings: openFigmaSettings
11146
+ onToggleTargetOverlay: toggleTargetOverlay
10444
11147
  }
10445
11148
  ),
10446
11149
  isSitemapOpen && /* @__PURE__ */ jsx17(
@@ -10518,16 +11221,42 @@ var ReviewShell = ({
10518
11221
  type: "button",
10519
11222
  onClick: toggleSourceTreePanel,
10520
11223
  title: "Source Tree",
10521
- children: /* @__PURE__ */ jsx17("span", { "aria-hidden": "true", children: /* @__PURE__ */ jsx17(Search, {}) })
11224
+ children: /* @__PURE__ */ jsx17("span", { "aria-hidden": "true", children: /* @__PURE__ */ jsx17(Workflow, {}) })
10522
11225
  }
10523
11226
  ),
10524
- currentPagePresenceUsers.length > 0 && /* @__PURE__ */ jsx17(
10525
- PresenceOverlay,
10526
- {
10527
- presenceSessionId,
10528
- users: currentPagePresenceUsers
10529
- }
10530
- )
11227
+ /* @__PURE__ */ jsxs15("div", { className: "df-review-side-actions", children: [
11228
+ /* @__PURE__ */ jsx17(
11229
+ "button",
11230
+ {
11231
+ "aria-label": "Open initial prompt",
11232
+ className: "df-review-side-toggle",
11233
+ type: "button",
11234
+ onClick: () => {
11235
+ setIsInitialPromptOpen(true);
11236
+ },
11237
+ title: "Help",
11238
+ children: /* @__PURE__ */ jsx17("span", { "aria-hidden": "true", children: /* @__PURE__ */ jsx17(CircleQuestionMark, {}) })
11239
+ }
11240
+ ),
11241
+ /* @__PURE__ */ jsx17(
11242
+ "button",
11243
+ {
11244
+ "aria-label": "Open settings",
11245
+ className: "df-review-side-toggle",
11246
+ type: "button",
11247
+ onClick: openFigmaSettings,
11248
+ title: "Settings",
11249
+ children: /* @__PURE__ */ jsx17("span", { "aria-hidden": "true", children: /* @__PURE__ */ jsx17(Settings, {}) })
11250
+ }
11251
+ ),
11252
+ currentPagePresenceUsers.length > 0 && /* @__PURE__ */ jsx17(
11253
+ PresenceOverlay,
11254
+ {
11255
+ presenceSessionId,
11256
+ users: currentPagePresenceUsers
11257
+ }
11258
+ )
11259
+ ] })
10531
11260
  ] }),
10532
11261
  /* @__PURE__ */ jsx17(
10533
11262
  ReviewQaPanel,
@@ -10555,6 +11284,7 @@ var ReviewShell = ({
10555
11284
  onChangeItemStatus: changeItemStatus,
10556
11285
  onClearSelectedItem: clearSelectedReviewItem,
10557
11286
  onChangeReviewSource: changeReviewSource,
11287
+ onCopyItemLabel: (numberedItem) => void copyItemLabel(numberedItem),
10558
11288
  onCopyItemLink: (numberedItem) => void copyItemLink(numberedItem),
10559
11289
  onCopyItemPrompt: (numberedItem) => void copyItemPrompt(numberedItem),
10560
11290
  onEditItem: setEditingItem,
@@ -10574,9 +11304,61 @@ var ReviewShell = ({
10574
11304
  "aria-hidden": !isSourceTreePanelVisible,
10575
11305
  children: /* @__PURE__ */ jsxs15("div", { id: "df-review-section-outline", className: "df-review-section-outline", children: [
10576
11306
  /* @__PURE__ */ jsxs15("div", { className: "df-review-section-outline-head", children: [
10577
- /* @__PURE__ */ jsxs15("span", { children: [
10578
- /* @__PURE__ */ jsx17("strong", { children: "Source Tree" }),
10579
- /* @__PURE__ */ jsx17("small", { children: isSectionOutlineFiltering ? `${filteredSectionOutlineCount} / ${sectionOutlineTotalCount} results` : `${sectionOutline?.length ?? 0} roots` })
11307
+ /* @__PURE__ */ jsxs15("div", { className: "df-review-section-outline-summary", children: [
11308
+ /* @__PURE__ */ jsxs15("span", { children: [
11309
+ /* @__PURE__ */ jsx17("strong", { children: "Component" }),
11310
+ /* @__PURE__ */ jsx17("small", { children: isSectionOutlineFiltering ? `${filteredSectionOutlineCount} / ${sectionOutlineTotalCount} results` : `${sectionOutline?.length ?? 0} ${sectionOutline?.length === 1 ? "root" : "roots"}` })
11311
+ ] }),
11312
+ /* @__PURE__ */ jsxs15("div", { className: "df-review-section-outline-meta-controls", children: [
11313
+ /* @__PURE__ */ jsx17(
11314
+ "button",
11315
+ {
11316
+ "aria-label": "Toggle source tree box metadata",
11317
+ "aria-pressed": isSectionOutlineBoxMetaVisible,
11318
+ className: `df-review-section-outline-meta-toggle${isSectionOutlineBoxMetaVisible ? " is-active" : ""}`,
11319
+ title: "top / left / width / height",
11320
+ type: "button",
11321
+ onClick: () => updateSectionOutlineMetaVisibility("box"),
11322
+ children: /* @__PURE__ */ jsx17(SquareDashed, { "aria-hidden": "true" })
11323
+ }
11324
+ ),
11325
+ /* @__PURE__ */ jsx17(
11326
+ "button",
11327
+ {
11328
+ "aria-label": "Toggle source tree font metadata",
11329
+ "aria-pressed": isSectionOutlineFontMetaVisible,
11330
+ className: `df-review-section-outline-meta-toggle${isSectionOutlineFontMetaVisible ? " is-active" : ""}`,
11331
+ title: "font size / weight",
11332
+ type: "button",
11333
+ onClick: () => updateSectionOutlineMetaVisibility("font"),
11334
+ children: /* @__PURE__ */ jsx17(Type, { "aria-hidden": "true" })
11335
+ }
11336
+ ),
11337
+ /* @__PURE__ */ jsx17(
11338
+ "button",
11339
+ {
11340
+ "aria-label": "Toggle source tree media metadata",
11341
+ "aria-pressed": isSectionOutlineMediaMetaVisible,
11342
+ className: `df-review-section-outline-meta-toggle${isSectionOutlineMediaMetaVisible ? " is-active" : ""}`,
11343
+ title: "media urls",
11344
+ type: "button",
11345
+ onClick: () => updateSectionOutlineMetaVisibility("media"),
11346
+ children: /* @__PURE__ */ jsx17(Image, { "aria-hidden": "true" })
11347
+ }
11348
+ ),
11349
+ /* @__PURE__ */ jsx17(
11350
+ "button",
11351
+ {
11352
+ "aria-label": "Toggle source tree class metadata",
11353
+ "aria-pressed": isSectionOutlineClassMetaVisible,
11354
+ className: `df-review-section-outline-meta-toggle${isSectionOutlineClassMetaVisible ? " is-active" : ""}`,
11355
+ title: "class names",
11356
+ type: "button",
11357
+ onClick: () => updateSectionOutlineMetaVisibility("className"),
11358
+ children: /* @__PURE__ */ jsx17(CodeXml, { "aria-hidden": "true" })
11359
+ }
11360
+ )
11361
+ ] })
10580
11362
  ] }),
10581
11363
  /* @__PURE__ */ jsxs15("div", { className: "df-review-section-outline-filter", children: [
10582
11364
  /* @__PURE__ */ jsx17(Search, { "aria-hidden": "true" }),
@@ -10590,7 +11372,7 @@ var ReviewShell = ({
10590
11372
  autoComplete: "off",
10591
11373
  enterKeyHint: "search",
10592
11374
  spellCheck: false,
10593
- onChange: (event) => setSectionOutlineFilter(event.currentTarget.value)
11375
+ onChange: (event) => updateSectionOutlineFilter(event.currentTarget.value)
10594
11376
  }
10595
11377
  ),
10596
11378
  sectionOutlineFilter && /* @__PURE__ */ jsx17(
@@ -10600,7 +11382,7 @@ var ReviewShell = ({
10600
11382
  className: "df-review-section-outline-filter-clear",
10601
11383
  type: "button",
10602
11384
  onMouseDown: (event) => event.preventDefault(),
10603
- onClick: () => setSectionOutlineFilter(""),
11385
+ onClick: () => updateSectionOutlineFilter(""),
10604
11386
  children: /* @__PURE__ */ jsx17(X, { "aria-hidden": "true" })
10605
11387
  }
10606
11388
  )
@@ -10919,7 +11701,6 @@ lucide-react/dist/esm/icons/circle-question-mark.mjs:
10919
11701
  lucide-react/dist/esm/icons/code-xml.mjs:
10920
11702
  lucide-react/dist/esm/icons/copy.mjs:
10921
11703
  lucide-react/dist/esm/icons/database.mjs:
10922
- lucide-react/dist/esm/icons/ellipsis.mjs:
10923
11704
  lucide-react/dist/esm/icons/external-link.mjs:
10924
11705
  lucide-react/dist/esm/icons/eye-off.mjs:
10925
11706
  lucide-react/dist/esm/icons/eye.mjs:
@@ -10940,11 +11721,13 @@ lucide-react/dist/esm/icons/scan.mjs:
10940
11721
  lucide-react/dist/esm/icons/search.mjs:
10941
11722
  lucide-react/dist/esm/icons/settings.mjs:
10942
11723
  lucide-react/dist/esm/icons/smartphone.mjs:
11724
+ lucide-react/dist/esm/icons/square-dashed.mjs:
10943
11725
  lucide-react/dist/esm/icons/square-mouse-pointer.mjs:
10944
11726
  lucide-react/dist/esm/icons/sticky-note.mjs:
10945
11727
  lucide-react/dist/esm/icons/sun.mjs:
11728
+ lucide-react/dist/esm/icons/type.mjs:
10946
11729
  lucide-react/dist/esm/icons/upload.mjs:
10947
- lucide-react/dist/esm/icons/user-round.mjs:
11730
+ lucide-react/dist/esm/icons/workflow.mjs:
10948
11731
  lucide-react/dist/esm/icons/x.mjs:
10949
11732
  lucide-react/dist/esm/lucide-react.mjs:
10950
11733
  (**