@react-perfscope/ui 0.5.0 → 0.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.cjs CHANGED
@@ -147,6 +147,9 @@ var en = {
147
147
  heapUnsupported: "heap size unavailable (Chromium only)",
148
148
  heapExtensionHint: "Heap size includes browser extensions injected into the page (e.g. React DevTools), so it can rise even while your app is idle. For app-only measurement, record in an incognito window or a profile with extensions disabled.",
149
149
  heapTrendLabel: (cls) => cls === "leak-suspected" ? "leak suspected" : cls === "growing" ? "growing" : "stable",
150
+ leaksTitle: "Suspected leaks",
151
+ leakHint: "Components whose unmounted instances stayed in memory with a count that kept climbing. Shows which component leaks and how many instances \u2014 not what retains them (a heap snapshot, unavailable in-page, is needed for that).",
152
+ leakSuspect: (component, retained, unmounted) => `${component} \u2014 ${retained} retained of ${unmounted} unmounted, climbing`,
150
153
  fpsLabel: "fps",
151
154
  fpsUnsupported: "frame timing unavailable",
152
155
  fpsBadge: (minFps, dropped) => `min ${minFps}fps \xB7 ${dropped} dropped`,
@@ -179,7 +182,8 @@ var en = {
179
182
  processingTime: "processing",
180
183
  presentation: "presentation",
181
184
  interactionThresholdHint: "Only interactions \u226540ms are shown \u2014 INP surfaces the slow ones; fast clicks are omitted.",
182
- layoutShiftHint: "Every layout shift, including ones triggered by your interactions. The CLS metric excludes input-driven shifts, so this is not a CLS score."
185
+ layoutShiftHint: "Every layout shift, including ones triggered by your interactions. The CLS metric excludes input-driven shifts, so this is not a CLS score.",
186
+ unsupportedInBrowser: (kinds) => `Not measurable in this browser (the API is missing, not that nothing happened): ${kinds}.`
183
187
  };
184
188
  var KIND_LABELS_KO = {
185
189
  render: "\uB80C\uB354",
@@ -241,6 +245,9 @@ var ko = {
241
245
  heapUnsupported: "\uD799 \uCE21\uC815 \uBBF8\uC9C0\uC6D0 (\uD06C\uB86C \uC804\uC6A9)",
242
246
  heapExtensionHint: "\uD799 \uD06C\uAE30\uC5D4 \uD398\uC774\uC9C0\uC5D0 \uC8FC\uC785\uB41C \uBE0C\uB77C\uC6B0\uC800 \uD655\uC7A5(\uC608: React DevTools) \uBA54\uBAA8\uB9AC\uB3C4 \uD3EC\uD568\uB3FC\uC694. \uADF8\uB798\uC11C \uC571\uC774 idle\uC774\uC5B4\uB3C4 \uC62C\uB77C\uAC08 \uC218 \uC788\uC5B4\uC694. \uC571\uB9CC \uC815\uD655\uD788 \uC7AC\uB824\uBA74 \uC2DC\uD06C\uB9BF \uCC3D\uC774\uB098 \uD655\uC7A5\uC774 \uAEBC\uC9C4 \uD504\uB85C\uD544\uC5D0\uC11C \uB179\uD654\uD558\uC138\uC694.",
243
247
  heapTrendLabel: (cls) => cls === "leak-suspected" ? "\uB204\uC218 \uC758\uC2EC" : cls === "growing" ? "\uC99D\uAC00 \uC911" : "\uC548\uC815",
248
+ leaksTitle: "\uB204\uC218 \uC758\uC2EC",
249
+ leakHint: "\uC5B8\uB9C8\uC6B4\uD2B8\uB410\uB294\uB370 \uBA54\uBAA8\uB9AC\uC5D0 \uB0A8\uACE0 \uADF8 \uC218\uAC00 \uACC4\uC18D \uB298\uC5B4\uB09C \uCEF4\uD3EC\uB10C\uD2B8\uC608\uC694. \uC5B4\uB5A4 \uCEF4\uD3EC\uB10C\uD2B8\uAC00 \uBA87 \uAC1C \uB204\uC218\uD558\uB294\uC9C0\uB294 \uBCF4\uC5EC\uC8FC\uC9C0\uB9CC, \uBB34\uC5C7\uC774 \uBD99\uC7A1\uACE0 \uC788\uB294\uC9C0\uB294(\uD799 \uC2A4\uB0C5\uC0F7\uC774 \uD544\uC694\uD55C\uB370 in-page\uC5D0\uC120 \uBD88\uAC00) \uC54C \uC218 \uC5C6\uC5B4\uC694.",
250
+ leakSuspect: (component, retained, unmounted) => `${component} \u2014 \uC5B8\uB9C8\uC6B4\uD2B8 ${unmounted}\uAC1C \uC911 ${retained}\uAC1C \uBCF4\uC720, \uC99D\uAC00 \uC911`,
244
251
  fpsLabel: "fps",
245
252
  fpsUnsupported: "\uD504\uB808\uC784 \uCE21\uC815 \uBBF8\uC9C0\uC6D0",
246
253
  fpsBadge: (minFps, dropped) => `\uCD5C\uC800 ${minFps}fps \xB7 \uB4DC\uB78D ${dropped}`,
@@ -273,7 +280,8 @@ var ko = {
273
280
  processingTime: "\uCC98\uB9AC",
274
281
  presentation: "\uD654\uBA74 \uBC18\uC601",
275
282
  interactionThresholdHint: "40ms \uC774\uC0C1 \uAC78\uB9B0 \uC0C1\uD638\uC791\uC6A9\uB9CC \uD45C\uC2DC\uB3FC\uC694 \u2014 \uB290\uB9B0 \uAC83\uB9CC INP\uB85C \uC7A1\uACE0, \uBE60\uB978 \uD074\uB9AD\uC740 \uC0DD\uB7B5\uD574\uC694.",
276
- layoutShiftHint: "\uC0AC\uC6A9\uC790 \uC778\uD130\uB799\uC158\uC73C\uB85C \uC0DD\uAE34 \uAC83\uAE4C\uC9C0 \uD3EC\uD568\uD55C \uBAA8\uB4E0 \uB808\uC774\uC544\uC6C3 \uC2DC\uD504\uD2B8\uC608\uC694. CLS \uC9C0\uD45C\uB294 \uC785\uB825\uC73C\uB85C \uC778\uD55C \uC2DC\uD504\uD2B8\uB97C \uC81C\uC678\uD558\uBBC0\uB85C, \uC774\uAC74 CLS \uC810\uC218\uAC00 \uC544\uB2C8\uC5D0\uC694."
283
+ layoutShiftHint: "\uC0AC\uC6A9\uC790 \uC778\uD130\uB799\uC158\uC73C\uB85C \uC0DD\uAE34 \uAC83\uAE4C\uC9C0 \uD3EC\uD568\uD55C \uBAA8\uB4E0 \uB808\uC774\uC544\uC6C3 \uC2DC\uD504\uD2B8\uC608\uC694. CLS \uC9C0\uD45C\uB294 \uC785\uB825\uC73C\uB85C \uC778\uD55C \uC2DC\uD504\uD2B8\uB97C \uC81C\uC678\uD558\uBBC0\uB85C, \uC774\uAC74 CLS \uC810\uC218\uAC00 \uC544\uB2C8\uC5D0\uC694.",
284
+ unsupportedInBrowser: (kinds) => `\uC774 \uBE0C\uB77C\uC6B0\uC800\uC5D0\uC120 \uCE21\uC815\uD560 \uC218 \uC5C6\uC5B4\uC694 (\uC544\uBB34 \uC77C\uB3C4 \uC5C6\uB358 \uAC8C \uC544\uB2C8\uB77C API\uAC00 \uC5C6\uC74C): ${kinds}.`
277
285
  };
278
286
  var STRINGS = { en, ko };
279
287
  function isLang(v) {
@@ -383,6 +391,7 @@ function Widget(props) {
383
391
 
384
392
  // src/panel.tsx
385
393
  var import_hooks3 = require("preact/hooks");
394
+ var import_core4 = require("@react-perfscope/core");
386
395
 
387
396
  // src/overlay.ts
388
397
  var OVERLAY_MARKER = "data-perfscope-overlay";
@@ -1795,8 +1804,39 @@ function TooltipContent({ s, startedAt }) {
1795
1804
  }
1796
1805
  }
1797
1806
 
1798
- // src/render-insights.tsx
1807
+ // src/leaks.tsx
1799
1808
  var import_jsx_runtime4 = require("preact/jsx-runtime");
1809
+ function LeakList({ suspects }) {
1810
+ const { t } = useI18n();
1811
+ if (!suspects || suspects.length === 0) return null;
1812
+ return /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)("div", { "data-leaks": "", style: { padding: "8px 10px", borderBottom: "1px solid #1c1c1c" }, children: [
1813
+ /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)(
1814
+ "div",
1815
+ {
1816
+ style: { display: "flex", alignItems: "center", gap: "6px", marginBottom: "6px" },
1817
+ children: [
1818
+ /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("span", { style: { color: "#ef4444", fontSize: "11px", fontWeight: 600 }, children: t.leaksTitle }),
1819
+ /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)("span", { style: { color: "#666", fontSize: "10px" }, children: [
1820
+ "\xD7",
1821
+ suspects.length
1822
+ ] })
1823
+ ]
1824
+ }
1825
+ ),
1826
+ /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("ul", { style: { listStyle: "none", margin: 0, padding: 0 }, children: suspects.map((s) => /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(
1827
+ "li",
1828
+ {
1829
+ style: { color: "#e6e6e6", fontSize: "11px", padding: "2px 0", fontVariantNumeric: "tabular-nums" },
1830
+ children: t.leakSuspect(s.component, s.retained, s.unmounted)
1831
+ },
1832
+ s.component
1833
+ )) }),
1834
+ /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("p", { style: { color: "#666", fontSize: "10px", margin: "6px 0 0", lineHeight: 1.4 }, children: t.leakHint })
1835
+ ] });
1836
+ }
1837
+
1838
+ // src/render-insights.tsx
1839
+ var import_jsx_runtime5 = require("preact/jsx-runtime");
1800
1840
  function aggregate(signals) {
1801
1841
  const byName = /* @__PURE__ */ new Map();
1802
1842
  for (const s of signals) {
@@ -1827,7 +1867,7 @@ function RenderInsights({ signals, onSelect }) {
1827
1867
  const top = rows.slice(0, TOP_N);
1828
1868
  const max = top.length > 0 ? top[0].totalMs : 1;
1829
1869
  const hiddenCount = rows.length - top.length;
1830
- return /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)(
1870
+ return /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)(
1831
1871
  "div",
1832
1872
  {
1833
1873
  style: {
@@ -1838,12 +1878,12 @@ function RenderInsights({ signals, onSelect }) {
1838
1878
  borderRadius: "8px"
1839
1879
  },
1840
1880
  children: [
1841
- /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("div", { style: { fontSize: "10px", color: "#888", textTransform: "uppercase", letterSpacing: "0.5px", marginBottom: "6px" }, children: t.topRenderers }),
1842
- /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)("div", { style: { display: "flex", flexDirection: "column", gap: "4px" }, children: [
1881
+ /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("div", { style: { fontSize: "10px", color: "#888", textTransform: "uppercase", letterSpacing: "0.5px", marginBottom: "6px" }, children: t.topRenderers }),
1882
+ /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)("div", { style: { display: "flex", flexDirection: "column", gap: "4px" }, children: [
1843
1883
  top.map((a) => {
1844
1884
  const widthPct = max > 0 ? Math.max(2, a.totalMs / max * 100) : 0;
1845
1885
  const color = SEVERITY_COLOR[a.worstSeverity];
1846
- return /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)(
1886
+ return /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)(
1847
1887
  "div",
1848
1888
  {
1849
1889
  "data-component": a.component,
@@ -1859,8 +1899,8 @@ function RenderInsights({ signals, onSelect }) {
1859
1899
  },
1860
1900
  title: t.rendererDetail(a.component, a.count, a.totalMs, a.maxMs),
1861
1901
  children: [
1862
- /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("strong", { style: { flex: "0 0 30%", overflow: "hidden", textOverflow: "ellipsis", whiteSpace: "nowrap" }, children: a.component }),
1863
- /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("div", { style: { flex: "1", position: "relative", height: "14px", background: "#1f1f1f", borderRadius: "2px" }, children: /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(
1902
+ /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("strong", { style: { flex: "0 0 30%", overflow: "hidden", textOverflow: "ellipsis", whiteSpace: "nowrap" }, children: a.component }),
1903
+ /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("div", { style: { flex: "1", position: "relative", height: "14px", background: "#1f1f1f", borderRadius: "2px" }, children: /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(
1864
1904
  "div",
1865
1905
  {
1866
1906
  style: {
@@ -1875,11 +1915,11 @@ function RenderInsights({ signals, onSelect }) {
1875
1915
  }
1876
1916
  }
1877
1917
  ) }),
1878
- /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)("span", { style: { flex: "0 0 auto", color, minWidth: "56px", textAlign: "right" }, children: [
1918
+ /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)("span", { style: { flex: "0 0 auto", color, minWidth: "56px", textAlign: "right" }, children: [
1879
1919
  a.totalMs.toFixed(1),
1880
1920
  "ms"
1881
1921
  ] }),
1882
- /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)("span", { style: { flex: "0 0 auto", color: "#888", minWidth: "32px", textAlign: "right" }, children: [
1922
+ /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)("span", { style: { flex: "0 0 auto", color: "#888", minWidth: "32px", textAlign: "right" }, children: [
1883
1923
  "\xD7",
1884
1924
  a.count
1885
1925
  ] })
@@ -1888,7 +1928,7 @@ function RenderInsights({ signals, onSelect }) {
1888
1928
  a.component
1889
1929
  );
1890
1930
  }),
1891
- hiddenCount > 0 && /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("div", { style: { fontSize: "10px", color: "#666", marginTop: "2px" }, children: t.moreComponents(hiddenCount) })
1931
+ hiddenCount > 0 && /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("div", { style: { fontSize: "10px", color: "#666", marginTop: "2px" }, children: t.moreComponents(hiddenCount) })
1892
1932
  ] })
1893
1933
  ]
1894
1934
  }
@@ -1899,7 +1939,7 @@ function RenderInsights({ signals, onSelect }) {
1899
1939
  var import_core2 = require("@react-perfscope/core");
1900
1940
 
1901
1941
  // src/episode-shared.tsx
1902
- var import_jsx_runtime5 = require("preact/jsx-runtime");
1942
+ var import_jsx_runtime6 = require("preact/jsx-runtime");
1903
1943
  function memberLabel(m) {
1904
1944
  const s = m.signal;
1905
1945
  if (s.kind === "render") return `${s.component} (${s.reason})`;
@@ -1910,18 +1950,18 @@ function memberLabel(m) {
1910
1950
  return `layout shift ${s.value.toFixed(3)}`;
1911
1951
  }
1912
1952
  function EpisodeMemberRow({ member }) {
1913
- return /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)(
1953
+ return /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)(
1914
1954
  "div",
1915
1955
  {
1916
1956
  "data-member-kind": member.signal.kind,
1917
1957
  style: { display: "flex", alignItems: "center", gap: "6px", padding: "1px 0", color: "#ccc" },
1918
1958
  children: [
1919
- /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("span", { style: { overflow: "hidden", textOverflow: "ellipsis", whiteSpace: "nowrap" }, children: memberLabel(member) }),
1920
- member.causedBy && /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)("span", { style: { flex: "0 0 auto", color: "#888" }, children: [
1959
+ /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("span", { style: { overflow: "hidden", textOverflow: "ellipsis", whiteSpace: "nowrap" }, children: memberLabel(member) }),
1960
+ member.causedBy && /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)("span", { style: { flex: "0 0 auto", color: "#888" }, children: [
1921
1961
  "\u2190 ",
1922
1962
  member.causedBy.component
1923
1963
  ] }),
1924
- member.confidence === "caused" && /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(
1964
+ member.confidence === "caused" && /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(
1925
1965
  "span",
1926
1966
  {
1927
1967
  style: {
@@ -1940,12 +1980,12 @@ function EpisodeMemberRow({ member }) {
1940
1980
  );
1941
1981
  }
1942
1982
  function EpisodeMemberList({ members }) {
1943
- if (members.length === 0) return /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("span", { style: { color: "#555" }, children: "\u2014" });
1944
- return /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(import_jsx_runtime5.Fragment, { children: members.map((m, i) => /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(EpisodeMemberRow, { member: m }, i)) });
1983
+ if (members.length === 0) return /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("span", { style: { color: "#555" }, children: "\u2014" });
1984
+ return /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(import_jsx_runtime6.Fragment, { children: members.map((m, i) => /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(EpisodeMemberRow, { member: m }, i)) });
1945
1985
  }
1946
1986
 
1947
1987
  // src/inp-episode.tsx
1948
- var import_jsx_runtime6 = require("preact/jsx-runtime");
1988
+ var import_jsx_runtime7 = require("preact/jsx-runtime");
1949
1989
  var PHASES = [
1950
1990
  { phase: "input-delay", labelKey: "inputDelay" },
1951
1991
  { phase: "processing", labelKey: "processingTime" },
@@ -1970,7 +2010,7 @@ function InpEpisode({ signals }) {
1970
2010
  if (!episode || episode.anchor.kind !== "interaction") return null;
1971
2011
  const a = episode.anchor;
1972
2012
  const target = a.target ? ` on ${a.target}` : "";
1973
- return /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)(
2013
+ return /* @__PURE__ */ (0, import_jsx_runtime7.jsxs)(
1974
2014
  "div",
1975
2015
  {
1976
2016
  "data-inp-episode": true,
@@ -1984,33 +2024,33 @@ function InpEpisode({ signals }) {
1984
2024
  overflow: "hidden"
1985
2025
  },
1986
2026
  children: [
1987
- /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)("div", { style: { padding: "6px 8px", borderBottom: "1px solid #1f1f1f", color: "#ddd" }, children: [
1988
- /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("strong", { children: a.eventType }),
2027
+ /* @__PURE__ */ (0, import_jsx_runtime7.jsxs)("div", { style: { padding: "6px 8px", borderBottom: "1px solid #1f1f1f", color: "#ddd" }, children: [
2028
+ /* @__PURE__ */ (0, import_jsx_runtime7.jsx)("strong", { children: a.eventType }),
1989
2029
  target,
1990
2030
  " \u2014 ",
1991
- /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)("strong", { children: [
2031
+ /* @__PURE__ */ (0, import_jsx_runtime7.jsxs)("strong", { children: [
1992
2032
  Math.round(a.duration),
1993
2033
  "ms"
1994
2034
  ] }),
1995
2035
  " ",
1996
- /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("span", { style: { color: "#888" }, children: "INP" })
2036
+ /* @__PURE__ */ (0, import_jsx_runtime7.jsx)("span", { style: { color: "#888" }, children: "INP" })
1997
2037
  ] }),
1998
2038
  PHASES.map(({ phase, labelKey }) => {
1999
2039
  const members = episode.members.filter((m) => m.phase === phase);
2000
- return /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)(
2040
+ return /* @__PURE__ */ (0, import_jsx_runtime7.jsxs)(
2001
2041
  "div",
2002
2042
  {
2003
2043
  "data-inp-phase": phase,
2004
2044
  style: { display: "flex", gap: "8px", padding: "5px 8px", borderTop: "1px solid #1a1a1a" },
2005
2045
  children: [
2006
- /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)("div", { style: { flex: "0 0 92px", color: "#aaa" }, children: [
2046
+ /* @__PURE__ */ (0, import_jsx_runtime7.jsxs)("div", { style: { flex: "0 0 92px", color: "#aaa" }, children: [
2007
2047
  t[labelKey],
2008
- /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)("div", { style: { color: "#666", fontSize: "10px" }, children: [
2048
+ /* @__PURE__ */ (0, import_jsx_runtime7.jsxs)("div", { style: { color: "#666", fontSize: "10px" }, children: [
2009
2049
  Math.round(phaseMs(episode, phase)),
2010
2050
  "ms"
2011
2051
  ] })
2012
2052
  ] }),
2013
- /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("div", { style: { flex: 1, minWidth: 0 }, children: /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(EpisodeMemberList, { members }) })
2053
+ /* @__PURE__ */ (0, import_jsx_runtime7.jsx)("div", { style: { flex: 1, minWidth: 0 }, children: /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(EpisodeMemberList, { members }) })
2014
2054
  ]
2015
2055
  },
2016
2056
  phase
@@ -2023,7 +2063,7 @@ function InpEpisode({ signals }) {
2023
2063
 
2024
2064
  // src/long-task-episode.tsx
2025
2065
  var import_core3 = require("@react-perfscope/core");
2026
- var import_jsx_runtime7 = require("preact/jsx-runtime");
2066
+ var import_jsx_runtime8 = require("preact/jsx-runtime");
2027
2067
  function worstLongTaskEpisode(signals) {
2028
2068
  let worst = null;
2029
2069
  for (const ep of (0, import_core3.correlate)(signals)) {
@@ -2038,7 +2078,7 @@ function LongTaskEpisode({ signals }) {
2038
2078
  if (!episode || episode.anchor.kind !== "long-task") return null;
2039
2079
  if (episode.members.length === 0) return null;
2040
2080
  const a = episode.anchor;
2041
- return /* @__PURE__ */ (0, import_jsx_runtime7.jsxs)(
2081
+ return /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)(
2042
2082
  "div",
2043
2083
  {
2044
2084
  "data-long-task-episode": true,
@@ -2052,15 +2092,15 @@ function LongTaskEpisode({ signals }) {
2052
2092
  overflow: "hidden"
2053
2093
  },
2054
2094
  children: [
2055
- /* @__PURE__ */ (0, import_jsx_runtime7.jsxs)("div", { style: { padding: "6px 8px", borderBottom: "1px solid #1f1f1f", color: "#ddd" }, children: [
2056
- /* @__PURE__ */ (0, import_jsx_runtime7.jsx)("strong", { children: t.kindLabel("long-task") }),
2095
+ /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)("div", { style: { padding: "6px 8px", borderBottom: "1px solid #1f1f1f", color: "#ddd" }, children: [
2096
+ /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("strong", { children: t.kindLabel("long-task") }),
2057
2097
  " \u2014 ",
2058
- /* @__PURE__ */ (0, import_jsx_runtime7.jsxs)("strong", { children: [
2098
+ /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)("strong", { children: [
2059
2099
  Math.round(a.duration),
2060
2100
  "ms"
2061
2101
  ] })
2062
2102
  ] }),
2063
- /* @__PURE__ */ (0, import_jsx_runtime7.jsx)("div", { style: { padding: "5px 8px" }, children: /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(EpisodeMemberList, { members: episode.members }) })
2103
+ /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("div", { style: { padding: "5px 8px" }, children: /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(EpisodeMemberList, { members: episode.members }) })
2064
2104
  ]
2065
2105
  }
2066
2106
  );
@@ -2106,7 +2146,7 @@ function signalMatchesFilter(signal, query) {
2106
2146
  }
2107
2147
 
2108
2148
  // src/panel.tsx
2109
- var import_jsx_runtime8 = require("preact/jsx-runtime");
2149
+ var import_jsx_runtime9 = require("preact/jsx-runtime");
2110
2150
  var RENDER_REASON_COLOR = {
2111
2151
  mount: "#5ac8fa",
2112
2152
  state: "#34c759",
@@ -2130,7 +2170,7 @@ function RenderReasonTag({ reason, changedProps }) {
2130
2170
  const color = RENDER_REASON_COLOR[reason];
2131
2171
  const label = renderReasonLabel(t, reason);
2132
2172
  const keys = reason === "props" && changedProps && changedProps.length > 0 ? `: ${changedProps.join(", ")}` : "";
2133
- return /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)(
2173
+ return /* @__PURE__ */ (0, import_jsx_runtime9.jsxs)(
2134
2174
  "span",
2135
2175
  {
2136
2176
  style: {
@@ -2186,7 +2226,7 @@ var WEB_VITAL_UNIT2 = {
2186
2226
  };
2187
2227
  function RatingDot({ rating }) {
2188
2228
  const { t } = useI18n();
2189
- return /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(
2229
+ return /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(
2190
2230
  "span",
2191
2231
  {
2192
2232
  "data-rating": rating,
@@ -2244,18 +2284,18 @@ var monoStyle = {
2244
2284
  };
2245
2285
  function LayoutShiftDetail({ s }) {
2246
2286
  const { t } = useI18n();
2247
- return /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)("div", { style: { paddingLeft: "12px" }, children: [
2248
- /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)("div", { style: detailRowStyle, children: [
2249
- /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("span", { style: detailLabelStyle, children: t.value }),
2250
- /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("span", { children: s.value.toFixed(4) })
2287
+ return /* @__PURE__ */ (0, import_jsx_runtime9.jsxs)("div", { style: { paddingLeft: "12px" }, children: [
2288
+ /* @__PURE__ */ (0, import_jsx_runtime9.jsxs)("div", { style: detailRowStyle, children: [
2289
+ /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("span", { style: detailLabelStyle, children: t.value }),
2290
+ /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("span", { children: s.value.toFixed(4) })
2251
2291
  ] }),
2252
- s.sources.length === 0 ? /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("div", { style: { color: "#666" }, children: t.noSourceRects }) : s.sources.map((r, i) => /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)("div", { style: { ...detailRowStyle, ...monoStyle }, children: [
2253
- /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)("span", { style: { color: "#888" }, children: [
2292
+ s.sources.length === 0 ? /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("div", { style: { color: "#666" }, children: t.noSourceRects }) : s.sources.map((r, i) => /* @__PURE__ */ (0, import_jsx_runtime9.jsxs)("div", { style: { ...detailRowStyle, ...monoStyle }, children: [
2293
+ /* @__PURE__ */ (0, import_jsx_runtime9.jsxs)("span", { style: { color: "#888" }, children: [
2254
2294
  t.rect,
2255
2295
  " ",
2256
2296
  i + 1
2257
2297
  ] }),
2258
- /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)("span", { children: [
2298
+ /* @__PURE__ */ (0, import_jsx_runtime9.jsxs)("span", { children: [
2259
2299
  "x=",
2260
2300
  r.x.toFixed(0),
2261
2301
  " y=",
@@ -2270,25 +2310,25 @@ function LayoutShiftDetail({ s }) {
2270
2310
  }
2271
2311
  function NetworkDetail({ s }) {
2272
2312
  const { t } = useI18n();
2273
- return /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)("div", { style: { paddingLeft: "12px" }, children: [
2274
- /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("div", { style: { ...detailRowStyle, ...monoStyle, wordBreak: "break-all" }, children: /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("span", { children: s.url }) }),
2275
- /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)("div", { style: detailRowStyle, children: [
2276
- /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("span", { style: detailLabelStyle, children: t.started }),
2277
- /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)("span", { children: [
2313
+ return /* @__PURE__ */ (0, import_jsx_runtime9.jsxs)("div", { style: { paddingLeft: "12px" }, children: [
2314
+ /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("div", { style: { ...detailRowStyle, ...monoStyle, wordBreak: "break-all" }, children: /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("span", { children: s.url }) }),
2315
+ /* @__PURE__ */ (0, import_jsx_runtime9.jsxs)("div", { style: detailRowStyle, children: [
2316
+ /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("span", { style: detailLabelStyle, children: t.started }),
2317
+ /* @__PURE__ */ (0, import_jsx_runtime9.jsxs)("span", { children: [
2278
2318
  s.startedAt.toFixed(0),
2279
2319
  "ms"
2280
2320
  ] })
2281
2321
  ] }),
2282
- /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)("div", { style: detailRowStyle, children: [
2283
- /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("span", { style: detailLabelStyle, children: t.duration }),
2284
- /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)("span", { children: [
2322
+ /* @__PURE__ */ (0, import_jsx_runtime9.jsxs)("div", { style: detailRowStyle, children: [
2323
+ /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("span", { style: detailLabelStyle, children: t.duration }),
2324
+ /* @__PURE__ */ (0, import_jsx_runtime9.jsxs)("span", { children: [
2285
2325
  s.duration.toFixed(0),
2286
2326
  "ms"
2287
2327
  ] })
2288
2328
  ] }),
2289
- /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)("div", { style: detailRowStyle, children: [
2290
- /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("span", { style: detailLabelStyle, children: t.size }),
2291
- /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)("span", { children: [
2329
+ /* @__PURE__ */ (0, import_jsx_runtime9.jsxs)("div", { style: detailRowStyle, children: [
2330
+ /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("span", { style: detailLabelStyle, children: t.size }),
2331
+ /* @__PURE__ */ (0, import_jsx_runtime9.jsxs)("span", { children: [
2292
2332
  (s.size / 1024).toFixed(2),
2293
2333
  "KB (",
2294
2334
  s.size,
@@ -2297,69 +2337,69 @@ function NetworkDetail({ s }) {
2297
2337
  ")"
2298
2338
  ] })
2299
2339
  ] }),
2300
- /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)("div", { style: detailRowStyle, children: [
2301
- /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("span", { style: detailLabelStyle, children: t.renderBlocking }),
2302
- /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("span", { children: s.blocking ? t.yes : t.no })
2340
+ /* @__PURE__ */ (0, import_jsx_runtime9.jsxs)("div", { style: detailRowStyle, children: [
2341
+ /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("span", { style: detailLabelStyle, children: t.renderBlocking }),
2342
+ /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("span", { children: s.blocking ? t.yes : t.no })
2303
2343
  ] })
2304
2344
  ] });
2305
2345
  }
2306
2346
  function WebVitalDetail({ s }) {
2307
2347
  const { t } = useI18n();
2308
- return /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)("div", { style: { paddingLeft: "12px" }, children: [
2309
- /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)("div", { style: detailRowStyle, children: [
2310
- /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("span", { style: detailLabelStyle, children: t.metric }),
2311
- /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("span", { children: s.name })
2348
+ return /* @__PURE__ */ (0, import_jsx_runtime9.jsxs)("div", { style: { paddingLeft: "12px" }, children: [
2349
+ /* @__PURE__ */ (0, import_jsx_runtime9.jsxs)("div", { style: detailRowStyle, children: [
2350
+ /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("span", { style: detailLabelStyle, children: t.metric }),
2351
+ /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("span", { children: s.name })
2312
2352
  ] }),
2313
- /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)("div", { style: detailRowStyle, children: [
2314
- /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("span", { style: detailLabelStyle, children: t.value }),
2315
- /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("span", { children: s.value.toFixed(2) })
2353
+ /* @__PURE__ */ (0, import_jsx_runtime9.jsxs)("div", { style: detailRowStyle, children: [
2354
+ /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("span", { style: detailLabelStyle, children: t.value }),
2355
+ /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("span", { children: s.value.toFixed(2) })
2316
2356
  ] })
2317
2357
  ] });
2318
2358
  }
2319
2359
  function RenderDetail({ s }) {
2320
2360
  const { t } = useI18n();
2321
2361
  if (s.members && s.members.length > 0) {
2322
- return /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)("div", { style: { paddingLeft: "12px" }, children: [
2323
- /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)("div", { style: detailRowStyle, children: [
2324
- /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("span", { style: detailLabelStyle, children: t.duration }),
2325
- /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)("span", { children: [
2362
+ return /* @__PURE__ */ (0, import_jsx_runtime9.jsxs)("div", { style: { paddingLeft: "12px" }, children: [
2363
+ /* @__PURE__ */ (0, import_jsx_runtime9.jsxs)("div", { style: detailRowStyle, children: [
2364
+ /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("span", { style: detailLabelStyle, children: t.duration }),
2365
+ /* @__PURE__ */ (0, import_jsx_runtime9.jsxs)("span", { children: [
2326
2366
  s.duration.toFixed(3),
2327
2367
  "ms"
2328
2368
  ] })
2329
2369
  ] }),
2330
- /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)("div", { style: detailRowStyle, children: [
2331
- /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("span", { style: detailLabelStyle, children: t.at }),
2332
- /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)("span", { children: [
2370
+ /* @__PURE__ */ (0, import_jsx_runtime9.jsxs)("div", { style: detailRowStyle, children: [
2371
+ /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("span", { style: detailLabelStyle, children: t.at }),
2372
+ /* @__PURE__ */ (0, import_jsx_runtime9.jsxs)("span", { children: [
2333
2373
  s.at.toFixed(2),
2334
2374
  "ms"
2335
2375
  ] })
2336
2376
  ] }),
2337
- /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("div", { style: { marginTop: "6px" }, children: /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(CascadeMembers, { members: s.members }) })
2377
+ /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("div", { style: { marginTop: "6px" }, children: /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(CascadeMembers, { members: s.members }) })
2338
2378
  ] });
2339
2379
  }
2340
- return /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)("div", { style: { paddingLeft: "12px" }, children: [
2341
- /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)("div", { style: detailRowStyle, children: [
2342
- /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("span", { style: detailLabelStyle, children: t.component }),
2343
- /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("span", { children: s.component })
2380
+ return /* @__PURE__ */ (0, import_jsx_runtime9.jsxs)("div", { style: { paddingLeft: "12px" }, children: [
2381
+ /* @__PURE__ */ (0, import_jsx_runtime9.jsxs)("div", { style: detailRowStyle, children: [
2382
+ /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("span", { style: detailLabelStyle, children: t.component }),
2383
+ /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("span", { children: s.component })
2344
2384
  ] }),
2345
- /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)("div", { style: detailRowStyle, children: [
2346
- /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("span", { style: detailLabelStyle, children: t.reason }),
2347
- /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(RenderReasonTag, { reason: s.reason, changedProps: s.changedProps })
2385
+ /* @__PURE__ */ (0, import_jsx_runtime9.jsxs)("div", { style: detailRowStyle, children: [
2386
+ /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("span", { style: detailLabelStyle, children: t.reason }),
2387
+ /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(RenderReasonTag, { reason: s.reason, changedProps: s.changedProps })
2348
2388
  ] }),
2349
- s.reason === "props" && s.changedProps && s.changedProps.length > 0 && /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)("div", { style: { ...detailRowStyle, ...monoStyle }, children: [
2350
- /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("span", { style: detailLabelStyle, children: t.changedProps }),
2351
- /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("span", { children: s.changedProps.join(", ") })
2389
+ s.reason === "props" && s.changedProps && s.changedProps.length > 0 && /* @__PURE__ */ (0, import_jsx_runtime9.jsxs)("div", { style: { ...detailRowStyle, ...monoStyle }, children: [
2390
+ /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("span", { style: detailLabelStyle, children: t.changedProps }),
2391
+ /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("span", { children: s.changedProps.join(", ") })
2352
2392
  ] }),
2353
- /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)("div", { style: detailRowStyle, children: [
2354
- /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("span", { style: detailLabelStyle, children: t.duration }),
2355
- /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)("span", { children: [
2393
+ /* @__PURE__ */ (0, import_jsx_runtime9.jsxs)("div", { style: detailRowStyle, children: [
2394
+ /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("span", { style: detailLabelStyle, children: t.duration }),
2395
+ /* @__PURE__ */ (0, import_jsx_runtime9.jsxs)("span", { children: [
2356
2396
  s.duration.toFixed(3),
2357
2397
  "ms"
2358
2398
  ] })
2359
2399
  ] }),
2360
- /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)("div", { style: detailRowStyle, children: [
2361
- /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("span", { style: detailLabelStyle, children: t.at }),
2362
- /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)("span", { children: [
2400
+ /* @__PURE__ */ (0, import_jsx_runtime9.jsxs)("div", { style: detailRowStyle, children: [
2401
+ /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("span", { style: detailLabelStyle, children: t.at }),
2402
+ /* @__PURE__ */ (0, import_jsx_runtime9.jsxs)("span", { children: [
2363
2403
  s.at.toFixed(2),
2364
2404
  "ms"
2365
2405
  ] })
@@ -2389,11 +2429,11 @@ function StackFrames({
2389
2429
  cancelled = true;
2390
2430
  };
2391
2431
  }, [raw]);
2392
- return /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)(import_jsx_runtime8.Fragment, { children: [
2393
- resolving && /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("div", { style: { color: "#666", fontSize: "10px", marginBottom: "4px" }, children: t.resolvingSourceMaps }),
2394
- frames.length === 0 ? /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("div", { style: { color: "#666" }, children: t.noStack }) : frames.map((f, i) => /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)("div", { style: { ...detailRowStyle, ...monoStyle }, children: [
2395
- f.fnName ? /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("span", { children: f.fnName }) : /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("span", { style: { color: "#666" }, children: t.anonymous }),
2396
- /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)("span", { style: { color: "#888" }, children: [
2432
+ return /* @__PURE__ */ (0, import_jsx_runtime9.jsxs)(import_jsx_runtime9.Fragment, { children: [
2433
+ resolving && /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("div", { style: { color: "#666", fontSize: "10px", marginBottom: "4px" }, children: t.resolvingSourceMaps }),
2434
+ frames.length === 0 ? /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("div", { style: { color: "#666" }, children: t.noStack }) : frames.map((f, i) => /* @__PURE__ */ (0, import_jsx_runtime9.jsxs)("div", { style: { ...detailRowStyle, ...monoStyle }, children: [
2435
+ f.fnName ? /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("span", { children: f.fnName }) : /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("span", { style: { color: "#666" }, children: t.anonymous }),
2436
+ /* @__PURE__ */ (0, import_jsx_runtime9.jsxs)("span", { style: { color: "#888" }, children: [
2397
2437
  f.file,
2398
2438
  ":",
2399
2439
  f.line,
@@ -2407,7 +2447,7 @@ function ForcedReflowDetail({
2407
2447
  s,
2408
2448
  resolveFrame
2409
2449
  }) {
2410
- return /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("div", { style: { paddingLeft: "12px" }, children: /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(StackFrames, { raw: s.stack, resolveFrame }) });
2450
+ return /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("div", { style: { paddingLeft: "12px" }, children: /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(StackFrames, { raw: s.stack, resolveFrame }) });
2411
2451
  }
2412
2452
  function HotFunctions({
2413
2453
  attribution,
@@ -2426,26 +2466,26 @@ function HotFunctions({
2426
2466
  cancelled = true;
2427
2467
  };
2428
2468
  }, [attribution]);
2429
- return /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)("div", { style: { marginTop: "6px" }, children: [
2430
- /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("div", { style: { ...detailLabelStyle, textTransform: "uppercase", fontSize: "10px", letterSpacing: "0.5px", marginBottom: "1px", color: "#ff9f0a" }, children: t.hotFunctions }),
2431
- /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("div", { style: { color: "#666", fontSize: "10px", marginBottom: "4px" }, children: t.hotFunctionsHint }),
2469
+ return /* @__PURE__ */ (0, import_jsx_runtime9.jsxs)("div", { style: { marginTop: "6px" }, children: [
2470
+ /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("div", { style: { ...detailLabelStyle, textTransform: "uppercase", fontSize: "10px", letterSpacing: "0.5px", marginBottom: "1px", color: "#ff9f0a" }, children: t.hotFunctions }),
2471
+ /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("div", { style: { color: "#666", fontSize: "10px", marginBottom: "4px" }, children: t.hotFunctionsHint }),
2432
2472
  attribution.map((a, i) => {
2433
2473
  const f = frames[i] ?? a.frame;
2434
2474
  const pct = Math.round(a.selfRatio * 100);
2435
- return /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)("div", { style: { ...monoStyle, padding: "3px 0", borderTop: i > 0 ? "1px dashed #1f1f1f" : "none" }, children: [
2436
- /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)("div", { children: [
2437
- /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("span", { style: { color: "#ff9f0a", fontWeight: 600 }, children: f.fnName || /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("span", { style: { color: "#666" }, children: t.anonymous }) }),
2438
- /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)("span", { style: { color: SEVERITY_COLOR.medium, marginLeft: "6px" }, children: [
2475
+ return /* @__PURE__ */ (0, import_jsx_runtime9.jsxs)("div", { style: { ...monoStyle, padding: "3px 0", borderTop: i > 0 ? "1px dashed #1f1f1f" : "none" }, children: [
2476
+ /* @__PURE__ */ (0, import_jsx_runtime9.jsxs)("div", { children: [
2477
+ /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("span", { style: { color: "#ff9f0a", fontWeight: 600 }, children: f.fnName || /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("span", { style: { color: "#666" }, children: t.anonymous }) }),
2478
+ /* @__PURE__ */ (0, import_jsx_runtime9.jsxs)("span", { style: { color: SEVERITY_COLOR.medium, marginLeft: "6px" }, children: [
2439
2479
  pct,
2440
2480
  "%"
2441
2481
  ] }),
2442
- /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)("span", { style: { color: "#666", marginLeft: "6px" }, children: [
2482
+ /* @__PURE__ */ (0, import_jsx_runtime9.jsxs)("span", { style: { color: "#666", marginLeft: "6px" }, children: [
2443
2483
  "(",
2444
2484
  a.sampleCount,
2445
2485
  ")"
2446
2486
  ] })
2447
2487
  ] }),
2448
- /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)("div", { style: { color: "#888", wordBreak: "break-all" }, children: [
2488
+ /* @__PURE__ */ (0, import_jsx_runtime9.jsxs)("div", { style: { color: "#888", wordBreak: "break-all" }, children: [
2449
2489
  f.file,
2450
2490
  ":",
2451
2491
  f.line,
@@ -2462,59 +2502,59 @@ function LongTaskDetail({
2462
2502
  }) {
2463
2503
  const { t } = useI18n();
2464
2504
  const scripts = s.scripts ? [...s.scripts].sort((a, b) => b.duration - a.duration) : [];
2465
- return /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)("div", { style: { paddingLeft: "12px" }, children: [
2466
- /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)("div", { style: detailRowStyle, children: [
2467
- /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("span", { style: detailLabelStyle, children: t.started }),
2468
- /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)("span", { children: [
2505
+ return /* @__PURE__ */ (0, import_jsx_runtime9.jsxs)("div", { style: { paddingLeft: "12px" }, children: [
2506
+ /* @__PURE__ */ (0, import_jsx_runtime9.jsxs)("div", { style: detailRowStyle, children: [
2507
+ /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("span", { style: detailLabelStyle, children: t.started }),
2508
+ /* @__PURE__ */ (0, import_jsx_runtime9.jsxs)("span", { children: [
2469
2509
  s.at.toFixed(2),
2470
2510
  "ms"
2471
2511
  ] })
2472
2512
  ] }),
2473
- /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)("div", { style: detailRowStyle, children: [
2474
- /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("span", { style: detailLabelStyle, children: t.ended }),
2475
- /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)("span", { children: [
2513
+ /* @__PURE__ */ (0, import_jsx_runtime9.jsxs)("div", { style: detailRowStyle, children: [
2514
+ /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("span", { style: detailLabelStyle, children: t.ended }),
2515
+ /* @__PURE__ */ (0, import_jsx_runtime9.jsxs)("span", { children: [
2476
2516
  (s.at + s.duration).toFixed(2),
2477
2517
  "ms"
2478
2518
  ] })
2479
2519
  ] }),
2480
- /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)("div", { style: detailRowStyle, children: [
2481
- /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("span", { style: detailLabelStyle, children: t.duration }),
2482
- /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)("span", { children: [
2520
+ /* @__PURE__ */ (0, import_jsx_runtime9.jsxs)("div", { style: detailRowStyle, children: [
2521
+ /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("span", { style: detailLabelStyle, children: t.duration }),
2522
+ /* @__PURE__ */ (0, import_jsx_runtime9.jsxs)("span", { children: [
2483
2523
  s.duration.toFixed(2),
2484
2524
  "ms"
2485
2525
  ] })
2486
2526
  ] }),
2487
- typeof s.blockingDuration === "number" && /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)("div", { style: detailRowStyle, children: [
2488
- /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("span", { style: detailLabelStyle, children: t.blockingTime }),
2489
- /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)("span", { children: [
2527
+ typeof s.blockingDuration === "number" && /* @__PURE__ */ (0, import_jsx_runtime9.jsxs)("div", { style: detailRowStyle, children: [
2528
+ /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("span", { style: detailLabelStyle, children: t.blockingTime }),
2529
+ /* @__PURE__ */ (0, import_jsx_runtime9.jsxs)("span", { children: [
2490
2530
  s.blockingDuration.toFixed(2),
2491
2531
  "ms"
2492
2532
  ] })
2493
2533
  ] }),
2494
- s.attribution !== void 0 && s.attribution.length > 0 && /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(HotFunctions, { attribution: s.attribution, resolveFrame }),
2495
- s.scripts !== void 0 && /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)("div", { style: { marginTop: "6px" }, children: [
2496
- /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("div", { style: { ...detailLabelStyle, textTransform: "uppercase", fontSize: "10px", letterSpacing: "0.5px", marginBottom: "4px" }, children: t.scripts }),
2497
- scripts.length === 0 ? /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("div", { style: { color: "#666" }, children: t.noScripts }) : scripts.map((script, i) => /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)("div", { style: { ...monoStyle, padding: "3px 0", borderTop: i > 0 ? "1px dashed #1f1f1f" : "none" }, children: [
2498
- /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)("div", { children: [
2499
- /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("span", { children: script.sourceFunctionName || /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("span", { style: { color: "#666" }, children: t.anonymous }) }),
2500
- /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("span", { style: { color: "#5ac8fa", marginLeft: "6px" }, children: script.invokerType }),
2501
- /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)("span", { style: { color: SEVERITY_COLOR.medium, marginLeft: "6px" }, children: [
2534
+ s.attribution !== void 0 && s.attribution.length > 0 && /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(HotFunctions, { attribution: s.attribution, resolveFrame }),
2535
+ s.scripts !== void 0 && /* @__PURE__ */ (0, import_jsx_runtime9.jsxs)("div", { style: { marginTop: "6px" }, children: [
2536
+ /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("div", { style: { ...detailLabelStyle, textTransform: "uppercase", fontSize: "10px", letterSpacing: "0.5px", marginBottom: "4px" }, children: t.scripts }),
2537
+ scripts.length === 0 ? /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("div", { style: { color: "#666" }, children: t.noScripts }) : scripts.map((script, i) => /* @__PURE__ */ (0, import_jsx_runtime9.jsxs)("div", { style: { ...monoStyle, padding: "3px 0", borderTop: i > 0 ? "1px dashed #1f1f1f" : "none" }, children: [
2538
+ /* @__PURE__ */ (0, import_jsx_runtime9.jsxs)("div", { children: [
2539
+ /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("span", { children: script.sourceFunctionName || /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("span", { style: { color: "#666" }, children: t.anonymous }) }),
2540
+ /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("span", { style: { color: "#5ac8fa", marginLeft: "6px" }, children: script.invokerType }),
2541
+ /* @__PURE__ */ (0, import_jsx_runtime9.jsxs)("span", { style: { color: SEVERITY_COLOR.medium, marginLeft: "6px" }, children: [
2502
2542
  script.duration.toFixed(1),
2503
2543
  "ms"
2504
2544
  ] })
2505
2545
  ] }),
2506
- script.sourceURL && /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)("div", { style: { color: "#888", wordBreak: "break-all" }, children: [
2546
+ script.sourceURL && /* @__PURE__ */ (0, import_jsx_runtime9.jsxs)("div", { style: { color: "#888", wordBreak: "break-all" }, children: [
2507
2547
  script.sourceURL,
2508
2548
  script.charPosition >= 0 ? `@${script.charPosition}` : ""
2509
2549
  ] }),
2510
- script.invoker && /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)("div", { style: { color: "#666" }, children: [
2550
+ script.invoker && /* @__PURE__ */ (0, import_jsx_runtime9.jsxs)("div", { style: { color: "#666" }, children: [
2511
2551
  t.invoker,
2512
2552
  ": ",
2513
2553
  script.invoker
2514
2554
  ] })
2515
2555
  ] }, i))
2516
2556
  ] }),
2517
- s.scripts === void 0 && s.stack.length > 0 && /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("div", { style: { marginTop: "4px" }, children: /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(StackFrames, { raw: s.stack, resolveFrame, limit: 5 }) })
2557
+ s.scripts === void 0 && s.stack.length > 0 && /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("div", { style: { marginTop: "4px" }, children: /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(StackFrames, { raw: s.stack, resolveFrame, limit: 5 }) })
2518
2558
  ] });
2519
2559
  }
2520
2560
  var INTERACTION_PHASE_COLOR = { input: "#8e8e93", processing: "#5ac8fa", presentation: "#34c759" };
@@ -2529,33 +2569,33 @@ function InteractionDetail({
2529
2569
  { label: t.processingTime, ms: s.processing, color: INTERACTION_PHASE_COLOR.processing },
2530
2570
  { label: t.presentation, ms: s.presentation, color: INTERACTION_PHASE_COLOR.presentation }
2531
2571
  ];
2532
- return /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)("div", { style: { paddingLeft: "12px" }, children: [
2533
- /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)("div", { style: detailRowStyle, children: [
2534
- /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("span", { style: detailLabelStyle, children: t.interactionEvent }),
2535
- /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)("span", { children: [
2572
+ return /* @__PURE__ */ (0, import_jsx_runtime9.jsxs)("div", { style: { paddingLeft: "12px" }, children: [
2573
+ /* @__PURE__ */ (0, import_jsx_runtime9.jsxs)("div", { style: detailRowStyle, children: [
2574
+ /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("span", { style: detailLabelStyle, children: t.interactionEvent }),
2575
+ /* @__PURE__ */ (0, import_jsx_runtime9.jsxs)("span", { children: [
2536
2576
  s.eventType,
2537
2577
  s.target ? ` \xB7 ${s.target}` : ""
2538
2578
  ] })
2539
2579
  ] }),
2540
- /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)("div", { style: detailRowStyle, children: [
2541
- /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("span", { style: detailLabelStyle, children: t.duration }),
2542
- /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)("span", { children: [
2580
+ /* @__PURE__ */ (0, import_jsx_runtime9.jsxs)("div", { style: detailRowStyle, children: [
2581
+ /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("span", { style: detailLabelStyle, children: t.duration }),
2582
+ /* @__PURE__ */ (0, import_jsx_runtime9.jsxs)("span", { children: [
2543
2583
  s.duration.toFixed(0),
2544
2584
  "ms"
2545
2585
  ] })
2546
2586
  ] }),
2547
- /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("div", { style: { display: "flex", height: "10px", borderRadius: "3px", overflow: "hidden", margin: "5px 0 7px", background: "#1a1a1a" }, children: phases.map((p, i) => /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("div", { style: { width: `${p.ms / total * 100}%`, background: p.color } }, i)) }),
2548
- phases.map((p, i) => /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)("div", { style: detailRowStyle, children: [
2549
- /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)("span", { style: { ...detailLabelStyle, display: "inline-flex", alignItems: "center", gap: "5px" }, children: [
2550
- /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("span", { style: { width: "7px", height: "7px", borderRadius: "2px", background: p.color, flex: "0 0 7px" } }),
2587
+ /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("div", { style: { display: "flex", height: "10px", borderRadius: "3px", overflow: "hidden", margin: "5px 0 7px", background: "#1a1a1a" }, children: phases.map((p, i) => /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("div", { style: { width: `${p.ms / total * 100}%`, background: p.color } }, i)) }),
2588
+ phases.map((p, i) => /* @__PURE__ */ (0, import_jsx_runtime9.jsxs)("div", { style: detailRowStyle, children: [
2589
+ /* @__PURE__ */ (0, import_jsx_runtime9.jsxs)("span", { style: { ...detailLabelStyle, display: "inline-flex", alignItems: "center", gap: "5px" }, children: [
2590
+ /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("span", { style: { width: "7px", height: "7px", borderRadius: "2px", background: p.color, flex: "0 0 7px" } }),
2551
2591
  p.label
2552
2592
  ] }),
2553
- /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)("span", { children: [
2593
+ /* @__PURE__ */ (0, import_jsx_runtime9.jsxs)("span", { children: [
2554
2594
  p.ms.toFixed(0),
2555
2595
  "ms"
2556
2596
  ] })
2557
2597
  ] }, i)),
2558
- s.attribution !== void 0 && s.attribution.length > 0 && /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(HotFunctions, { attribution: s.attribution, resolveFrame })
2598
+ s.attribution !== void 0 && s.attribution.length > 0 && /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(HotFunctions, { attribution: s.attribution, resolveFrame })
2559
2599
  ] });
2560
2600
  }
2561
2601
  function SignalDetail({
@@ -2564,24 +2604,24 @@ function SignalDetail({
2564
2604
  }) {
2565
2605
  switch (s.kind) {
2566
2606
  case "forced-reflow":
2567
- return /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(ForcedReflowDetail, { s, resolveFrame });
2607
+ return /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(ForcedReflowDetail, { s, resolveFrame });
2568
2608
  case "layout-shift":
2569
- return /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(LayoutShiftDetail, { s });
2609
+ return /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(LayoutShiftDetail, { s });
2570
2610
  case "long-task":
2571
- return /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(LongTaskDetail, { s, resolveFrame });
2611
+ return /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(LongTaskDetail, { s, resolveFrame });
2572
2612
  case "interaction":
2573
- return /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(InteractionDetail, { s, resolveFrame });
2613
+ return /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(InteractionDetail, { s, resolveFrame });
2574
2614
  case "network":
2575
- return /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(NetworkDetail, { s });
2615
+ return /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(NetworkDetail, { s });
2576
2616
  case "web-vital":
2577
- return /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(WebVitalDetail, { s });
2617
+ return /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(WebVitalDetail, { s });
2578
2618
  case "render":
2579
- return /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(RenderDetail, { s });
2619
+ return /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(RenderDetail, { s });
2580
2620
  }
2581
2621
  }
2582
2622
  function SeverityDot({ sev, title }) {
2583
2623
  const { t } = useI18n();
2584
- return /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(
2624
+ return /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(
2585
2625
  "span",
2586
2626
  {
2587
2627
  "data-severity": sev,
@@ -2604,9 +2644,9 @@ function SummaryLine({ signal }) {
2604
2644
  if (signal.kind === "web-vital") {
2605
2645
  const rating = webVitalRating(signal.name, signal.value);
2606
2646
  const unit = WEB_VITAL_UNIT2[signal.name];
2607
- return /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)("span", { children: [
2608
- /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(RatingDot, { rating }),
2609
- /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("strong", { children: signal.name }),
2647
+ return /* @__PURE__ */ (0, import_jsx_runtime9.jsxs)("span", { children: [
2648
+ /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(RatingDot, { rating }),
2649
+ /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("strong", { children: signal.name }),
2610
2650
  ": ",
2611
2651
  signal.value.toFixed(2),
2612
2652
  unit
@@ -2615,12 +2655,12 @@ function SummaryLine({ signal }) {
2615
2655
  const sev = severityForSignal(signal);
2616
2656
  const color = SEVERITY_COLOR[sev];
2617
2657
  if (signal.kind === "long-task") {
2618
- return /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)("span", { children: [
2658
+ return /* @__PURE__ */ (0, import_jsx_runtime9.jsxs)("span", { children: [
2619
2659
  "@ ",
2620
2660
  signal.at.toFixed(1),
2621
2661
  "ms \u2022 duration",
2622
2662
  " ",
2623
- /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)("span", { style: { color }, children: [
2663
+ /* @__PURE__ */ (0, import_jsx_runtime9.jsxs)("span", { style: { color }, children: [
2624
2664
  signal.duration.toFixed(1),
2625
2665
  "ms"
2626
2666
  ] })
@@ -2628,59 +2668,59 @@ function SummaryLine({ signal }) {
2628
2668
  }
2629
2669
  if (signal.kind === "forced-reflow") {
2630
2670
  const count = signal.count ?? 1;
2631
- return /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)("span", { children: [
2671
+ return /* @__PURE__ */ (0, import_jsx_runtime9.jsxs)("span", { children: [
2632
2672
  "@ ",
2633
2673
  signal.at.toFixed(1),
2634
2674
  "ms \u2022 duration",
2635
2675
  " ",
2636
- /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)("span", { style: { color }, children: [
2676
+ /* @__PURE__ */ (0, import_jsx_runtime9.jsxs)("span", { style: { color }, children: [
2637
2677
  signal.duration.toFixed(2),
2638
2678
  "ms"
2639
2679
  ] }),
2640
- count > 1 && /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)("span", { style: { color: "#888" }, children: [
2680
+ count > 1 && /* @__PURE__ */ (0, import_jsx_runtime9.jsxs)("span", { style: { color: "#888" }, children: [
2641
2681
  " \u2022 ",
2642
2682
  t.coalescedReads(count)
2643
2683
  ] })
2644
2684
  ] });
2645
2685
  }
2646
2686
  if (signal.kind === "layout-shift") {
2647
- return /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)("span", { children: [
2687
+ return /* @__PURE__ */ (0, import_jsx_runtime9.jsxs)("span", { children: [
2648
2688
  "@ ",
2649
2689
  signal.at.toFixed(1),
2650
2690
  "ms \u2022 value",
2651
2691
  " ",
2652
- /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("span", { style: { color }, children: formatCls(signal.value) }),
2692
+ /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("span", { style: { color }, children: formatCls(signal.value) }),
2653
2693
  " \u2022 ",
2654
2694
  t.sourceCount(signal.sources.length)
2655
2695
  ] });
2656
2696
  }
2657
2697
  if (signal.kind === "render") {
2658
- return /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)("span", { style: { display: "inline-flex", alignItems: "center", gap: "6px" }, children: [
2659
- /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("strong", { children: signal.component }),
2660
- /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(RenderReasonTag, { reason: signal.reason, changedProps: signal.changedProps }),
2661
- /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)("span", { style: { color }, children: [
2698
+ return /* @__PURE__ */ (0, import_jsx_runtime9.jsxs)("span", { style: { display: "inline-flex", alignItems: "center", gap: "6px" }, children: [
2699
+ /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("strong", { children: signal.component }),
2700
+ /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(RenderReasonTag, { reason: signal.reason, changedProps: signal.changedProps }),
2701
+ /* @__PURE__ */ (0, import_jsx_runtime9.jsxs)("span", { style: { color }, children: [
2662
2702
  signal.duration.toFixed(2),
2663
2703
  "ms"
2664
2704
  ] }),
2665
- signal.count && signal.count > 1 && /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("span", { style: { color: "#888" }, children: t.cascadeComponents(signal.count) })
2705
+ signal.count && signal.count > 1 && /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("span", { style: { color: "#888" }, children: t.cascadeComponents(signal.count) })
2666
2706
  ] });
2667
2707
  }
2668
2708
  if (signal.kind === "network") {
2669
2709
  const url = signal.url.length > 60 ? signal.url.slice(0, 57) + "..." : signal.url;
2670
- return /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)("span", { children: [
2710
+ return /* @__PURE__ */ (0, import_jsx_runtime9.jsxs)("span", { children: [
2671
2711
  url,
2672
2712
  " \u2022 ",
2673
- /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)("span", { style: { color }, children: [
2713
+ /* @__PURE__ */ (0, import_jsx_runtime9.jsxs)("span", { style: { color }, children: [
2674
2714
  signal.duration.toFixed(0),
2675
2715
  "ms"
2676
2716
  ] }),
2677
- signal.blocking && /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)("span", { style: { color: SEVERITY_COLOR.high }, children: [
2717
+ signal.blocking && /* @__PURE__ */ (0, import_jsx_runtime9.jsxs)("span", { style: { color: SEVERITY_COLOR.high }, children: [
2678
2718
  " \u2022 ",
2679
2719
  t.blocking
2680
2720
  ] })
2681
2721
  ] });
2682
2722
  }
2683
- return /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("span", { children: summary(signal) });
2723
+ return /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("span", { children: summary(signal) });
2684
2724
  }
2685
2725
  function tabSupportsGrouping(kind) {
2686
2726
  return kind === "render" || kind === "forced-reflow";
@@ -2754,7 +2794,7 @@ function groupSignals(signals, mode, kind) {
2754
2794
  function SignalRow({ signal, expanded, onToggleExpand, onHoverGeometry, resolveFrame }) {
2755
2795
  const hasGeometry = signal.kind === "layout-shift" && signal.sources.length > 0;
2756
2796
  const sev = severityForSignal(signal);
2757
- return /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)(
2797
+ return /* @__PURE__ */ (0, import_jsx_runtime9.jsxs)(
2758
2798
  "li",
2759
2799
  {
2760
2800
  "aria-expanded": expanded,
@@ -2776,22 +2816,22 @@ function SignalRow({ signal, expanded, onToggleExpand, onHoverGeometry, resolveF
2776
2816
  userSelect: "none"
2777
2817
  },
2778
2818
  children: [
2779
- /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)("div", { style: { display: "flex", alignItems: "center", gap: "6px" }, children: [
2780
- /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("span", { style: { color: "#888", width: "10px" }, children: expanded ? "\u25BC" : "\u25B6" }),
2781
- /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(SeverityDot, { sev }),
2782
- /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(SummaryLine, { signal })
2819
+ /* @__PURE__ */ (0, import_jsx_runtime9.jsxs)("div", { style: { display: "flex", alignItems: "center", gap: "6px" }, children: [
2820
+ /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("span", { style: { color: "#888", width: "10px" }, children: expanded ? "\u25BC" : "\u25B6" }),
2821
+ /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(SeverityDot, { sev }),
2822
+ /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(SummaryLine, { signal })
2783
2823
  ] }),
2784
- expanded && /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("div", { style: { marginTop: "6px", paddingTop: "6px", borderTop: "1px dashed #2a2a2a" }, children: /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(SignalDetail, { s: signal, resolveFrame }) })
2824
+ expanded && /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("div", { style: { marginTop: "6px", paddingTop: "6px", borderTop: "1px dashed #2a2a2a" }, children: /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(SignalDetail, { s: signal, resolveFrame }) })
2785
2825
  ]
2786
2826
  }
2787
2827
  );
2788
2828
  }
2789
2829
  function CascadeMembers({ members }) {
2790
2830
  const minDepth = members.reduce((m, s) => Math.min(m, s.depth), Infinity);
2791
- return /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("div", { children: members.map((m, i) => {
2831
+ return /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("div", { children: members.map((m, i) => {
2792
2832
  const indent = (m.depth - minDepth) * 14;
2793
2833
  const isCascade = m.reason === "parent";
2794
- return /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)(
2834
+ return /* @__PURE__ */ (0, import_jsx_runtime9.jsxs)(
2795
2835
  "div",
2796
2836
  {
2797
2837
  style: {
@@ -2802,10 +2842,10 @@ function CascadeMembers({ members }) {
2802
2842
  gap: "6px"
2803
2843
  },
2804
2844
  children: [
2805
- /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("span", { style: { color: isCascade ? RENDER_REASON_COLOR.parent : "#555" }, children: m.depth > minDepth ? "\u2514" : "\u2022" }),
2806
- /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("strong", { children: m.component }),
2807
- /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(RenderReasonTag, { reason: m.reason, changedProps: m.changedProps }),
2808
- /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)("span", { style: { color: "#888" }, children: [
2845
+ /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("span", { style: { color: isCascade ? RENDER_REASON_COLOR.parent : "#555" }, children: m.depth > minDepth ? "\u2514" : "\u2022" }),
2846
+ /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("strong", { children: m.component }),
2847
+ /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(RenderReasonTag, { reason: m.reason, changedProps: m.changedProps }),
2848
+ /* @__PURE__ */ (0, import_jsx_runtime9.jsxs)("span", { style: { color: "#888" }, children: [
2809
2849
  m.duration.toFixed(2),
2810
2850
  "ms"
2811
2851
  ] })
@@ -2819,7 +2859,7 @@ function LanguageToggle() {
2819
2859
  const { lang, setLang, t } = useI18n();
2820
2860
  const langs = ["en", "ko"];
2821
2861
  const labels = { en: "EN", ko: "\uD55C" };
2822
- return /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(
2862
+ return /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(
2823
2863
  "div",
2824
2864
  {
2825
2865
  role: "group",
@@ -2832,7 +2872,7 @@ function LanguageToggle() {
2832
2872
  },
2833
2873
  children: langs.map((l) => {
2834
2874
  const active = lang === l;
2835
- return /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(
2875
+ return /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(
2836
2876
  "button",
2837
2877
  {
2838
2878
  type: "button",
@@ -2861,7 +2901,8 @@ function Panel(props) {
2861
2901
  const { t } = useI18n();
2862
2902
  const grouped = (0, import_hooks3.useMemo)(() => groupByKind(result.signals), [result.signals]);
2863
2903
  const kindsPresent = KIND_ORDER.filter((k) => grouped[k].length > 0);
2864
- const hasTimelineSignals = result.signals.some((s) => s.kind !== "web-vital") || (result.heapSamples?.length ?? 0) > 0 || (result.frames?.length ?? 0) > 0;
2904
+ const unsupported = (0, import_hooks3.useMemo)(() => (0, import_core4.unsupportedKinds)(), []);
2905
+ const hasTimelineSignals = result.signals.some((s) => s.kind !== "web-vital") || (result.heapSamples?.length ?? 0) > 0 || (result.frames?.length ?? 0) > 0 || (result.leakSuspects?.length ?? 0) > 0;
2865
2906
  const [activeTab, setActiveTab] = (0, import_hooks3.useState)(
2866
2907
  kindsPresent[0] ?? "forced-reflow"
2867
2908
  );
@@ -2926,12 +2967,12 @@ function Panel(props) {
2926
2967
  flexDirection: "column",
2927
2968
  overflow: "hidden"
2928
2969
  };
2929
- return /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)("div", { role: "region", "aria-label": t.panelRegion, style: panelStyle, children: [
2930
- /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)("header", { style: { display: "flex", alignItems: "center", justifyContent: "space-between", marginBottom: "8px" }, children: [
2931
- /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("strong", { children: "react-perfscope" }),
2932
- /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)("div", { style: { display: "flex", gap: "4px", alignItems: "center" }, children: [
2933
- /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(LanguageToggle, {}),
2934
- /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(
2970
+ return /* @__PURE__ */ (0, import_jsx_runtime9.jsxs)("div", { role: "region", "aria-label": t.panelRegion, style: panelStyle, children: [
2971
+ /* @__PURE__ */ (0, import_jsx_runtime9.jsxs)("header", { style: { display: "flex", alignItems: "center", justifyContent: "space-between", marginBottom: "8px" }, children: [
2972
+ /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("strong", { children: "react-perfscope" }),
2973
+ /* @__PURE__ */ (0, import_jsx_runtime9.jsxs)("div", { style: { display: "flex", gap: "4px", alignItems: "center" }, children: [
2974
+ /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(LanguageToggle, {}),
2975
+ /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(
2935
2976
  "button",
2936
2977
  {
2937
2978
  type: "button",
@@ -2950,7 +2991,7 @@ function Panel(props) {
2950
2991
  children: t.save
2951
2992
  }
2952
2993
  ),
2953
- /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(
2994
+ /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(
2954
2995
  "button",
2955
2996
  {
2956
2997
  type: "button",
@@ -2962,9 +3003,24 @@ function Panel(props) {
2962
3003
  )
2963
3004
  ] })
2964
3005
  ] }),
2965
- kindsPresent.length === 0 && /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("div", { style: { color: "#888" }, children: t.noSignals }),
2966
- kindsPresent.length > 0 && /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)(import_jsx_runtime8.Fragment, { children: [
2967
- /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(
3006
+ unsupported.length > 0 && /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(
3007
+ "div",
3008
+ {
3009
+ style: {
3010
+ padding: "6px 8px",
3011
+ marginBottom: "8px",
3012
+ fontSize: "11px",
3013
+ color: "#888",
3014
+ background: "#141414",
3015
+ border: "1px solid #1f1f1f",
3016
+ borderRadius: "6px"
3017
+ },
3018
+ children: t.unsupportedInBrowser(unsupported.map((k) => t.kindLabel(k)).join(", "))
3019
+ }
3020
+ ),
3021
+ kindsPresent.length === 0 && /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("div", { style: { color: "#888" }, children: t.noSignals }),
3022
+ kindsPresent.length > 0 && /* @__PURE__ */ (0, import_jsx_runtime9.jsxs)(import_jsx_runtime9.Fragment, { children: [
3023
+ /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(
2968
3024
  SummaryHeader,
2969
3025
  {
2970
3026
  signals: result.signals,
@@ -2976,8 +3032,8 @@ function Panel(props) {
2976
3032
  }
2977
3033
  }
2978
3034
  ),
2979
- /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)("nav", { style: { display: "flex", gap: "4px", flexWrap: "wrap", marginBottom: "8px" }, children: [
2980
- hasTimelineSignals && /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(
3035
+ /* @__PURE__ */ (0, import_jsx_runtime9.jsxs)("nav", { style: { display: "flex", gap: "4px", flexWrap: "wrap", marginBottom: "8px" }, children: [
3036
+ hasTimelineSignals && /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(
2981
3037
  "button",
2982
3038
  {
2983
3039
  type: "button",
@@ -3002,7 +3058,7 @@ function Panel(props) {
3002
3058
  kindsPresent.map((kind) => {
3003
3059
  const worst = worstSeverity(grouped[kind]);
3004
3060
  const active = activeKind === kind;
3005
- return /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)(
3061
+ return /* @__PURE__ */ (0, import_jsx_runtime9.jsxs)(
3006
3062
  "button",
3007
3063
  {
3008
3064
  type: "button",
@@ -3025,7 +3081,7 @@ function Panel(props) {
3025
3081
  gap: "6px"
3026
3082
  },
3027
3083
  children: [
3028
- worst !== "low" && /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(SeverityDot, { sev: worst, title: t.worstLabel(worst) }),
3084
+ worst !== "low" && /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(SeverityDot, { sev: worst, title: t.worstLabel(worst) }),
3029
3085
  t.kindLabel(kind),
3030
3086
  " ",
3031
3087
  grouped[kind].length
@@ -3035,10 +3091,10 @@ function Panel(props) {
3035
3091
  );
3036
3092
  })
3037
3093
  ] }),
3038
- activeKind && activeTab !== "timeline" && /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)("div", { style: { display: "flex", alignItems: "center", gap: "12px", marginBottom: "6px", fontSize: "11px", color: "#888", flexWrap: "wrap" }, children: [
3039
- /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)("label", { style: { display: "flex", alignItems: "center", gap: "6px" }, children: [
3094
+ activeKind && activeTab !== "timeline" && /* @__PURE__ */ (0, import_jsx_runtime9.jsxs)("div", { style: { display: "flex", alignItems: "center", gap: "12px", marginBottom: "6px", fontSize: "11px", color: "#888", flexWrap: "wrap" }, children: [
3095
+ /* @__PURE__ */ (0, import_jsx_runtime9.jsxs)("label", { style: { display: "flex", alignItems: "center", gap: "6px" }, children: [
3040
3096
  t.sort,
3041
- /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)(
3097
+ /* @__PURE__ */ (0, import_jsx_runtime9.jsxs)(
3042
3098
  "select",
3043
3099
  {
3044
3100
  "aria-label": t.sort,
@@ -3050,15 +3106,15 @@ function Panel(props) {
3050
3106
  },
3051
3107
  style: { background: "#1a1a1a", color: "#e6e6e6", border: "1px solid #2a2a2a", borderRadius: "4px", padding: "2px 6px", fontSize: "11px" },
3052
3108
  children: [
3053
- /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("option", { value: "chronological", children: t.sortChronological }),
3054
- /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("option", { value: "severity", children: t.sortSeverity })
3109
+ /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("option", { value: "chronological", children: t.sortChronological }),
3110
+ /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("option", { value: "severity", children: t.sortSeverity })
3055
3111
  ]
3056
3112
  }
3057
3113
  )
3058
3114
  ] }),
3059
- tabSupportsGrouping(activeKind) && /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)("label", { style: { display: "flex", alignItems: "center", gap: "6px" }, children: [
3115
+ tabSupportsGrouping(activeKind) && /* @__PURE__ */ (0, import_jsx_runtime9.jsxs)("label", { style: { display: "flex", alignItems: "center", gap: "6px" }, children: [
3060
3116
  t.groupBy,
3061
- /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)(
3117
+ /* @__PURE__ */ (0, import_jsx_runtime9.jsxs)(
3062
3118
  "select",
3063
3119
  {
3064
3120
  "aria-label": t.groupBy,
@@ -3070,15 +3126,15 @@ function Panel(props) {
3070
3126
  },
3071
3127
  style: { background: "#1a1a1a", color: "#e6e6e6", border: "1px solid #2a2a2a", borderRadius: "4px", padding: "2px 6px", fontSize: "11px" },
3072
3128
  children: [
3073
- /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("option", { value: "chronological", children: t.groupChronological }),
3074
- activeKind === "render" && /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("option", { value: "commit", children: t.groupCommit }),
3075
- activeKind === "render" && /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("option", { value: "component", children: t.groupComponent }),
3076
- activeKind === "forced-reflow" && /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("option", { value: "source", children: t.groupSource })
3129
+ /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("option", { value: "chronological", children: t.groupChronological }),
3130
+ activeKind === "render" && /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("option", { value: "commit", children: t.groupCommit }),
3131
+ activeKind === "render" && /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("option", { value: "component", children: t.groupComponent }),
3132
+ activeKind === "forced-reflow" && /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("option", { value: "source", children: t.groupSource })
3077
3133
  ]
3078
3134
  }
3079
3135
  )
3080
3136
  ] }),
3081
- /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(
3137
+ /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(
3082
3138
  "input",
3083
3139
  {
3084
3140
  type: "text",
@@ -3093,23 +3149,26 @@ function Panel(props) {
3093
3149
  }
3094
3150
  )
3095
3151
  ] }),
3096
- activeTab === "timeline" && /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("div", { style: { flexGrow: 1, overflowY: "auto", paddingTop: "4px", paddingBottom: "24px" }, children: /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(
3097
- Timeline,
3098
- {
3099
- signals: result.signals,
3100
- duration: result.duration,
3101
- startedAt: result.startedAt,
3102
- heapSamples: result.heapSamples,
3103
- frames: result.frames,
3104
- onJump: (s) => {
3105
- setActiveTab(s.kind);
3106
- const inOrder = grouped[s.kind];
3107
- const idx = inOrder.indexOf(s);
3108
- if (idx >= 0) setExpandedKey(`${s.kind}-${idx}`);
3152
+ activeTab === "timeline" && /* @__PURE__ */ (0, import_jsx_runtime9.jsxs)("div", { style: { flexGrow: 1, overflowY: "auto", paddingTop: "4px", paddingBottom: "24px" }, children: [
3153
+ /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(LeakList, { suspects: result.leakSuspects }),
3154
+ /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(
3155
+ Timeline,
3156
+ {
3157
+ signals: result.signals,
3158
+ duration: result.duration,
3159
+ startedAt: result.startedAt,
3160
+ heapSamples: result.heapSamples,
3161
+ frames: result.frames,
3162
+ onJump: (s) => {
3163
+ setActiveTab(s.kind);
3164
+ const inOrder = grouped[s.kind];
3165
+ const idx = inOrder.indexOf(s);
3166
+ if (idx >= 0) setExpandedKey(`${s.kind}-${idx}`);
3167
+ }
3109
3168
  }
3110
- }
3111
- ) }),
3112
- activeKind === "render" && activeTab !== "timeline" && /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(
3169
+ )
3170
+ ] }),
3171
+ activeKind === "render" && activeTab !== "timeline" && /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(
3113
3172
  RenderInsights,
3114
3173
  {
3115
3174
  signals: grouped.render.flatMap((s) => s.kind === "render" ? s.members ?? [s] : []).filter((s) => signalMatchesFilter(s, filterText.render ?? "")),
@@ -3119,8 +3178,8 @@ function Panel(props) {
3119
3178
  }
3120
3179
  }
3121
3180
  ),
3122
- activeKind === "long-task" && activeTab !== "timeline" && /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(LongTaskEpisode, { signals: result.signals }),
3123
- activeKind === "layout-shift" && activeTab !== "timeline" && /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(
3181
+ activeKind === "long-task" && activeTab !== "timeline" && /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(LongTaskEpisode, { signals: result.signals }),
3182
+ activeKind === "layout-shift" && activeTab !== "timeline" && /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(
3124
3183
  "div",
3125
3184
  {
3126
3185
  style: {
@@ -3135,9 +3194,9 @@ function Panel(props) {
3135
3194
  children: t.layoutShiftHint
3136
3195
  }
3137
3196
  ),
3138
- activeKind === "interaction" && activeTab !== "timeline" && /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)(import_jsx_runtime8.Fragment, { children: [
3139
- /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(InpEpisode, { signals: result.signals }),
3140
- /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(
3197
+ activeKind === "interaction" && activeTab !== "timeline" && /* @__PURE__ */ (0, import_jsx_runtime9.jsxs)(import_jsx_runtime9.Fragment, { children: [
3198
+ /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(InpEpisode, { signals: result.signals }),
3199
+ /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(
3141
3200
  "div",
3142
3201
  {
3143
3202
  style: {
@@ -3153,7 +3212,7 @@ function Panel(props) {
3153
3212
  }
3154
3213
  )
3155
3214
  ] }),
3156
- /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("ul", { style: { listStyle: "none", margin: 0, padding: 0, overflowY: "auto", flexGrow: 1, display: activeTab === "timeline" ? "none" : void 0 }, children: activeKind && (() => {
3215
+ /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("ul", { style: { listStyle: "none", margin: 0, padding: 0, overflowY: "auto", flexGrow: 1, display: activeTab === "timeline" ? "none" : void 0 }, children: activeKind && (() => {
3157
3216
  const filtered = grouped[activeKind].filter(
3158
3217
  (s) => signalMatchesFilter(s, filterText[activeKind] ?? "")
3159
3218
  );
@@ -3163,7 +3222,7 @@ function Panel(props) {
3163
3222
  const currentMode = groupMode[activeKind] ?? "chronological";
3164
3223
  if (currentMode === "chronological") {
3165
3224
  const key2 = `${activeKind}-${gi}`;
3166
- return /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(
3225
+ return /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(
3167
3226
  SignalRow,
3168
3227
  {
3169
3228
  signal: g.signals[0],
@@ -3180,7 +3239,7 @@ function Panel(props) {
3180
3239
  const isCascade = activeKind === "render" && currentMode === "commit";
3181
3240
  const renderMembers = g.signals.filter((s) => s.kind === "render");
3182
3241
  const unnecessary = isCascade ? renderMembers.filter((s) => s.reason === "parent").length : 0;
3183
- return /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)(
3242
+ return /* @__PURE__ */ (0, import_jsx_runtime9.jsxs)(
3184
3243
  "li",
3185
3244
  {
3186
3245
  "aria-expanded": isOpen,
@@ -3195,34 +3254,34 @@ function Panel(props) {
3195
3254
  userSelect: "none"
3196
3255
  },
3197
3256
  children: [
3198
- /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)("div", { style: { display: "flex", alignItems: "center", gap: "6px", flexWrap: "wrap" }, children: [
3199
- /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("span", { style: { color: "#888", width: "10px" }, children: isOpen ? "\u25BC" : "\u25B6" }),
3200
- /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)("span", { children: [
3201
- /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("strong", { children: g.label }),
3257
+ /* @__PURE__ */ (0, import_jsx_runtime9.jsxs)("div", { style: { display: "flex", alignItems: "center", gap: "6px", flexWrap: "wrap" }, children: [
3258
+ /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("span", { style: { color: "#888", width: "10px" }, children: isOpen ? "\u25BC" : "\u25B6" }),
3259
+ /* @__PURE__ */ (0, import_jsx_runtime9.jsxs)("span", { children: [
3260
+ /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("strong", { children: g.label }),
3202
3261
  " \xD7",
3203
3262
  g.count
3204
3263
  ] }),
3205
- isCascade && unnecessary > 0 && /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)("span", { style: { color: RENDER_REASON_COLOR.parent, fontSize: "10px" }, children: [
3264
+ isCascade && unnecessary > 0 && /* @__PURE__ */ (0, import_jsx_runtime9.jsxs)("span", { style: { color: RENDER_REASON_COLOR.parent, fontSize: "10px" }, children: [
3206
3265
  "\u26A0 ",
3207
3266
  t.unnecessaryRenders(unnecessary)
3208
3267
  ] })
3209
3268
  ] }),
3210
- isOpen && /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("div", { style: { marginTop: "6px", paddingTop: "6px", borderTop: "1px dashed #2a2a2a", paddingLeft: "8px" }, children: isCascade ? /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(CascadeMembers, { members: renderMembers }) : /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)(import_jsx_runtime8.Fragment, { children: [
3211
- g.signals.slice(0, 20).map((s, si) => /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("div", { style: { padding: "2px 0" }, children: /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(SummaryLine, { signal: s }) }, si)),
3212
- g.signals.length > 20 && /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("div", { style: { color: "#888", marginTop: "4px" }, children: t.moreItems(g.signals.length - 20) })
3269
+ isOpen && /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("div", { style: { marginTop: "6px", paddingTop: "6px", borderTop: "1px dashed #2a2a2a", paddingLeft: "8px" }, children: isCascade ? /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(CascadeMembers, { members: renderMembers }) : /* @__PURE__ */ (0, import_jsx_runtime9.jsxs)(import_jsx_runtime9.Fragment, { children: [
3270
+ g.signals.slice(0, 20).map((s, si) => /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("div", { style: { padding: "2px 0" }, children: /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(SummaryLine, { signal: s }) }, si)),
3271
+ g.signals.length > 20 && /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("div", { style: { color: "#888", marginTop: "4px" }, children: t.moreItems(g.signals.length - 20) })
3213
3272
  ] }) })
3214
3273
  ]
3215
3274
  },
3216
3275
  key
3217
3276
  );
3218
3277
  }) }),
3219
- activeKind && activeTab !== "timeline" && (filterText[activeKind] ?? "").trim() !== "" && grouped[activeKind].length > 0 && grouped[activeKind].every((s) => !signalMatchesFilter(s, filterText[activeKind] ?? "")) && /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("div", { style: { padding: "12px 8px", fontSize: "11px", color: "#888" }, children: t.filterNoMatches })
3278
+ activeKind && activeTab !== "timeline" && (filterText[activeKind] ?? "").trim() !== "" && grouped[activeKind].length > 0 && grouped[activeKind].every((s) => !signalMatchesFilter(s, filterText[activeKind] ?? "")) && /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("div", { style: { padding: "12px 8px", fontSize: "11px", color: "#888" }, children: t.filterNoMatches })
3220
3279
  ] })
3221
3280
  ] });
3222
3281
  }
3223
3282
 
3224
3283
  // src/app.tsx
3225
- var import_jsx_runtime9 = require("preact/jsx-runtime");
3284
+ var import_jsx_runtime10 = require("preact/jsx-runtime");
3226
3285
  function App(props) {
3227
3286
  const { recorder, position = "bottom-right", resolveFrame, finalize } = props;
3228
3287
  const [recording, setRecording] = (0, import_hooks4.useState)(false);
@@ -3268,8 +3327,8 @@ function App(props) {
3268
3327
  function onClose() {
3269
3328
  setResult(null);
3270
3329
  }
3271
- return /* @__PURE__ */ (0, import_jsx_runtime9.jsxs)(I18nProvider, { children: [
3272
- result === null && /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(
3330
+ return /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)(I18nProvider, { children: [
3331
+ result === null && /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(
3273
3332
  Widget,
3274
3333
  {
3275
3334
  recording,
@@ -3278,16 +3337,16 @@ function App(props) {
3278
3337
  position
3279
3338
  }
3280
3339
  ),
3281
- result !== null && /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(Panel, { result, position, onClose, resolveFrame })
3340
+ result !== null && /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(Panel, { result, position, onClose, resolveFrame })
3282
3341
  ] });
3283
3342
  }
3284
3343
 
3285
3344
  // src/mount.tsx
3286
- var import_jsx_runtime10 = require("preact/jsx-runtime");
3345
+ var import_jsx_runtime11 = require("preact/jsx-runtime");
3287
3346
  function mount(opts) {
3288
3347
  const { recorder, position = "bottom-right", host = document.body, resolveFrame, finalize } = opts;
3289
3348
  return mountShadow(
3290
- /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(App, { recorder, position, resolveFrame, finalize }),
3349
+ /* @__PURE__ */ (0, import_jsx_runtime11.jsx)(App, { recorder, position, resolveFrame, finalize }),
3291
3350
  { parent: host }
3292
3351
  );
3293
3352
  }