@react-perfscope/ui 0.4.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.
package/dist/index.js CHANGED
@@ -145,7 +145,9 @@ var en = {
145
145
  inputDelay: "input delay",
146
146
  processingTime: "processing",
147
147
  presentation: "presentation",
148
- interactionThresholdHint: "Only interactions \u226540ms are shown \u2014 INP surfaces the slow ones; fast clicks are omitted."
148
+ interactionThresholdHint: "Only interactions \u226540ms are shown \u2014 INP surfaces the slow ones; fast clicks are omitted.",
149
+ layoutShiftHint: "Every layout shift, including ones triggered by your interactions. The CLS metric excludes input-driven shifts, so this is not a CLS score.",
150
+ unsupportedInBrowser: (kinds) => `Not measurable in this browser (the API is missing, not that nothing happened): ${kinds}.`
149
151
  };
150
152
  var KIND_LABELS_KO = {
151
153
  render: "\uB80C\uB354",
@@ -238,7 +240,9 @@ var ko = {
238
240
  inputDelay: "\uC785\uB825 \uC9C0\uC5F0",
239
241
  processingTime: "\uCC98\uB9AC",
240
242
  presentation: "\uD654\uBA74 \uBC18\uC601",
241
- 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."
243
+ 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.",
244
+ 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.",
245
+ 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}.`
242
246
  };
243
247
  var STRINGS = { en, ko };
244
248
  function isLang(v) {
@@ -348,6 +352,7 @@ function Widget(props) {
348
352
 
349
353
  // src/panel.tsx
350
354
  import { useState as useState3, useMemo as useMemo3, useEffect, useRef as useRef2 } from "preact/hooks";
355
+ import { unsupportedKinds } from "@react-perfscope/core";
351
356
 
352
357
  // src/overlay.ts
353
358
  var OVERLAY_MARKER = "data-perfscope-overlay";
@@ -1860,6 +1865,177 @@ function RenderInsights({ signals, onSelect }) {
1860
1865
  );
1861
1866
  }
1862
1867
 
1868
+ // src/inp-episode.tsx
1869
+ import { correlate } from "@react-perfscope/core";
1870
+
1871
+ // src/episode-shared.tsx
1872
+ import { Fragment as Fragment2, jsx as jsx5, jsxs as jsxs5 } from "preact/jsx-runtime";
1873
+ function memberLabel(m) {
1874
+ const s = m.signal;
1875
+ if (s.kind === "render") return `${s.component} (${s.reason})`;
1876
+ if (s.kind === "forced-reflow") {
1877
+ const top = s.stack[0];
1878
+ return top ? `forced reflow \xB7 ${top.file}:${top.line}` : "forced reflow";
1879
+ }
1880
+ return `layout shift ${s.value.toFixed(3)}`;
1881
+ }
1882
+ function EpisodeMemberRow({ member }) {
1883
+ return /* @__PURE__ */ jsxs5(
1884
+ "div",
1885
+ {
1886
+ "data-member-kind": member.signal.kind,
1887
+ style: { display: "flex", alignItems: "center", gap: "6px", padding: "1px 0", color: "#ccc" },
1888
+ children: [
1889
+ /* @__PURE__ */ jsx5("span", { style: { overflow: "hidden", textOverflow: "ellipsis", whiteSpace: "nowrap" }, children: memberLabel(member) }),
1890
+ member.causedBy && /* @__PURE__ */ jsxs5("span", { style: { flex: "0 0 auto", color: "#888" }, children: [
1891
+ "\u2190 ",
1892
+ member.causedBy.component
1893
+ ] }),
1894
+ member.confidence === "caused" && /* @__PURE__ */ jsx5(
1895
+ "span",
1896
+ {
1897
+ style: {
1898
+ flex: "0 0 auto",
1899
+ fontSize: "9px",
1900
+ color: "#e0a030",
1901
+ border: "1px solid #5a4410",
1902
+ borderRadius: "3px",
1903
+ padding: "0 4px"
1904
+ },
1905
+ children: "caused"
1906
+ }
1907
+ )
1908
+ ]
1909
+ }
1910
+ );
1911
+ }
1912
+ function EpisodeMemberList({ members }) {
1913
+ if (members.length === 0) return /* @__PURE__ */ jsx5("span", { style: { color: "#555" }, children: "\u2014" });
1914
+ return /* @__PURE__ */ jsx5(Fragment2, { children: members.map((m, i) => /* @__PURE__ */ jsx5(EpisodeMemberRow, { member: m }, i)) });
1915
+ }
1916
+
1917
+ // src/inp-episode.tsx
1918
+ import { jsx as jsx6, jsxs as jsxs6 } from "preact/jsx-runtime";
1919
+ var PHASES = [
1920
+ { phase: "input-delay", labelKey: "inputDelay" },
1921
+ { phase: "processing", labelKey: "processingTime" },
1922
+ { phase: "presentation", labelKey: "presentation" }
1923
+ ];
1924
+ function worstInteractionEpisode(signals) {
1925
+ let worst = null;
1926
+ for (const ep of correlate(signals)) {
1927
+ if (ep.anchor.kind !== "interaction") continue;
1928
+ if (!worst || ep.anchor.duration > worst.anchor.duration) worst = ep;
1929
+ }
1930
+ return worst;
1931
+ }
1932
+ function phaseMs(episode, phase) {
1933
+ const a = episode.anchor;
1934
+ if (a.kind !== "interaction") return 0;
1935
+ return phase === "input-delay" ? a.inputDelay : phase === "processing" ? a.processing : a.presentation;
1936
+ }
1937
+ function InpEpisode({ signals }) {
1938
+ const { t } = useI18n();
1939
+ const episode = worstInteractionEpisode(signals);
1940
+ if (!episode || episode.anchor.kind !== "interaction") return null;
1941
+ const a = episode.anchor;
1942
+ const target = a.target ? ` on ${a.target}` : "";
1943
+ return /* @__PURE__ */ jsxs6(
1944
+ "div",
1945
+ {
1946
+ "data-inp-episode": true,
1947
+ style: {
1948
+ margin: "0 0 8px",
1949
+ border: "1px solid #1f1f1f",
1950
+ borderRadius: "6px",
1951
+ background: "#121212",
1952
+ fontFamily: "SF Mono, Menlo, Consolas, monospace",
1953
+ fontSize: "11px",
1954
+ overflow: "hidden"
1955
+ },
1956
+ children: [
1957
+ /* @__PURE__ */ jsxs6("div", { style: { padding: "6px 8px", borderBottom: "1px solid #1f1f1f", color: "#ddd" }, children: [
1958
+ /* @__PURE__ */ jsx6("strong", { children: a.eventType }),
1959
+ target,
1960
+ " \u2014 ",
1961
+ /* @__PURE__ */ jsxs6("strong", { children: [
1962
+ Math.round(a.duration),
1963
+ "ms"
1964
+ ] }),
1965
+ " ",
1966
+ /* @__PURE__ */ jsx6("span", { style: { color: "#888" }, children: "INP" })
1967
+ ] }),
1968
+ PHASES.map(({ phase, labelKey }) => {
1969
+ const members = episode.members.filter((m) => m.phase === phase);
1970
+ return /* @__PURE__ */ jsxs6(
1971
+ "div",
1972
+ {
1973
+ "data-inp-phase": phase,
1974
+ style: { display: "flex", gap: "8px", padding: "5px 8px", borderTop: "1px solid #1a1a1a" },
1975
+ children: [
1976
+ /* @__PURE__ */ jsxs6("div", { style: { flex: "0 0 92px", color: "#aaa" }, children: [
1977
+ t[labelKey],
1978
+ /* @__PURE__ */ jsxs6("div", { style: { color: "#666", fontSize: "10px" }, children: [
1979
+ Math.round(phaseMs(episode, phase)),
1980
+ "ms"
1981
+ ] })
1982
+ ] }),
1983
+ /* @__PURE__ */ jsx6("div", { style: { flex: 1, minWidth: 0 }, children: /* @__PURE__ */ jsx6(EpisodeMemberList, { members }) })
1984
+ ]
1985
+ },
1986
+ phase
1987
+ );
1988
+ })
1989
+ ]
1990
+ }
1991
+ );
1992
+ }
1993
+
1994
+ // src/long-task-episode.tsx
1995
+ import { correlate as correlate2 } from "@react-perfscope/core";
1996
+ import { jsx as jsx7, jsxs as jsxs7 } from "preact/jsx-runtime";
1997
+ function worstLongTaskEpisode(signals) {
1998
+ let worst = null;
1999
+ for (const ep of correlate2(signals)) {
2000
+ if (ep.anchor.kind !== "long-task") continue;
2001
+ if (!worst || ep.anchor.duration > worst.anchor.duration) worst = ep;
2002
+ }
2003
+ return worst;
2004
+ }
2005
+ function LongTaskEpisode({ signals }) {
2006
+ const { t } = useI18n();
2007
+ const episode = worstLongTaskEpisode(signals);
2008
+ if (!episode || episode.anchor.kind !== "long-task") return null;
2009
+ if (episode.members.length === 0) return null;
2010
+ const a = episode.anchor;
2011
+ return /* @__PURE__ */ jsxs7(
2012
+ "div",
2013
+ {
2014
+ "data-long-task-episode": true,
2015
+ style: {
2016
+ margin: "0 0 8px",
2017
+ border: "1px solid #1f1f1f",
2018
+ borderRadius: "6px",
2019
+ background: "#121212",
2020
+ fontFamily: "SF Mono, Menlo, Consolas, monospace",
2021
+ fontSize: "11px",
2022
+ overflow: "hidden"
2023
+ },
2024
+ children: [
2025
+ /* @__PURE__ */ jsxs7("div", { style: { padding: "6px 8px", borderBottom: "1px solid #1f1f1f", color: "#ddd" }, children: [
2026
+ /* @__PURE__ */ jsx7("strong", { children: t.kindLabel("long-task") }),
2027
+ " \u2014 ",
2028
+ /* @__PURE__ */ jsxs7("strong", { children: [
2029
+ Math.round(a.duration),
2030
+ "ms"
2031
+ ] })
2032
+ ] }),
2033
+ /* @__PURE__ */ jsx7("div", { style: { padding: "5px 8px" }, children: /* @__PURE__ */ jsx7(EpisodeMemberList, { members: episode.members }) })
2034
+ ]
2035
+ }
2036
+ );
2037
+ }
2038
+
1863
2039
  // src/filter.ts
1864
2040
  function signalSearchText(signal) {
1865
2041
  switch (signal.kind) {
@@ -1900,7 +2076,7 @@ function signalMatchesFilter(signal, query) {
1900
2076
  }
1901
2077
 
1902
2078
  // src/panel.tsx
1903
- import { Fragment as Fragment2, jsx as jsx5, jsxs as jsxs5 } from "preact/jsx-runtime";
2079
+ import { Fragment as Fragment3, jsx as jsx8, jsxs as jsxs8 } from "preact/jsx-runtime";
1904
2080
  var RENDER_REASON_COLOR = {
1905
2081
  mount: "#5ac8fa",
1906
2082
  state: "#34c759",
@@ -1924,7 +2100,7 @@ function RenderReasonTag({ reason, changedProps }) {
1924
2100
  const color = RENDER_REASON_COLOR[reason];
1925
2101
  const label = renderReasonLabel(t, reason);
1926
2102
  const keys = reason === "props" && changedProps && changedProps.length > 0 ? `: ${changedProps.join(", ")}` : "";
1927
- return /* @__PURE__ */ jsxs5(
2103
+ return /* @__PURE__ */ jsxs8(
1928
2104
  "span",
1929
2105
  {
1930
2106
  style: {
@@ -1980,7 +2156,7 @@ var WEB_VITAL_UNIT2 = {
1980
2156
  };
1981
2157
  function RatingDot({ rating }) {
1982
2158
  const { t } = useI18n();
1983
- return /* @__PURE__ */ jsx5(
2159
+ return /* @__PURE__ */ jsx8(
1984
2160
  "span",
1985
2161
  {
1986
2162
  "data-rating": rating,
@@ -2038,18 +2214,18 @@ var monoStyle = {
2038
2214
  };
2039
2215
  function LayoutShiftDetail({ s }) {
2040
2216
  const { t } = useI18n();
2041
- return /* @__PURE__ */ jsxs5("div", { style: { paddingLeft: "12px" }, children: [
2042
- /* @__PURE__ */ jsxs5("div", { style: detailRowStyle, children: [
2043
- /* @__PURE__ */ jsx5("span", { style: detailLabelStyle, children: t.value }),
2044
- /* @__PURE__ */ jsx5("span", { children: s.value.toFixed(4) })
2217
+ return /* @__PURE__ */ jsxs8("div", { style: { paddingLeft: "12px" }, children: [
2218
+ /* @__PURE__ */ jsxs8("div", { style: detailRowStyle, children: [
2219
+ /* @__PURE__ */ jsx8("span", { style: detailLabelStyle, children: t.value }),
2220
+ /* @__PURE__ */ jsx8("span", { children: s.value.toFixed(4) })
2045
2221
  ] }),
2046
- s.sources.length === 0 ? /* @__PURE__ */ jsx5("div", { style: { color: "#666" }, children: t.noSourceRects }) : s.sources.map((r, i) => /* @__PURE__ */ jsxs5("div", { style: { ...detailRowStyle, ...monoStyle }, children: [
2047
- /* @__PURE__ */ jsxs5("span", { style: { color: "#888" }, children: [
2222
+ s.sources.length === 0 ? /* @__PURE__ */ jsx8("div", { style: { color: "#666" }, children: t.noSourceRects }) : s.sources.map((r, i) => /* @__PURE__ */ jsxs8("div", { style: { ...detailRowStyle, ...monoStyle }, children: [
2223
+ /* @__PURE__ */ jsxs8("span", { style: { color: "#888" }, children: [
2048
2224
  t.rect,
2049
2225
  " ",
2050
2226
  i + 1
2051
2227
  ] }),
2052
- /* @__PURE__ */ jsxs5("span", { children: [
2228
+ /* @__PURE__ */ jsxs8("span", { children: [
2053
2229
  "x=",
2054
2230
  r.x.toFixed(0),
2055
2231
  " y=",
@@ -2064,25 +2240,25 @@ function LayoutShiftDetail({ s }) {
2064
2240
  }
2065
2241
  function NetworkDetail({ s }) {
2066
2242
  const { t } = useI18n();
2067
- return /* @__PURE__ */ jsxs5("div", { style: { paddingLeft: "12px" }, children: [
2068
- /* @__PURE__ */ jsx5("div", { style: { ...detailRowStyle, ...monoStyle, wordBreak: "break-all" }, children: /* @__PURE__ */ jsx5("span", { children: s.url }) }),
2069
- /* @__PURE__ */ jsxs5("div", { style: detailRowStyle, children: [
2070
- /* @__PURE__ */ jsx5("span", { style: detailLabelStyle, children: t.started }),
2071
- /* @__PURE__ */ jsxs5("span", { children: [
2243
+ return /* @__PURE__ */ jsxs8("div", { style: { paddingLeft: "12px" }, children: [
2244
+ /* @__PURE__ */ jsx8("div", { style: { ...detailRowStyle, ...monoStyle, wordBreak: "break-all" }, children: /* @__PURE__ */ jsx8("span", { children: s.url }) }),
2245
+ /* @__PURE__ */ jsxs8("div", { style: detailRowStyle, children: [
2246
+ /* @__PURE__ */ jsx8("span", { style: detailLabelStyle, children: t.started }),
2247
+ /* @__PURE__ */ jsxs8("span", { children: [
2072
2248
  s.startedAt.toFixed(0),
2073
2249
  "ms"
2074
2250
  ] })
2075
2251
  ] }),
2076
- /* @__PURE__ */ jsxs5("div", { style: detailRowStyle, children: [
2077
- /* @__PURE__ */ jsx5("span", { style: detailLabelStyle, children: t.duration }),
2078
- /* @__PURE__ */ jsxs5("span", { children: [
2252
+ /* @__PURE__ */ jsxs8("div", { style: detailRowStyle, children: [
2253
+ /* @__PURE__ */ jsx8("span", { style: detailLabelStyle, children: t.duration }),
2254
+ /* @__PURE__ */ jsxs8("span", { children: [
2079
2255
  s.duration.toFixed(0),
2080
2256
  "ms"
2081
2257
  ] })
2082
2258
  ] }),
2083
- /* @__PURE__ */ jsxs5("div", { style: detailRowStyle, children: [
2084
- /* @__PURE__ */ jsx5("span", { style: detailLabelStyle, children: t.size }),
2085
- /* @__PURE__ */ jsxs5("span", { children: [
2259
+ /* @__PURE__ */ jsxs8("div", { style: detailRowStyle, children: [
2260
+ /* @__PURE__ */ jsx8("span", { style: detailLabelStyle, children: t.size }),
2261
+ /* @__PURE__ */ jsxs8("span", { children: [
2086
2262
  (s.size / 1024).toFixed(2),
2087
2263
  "KB (",
2088
2264
  s.size,
@@ -2091,69 +2267,69 @@ function NetworkDetail({ s }) {
2091
2267
  ")"
2092
2268
  ] })
2093
2269
  ] }),
2094
- /* @__PURE__ */ jsxs5("div", { style: detailRowStyle, children: [
2095
- /* @__PURE__ */ jsx5("span", { style: detailLabelStyle, children: t.renderBlocking }),
2096
- /* @__PURE__ */ jsx5("span", { children: s.blocking ? t.yes : t.no })
2270
+ /* @__PURE__ */ jsxs8("div", { style: detailRowStyle, children: [
2271
+ /* @__PURE__ */ jsx8("span", { style: detailLabelStyle, children: t.renderBlocking }),
2272
+ /* @__PURE__ */ jsx8("span", { children: s.blocking ? t.yes : t.no })
2097
2273
  ] })
2098
2274
  ] });
2099
2275
  }
2100
2276
  function WebVitalDetail({ s }) {
2101
2277
  const { t } = useI18n();
2102
- return /* @__PURE__ */ jsxs5("div", { style: { paddingLeft: "12px" }, children: [
2103
- /* @__PURE__ */ jsxs5("div", { style: detailRowStyle, children: [
2104
- /* @__PURE__ */ jsx5("span", { style: detailLabelStyle, children: t.metric }),
2105
- /* @__PURE__ */ jsx5("span", { children: s.name })
2278
+ return /* @__PURE__ */ jsxs8("div", { style: { paddingLeft: "12px" }, children: [
2279
+ /* @__PURE__ */ jsxs8("div", { style: detailRowStyle, children: [
2280
+ /* @__PURE__ */ jsx8("span", { style: detailLabelStyle, children: t.metric }),
2281
+ /* @__PURE__ */ jsx8("span", { children: s.name })
2106
2282
  ] }),
2107
- /* @__PURE__ */ jsxs5("div", { style: detailRowStyle, children: [
2108
- /* @__PURE__ */ jsx5("span", { style: detailLabelStyle, children: t.value }),
2109
- /* @__PURE__ */ jsx5("span", { children: s.value.toFixed(2) })
2283
+ /* @__PURE__ */ jsxs8("div", { style: detailRowStyle, children: [
2284
+ /* @__PURE__ */ jsx8("span", { style: detailLabelStyle, children: t.value }),
2285
+ /* @__PURE__ */ jsx8("span", { children: s.value.toFixed(2) })
2110
2286
  ] })
2111
2287
  ] });
2112
2288
  }
2113
2289
  function RenderDetail({ s }) {
2114
2290
  const { t } = useI18n();
2115
2291
  if (s.members && s.members.length > 0) {
2116
- return /* @__PURE__ */ jsxs5("div", { style: { paddingLeft: "12px" }, children: [
2117
- /* @__PURE__ */ jsxs5("div", { style: detailRowStyle, children: [
2118
- /* @__PURE__ */ jsx5("span", { style: detailLabelStyle, children: t.duration }),
2119
- /* @__PURE__ */ jsxs5("span", { children: [
2292
+ return /* @__PURE__ */ jsxs8("div", { style: { paddingLeft: "12px" }, children: [
2293
+ /* @__PURE__ */ jsxs8("div", { style: detailRowStyle, children: [
2294
+ /* @__PURE__ */ jsx8("span", { style: detailLabelStyle, children: t.duration }),
2295
+ /* @__PURE__ */ jsxs8("span", { children: [
2120
2296
  s.duration.toFixed(3),
2121
2297
  "ms"
2122
2298
  ] })
2123
2299
  ] }),
2124
- /* @__PURE__ */ jsxs5("div", { style: detailRowStyle, children: [
2125
- /* @__PURE__ */ jsx5("span", { style: detailLabelStyle, children: t.at }),
2126
- /* @__PURE__ */ jsxs5("span", { children: [
2300
+ /* @__PURE__ */ jsxs8("div", { style: detailRowStyle, children: [
2301
+ /* @__PURE__ */ jsx8("span", { style: detailLabelStyle, children: t.at }),
2302
+ /* @__PURE__ */ jsxs8("span", { children: [
2127
2303
  s.at.toFixed(2),
2128
2304
  "ms"
2129
2305
  ] })
2130
2306
  ] }),
2131
- /* @__PURE__ */ jsx5("div", { style: { marginTop: "6px" }, children: /* @__PURE__ */ jsx5(CascadeMembers, { members: s.members }) })
2307
+ /* @__PURE__ */ jsx8("div", { style: { marginTop: "6px" }, children: /* @__PURE__ */ jsx8(CascadeMembers, { members: s.members }) })
2132
2308
  ] });
2133
2309
  }
2134
- return /* @__PURE__ */ jsxs5("div", { style: { paddingLeft: "12px" }, children: [
2135
- /* @__PURE__ */ jsxs5("div", { style: detailRowStyle, children: [
2136
- /* @__PURE__ */ jsx5("span", { style: detailLabelStyle, children: t.component }),
2137
- /* @__PURE__ */ jsx5("span", { children: s.component })
2310
+ return /* @__PURE__ */ jsxs8("div", { style: { paddingLeft: "12px" }, children: [
2311
+ /* @__PURE__ */ jsxs8("div", { style: detailRowStyle, children: [
2312
+ /* @__PURE__ */ jsx8("span", { style: detailLabelStyle, children: t.component }),
2313
+ /* @__PURE__ */ jsx8("span", { children: s.component })
2138
2314
  ] }),
2139
- /* @__PURE__ */ jsxs5("div", { style: detailRowStyle, children: [
2140
- /* @__PURE__ */ jsx5("span", { style: detailLabelStyle, children: t.reason }),
2141
- /* @__PURE__ */ jsx5(RenderReasonTag, { reason: s.reason, changedProps: s.changedProps })
2315
+ /* @__PURE__ */ jsxs8("div", { style: detailRowStyle, children: [
2316
+ /* @__PURE__ */ jsx8("span", { style: detailLabelStyle, children: t.reason }),
2317
+ /* @__PURE__ */ jsx8(RenderReasonTag, { reason: s.reason, changedProps: s.changedProps })
2142
2318
  ] }),
2143
- s.reason === "props" && s.changedProps && s.changedProps.length > 0 && /* @__PURE__ */ jsxs5("div", { style: { ...detailRowStyle, ...monoStyle }, children: [
2144
- /* @__PURE__ */ jsx5("span", { style: detailLabelStyle, children: t.changedProps }),
2145
- /* @__PURE__ */ jsx5("span", { children: s.changedProps.join(", ") })
2319
+ s.reason === "props" && s.changedProps && s.changedProps.length > 0 && /* @__PURE__ */ jsxs8("div", { style: { ...detailRowStyle, ...monoStyle }, children: [
2320
+ /* @__PURE__ */ jsx8("span", { style: detailLabelStyle, children: t.changedProps }),
2321
+ /* @__PURE__ */ jsx8("span", { children: s.changedProps.join(", ") })
2146
2322
  ] }),
2147
- /* @__PURE__ */ jsxs5("div", { style: detailRowStyle, children: [
2148
- /* @__PURE__ */ jsx5("span", { style: detailLabelStyle, children: t.duration }),
2149
- /* @__PURE__ */ jsxs5("span", { children: [
2323
+ /* @__PURE__ */ jsxs8("div", { style: detailRowStyle, children: [
2324
+ /* @__PURE__ */ jsx8("span", { style: detailLabelStyle, children: t.duration }),
2325
+ /* @__PURE__ */ jsxs8("span", { children: [
2150
2326
  s.duration.toFixed(3),
2151
2327
  "ms"
2152
2328
  ] })
2153
2329
  ] }),
2154
- /* @__PURE__ */ jsxs5("div", { style: detailRowStyle, children: [
2155
- /* @__PURE__ */ jsx5("span", { style: detailLabelStyle, children: t.at }),
2156
- /* @__PURE__ */ jsxs5("span", { children: [
2330
+ /* @__PURE__ */ jsxs8("div", { style: detailRowStyle, children: [
2331
+ /* @__PURE__ */ jsx8("span", { style: detailLabelStyle, children: t.at }),
2332
+ /* @__PURE__ */ jsxs8("span", { children: [
2157
2333
  s.at.toFixed(2),
2158
2334
  "ms"
2159
2335
  ] })
@@ -2183,11 +2359,11 @@ function StackFrames({
2183
2359
  cancelled = true;
2184
2360
  };
2185
2361
  }, [raw]);
2186
- return /* @__PURE__ */ jsxs5(Fragment2, { children: [
2187
- resolving && /* @__PURE__ */ jsx5("div", { style: { color: "#666", fontSize: "10px", marginBottom: "4px" }, children: t.resolvingSourceMaps }),
2188
- frames.length === 0 ? /* @__PURE__ */ jsx5("div", { style: { color: "#666" }, children: t.noStack }) : frames.map((f, i) => /* @__PURE__ */ jsxs5("div", { style: { ...detailRowStyle, ...monoStyle }, children: [
2189
- f.fnName ? /* @__PURE__ */ jsx5("span", { children: f.fnName }) : /* @__PURE__ */ jsx5("span", { style: { color: "#666" }, children: t.anonymous }),
2190
- /* @__PURE__ */ jsxs5("span", { style: { color: "#888" }, children: [
2362
+ return /* @__PURE__ */ jsxs8(Fragment3, { children: [
2363
+ resolving && /* @__PURE__ */ jsx8("div", { style: { color: "#666", fontSize: "10px", marginBottom: "4px" }, children: t.resolvingSourceMaps }),
2364
+ frames.length === 0 ? /* @__PURE__ */ jsx8("div", { style: { color: "#666" }, children: t.noStack }) : frames.map((f, i) => /* @__PURE__ */ jsxs8("div", { style: { ...detailRowStyle, ...monoStyle }, children: [
2365
+ f.fnName ? /* @__PURE__ */ jsx8("span", { children: f.fnName }) : /* @__PURE__ */ jsx8("span", { style: { color: "#666" }, children: t.anonymous }),
2366
+ /* @__PURE__ */ jsxs8("span", { style: { color: "#888" }, children: [
2191
2367
  f.file,
2192
2368
  ":",
2193
2369
  f.line,
@@ -2201,7 +2377,7 @@ function ForcedReflowDetail({
2201
2377
  s,
2202
2378
  resolveFrame
2203
2379
  }) {
2204
- return /* @__PURE__ */ jsx5("div", { style: { paddingLeft: "12px" }, children: /* @__PURE__ */ jsx5(StackFrames, { raw: s.stack, resolveFrame }) });
2380
+ return /* @__PURE__ */ jsx8("div", { style: { paddingLeft: "12px" }, children: /* @__PURE__ */ jsx8(StackFrames, { raw: s.stack, resolveFrame }) });
2205
2381
  }
2206
2382
  function HotFunctions({
2207
2383
  attribution,
@@ -2220,26 +2396,26 @@ function HotFunctions({
2220
2396
  cancelled = true;
2221
2397
  };
2222
2398
  }, [attribution]);
2223
- return /* @__PURE__ */ jsxs5("div", { style: { marginTop: "6px" }, children: [
2224
- /* @__PURE__ */ jsx5("div", { style: { ...detailLabelStyle, textTransform: "uppercase", fontSize: "10px", letterSpacing: "0.5px", marginBottom: "1px", color: "#ff9f0a" }, children: t.hotFunctions }),
2225
- /* @__PURE__ */ jsx5("div", { style: { color: "#666", fontSize: "10px", marginBottom: "4px" }, children: t.hotFunctionsHint }),
2399
+ return /* @__PURE__ */ jsxs8("div", { style: { marginTop: "6px" }, children: [
2400
+ /* @__PURE__ */ jsx8("div", { style: { ...detailLabelStyle, textTransform: "uppercase", fontSize: "10px", letterSpacing: "0.5px", marginBottom: "1px", color: "#ff9f0a" }, children: t.hotFunctions }),
2401
+ /* @__PURE__ */ jsx8("div", { style: { color: "#666", fontSize: "10px", marginBottom: "4px" }, children: t.hotFunctionsHint }),
2226
2402
  attribution.map((a, i) => {
2227
2403
  const f = frames[i] ?? a.frame;
2228
2404
  const pct = Math.round(a.selfRatio * 100);
2229
- return /* @__PURE__ */ jsxs5("div", { style: { ...monoStyle, padding: "3px 0", borderTop: i > 0 ? "1px dashed #1f1f1f" : "none" }, children: [
2230
- /* @__PURE__ */ jsxs5("div", { children: [
2231
- /* @__PURE__ */ jsx5("span", { style: { color: "#ff9f0a", fontWeight: 600 }, children: f.fnName || /* @__PURE__ */ jsx5("span", { style: { color: "#666" }, children: t.anonymous }) }),
2232
- /* @__PURE__ */ jsxs5("span", { style: { color: SEVERITY_COLOR.medium, marginLeft: "6px" }, children: [
2405
+ return /* @__PURE__ */ jsxs8("div", { style: { ...monoStyle, padding: "3px 0", borderTop: i > 0 ? "1px dashed #1f1f1f" : "none" }, children: [
2406
+ /* @__PURE__ */ jsxs8("div", { children: [
2407
+ /* @__PURE__ */ jsx8("span", { style: { color: "#ff9f0a", fontWeight: 600 }, children: f.fnName || /* @__PURE__ */ jsx8("span", { style: { color: "#666" }, children: t.anonymous }) }),
2408
+ /* @__PURE__ */ jsxs8("span", { style: { color: SEVERITY_COLOR.medium, marginLeft: "6px" }, children: [
2233
2409
  pct,
2234
2410
  "%"
2235
2411
  ] }),
2236
- /* @__PURE__ */ jsxs5("span", { style: { color: "#666", marginLeft: "6px" }, children: [
2412
+ /* @__PURE__ */ jsxs8("span", { style: { color: "#666", marginLeft: "6px" }, children: [
2237
2413
  "(",
2238
2414
  a.sampleCount,
2239
2415
  ")"
2240
2416
  ] })
2241
2417
  ] }),
2242
- /* @__PURE__ */ jsxs5("div", { style: { color: "#888", wordBreak: "break-all" }, children: [
2418
+ /* @__PURE__ */ jsxs8("div", { style: { color: "#888", wordBreak: "break-all" }, children: [
2243
2419
  f.file,
2244
2420
  ":",
2245
2421
  f.line,
@@ -2256,59 +2432,59 @@ function LongTaskDetail({
2256
2432
  }) {
2257
2433
  const { t } = useI18n();
2258
2434
  const scripts = s.scripts ? [...s.scripts].sort((a, b) => b.duration - a.duration) : [];
2259
- return /* @__PURE__ */ jsxs5("div", { style: { paddingLeft: "12px" }, children: [
2260
- /* @__PURE__ */ jsxs5("div", { style: detailRowStyle, children: [
2261
- /* @__PURE__ */ jsx5("span", { style: detailLabelStyle, children: t.started }),
2262
- /* @__PURE__ */ jsxs5("span", { children: [
2435
+ return /* @__PURE__ */ jsxs8("div", { style: { paddingLeft: "12px" }, children: [
2436
+ /* @__PURE__ */ jsxs8("div", { style: detailRowStyle, children: [
2437
+ /* @__PURE__ */ jsx8("span", { style: detailLabelStyle, children: t.started }),
2438
+ /* @__PURE__ */ jsxs8("span", { children: [
2263
2439
  s.at.toFixed(2),
2264
2440
  "ms"
2265
2441
  ] })
2266
2442
  ] }),
2267
- /* @__PURE__ */ jsxs5("div", { style: detailRowStyle, children: [
2268
- /* @__PURE__ */ jsx5("span", { style: detailLabelStyle, children: t.ended }),
2269
- /* @__PURE__ */ jsxs5("span", { children: [
2443
+ /* @__PURE__ */ jsxs8("div", { style: detailRowStyle, children: [
2444
+ /* @__PURE__ */ jsx8("span", { style: detailLabelStyle, children: t.ended }),
2445
+ /* @__PURE__ */ jsxs8("span", { children: [
2270
2446
  (s.at + s.duration).toFixed(2),
2271
2447
  "ms"
2272
2448
  ] })
2273
2449
  ] }),
2274
- /* @__PURE__ */ jsxs5("div", { style: detailRowStyle, children: [
2275
- /* @__PURE__ */ jsx5("span", { style: detailLabelStyle, children: t.duration }),
2276
- /* @__PURE__ */ jsxs5("span", { children: [
2450
+ /* @__PURE__ */ jsxs8("div", { style: detailRowStyle, children: [
2451
+ /* @__PURE__ */ jsx8("span", { style: detailLabelStyle, children: t.duration }),
2452
+ /* @__PURE__ */ jsxs8("span", { children: [
2277
2453
  s.duration.toFixed(2),
2278
2454
  "ms"
2279
2455
  ] })
2280
2456
  ] }),
2281
- typeof s.blockingDuration === "number" && /* @__PURE__ */ jsxs5("div", { style: detailRowStyle, children: [
2282
- /* @__PURE__ */ jsx5("span", { style: detailLabelStyle, children: t.blockingTime }),
2283
- /* @__PURE__ */ jsxs5("span", { children: [
2457
+ typeof s.blockingDuration === "number" && /* @__PURE__ */ jsxs8("div", { style: detailRowStyle, children: [
2458
+ /* @__PURE__ */ jsx8("span", { style: detailLabelStyle, children: t.blockingTime }),
2459
+ /* @__PURE__ */ jsxs8("span", { children: [
2284
2460
  s.blockingDuration.toFixed(2),
2285
2461
  "ms"
2286
2462
  ] })
2287
2463
  ] }),
2288
- s.attribution !== void 0 && s.attribution.length > 0 && /* @__PURE__ */ jsx5(HotFunctions, { attribution: s.attribution, resolveFrame }),
2289
- s.scripts !== void 0 && /* @__PURE__ */ jsxs5("div", { style: { marginTop: "6px" }, children: [
2290
- /* @__PURE__ */ jsx5("div", { style: { ...detailLabelStyle, textTransform: "uppercase", fontSize: "10px", letterSpacing: "0.5px", marginBottom: "4px" }, children: t.scripts }),
2291
- scripts.length === 0 ? /* @__PURE__ */ jsx5("div", { style: { color: "#666" }, children: t.noScripts }) : scripts.map((script, i) => /* @__PURE__ */ jsxs5("div", { style: { ...monoStyle, padding: "3px 0", borderTop: i > 0 ? "1px dashed #1f1f1f" : "none" }, children: [
2292
- /* @__PURE__ */ jsxs5("div", { children: [
2293
- /* @__PURE__ */ jsx5("span", { children: script.sourceFunctionName || /* @__PURE__ */ jsx5("span", { style: { color: "#666" }, children: t.anonymous }) }),
2294
- /* @__PURE__ */ jsx5("span", { style: { color: "#5ac8fa", marginLeft: "6px" }, children: script.invokerType }),
2295
- /* @__PURE__ */ jsxs5("span", { style: { color: SEVERITY_COLOR.medium, marginLeft: "6px" }, children: [
2464
+ s.attribution !== void 0 && s.attribution.length > 0 && /* @__PURE__ */ jsx8(HotFunctions, { attribution: s.attribution, resolveFrame }),
2465
+ s.scripts !== void 0 && /* @__PURE__ */ jsxs8("div", { style: { marginTop: "6px" }, children: [
2466
+ /* @__PURE__ */ jsx8("div", { style: { ...detailLabelStyle, textTransform: "uppercase", fontSize: "10px", letterSpacing: "0.5px", marginBottom: "4px" }, children: t.scripts }),
2467
+ scripts.length === 0 ? /* @__PURE__ */ jsx8("div", { style: { color: "#666" }, children: t.noScripts }) : scripts.map((script, i) => /* @__PURE__ */ jsxs8("div", { style: { ...monoStyle, padding: "3px 0", borderTop: i > 0 ? "1px dashed #1f1f1f" : "none" }, children: [
2468
+ /* @__PURE__ */ jsxs8("div", { children: [
2469
+ /* @__PURE__ */ jsx8("span", { children: script.sourceFunctionName || /* @__PURE__ */ jsx8("span", { style: { color: "#666" }, children: t.anonymous }) }),
2470
+ /* @__PURE__ */ jsx8("span", { style: { color: "#5ac8fa", marginLeft: "6px" }, children: script.invokerType }),
2471
+ /* @__PURE__ */ jsxs8("span", { style: { color: SEVERITY_COLOR.medium, marginLeft: "6px" }, children: [
2296
2472
  script.duration.toFixed(1),
2297
2473
  "ms"
2298
2474
  ] })
2299
2475
  ] }),
2300
- script.sourceURL && /* @__PURE__ */ jsxs5("div", { style: { color: "#888", wordBreak: "break-all" }, children: [
2476
+ script.sourceURL && /* @__PURE__ */ jsxs8("div", { style: { color: "#888", wordBreak: "break-all" }, children: [
2301
2477
  script.sourceURL,
2302
2478
  script.charPosition >= 0 ? `@${script.charPosition}` : ""
2303
2479
  ] }),
2304
- script.invoker && /* @__PURE__ */ jsxs5("div", { style: { color: "#666" }, children: [
2480
+ script.invoker && /* @__PURE__ */ jsxs8("div", { style: { color: "#666" }, children: [
2305
2481
  t.invoker,
2306
2482
  ": ",
2307
2483
  script.invoker
2308
2484
  ] })
2309
2485
  ] }, i))
2310
2486
  ] }),
2311
- s.scripts === void 0 && s.stack.length > 0 && /* @__PURE__ */ jsx5("div", { style: { marginTop: "4px" }, children: /* @__PURE__ */ jsx5(StackFrames, { raw: s.stack, resolveFrame, limit: 5 }) })
2487
+ s.scripts === void 0 && s.stack.length > 0 && /* @__PURE__ */ jsx8("div", { style: { marginTop: "4px" }, children: /* @__PURE__ */ jsx8(StackFrames, { raw: s.stack, resolveFrame, limit: 5 }) })
2312
2488
  ] });
2313
2489
  }
2314
2490
  var INTERACTION_PHASE_COLOR = { input: "#8e8e93", processing: "#5ac8fa", presentation: "#34c759" };
@@ -2323,33 +2499,33 @@ function InteractionDetail({
2323
2499
  { label: t.processingTime, ms: s.processing, color: INTERACTION_PHASE_COLOR.processing },
2324
2500
  { label: t.presentation, ms: s.presentation, color: INTERACTION_PHASE_COLOR.presentation }
2325
2501
  ];
2326
- return /* @__PURE__ */ jsxs5("div", { style: { paddingLeft: "12px" }, children: [
2327
- /* @__PURE__ */ jsxs5("div", { style: detailRowStyle, children: [
2328
- /* @__PURE__ */ jsx5("span", { style: detailLabelStyle, children: t.interactionEvent }),
2329
- /* @__PURE__ */ jsxs5("span", { children: [
2502
+ return /* @__PURE__ */ jsxs8("div", { style: { paddingLeft: "12px" }, children: [
2503
+ /* @__PURE__ */ jsxs8("div", { style: detailRowStyle, children: [
2504
+ /* @__PURE__ */ jsx8("span", { style: detailLabelStyle, children: t.interactionEvent }),
2505
+ /* @__PURE__ */ jsxs8("span", { children: [
2330
2506
  s.eventType,
2331
2507
  s.target ? ` \xB7 ${s.target}` : ""
2332
2508
  ] })
2333
2509
  ] }),
2334
- /* @__PURE__ */ jsxs5("div", { style: detailRowStyle, children: [
2335
- /* @__PURE__ */ jsx5("span", { style: detailLabelStyle, children: t.duration }),
2336
- /* @__PURE__ */ jsxs5("span", { children: [
2510
+ /* @__PURE__ */ jsxs8("div", { style: detailRowStyle, children: [
2511
+ /* @__PURE__ */ jsx8("span", { style: detailLabelStyle, children: t.duration }),
2512
+ /* @__PURE__ */ jsxs8("span", { children: [
2337
2513
  s.duration.toFixed(0),
2338
2514
  "ms"
2339
2515
  ] })
2340
2516
  ] }),
2341
- /* @__PURE__ */ jsx5("div", { style: { display: "flex", height: "10px", borderRadius: "3px", overflow: "hidden", margin: "5px 0 7px", background: "#1a1a1a" }, children: phases.map((p, i) => /* @__PURE__ */ jsx5("div", { style: { width: `${p.ms / total * 100}%`, background: p.color } }, i)) }),
2342
- phases.map((p, i) => /* @__PURE__ */ jsxs5("div", { style: detailRowStyle, children: [
2343
- /* @__PURE__ */ jsxs5("span", { style: { ...detailLabelStyle, display: "inline-flex", alignItems: "center", gap: "5px" }, children: [
2344
- /* @__PURE__ */ jsx5("span", { style: { width: "7px", height: "7px", borderRadius: "2px", background: p.color, flex: "0 0 7px" } }),
2517
+ /* @__PURE__ */ jsx8("div", { style: { display: "flex", height: "10px", borderRadius: "3px", overflow: "hidden", margin: "5px 0 7px", background: "#1a1a1a" }, children: phases.map((p, i) => /* @__PURE__ */ jsx8("div", { style: { width: `${p.ms / total * 100}%`, background: p.color } }, i)) }),
2518
+ phases.map((p, i) => /* @__PURE__ */ jsxs8("div", { style: detailRowStyle, children: [
2519
+ /* @__PURE__ */ jsxs8("span", { style: { ...detailLabelStyle, display: "inline-flex", alignItems: "center", gap: "5px" }, children: [
2520
+ /* @__PURE__ */ jsx8("span", { style: { width: "7px", height: "7px", borderRadius: "2px", background: p.color, flex: "0 0 7px" } }),
2345
2521
  p.label
2346
2522
  ] }),
2347
- /* @__PURE__ */ jsxs5("span", { children: [
2523
+ /* @__PURE__ */ jsxs8("span", { children: [
2348
2524
  p.ms.toFixed(0),
2349
2525
  "ms"
2350
2526
  ] })
2351
2527
  ] }, i)),
2352
- s.attribution !== void 0 && s.attribution.length > 0 && /* @__PURE__ */ jsx5(HotFunctions, { attribution: s.attribution, resolveFrame })
2528
+ s.attribution !== void 0 && s.attribution.length > 0 && /* @__PURE__ */ jsx8(HotFunctions, { attribution: s.attribution, resolveFrame })
2353
2529
  ] });
2354
2530
  }
2355
2531
  function SignalDetail({
@@ -2358,24 +2534,24 @@ function SignalDetail({
2358
2534
  }) {
2359
2535
  switch (s.kind) {
2360
2536
  case "forced-reflow":
2361
- return /* @__PURE__ */ jsx5(ForcedReflowDetail, { s, resolveFrame });
2537
+ return /* @__PURE__ */ jsx8(ForcedReflowDetail, { s, resolveFrame });
2362
2538
  case "layout-shift":
2363
- return /* @__PURE__ */ jsx5(LayoutShiftDetail, { s });
2539
+ return /* @__PURE__ */ jsx8(LayoutShiftDetail, { s });
2364
2540
  case "long-task":
2365
- return /* @__PURE__ */ jsx5(LongTaskDetail, { s, resolveFrame });
2541
+ return /* @__PURE__ */ jsx8(LongTaskDetail, { s, resolveFrame });
2366
2542
  case "interaction":
2367
- return /* @__PURE__ */ jsx5(InteractionDetail, { s, resolveFrame });
2543
+ return /* @__PURE__ */ jsx8(InteractionDetail, { s, resolveFrame });
2368
2544
  case "network":
2369
- return /* @__PURE__ */ jsx5(NetworkDetail, { s });
2545
+ return /* @__PURE__ */ jsx8(NetworkDetail, { s });
2370
2546
  case "web-vital":
2371
- return /* @__PURE__ */ jsx5(WebVitalDetail, { s });
2547
+ return /* @__PURE__ */ jsx8(WebVitalDetail, { s });
2372
2548
  case "render":
2373
- return /* @__PURE__ */ jsx5(RenderDetail, { s });
2549
+ return /* @__PURE__ */ jsx8(RenderDetail, { s });
2374
2550
  }
2375
2551
  }
2376
2552
  function SeverityDot({ sev, title }) {
2377
2553
  const { t } = useI18n();
2378
- return /* @__PURE__ */ jsx5(
2554
+ return /* @__PURE__ */ jsx8(
2379
2555
  "span",
2380
2556
  {
2381
2557
  "data-severity": sev,
@@ -2398,9 +2574,9 @@ function SummaryLine({ signal }) {
2398
2574
  if (signal.kind === "web-vital") {
2399
2575
  const rating = webVitalRating(signal.name, signal.value);
2400
2576
  const unit = WEB_VITAL_UNIT2[signal.name];
2401
- return /* @__PURE__ */ jsxs5("span", { children: [
2402
- /* @__PURE__ */ jsx5(RatingDot, { rating }),
2403
- /* @__PURE__ */ jsx5("strong", { children: signal.name }),
2577
+ return /* @__PURE__ */ jsxs8("span", { children: [
2578
+ /* @__PURE__ */ jsx8(RatingDot, { rating }),
2579
+ /* @__PURE__ */ jsx8("strong", { children: signal.name }),
2404
2580
  ": ",
2405
2581
  signal.value.toFixed(2),
2406
2582
  unit
@@ -2409,12 +2585,12 @@ function SummaryLine({ signal }) {
2409
2585
  const sev = severityForSignal(signal);
2410
2586
  const color = SEVERITY_COLOR[sev];
2411
2587
  if (signal.kind === "long-task") {
2412
- return /* @__PURE__ */ jsxs5("span", { children: [
2588
+ return /* @__PURE__ */ jsxs8("span", { children: [
2413
2589
  "@ ",
2414
2590
  signal.at.toFixed(1),
2415
2591
  "ms \u2022 duration",
2416
2592
  " ",
2417
- /* @__PURE__ */ jsxs5("span", { style: { color }, children: [
2593
+ /* @__PURE__ */ jsxs8("span", { style: { color }, children: [
2418
2594
  signal.duration.toFixed(1),
2419
2595
  "ms"
2420
2596
  ] })
@@ -2422,59 +2598,59 @@ function SummaryLine({ signal }) {
2422
2598
  }
2423
2599
  if (signal.kind === "forced-reflow") {
2424
2600
  const count = signal.count ?? 1;
2425
- return /* @__PURE__ */ jsxs5("span", { children: [
2601
+ return /* @__PURE__ */ jsxs8("span", { children: [
2426
2602
  "@ ",
2427
2603
  signal.at.toFixed(1),
2428
2604
  "ms \u2022 duration",
2429
2605
  " ",
2430
- /* @__PURE__ */ jsxs5("span", { style: { color }, children: [
2606
+ /* @__PURE__ */ jsxs8("span", { style: { color }, children: [
2431
2607
  signal.duration.toFixed(2),
2432
2608
  "ms"
2433
2609
  ] }),
2434
- count > 1 && /* @__PURE__ */ jsxs5("span", { style: { color: "#888" }, children: [
2610
+ count > 1 && /* @__PURE__ */ jsxs8("span", { style: { color: "#888" }, children: [
2435
2611
  " \u2022 ",
2436
2612
  t.coalescedReads(count)
2437
2613
  ] })
2438
2614
  ] });
2439
2615
  }
2440
2616
  if (signal.kind === "layout-shift") {
2441
- return /* @__PURE__ */ jsxs5("span", { children: [
2617
+ return /* @__PURE__ */ jsxs8("span", { children: [
2442
2618
  "@ ",
2443
2619
  signal.at.toFixed(1),
2444
2620
  "ms \u2022 value",
2445
2621
  " ",
2446
- /* @__PURE__ */ jsx5("span", { style: { color }, children: formatCls(signal.value) }),
2622
+ /* @__PURE__ */ jsx8("span", { style: { color }, children: formatCls(signal.value) }),
2447
2623
  " \u2022 ",
2448
2624
  t.sourceCount(signal.sources.length)
2449
2625
  ] });
2450
2626
  }
2451
2627
  if (signal.kind === "render") {
2452
- return /* @__PURE__ */ jsxs5("span", { style: { display: "inline-flex", alignItems: "center", gap: "6px" }, children: [
2453
- /* @__PURE__ */ jsx5("strong", { children: signal.component }),
2454
- /* @__PURE__ */ jsx5(RenderReasonTag, { reason: signal.reason, changedProps: signal.changedProps }),
2455
- /* @__PURE__ */ jsxs5("span", { style: { color }, children: [
2628
+ return /* @__PURE__ */ jsxs8("span", { style: { display: "inline-flex", alignItems: "center", gap: "6px" }, children: [
2629
+ /* @__PURE__ */ jsx8("strong", { children: signal.component }),
2630
+ /* @__PURE__ */ jsx8(RenderReasonTag, { reason: signal.reason, changedProps: signal.changedProps }),
2631
+ /* @__PURE__ */ jsxs8("span", { style: { color }, children: [
2456
2632
  signal.duration.toFixed(2),
2457
2633
  "ms"
2458
2634
  ] }),
2459
- signal.count && signal.count > 1 && /* @__PURE__ */ jsx5("span", { style: { color: "#888" }, children: t.cascadeComponents(signal.count) })
2635
+ signal.count && signal.count > 1 && /* @__PURE__ */ jsx8("span", { style: { color: "#888" }, children: t.cascadeComponents(signal.count) })
2460
2636
  ] });
2461
2637
  }
2462
2638
  if (signal.kind === "network") {
2463
2639
  const url = signal.url.length > 60 ? signal.url.slice(0, 57) + "..." : signal.url;
2464
- return /* @__PURE__ */ jsxs5("span", { children: [
2640
+ return /* @__PURE__ */ jsxs8("span", { children: [
2465
2641
  url,
2466
2642
  " \u2022 ",
2467
- /* @__PURE__ */ jsxs5("span", { style: { color }, children: [
2643
+ /* @__PURE__ */ jsxs8("span", { style: { color }, children: [
2468
2644
  signal.duration.toFixed(0),
2469
2645
  "ms"
2470
2646
  ] }),
2471
- signal.blocking && /* @__PURE__ */ jsxs5("span", { style: { color: SEVERITY_COLOR.high }, children: [
2647
+ signal.blocking && /* @__PURE__ */ jsxs8("span", { style: { color: SEVERITY_COLOR.high }, children: [
2472
2648
  " \u2022 ",
2473
2649
  t.blocking
2474
2650
  ] })
2475
2651
  ] });
2476
2652
  }
2477
- return /* @__PURE__ */ jsx5("span", { children: summary(signal) });
2653
+ return /* @__PURE__ */ jsx8("span", { children: summary(signal) });
2478
2654
  }
2479
2655
  function tabSupportsGrouping(kind) {
2480
2656
  return kind === "render" || kind === "forced-reflow";
@@ -2548,7 +2724,7 @@ function groupSignals(signals, mode, kind) {
2548
2724
  function SignalRow({ signal, expanded, onToggleExpand, onHoverGeometry, resolveFrame }) {
2549
2725
  const hasGeometry = signal.kind === "layout-shift" && signal.sources.length > 0;
2550
2726
  const sev = severityForSignal(signal);
2551
- return /* @__PURE__ */ jsxs5(
2727
+ return /* @__PURE__ */ jsxs8(
2552
2728
  "li",
2553
2729
  {
2554
2730
  "aria-expanded": expanded,
@@ -2570,22 +2746,22 @@ function SignalRow({ signal, expanded, onToggleExpand, onHoverGeometry, resolveF
2570
2746
  userSelect: "none"
2571
2747
  },
2572
2748
  children: [
2573
- /* @__PURE__ */ jsxs5("div", { style: { display: "flex", alignItems: "center", gap: "6px" }, children: [
2574
- /* @__PURE__ */ jsx5("span", { style: { color: "#888", width: "10px" }, children: expanded ? "\u25BC" : "\u25B6" }),
2575
- /* @__PURE__ */ jsx5(SeverityDot, { sev }),
2576
- /* @__PURE__ */ jsx5(SummaryLine, { signal })
2749
+ /* @__PURE__ */ jsxs8("div", { style: { display: "flex", alignItems: "center", gap: "6px" }, children: [
2750
+ /* @__PURE__ */ jsx8("span", { style: { color: "#888", width: "10px" }, children: expanded ? "\u25BC" : "\u25B6" }),
2751
+ /* @__PURE__ */ jsx8(SeverityDot, { sev }),
2752
+ /* @__PURE__ */ jsx8(SummaryLine, { signal })
2577
2753
  ] }),
2578
- expanded && /* @__PURE__ */ jsx5("div", { style: { marginTop: "6px", paddingTop: "6px", borderTop: "1px dashed #2a2a2a" }, children: /* @__PURE__ */ jsx5(SignalDetail, { s: signal, resolveFrame }) })
2754
+ expanded && /* @__PURE__ */ jsx8("div", { style: { marginTop: "6px", paddingTop: "6px", borderTop: "1px dashed #2a2a2a" }, children: /* @__PURE__ */ jsx8(SignalDetail, { s: signal, resolveFrame }) })
2579
2755
  ]
2580
2756
  }
2581
2757
  );
2582
2758
  }
2583
2759
  function CascadeMembers({ members }) {
2584
2760
  const minDepth = members.reduce((m, s) => Math.min(m, s.depth), Infinity);
2585
- return /* @__PURE__ */ jsx5("div", { children: members.map((m, i) => {
2761
+ return /* @__PURE__ */ jsx8("div", { children: members.map((m, i) => {
2586
2762
  const indent = (m.depth - minDepth) * 14;
2587
2763
  const isCascade = m.reason === "parent";
2588
- return /* @__PURE__ */ jsxs5(
2764
+ return /* @__PURE__ */ jsxs8(
2589
2765
  "div",
2590
2766
  {
2591
2767
  style: {
@@ -2596,10 +2772,10 @@ function CascadeMembers({ members }) {
2596
2772
  gap: "6px"
2597
2773
  },
2598
2774
  children: [
2599
- /* @__PURE__ */ jsx5("span", { style: { color: isCascade ? RENDER_REASON_COLOR.parent : "#555" }, children: m.depth > minDepth ? "\u2514" : "\u2022" }),
2600
- /* @__PURE__ */ jsx5("strong", { children: m.component }),
2601
- /* @__PURE__ */ jsx5(RenderReasonTag, { reason: m.reason, changedProps: m.changedProps }),
2602
- /* @__PURE__ */ jsxs5("span", { style: { color: "#888" }, children: [
2775
+ /* @__PURE__ */ jsx8("span", { style: { color: isCascade ? RENDER_REASON_COLOR.parent : "#555" }, children: m.depth > minDepth ? "\u2514" : "\u2022" }),
2776
+ /* @__PURE__ */ jsx8("strong", { children: m.component }),
2777
+ /* @__PURE__ */ jsx8(RenderReasonTag, { reason: m.reason, changedProps: m.changedProps }),
2778
+ /* @__PURE__ */ jsxs8("span", { style: { color: "#888" }, children: [
2603
2779
  m.duration.toFixed(2),
2604
2780
  "ms"
2605
2781
  ] })
@@ -2613,7 +2789,7 @@ function LanguageToggle() {
2613
2789
  const { lang, setLang, t } = useI18n();
2614
2790
  const langs = ["en", "ko"];
2615
2791
  const labels = { en: "EN", ko: "\uD55C" };
2616
- return /* @__PURE__ */ jsx5(
2792
+ return /* @__PURE__ */ jsx8(
2617
2793
  "div",
2618
2794
  {
2619
2795
  role: "group",
@@ -2626,7 +2802,7 @@ function LanguageToggle() {
2626
2802
  },
2627
2803
  children: langs.map((l) => {
2628
2804
  const active = lang === l;
2629
- return /* @__PURE__ */ jsx5(
2805
+ return /* @__PURE__ */ jsx8(
2630
2806
  "button",
2631
2807
  {
2632
2808
  type: "button",
@@ -2655,6 +2831,7 @@ function Panel(props) {
2655
2831
  const { t } = useI18n();
2656
2832
  const grouped = useMemo3(() => groupByKind(result.signals), [result.signals]);
2657
2833
  const kindsPresent = KIND_ORDER.filter((k) => grouped[k].length > 0);
2834
+ const unsupported = useMemo3(() => unsupportedKinds(), []);
2658
2835
  const hasTimelineSignals = result.signals.some((s) => s.kind !== "web-vital") || (result.heapSamples?.length ?? 0) > 0 || (result.frames?.length ?? 0) > 0;
2659
2836
  const [activeTab, setActiveTab] = useState3(
2660
2837
  kindsPresent[0] ?? "forced-reflow"
@@ -2720,12 +2897,12 @@ function Panel(props) {
2720
2897
  flexDirection: "column",
2721
2898
  overflow: "hidden"
2722
2899
  };
2723
- return /* @__PURE__ */ jsxs5("div", { role: "region", "aria-label": t.panelRegion, style: panelStyle, children: [
2724
- /* @__PURE__ */ jsxs5("header", { style: { display: "flex", alignItems: "center", justifyContent: "space-between", marginBottom: "8px" }, children: [
2725
- /* @__PURE__ */ jsx5("strong", { children: "react-perfscope" }),
2726
- /* @__PURE__ */ jsxs5("div", { style: { display: "flex", gap: "4px", alignItems: "center" }, children: [
2727
- /* @__PURE__ */ jsx5(LanguageToggle, {}),
2728
- /* @__PURE__ */ jsx5(
2900
+ return /* @__PURE__ */ jsxs8("div", { role: "region", "aria-label": t.panelRegion, style: panelStyle, children: [
2901
+ /* @__PURE__ */ jsxs8("header", { style: { display: "flex", alignItems: "center", justifyContent: "space-between", marginBottom: "8px" }, children: [
2902
+ /* @__PURE__ */ jsx8("strong", { children: "react-perfscope" }),
2903
+ /* @__PURE__ */ jsxs8("div", { style: { display: "flex", gap: "4px", alignItems: "center" }, children: [
2904
+ /* @__PURE__ */ jsx8(LanguageToggle, {}),
2905
+ /* @__PURE__ */ jsx8(
2729
2906
  "button",
2730
2907
  {
2731
2908
  type: "button",
@@ -2744,7 +2921,7 @@ function Panel(props) {
2744
2921
  children: t.save
2745
2922
  }
2746
2923
  ),
2747
- /* @__PURE__ */ jsx5(
2924
+ /* @__PURE__ */ jsx8(
2748
2925
  "button",
2749
2926
  {
2750
2927
  type: "button",
@@ -2756,9 +2933,24 @@ function Panel(props) {
2756
2933
  )
2757
2934
  ] })
2758
2935
  ] }),
2759
- kindsPresent.length === 0 && /* @__PURE__ */ jsx5("div", { style: { color: "#888" }, children: t.noSignals }),
2760
- kindsPresent.length > 0 && /* @__PURE__ */ jsxs5(Fragment2, { children: [
2761
- /* @__PURE__ */ jsx5(
2936
+ unsupported.length > 0 && /* @__PURE__ */ jsx8(
2937
+ "div",
2938
+ {
2939
+ style: {
2940
+ padding: "6px 8px",
2941
+ marginBottom: "8px",
2942
+ fontSize: "11px",
2943
+ color: "#888",
2944
+ background: "#141414",
2945
+ border: "1px solid #1f1f1f",
2946
+ borderRadius: "6px"
2947
+ },
2948
+ children: t.unsupportedInBrowser(unsupported.map((k) => t.kindLabel(k)).join(", "))
2949
+ }
2950
+ ),
2951
+ kindsPresent.length === 0 && /* @__PURE__ */ jsx8("div", { style: { color: "#888" }, children: t.noSignals }),
2952
+ kindsPresent.length > 0 && /* @__PURE__ */ jsxs8(Fragment3, { children: [
2953
+ /* @__PURE__ */ jsx8(
2762
2954
  SummaryHeader,
2763
2955
  {
2764
2956
  signals: result.signals,
@@ -2770,8 +2962,8 @@ function Panel(props) {
2770
2962
  }
2771
2963
  }
2772
2964
  ),
2773
- /* @__PURE__ */ jsxs5("nav", { style: { display: "flex", gap: "4px", flexWrap: "wrap", marginBottom: "8px" }, children: [
2774
- hasTimelineSignals && /* @__PURE__ */ jsx5(
2965
+ /* @__PURE__ */ jsxs8("nav", { style: { display: "flex", gap: "4px", flexWrap: "wrap", marginBottom: "8px" }, children: [
2966
+ hasTimelineSignals && /* @__PURE__ */ jsx8(
2775
2967
  "button",
2776
2968
  {
2777
2969
  type: "button",
@@ -2796,7 +2988,7 @@ function Panel(props) {
2796
2988
  kindsPresent.map((kind) => {
2797
2989
  const worst = worstSeverity(grouped[kind]);
2798
2990
  const active = activeKind === kind;
2799
- return /* @__PURE__ */ jsxs5(
2991
+ return /* @__PURE__ */ jsxs8(
2800
2992
  "button",
2801
2993
  {
2802
2994
  type: "button",
@@ -2819,7 +3011,7 @@ function Panel(props) {
2819
3011
  gap: "6px"
2820
3012
  },
2821
3013
  children: [
2822
- worst !== "low" && /* @__PURE__ */ jsx5(SeverityDot, { sev: worst, title: t.worstLabel(worst) }),
3014
+ worst !== "low" && /* @__PURE__ */ jsx8(SeverityDot, { sev: worst, title: t.worstLabel(worst) }),
2823
3015
  t.kindLabel(kind),
2824
3016
  " ",
2825
3017
  grouped[kind].length
@@ -2829,10 +3021,10 @@ function Panel(props) {
2829
3021
  );
2830
3022
  })
2831
3023
  ] }),
2832
- activeKind && activeTab !== "timeline" && /* @__PURE__ */ jsxs5("div", { style: { display: "flex", alignItems: "center", gap: "12px", marginBottom: "6px", fontSize: "11px", color: "#888", flexWrap: "wrap" }, children: [
2833
- /* @__PURE__ */ jsxs5("label", { style: { display: "flex", alignItems: "center", gap: "6px" }, children: [
3024
+ activeKind && activeTab !== "timeline" && /* @__PURE__ */ jsxs8("div", { style: { display: "flex", alignItems: "center", gap: "12px", marginBottom: "6px", fontSize: "11px", color: "#888", flexWrap: "wrap" }, children: [
3025
+ /* @__PURE__ */ jsxs8("label", { style: { display: "flex", alignItems: "center", gap: "6px" }, children: [
2834
3026
  t.sort,
2835
- /* @__PURE__ */ jsxs5(
3027
+ /* @__PURE__ */ jsxs8(
2836
3028
  "select",
2837
3029
  {
2838
3030
  "aria-label": t.sort,
@@ -2844,15 +3036,15 @@ function Panel(props) {
2844
3036
  },
2845
3037
  style: { background: "#1a1a1a", color: "#e6e6e6", border: "1px solid #2a2a2a", borderRadius: "4px", padding: "2px 6px", fontSize: "11px" },
2846
3038
  children: [
2847
- /* @__PURE__ */ jsx5("option", { value: "chronological", children: t.sortChronological }),
2848
- /* @__PURE__ */ jsx5("option", { value: "severity", children: t.sortSeverity })
3039
+ /* @__PURE__ */ jsx8("option", { value: "chronological", children: t.sortChronological }),
3040
+ /* @__PURE__ */ jsx8("option", { value: "severity", children: t.sortSeverity })
2849
3041
  ]
2850
3042
  }
2851
3043
  )
2852
3044
  ] }),
2853
- tabSupportsGrouping(activeKind) && /* @__PURE__ */ jsxs5("label", { style: { display: "flex", alignItems: "center", gap: "6px" }, children: [
3045
+ tabSupportsGrouping(activeKind) && /* @__PURE__ */ jsxs8("label", { style: { display: "flex", alignItems: "center", gap: "6px" }, children: [
2854
3046
  t.groupBy,
2855
- /* @__PURE__ */ jsxs5(
3047
+ /* @__PURE__ */ jsxs8(
2856
3048
  "select",
2857
3049
  {
2858
3050
  "aria-label": t.groupBy,
@@ -2864,15 +3056,15 @@ function Panel(props) {
2864
3056
  },
2865
3057
  style: { background: "#1a1a1a", color: "#e6e6e6", border: "1px solid #2a2a2a", borderRadius: "4px", padding: "2px 6px", fontSize: "11px" },
2866
3058
  children: [
2867
- /* @__PURE__ */ jsx5("option", { value: "chronological", children: t.groupChronological }),
2868
- activeKind === "render" && /* @__PURE__ */ jsx5("option", { value: "commit", children: t.groupCommit }),
2869
- activeKind === "render" && /* @__PURE__ */ jsx5("option", { value: "component", children: t.groupComponent }),
2870
- activeKind === "forced-reflow" && /* @__PURE__ */ jsx5("option", { value: "source", children: t.groupSource })
3059
+ /* @__PURE__ */ jsx8("option", { value: "chronological", children: t.groupChronological }),
3060
+ activeKind === "render" && /* @__PURE__ */ jsx8("option", { value: "commit", children: t.groupCommit }),
3061
+ activeKind === "render" && /* @__PURE__ */ jsx8("option", { value: "component", children: t.groupComponent }),
3062
+ activeKind === "forced-reflow" && /* @__PURE__ */ jsx8("option", { value: "source", children: t.groupSource })
2871
3063
  ]
2872
3064
  }
2873
3065
  )
2874
3066
  ] }),
2875
- /* @__PURE__ */ jsx5(
3067
+ /* @__PURE__ */ jsx8(
2876
3068
  "input",
2877
3069
  {
2878
3070
  type: "text",
@@ -2887,7 +3079,7 @@ function Panel(props) {
2887
3079
  }
2888
3080
  )
2889
3081
  ] }),
2890
- activeTab === "timeline" && /* @__PURE__ */ jsx5("div", { style: { flexGrow: 1, overflowY: "auto", paddingTop: "4px", paddingBottom: "24px" }, children: /* @__PURE__ */ jsx5(
3082
+ activeTab === "timeline" && /* @__PURE__ */ jsx8("div", { style: { flexGrow: 1, overflowY: "auto", paddingTop: "4px", paddingBottom: "24px" }, children: /* @__PURE__ */ jsx8(
2891
3083
  Timeline,
2892
3084
  {
2893
3085
  signals: result.signals,
@@ -2903,7 +3095,7 @@ function Panel(props) {
2903
3095
  }
2904
3096
  }
2905
3097
  ) }),
2906
- activeKind === "render" && activeTab !== "timeline" && /* @__PURE__ */ jsx5(
3098
+ activeKind === "render" && activeTab !== "timeline" && /* @__PURE__ */ jsx8(
2907
3099
  RenderInsights,
2908
3100
  {
2909
3101
  signals: grouped.render.flatMap((s) => s.kind === "render" ? s.members ?? [s] : []).filter((s) => signalMatchesFilter(s, filterText.render ?? "")),
@@ -2913,7 +3105,8 @@ function Panel(props) {
2913
3105
  }
2914
3106
  }
2915
3107
  ),
2916
- activeKind === "interaction" && activeTab !== "timeline" && /* @__PURE__ */ jsx5(
3108
+ activeKind === "long-task" && activeTab !== "timeline" && /* @__PURE__ */ jsx8(LongTaskEpisode, { signals: result.signals }),
3109
+ activeKind === "layout-shift" && activeTab !== "timeline" && /* @__PURE__ */ jsx8(
2917
3110
  "div",
2918
3111
  {
2919
3112
  style: {
@@ -2925,10 +3118,28 @@ function Panel(props) {
2925
3118
  border: "1px solid #1f1f1f",
2926
3119
  borderRadius: "6px"
2927
3120
  },
2928
- children: t.interactionThresholdHint
3121
+ children: t.layoutShiftHint
2929
3122
  }
2930
3123
  ),
2931
- /* @__PURE__ */ jsx5("ul", { style: { listStyle: "none", margin: 0, padding: 0, overflowY: "auto", flexGrow: 1, display: activeTab === "timeline" ? "none" : void 0 }, children: activeKind && (() => {
3124
+ activeKind === "interaction" && activeTab !== "timeline" && /* @__PURE__ */ jsxs8(Fragment3, { children: [
3125
+ /* @__PURE__ */ jsx8(InpEpisode, { signals: result.signals }),
3126
+ /* @__PURE__ */ jsx8(
3127
+ "div",
3128
+ {
3129
+ style: {
3130
+ padding: "6px 8px",
3131
+ marginBottom: "6px",
3132
+ fontSize: "11px",
3133
+ color: "#888",
3134
+ background: "#141414",
3135
+ border: "1px solid #1f1f1f",
3136
+ borderRadius: "6px"
3137
+ },
3138
+ children: t.interactionThresholdHint
3139
+ }
3140
+ )
3141
+ ] }),
3142
+ /* @__PURE__ */ jsx8("ul", { style: { listStyle: "none", margin: 0, padding: 0, overflowY: "auto", flexGrow: 1, display: activeTab === "timeline" ? "none" : void 0 }, children: activeKind && (() => {
2932
3143
  const filtered = grouped[activeKind].filter(
2933
3144
  (s) => signalMatchesFilter(s, filterText[activeKind] ?? "")
2934
3145
  );
@@ -2938,7 +3149,7 @@ function Panel(props) {
2938
3149
  const currentMode = groupMode[activeKind] ?? "chronological";
2939
3150
  if (currentMode === "chronological") {
2940
3151
  const key2 = `${activeKind}-${gi}`;
2941
- return /* @__PURE__ */ jsx5(
3152
+ return /* @__PURE__ */ jsx8(
2942
3153
  SignalRow,
2943
3154
  {
2944
3155
  signal: g.signals[0],
@@ -2955,7 +3166,7 @@ function Panel(props) {
2955
3166
  const isCascade = activeKind === "render" && currentMode === "commit";
2956
3167
  const renderMembers = g.signals.filter((s) => s.kind === "render");
2957
3168
  const unnecessary = isCascade ? renderMembers.filter((s) => s.reason === "parent").length : 0;
2958
- return /* @__PURE__ */ jsxs5(
3169
+ return /* @__PURE__ */ jsxs8(
2959
3170
  "li",
2960
3171
  {
2961
3172
  "aria-expanded": isOpen,
@@ -2970,34 +3181,34 @@ function Panel(props) {
2970
3181
  userSelect: "none"
2971
3182
  },
2972
3183
  children: [
2973
- /* @__PURE__ */ jsxs5("div", { style: { display: "flex", alignItems: "center", gap: "6px", flexWrap: "wrap" }, children: [
2974
- /* @__PURE__ */ jsx5("span", { style: { color: "#888", width: "10px" }, children: isOpen ? "\u25BC" : "\u25B6" }),
2975
- /* @__PURE__ */ jsxs5("span", { children: [
2976
- /* @__PURE__ */ jsx5("strong", { children: g.label }),
3184
+ /* @__PURE__ */ jsxs8("div", { style: { display: "flex", alignItems: "center", gap: "6px", flexWrap: "wrap" }, children: [
3185
+ /* @__PURE__ */ jsx8("span", { style: { color: "#888", width: "10px" }, children: isOpen ? "\u25BC" : "\u25B6" }),
3186
+ /* @__PURE__ */ jsxs8("span", { children: [
3187
+ /* @__PURE__ */ jsx8("strong", { children: g.label }),
2977
3188
  " \xD7",
2978
3189
  g.count
2979
3190
  ] }),
2980
- isCascade && unnecessary > 0 && /* @__PURE__ */ jsxs5("span", { style: { color: RENDER_REASON_COLOR.parent, fontSize: "10px" }, children: [
3191
+ isCascade && unnecessary > 0 && /* @__PURE__ */ jsxs8("span", { style: { color: RENDER_REASON_COLOR.parent, fontSize: "10px" }, children: [
2981
3192
  "\u26A0 ",
2982
3193
  t.unnecessaryRenders(unnecessary)
2983
3194
  ] })
2984
3195
  ] }),
2985
- isOpen && /* @__PURE__ */ jsx5("div", { style: { marginTop: "6px", paddingTop: "6px", borderTop: "1px dashed #2a2a2a", paddingLeft: "8px" }, children: isCascade ? /* @__PURE__ */ jsx5(CascadeMembers, { members: renderMembers }) : /* @__PURE__ */ jsxs5(Fragment2, { children: [
2986
- g.signals.slice(0, 20).map((s, si) => /* @__PURE__ */ jsx5("div", { style: { padding: "2px 0" }, children: /* @__PURE__ */ jsx5(SummaryLine, { signal: s }) }, si)),
2987
- g.signals.length > 20 && /* @__PURE__ */ jsx5("div", { style: { color: "#888", marginTop: "4px" }, children: t.moreItems(g.signals.length - 20) })
3196
+ isOpen && /* @__PURE__ */ jsx8("div", { style: { marginTop: "6px", paddingTop: "6px", borderTop: "1px dashed #2a2a2a", paddingLeft: "8px" }, children: isCascade ? /* @__PURE__ */ jsx8(CascadeMembers, { members: renderMembers }) : /* @__PURE__ */ jsxs8(Fragment3, { children: [
3197
+ g.signals.slice(0, 20).map((s, si) => /* @__PURE__ */ jsx8("div", { style: { padding: "2px 0" }, children: /* @__PURE__ */ jsx8(SummaryLine, { signal: s }) }, si)),
3198
+ g.signals.length > 20 && /* @__PURE__ */ jsx8("div", { style: { color: "#888", marginTop: "4px" }, children: t.moreItems(g.signals.length - 20) })
2988
3199
  ] }) })
2989
3200
  ]
2990
3201
  },
2991
3202
  key
2992
3203
  );
2993
3204
  }) }),
2994
- activeKind && activeTab !== "timeline" && (filterText[activeKind] ?? "").trim() !== "" && grouped[activeKind].length > 0 && grouped[activeKind].every((s) => !signalMatchesFilter(s, filterText[activeKind] ?? "")) && /* @__PURE__ */ jsx5("div", { style: { padding: "12px 8px", fontSize: "11px", color: "#888" }, children: t.filterNoMatches })
3205
+ activeKind && activeTab !== "timeline" && (filterText[activeKind] ?? "").trim() !== "" && grouped[activeKind].length > 0 && grouped[activeKind].every((s) => !signalMatchesFilter(s, filterText[activeKind] ?? "")) && /* @__PURE__ */ jsx8("div", { style: { padding: "12px 8px", fontSize: "11px", color: "#888" }, children: t.filterNoMatches })
2995
3206
  ] })
2996
3207
  ] });
2997
3208
  }
2998
3209
 
2999
3210
  // src/app.tsx
3000
- import { jsx as jsx6, jsxs as jsxs6 } from "preact/jsx-runtime";
3211
+ import { jsx as jsx9, jsxs as jsxs9 } from "preact/jsx-runtime";
3001
3212
  function App(props) {
3002
3213
  const { recorder, position = "bottom-right", resolveFrame, finalize } = props;
3003
3214
  const [recording, setRecording] = useState4(false);
@@ -3043,8 +3254,8 @@ function App(props) {
3043
3254
  function onClose() {
3044
3255
  setResult(null);
3045
3256
  }
3046
- return /* @__PURE__ */ jsxs6(I18nProvider, { children: [
3047
- result === null && /* @__PURE__ */ jsx6(
3257
+ return /* @__PURE__ */ jsxs9(I18nProvider, { children: [
3258
+ result === null && /* @__PURE__ */ jsx9(
3048
3259
  Widget,
3049
3260
  {
3050
3261
  recording,
@@ -3053,16 +3264,16 @@ function App(props) {
3053
3264
  position
3054
3265
  }
3055
3266
  ),
3056
- result !== null && /* @__PURE__ */ jsx6(Panel, { result, position, onClose, resolveFrame })
3267
+ result !== null && /* @__PURE__ */ jsx9(Panel, { result, position, onClose, resolveFrame })
3057
3268
  ] });
3058
3269
  }
3059
3270
 
3060
3271
  // src/mount.tsx
3061
- import { jsx as jsx7 } from "preact/jsx-runtime";
3272
+ import { jsx as jsx10 } from "preact/jsx-runtime";
3062
3273
  function mount(opts) {
3063
3274
  const { recorder, position = "bottom-right", host = document.body, resolveFrame, finalize } = opts;
3064
3275
  return mountShadow(
3065
- /* @__PURE__ */ jsx7(App, { recorder, position, resolveFrame, finalize }),
3276
+ /* @__PURE__ */ jsx10(App, { recorder, position, resolveFrame, finalize }),
3066
3277
  { parent: host }
3067
3278
  );
3068
3279
  }