why-hydration 0.2.0 → 0.3.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.
@@ -0,0 +1,1333 @@
1
+ import { isDev, ReportCollector, inspectRoot, reportFromMessage, isInternalComponent, formatConsoleArgs, isHydrationMessage, EN_MESSAGES, plainText, renderMessage, code, classDetail, param } from './chunk-KP4S6CRL.js';
2
+ import { getServerHtmlForRoot, readSnapshot, DEFAULT_SNAPSHOT_SELECTORS } from './chunk-XIM33ZGB.js';
3
+ import * as React from 'react';
4
+
5
+ // src/react/console.ts
6
+ function installConsoleInterceptor(onMessage) {
7
+ if (typeof console === "undefined") return () => {
8
+ };
9
+ const original = console.error;
10
+ const patched = (...args) => {
11
+ try {
12
+ const message = formatConsoleArgs(args);
13
+ if (message && isHydrationMessage(message)) {
14
+ onMessage(message, args);
15
+ }
16
+ } catch {
17
+ }
18
+ original.apply(console, args);
19
+ };
20
+ console.error = patched;
21
+ return () => {
22
+ if (console.error === patched) {
23
+ console.error = original;
24
+ }
25
+ };
26
+ }
27
+ var BADGE = "color:#f59e0b;font-weight:bold";
28
+ var DIM = "color:#9ca3af";
29
+ function createConsoleReporter() {
30
+ const sink = (report) => {
31
+ const title = `%c\u2B21 why-hydration%c ${report.cause.category} \u2014 ${report.node.path}`;
32
+ console.group(title, BADGE, DIM);
33
+ console.log("%cServer:%c", "color:#fb7185", "", report.server ?? "(none)");
34
+ console.log("%cClient:%c", "color:#4ade80", "", report.client ?? "(none)");
35
+ if (report.component) {
36
+ console.log("%cComponent:%c", DIM, "", `<${report.component}>`);
37
+ }
38
+ if (report.location?.file) {
39
+ const loc = report.location.line ? `${report.location.file}:${report.location.line}` : report.location.file;
40
+ console.log("%cSource:%c", DIM, "", loc);
41
+ }
42
+ console.log("%cWhy:%c", DIM, "", report.cause.explanation);
43
+ console.log("%cFix:%c", "color:#86efac", "", report.cause.suggestion);
44
+ if (report.cause.docsUrl) {
45
+ console.log("%cDocs:%c", DIM, "", report.cause.docsUrl);
46
+ }
47
+ if (report.componentStack) {
48
+ console.log("%cComponent stack:%c", DIM, "", report.componentStack);
49
+ }
50
+ console.groupEnd();
51
+ };
52
+ return sink;
53
+ }
54
+
55
+ // src/react/capture.ts
56
+ var MAX_CAPTURED = 50;
57
+ var captured = /* @__PURE__ */ new Set();
58
+ var listeners = /* @__PURE__ */ new Set();
59
+ var uninstall = null;
60
+ function startCapture() {
61
+ if (uninstall || typeof window === "undefined") return;
62
+ uninstall = installConsoleInterceptor((message) => {
63
+ if (captured.has(message) || captured.size >= MAX_CAPTURED) return;
64
+ captured.add(message);
65
+ for (const listener of [...listeners]) listener(message);
66
+ });
67
+ }
68
+ function subscribeCapture(listener) {
69
+ startCapture();
70
+ listeners.add(listener);
71
+ for (const message of [...captured]) listener(message);
72
+ return () => {
73
+ if (!listeners.delete(listener)) return;
74
+ if (listeners.size === 0 && uninstall) {
75
+ uninstall();
76
+ uninstall = null;
77
+ }
78
+ };
79
+ }
80
+
81
+ // src/react/locales/ar.ts
82
+ var AR_MESSAGES = {
83
+ "non-deterministic-value": {
84
+ explanation: "\u0639\u0631\u0636 \u0627\u0644\u062E\u0627\u062F\u0645 \u0648\u0627\u0644\u0639\u0645\u064A\u0644 \u0642\u064A\u0645\u062A\u064A\u0646 \u062A\u0628\u062F\u0648\u0627\u0646 \u0639\u0634\u0648\u0627\u0626\u064A\u062A\u064A\u0646 \u0648\u0645\u062E\u062A\u0644\u0641\u062A\u064A\u0646 (\u0645\u0639\u0631\u0651\u0641 \u0623\u0648 \u0631\u0645\u0632 \u0623\u0648 \u0646\u0627\u062A\u062C `Math.random()`). \u0623\u064A \u0634\u064A\u0621 \u063A\u064A\u0631 \u062D\u062A\u0645\u064A \u0623\u062B\u0646\u0627\u0621 \u0627\u0644\u0639\u0631\u0636 \u064A\u0646\u062A\u062C \u0642\u064A\u0645\u0629 \u0645\u062E\u062A\u0644\u0641\u0629 \u0639\u0644\u0649 \u0643\u0644 \u062C\u0627\u0646\u0628.",
85
+ suggestion: "\u0627\u0633\u062A\u062E\u062F\u0645 `useId()` \u0645\u0646 React \u0644\u0644\u0645\u0639\u0631\u0651\u0641\u0627\u062A. \u0623\u0645\u0627 \u0627\u0644\u0642\u064A\u0645 \u0627\u0644\u0639\u0634\u0648\u0627\u0626\u064A\u0629 \u0641\u0648\u0644\u0651\u062F\u0647\u0627 \u0628\u0639\u062F \u0627\u0644\u062A\u0631\u0643\u064A\u0628 (\u062F\u0627\u062E\u0644 `useEffect`) \u0623\u0648 \u0645\u0631\u0651\u0631\u0647\u0627 \u0645\u0646 \u0627\u0644\u062E\u0627\u062F\u0645 \u0644\u064A\u062A\u0641\u0642 \u0627\u0644\u0637\u0631\u0641\u0627\u0646. \u0644\u0627 \u062A\u0633\u062A\u062F\u0639\u0650 `Math.random()` \u0623\u0648 `crypto` \u0623\u062B\u0646\u0627\u0621 \u0627\u0644\u0639\u0631\u0636 \u0623\u0628\u062F\u064B\u0627."
86
+ },
87
+ "date-time": {
88
+ explanation: "\u0627\u0644\u0642\u064A\u0645\u062A\u0627\u0646 \u062A\u0627\u0631\u064A\u062E\u0627\u0646 \u0623\u0648 \u0648\u0642\u062A\u0627\u0646 \u064A\u062E\u062A\u0644\u0641\u0627\u0646 \u0628\u064A\u0646 \u0639\u0631\u0636 \u0627\u0644\u062E\u0627\u062F\u0645 \u0648\u0639\u0631\u0636 \u0627\u0644\u0639\u0645\u064A\u0644 \u2014 \u062A\u063A\u064A\u0651\u0631\u062A \u0627\u0644\u0633\u0627\u0639\u0629 (\u0623\u0648 \u0627\u062E\u062A\u0644\u0641\u062A \u0627\u0644\u0645\u0646\u0637\u0642\u0629 \u0627\u0644\u0632\u0645\u0646\u064A\u0629) \u0628\u064A\u0646 \u0627\u0644\u0628\u064A\u0626\u062A\u064A\u0646.",
89
+ suggestion: "\u0627\u0639\u0631\u0636 \u0627\u0644\u0648\u0642\u062A \u0627\u0644\u062D\u0627\u0644\u064A \u0628\u0639\u062F \u0627\u0644\u062A\u0631\u0643\u064A\u0628\u060C \u0623\u0648 \u0645\u0631\u0651\u0631 \u0637\u0627\u0628\u0639\u064B\u0627 \u0632\u0645\u0646\u064A\u064B\u0627 \u0648\u0627\u062D\u062F\u064B\u0627 \u0645\u0646 \u0627\u0644\u062E\u0627\u062F\u0645 \u0648\u0646\u0633\u0651\u0642\u0647 \u0628\u0627\u0644\u0637\u0631\u064A\u0642\u0629 \u0646\u0641\u0633\u0647\u0627 \u0639\u0644\u0649 \u0627\u0644\u062C\u0627\u0646\u0628\u064A\u0646. \u0648\u062D\u062F\u0651\u062F \u0645\u0646\u0637\u0642\u0629 \u0632\u0645\u0646\u064A\u0629 \u0635\u0631\u064A\u062D\u0629 \u0639\u0646\u062F \u0627\u0644\u062A\u0646\u0633\u064A\u0642."
90
+ },
91
+ "locale-format.bidi": {
92
+ explanation: "\u0627\u0644\u0642\u064A\u0645\u062A\u0627\u0646 \u0644\u0627 \u062A\u062E\u062A\u0644\u0641\u0627\u0646 \u0625\u0644\u0627 \u0628\u0639\u0644\u0627\u0645\u0627\u062A \u062A\u062D\u0643\u0645 \u062B\u0646\u0627\u0626\u064A\u0629 \u0627\u0644\u0627\u062A\u062C\u0627\u0647 \u063A\u064A\u0631 \u0645\u0631\u0626\u064A\u0629 (`LRM` \u0648`RLM` \u0648\u0639\u0644\u0627\u0645\u0627\u062A \u0627\u0644\u0639\u0632\u0644). \u062A\u0636\u064A\u0641 `Intl` \u0647\u0630\u0647 \u0627\u0644\u0639\u0644\u0627\u0645\u0627\u062A \u062D\u0648\u0644 \u0627\u0644\u0623\u0631\u0642\u0627\u0645 \u0648\u0627\u0644\u062A\u0648\u0627\u0631\u064A\u062E \u0641\u064A \u0627\u0644\u0644\u063A\u0627\u062A \u0627\u0644\u062A\u064A \u062A\u064F\u0643\u062A\u0628 \u0645\u0646 \u0627\u0644\u064A\u0645\u064A\u0646 \u0625\u0644\u0649 \u0627\u0644\u064A\u0633\u0627\u0631\u060C \u0648\u062A\u064F\u0635\u062F\u0631 \u0625\u0635\u062F\u0627\u0631\u0627\u062A ICU \u0627\u0644\u0645\u062E\u062A\u0644\u0641\u0629 \u2014 Node \u0645\u0642\u0627\u0628\u0644 \u0627\u0644\u0645\u062A\u0635\u0641\u062D \u2014 \u0639\u0644\u0627\u0645\u0627\u062A \u0645\u062E\u062A\u0644\u0641\u0629 \u0644\u0644\u0645\u062F\u062E\u0644 \u0646\u0641\u0633\u0647.",
93
+ suggestion: "\u0646\u0633\u0651\u0642 \u0627\u0644\u0642\u064A\u0645\u0629 \u0641\u064A \u0645\u0643\u0627\u0646 \u0648\u0627\u062D\u062F \u0648\u0645\u0631\u0651\u0631 \u0627\u0644\u0646\u0635 \u0627\u0644\u0646\u0627\u062A\u062C\u060C \u0623\u0648 \u062B\u0628\u0651\u062A \u0627\u0644\u0644\u063A\u0629 \u0648\u0627\u0644\u0645\u0646\u0637\u0642\u0629 \u0627\u0644\u0632\u0645\u0646\u064A\u0629 \u0646\u0641\u0633\u064A\u0647\u0645\u0627 \u0639\u0644\u0649 \u0627\u0644\u062C\u0627\u0646\u0628\u064A\u0646. \u0648\u0625\u0646 \u0643\u0627\u0646\u062A \u0627\u0644\u0639\u0644\u0627\u0645\u0627\u062A \u063A\u064A\u0631 \u0645\u0624\u0630\u064A\u0629 \u0641\u0623\u0636\u0641 `suppressHydrationWarning` \u0625\u0644\u0649 \u0627\u0644\u0639\u0646\u0635\u0631."
94
+ },
95
+ "locale-format.script": {
96
+ explanation: "\u0646\u064F\u0633\u0651\u0642\u062A \u0627\u0644\u0642\u064A\u0645\u0629 \u0646\u0641\u0633\u0647\u0627 \u0628\u0646\u0638\u0627\u0645\u064E\u064A \u0623\u0631\u0642\u0627\u0645 \u0645\u062E\u062A\u0644\u0641\u064A\u0646 (\u0623\u0631\u0642\u0627\u0645 \u0639\u0631\u0628\u064A\u0629 \u0645\u0634\u0631\u0642\u064A\u0629 `\u0660\u0661\u0662` \u0645\u0642\u0627\u0628\u0644 \u0623\u0631\u0642\u0627\u0645 \u0644\u0627\u062A\u064A\u0646\u064A\u0629 `012`). \u0627\u062E\u062A\u0627\u0631 \u0627\u0644\u062E\u0627\u062F\u0645 \u0648\u0627\u0644\u0639\u0645\u064A\u0644 \u0625\u0639\u062F\u0627\u062F\u064A\u0646 \u0645\u062D\u0644\u064A\u064A\u0646 \u0645\u062E\u062A\u0644\u0641\u064A\u0646.",
97
+ suggestion: "\u0645\u0631\u0651\u0631 `locale` \u0635\u0631\u064A\u062D\u064B\u0627 (\u0648\u0645\u0646\u0637\u0642\u0629 \u0632\u0645\u0646\u064A\u0629) \u0625\u0644\u0649 `Intl.NumberFormat` \u0623\u0648 `toLocaleString` \u0639\u0644\u0649 \u0627\u0644\u062E\u0627\u062F\u0645 \u0648\u0627\u0644\u0639\u0645\u064A\u0644 \u0645\u0639\u064B\u0627\u060C \u0623\u0648 \u0646\u0633\u0651\u0642 \u0627\u0644\u0642\u064A\u0645\u0629 \u0628\u0639\u062F \u0627\u0644\u062A\u0631\u0643\u064A\u0628 \u0644\u064A\u064F\u0633\u062A\u062E\u062F\u0645 \u0625\u0639\u062F\u0627\u062F \u0627\u0644\u0639\u0645\u064A\u0644 \u0648\u062D\u062F\u0647."
98
+ },
99
+ "locale-format.separators": {
100
+ explanation: "\u0646\u064F\u0633\u0651\u0642 \u0627\u0644\u0631\u0642\u0645 \u0646\u0641\u0633\u0647 \u0628\u0641\u0648\u0627\u0635\u0644 \u0622\u0644\u0627\u0641 \u0623\u0648 \u0641\u0648\u0627\u0635\u0644 \u0639\u0634\u0631\u064A\u0629 \u0645\u062E\u062A\u0644\u0641\u0629 \u0628\u064A\u0646 \u0627\u0644\u062E\u0627\u062F\u0645 \u0648\u0627\u0644\u0639\u0645\u064A\u0644 (\u0645\u062B\u0644 `1,234.56` \u0645\u0642\u0627\u0628\u0644 `1.234,56`).",
101
+ suggestion: "\u0645\u0631\u0651\u0631 \u0625\u0639\u062F\u0627\u062F\u064B\u0627 \u0645\u062D\u0644\u064A\u064B\u0627 \u0635\u0631\u064A\u062D\u064B\u0627 \u0625\u0644\u0649 `Intl.NumberFormat` \u0623\u0648 `toLocaleString` \u0639\u0644\u0649 \u0627\u0644\u062C\u0627\u0646\u0628\u064A\u0646 \u0644\u062A\u062A\u0637\u0627\u0628\u0642 \u0627\u0644\u0641\u0648\u0627\u0635\u0644."
102
+ },
103
+ "locale-format.date-order": {
104
+ explanation: "\u0639\u064F\u0631\u0636 \u0627\u0644\u062A\u0627\u0631\u064A\u062E \u0646\u0641\u0633\u0647 \u0628\u062A\u0631\u062A\u064A\u0628 \u062D\u0642\u0648\u0644 \u0645\u062E\u062A\u0644\u0641 (`MM/DD` \u0645\u0642\u0627\u0628\u0644 `DD/MM`) \u0628\u064A\u0646 \u0627\u0644\u062E\u0627\u062F\u0645 \u0648\u0627\u0644\u0639\u0645\u064A\u0644.",
105
+ suggestion: "\u0646\u0633\u0651\u0642 \u0627\u0644\u062A\u0648\u0627\u0631\u064A\u062E \u0628\u0625\u0639\u062F\u0627\u062F \u0645\u062D\u0644\u064A \u0648\u0645\u0646\u0637\u0642\u0629 \u0632\u0645\u0646\u064A\u0629 \u0635\u0631\u064A\u062D\u064A\u0646 \u0639\u0628\u0631 `Intl` \u0639\u0644\u0649 \u0627\u0644\u062C\u0627\u0646\u0628\u064A\u0646."
106
+ },
107
+ "browser-only-api": {
108
+ explanation: "\u0639\u0631\u0636 \u0627\u0644\u0639\u0645\u064A\u0644 \u0645\u062D\u062A\u0648\u0649 \u062A\u0631\u0643\u0647 \u0627\u0644\u062E\u0627\u062F\u0645 \u0641\u0627\u0631\u063A\u064B\u0627 \u2014 \u0648\u0647\u0630\u0647 \u0639\u0644\u0627\u0645\u0629 \u0639\u0644\u0649 \u0642\u0631\u0627\u0621\u0629 \u0648\u0627\u062C\u0647\u0629 \u0644\u0627 \u062A\u062A\u0648\u0641\u0631 \u0625\u0644\u0627 \u0641\u064A \u0627\u0644\u0645\u062A\u0635\u0641\u062D (`window` \u0623\u0648 `document` \u0623\u0648 `localStorage` \u0623\u0648 `navigator` \u0623\u0648 `matchMedia`) \u0623\u062B\u0646\u0627\u0621 \u0627\u0644\u0639\u0631\u0636.",
109
+ suggestion: "\u0627\u062C\u0639\u0644 \u0642\u0631\u0627\u0621\u0627\u062A \u0627\u0644\u0645\u062A\u0635\u0641\u062D \u0645\u0634\u0631\u0648\u0637\u0629 \u0628\u0639\u0644\u0627\u0645\u0629 \u062A\u0631\u0643\u064A\u0628 \u0623\u0648 \u0636\u0639\u0647\u0627 \u062F\u0627\u062E\u0644 `useEffect`\u060C \u0623\u0648 \u0627\u0633\u062A\u062E\u062F\u0645 `useSyncExternalStore` \u0645\u0639 \u0644\u0642\u0637\u0629 \u0644\u0644\u062E\u0627\u062F\u0645 \u0644\u064A\u0637\u0627\u0628\u0642 \u0623\u0648\u0644 \u0639\u0631\u0636 \u0639\u0644\u0649 \u0627\u0644\u0639\u0645\u064A\u0644 \u0645\u0627 \u0639\u0631\u0636\u0647 \u0627\u0644\u062E\u0627\u062F\u0645."
110
+ },
111
+ "viewport-branching": {
112
+ explanation: "\u0623\u064F\u0636\u064A\u0641\u062A \u0634\u062C\u0631\u0629 \u0641\u0631\u0639\u064A\u0629 \u0643\u0627\u0645\u0644\u0629 \u0623\u0648 \u062D\u064F\u0630\u0641\u062A \u0623\u0648 \u0627\u0633\u062A\u064F\u0628\u062F\u0644\u062A \u0628\u064A\u0646 \u0627\u0644\u062E\u0627\u062F\u0645 \u0648\u0627\u0644\u0639\u0645\u064A\u0644 \u2014 \u063A\u0627\u0644\u0628\u064B\u0627 \u0628\u0633\u0628\u0628 \u0641\u062D\u0635 \u0641\u064A JavaScript \u0644\u0639\u0631\u0636 \u0627\u0644\u0634\u0627\u0634\u0629 \u064A\u0641\u0631\u0651\u0639 \u0627\u0644\u0634\u062C\u0631\u0629 \u0641\u064A \u0623\u0648\u0644 \u0639\u0631\u0636.",
113
+ suggestion: "\u0627\u0639\u0631\u0636 \u0627\u0644\u0641\u0631\u0639\u064A\u0646 \u0648\u0628\u062F\u0651\u0644 \u0628\u064A\u0646\u0647\u0645\u0627 \u0628\u0627\u0633\u062A\u0639\u0644\u0627\u0645\u0627\u062A \u0627\u0644\u0648\u0633\u0627\u0626\u0637 \u0641\u064A CSS \u0639\u0646\u062F \u0623\u0648\u0644 \u0631\u0633\u0645 \u0628\u062F\u0644 \u0627\u0644\u062A\u0641\u0631\u064A\u0639 \u0641\u064A JavaScript\u060C \u0623\u0648 \u0623\u062C\u0651\u0644 \u0627\u0644\u0641\u0631\u0639 \u0627\u0644\u0645\u0639\u062A\u0645\u062F \u0639\u0644\u0649 JavaScript \u0625\u0644\u0649 \u0645\u0627 \u0628\u0639\u062F \u0627\u0644\u062A\u0631\u0643\u064A\u0628."
114
+ },
115
+ "invalid-html-nesting": {
116
+ explanation: "\u0646\u064F\u0642\u0644\u062A \u0639\u0642\u062F\u0629 \u0623\u0648 \u0623\u064F\u062E\u0631\u062C\u062A \u0645\u0646 \u0645\u0643\u0627\u0646\u0647\u0627 \u0644\u0623\u0646 \u062A\u0631\u0645\u064A\u0632 HTML \u063A\u064A\u0631 \u0635\u0627\u0644\u062D (\u0645\u062B\u0644 `<div>` \u062F\u0627\u062E\u0644 `<p>`\u060C \u0623\u0648 `<a>` \u062F\u0627\u062E\u0644 `<a>`). \u064A\u064F\u0635\u0644\u062D \u0627\u0644\u0645\u062A\u0635\u0641\u062D DOM \u0627\u0644\u0642\u0627\u062F\u0645 \u0645\u0646 \u0627\u0644\u062E\u0627\u062F\u0645\u060C \u0641\u0644\u0627 \u064A\u0639\u0648\u062F \u0645\u0637\u0627\u0628\u0642\u064B\u0627 \u0644\u0645\u0627 \u064A\u062A\u0648\u0642\u0639\u0647 React.",
117
+ suggestion: "\u0635\u062D\u0651\u062D \u0635\u0644\u0627\u062D\u064A\u0629 \u0627\u0644\u062A\u0631\u0645\u064A\u0632: \u0644\u0627 \u064A\u0645\u0643\u0646 \u0648\u0636\u0639 \u0627\u0644\u0639\u0646\u0627\u0635\u0631 \u0627\u0644\u0643\u062A\u0644\u064A\u0629 \u062F\u0627\u062E\u0644 `<p>`\u060C \u0648\u0644\u0627 \u064A\u0645\u0643\u0646 \u062A\u062F\u0627\u062E\u0644 \u0627\u0644\u0631\u0648\u0627\u0628\u0637. \u0627\u0633\u062A\u0628\u062F\u0644 \u0627\u0644\u0639\u0646\u0635\u0631 \u0627\u0644\u0623\u0628 \u063A\u064A\u0631 \u0627\u0644\u0635\u0627\u0644\u062D \u0628\u0640 `<div>` \u0623\u0648 \u0623\u0639\u062F \u0647\u064A\u0643\u0644\u0629 \u0627\u0644\u0634\u062C\u0631\u0629."
118
+ },
119
+ "whitespace-minification": {
120
+ explanation: "\u0627\u0644\u0627\u062E\u062A\u0644\u0627\u0641 \u0641\u064A \u0627\u0644\u0645\u0633\u0627\u0641\u0627\u062A \u0627\u0644\u0628\u064A\u0636\u0627\u0621 \u0641\u0642\u0637 \u2014 \u0627\u0644\u0646\u0635 \u0645\u062A\u0637\u0627\u0628\u0642 \u0628\u0627\u0633\u062A\u062B\u0646\u0627\u0621 \u0627\u0644\u0645\u0633\u0627\u0641\u0627\u062A \u0648\u0627\u0644\u0623\u0633\u0637\u0631 \u0627\u0644\u062C\u062F\u064A\u062F\u0629. \u0639\u0644\u0649 \u0627\u0644\u0623\u0631\u062C\u062D \u0636\u063A\u0637 \u0645\u064F\u0635\u063A\u0651\u0631 HTML \u0627\u0644\u0645\u0633\u0627\u0641\u0627\u062A \u062D\u0648\u0644 \u062C\u0630\u0631 \u0627\u0644\u0640 Hydration \u0628\u0637\u0631\u064A\u0642\u0629 \u0645\u062E\u062A\u0644\u0641\u0629 \u0639\u0646 React.",
121
+ suggestion: "\u0631\u0627\u062C\u0639 \u0625\u0639\u062F\u0627\u062F\u0627\u062A \u0645\u064F\u0635\u063A\u0651\u0631 HTML (\u0645\u062B\u0644 `conservativeCollapse`) \u062D\u0648\u0644 \u062C\u0630\u0631 \u0627\u0644\u062A\u0637\u0628\u064A\u0642\u060C \u0623\u0648 \u062A\u062C\u0646\u0651\u0628 \u062A\u0635\u063A\u064A\u0631 \u0627\u0644\u0645\u0633\u0627\u0641\u0627\u062A \u062F\u0627\u062E\u0644 \u0627\u0644\u062A\u0631\u0645\u064A\u0632 \u0627\u0644\u0630\u064A \u064A\u0645\u0631 \u0628\u0627\u0644\u0640 Hydration."
122
+ },
123
+ "third-party-dom-mutation.extension-attribute": {
124
+ explanation: "\u062D\u0642\u0646 \u0627\u0645\u062A\u062F\u0627\u062F \u0645\u062A\u0635\u0641\u062D \u0623\u0648 \u0633\u0643\u0631\u0628\u062A \u062E\u0627\u0631\u062C\u064A (\u0645\u062B\u0644 Grammarly \u0623\u0648 ColorZilla) \u0627\u0644\u0633\u0645\u0629 `{attribute}` \u0642\u0628\u0644 \u0627\u0644\u0640 Hydration\u060C \u0641\u0644\u0645 \u064A\u0639\u062F DOM \u0639\u0644\u0649 \u0627\u0644\u0639\u0645\u064A\u0644 \u0645\u0637\u0627\u0628\u0642\u064B\u0627 \u0644\u0644\u062E\u0627\u062F\u0645.",
125
+ suggestion: "\u063A\u0627\u0644\u0628\u064B\u0627 \u0645\u0627 \u064A\u0643\u0648\u0646 \u0647\u0630\u0627 \u063A\u064A\u0631 \u0645\u0624\u0630\u064D. \u0623\u0636\u0641 `suppressHydrationWarning` \u0625\u0644\u0649 \u0627\u0644\u0639\u0646\u0635\u0631 \u0627\u0644\u0645\u062A\u0623\u062B\u0631\u060C \u0623\u0648 \u0623\u062C\u0651\u0644 \u062A\u0647\u064A\u0626\u0629 \u0627\u0644\u0633\u0643\u0631\u0628\u062A \u0627\u0644\u062E\u0627\u0631\u062C\u064A \u0625\u0644\u0649 \u0645\u0627 \u0628\u0639\u062F \u0627\u0644\u0640 Hydration."
126
+ },
127
+ "third-party-dom-mutation.root-attribute": {
128
+ explanation: "\u0638\u0647\u0631\u062A \u0633\u0645\u0629 (`{attribute}`) \u0639\u0644\u0649 \u0639\u0646\u0635\u0631 \u062C\u0630\u0631\u064A \u0644\u0645 \u064A\u0631\u0633\u0644\u0647\u0627 \u0627\u0644\u062E\u0627\u062F\u0645 \u0623\u0628\u062F\u064B\u0627 \u2014 \u0648\u0647\u064A \u0639\u0644\u0627\u0645\u0629 \u0645\u0645\u064A\u0632\u0629 \u0644\u0627\u0645\u062A\u062F\u0627\u062F \u0623\u0648 \u0633\u0643\u0631\u0628\u062A \u062E\u0627\u0631\u062C\u064A \u0645\u0628\u0643\u0631 \u064A\u0639\u062F\u0651\u0644 DOM.",
129
+ suggestion: "\u0623\u0636\u0641 `suppressHydrationWarning` \u0625\u0644\u0649 \u0627\u0644\u0639\u0646\u0635\u0631 \u0627\u0644\u062C\u0630\u0631\u064A\u060C \u0623\u0648 \u0623\u062C\u0651\u0644 \u0627\u0644\u0633\u0643\u0631\u0628\u062A \u0627\u0644\u062E\u0627\u0631\u062C\u064A \u0625\u0644\u0649 \u0645\u0627 \u0628\u0639\u062F \u0627\u0644\u0640 Hydration."
130
+ },
131
+ "third-party-dom-mutation.injected-node": {
132
+ explanation: (p) => [
133
+ "\u062D\u0642\u0646 \u0633\u0643\u0631\u0628\u062A \u062E\u0627\u0631\u062C\u064A \u0623\u0648 \u0627\u0645\u062A\u062F\u0627\u062F \u0645\u062A\u0635\u0641\u062D \u0627\u0644\u0639\u0646\u0635\u0631 ",
134
+ code(param(p, "tag")),
135
+ " (\u0625\u0639\u0644\u0627\u0646\u0627\u062A \u0623\u0648 \u0646\u0627\u0641\u0630\u0629 \u0645\u0648\u0627\u0641\u0642\u0629 \u0623\u0648 \u062A\u062D\u0644\u064A\u0644\u0627\u062A \u0623\u0648 \u0645\u062D\u0627\u062F\u062B\u0629) \u0628\u0639\u062F \u0639\u0631\u0636 \u0627\u0644\u062E\u0627\u062F\u0645. \u0644\u064A\u0633 \u0647\u0630\u0627 \u062C\u0632\u0621\u064B\u0627 \u0645\u0646 \u0627\u0644\u0640 Hydration \u0641\u064A \u062A\u0637\u0628\u064A\u0642\u0643\u060C \u0644\u0630\u0627 \u0641\u0647\u0648 \u063A\u0627\u0644\u0628\u064B\u0627 \u0636\u062C\u064A\u062C \u063A\u064A\u0631 \u0645\u0624\u0630\u064D."
136
+ ],
137
+ suggestion: '\u0625\u0646 \u062D\u0630\u0651\u0631 React \u0645\u0646\u0647 \u0641\u0623\u0636\u0641 `suppressHydrationWarning` \u0625\u0644\u0649 \u0623\u0642\u0631\u0628 \u063A\u0644\u0627\u0641 \u0639\u064F\u0631\u0636 \u0639\u0644\u0649 \u0627\u0644\u062E\u0627\u062F\u0645\u060C \u0623\u0648 \u062D\u0645\u0651\u0644 \u0627\u0644\u0633\u0643\u0631\u0628\u062A \u0627\u0644\u062E\u0627\u0631\u062C\u064A \u0628\u0639\u062F \u0627\u0644\u0640 Hydration (\u0645\u062B\u0644 `<Script strategy="afterInteractive">` \u0641\u064A Next.js).'
138
+ },
139
+ "attribute-mismatch.class": {
140
+ explanation: (p) => [
141
+ "\u062A\u062E\u062A\u0644\u0641 ",
142
+ code("class"),
143
+ " \u0628\u064A\u0646 \u0627\u0644\u062E\u0627\u062F\u0645 \u0648\u0627\u0644\u0639\u0645\u064A\u0644",
144
+ ...classDetail(p, {
145
+ added: "\u0623\u064F\u0636\u064A\u0641 \u0639\u0644\u0649 \u0627\u0644\u0639\u0645\u064A\u0644: ",
146
+ removed: "\u0623\u064F\u0632\u064A\u0644 \u0639\u0644\u0649 \u0627\u0644\u0639\u0645\u064A\u0644: ",
147
+ listSeparator: "\u060C ",
148
+ partSeparator: "\u061B ",
149
+ open: " (",
150
+ close: ")"
151
+ }),
152
+ ". \u0637\u064F\u0628\u0651\u0642\u062A \u0641\u0626\u0629 CSS \u0628\u0634\u0643\u0644 \u0645\u0634\u0631\u0648\u0637 \u0639\u0644\u0649 \u0627\u0644\u0639\u0645\u064A\u0644 \u2014 \u063A\u0627\u0644\u0628\u064B\u0627 \u0628\u0633\u0628\u0628 \u0641\u062D\u0635 \u0644\u062D\u062C\u0645 \u0627\u0644\u0634\u0627\u0634\u0629 \u0623\u0648 \u0627\u0633\u062A\u0639\u0644\u0627\u0645 \u0648\u0633\u0627\u0626\u0637 \u0623\u0648 \u0633\u0645\u0629 (theme) \u0623\u0648 \u0639\u0644\u0627\u0645\u0629 \u0645\u064A\u0632\u0629 \u064A\u064F\u0646\u0641\u064E\u0651\u0630 \u0623\u062B\u0646\u0627\u0621 \u0623\u0648\u0644 \u0639\u0631\u0636."
153
+ ],
154
+ suggestion: "\u0627\u0639\u0631\u0636 \u0642\u064A\u0645\u0629 `className` \u0646\u0641\u0633\u0647\u0627 \u0639\u0644\u0649 \u0627\u0644\u062E\u0627\u062F\u0645 \u0648\u0641\u064A \u0623\u0648\u0644 \u0631\u0633\u0645 \u0639\u0644\u0649 \u0627\u0644\u0639\u0645\u064A\u0644. \u0627\u0646\u0642\u0644 \u0627\u0644\u0634\u0631\u0648\u0637 \u0627\u0644\u062E\u0627\u0635\u0629 \u0628\u0627\u0644\u0639\u0645\u064A\u0644 \u0625\u0644\u0649 `useEffect` \u0623\u0648 \u0639\u0644\u0627\u0645\u0629 \u062A\u0631\u0643\u064A\u0628\u060C \u0623\u0648 \u0646\u0641\u0651\u0630 \u0627\u0644\u062A\u063A\u064A\u064A\u0631 \u0627\u0644\u0628\u0635\u0631\u064A \u0628\u0627\u0633\u062A\u0639\u0644\u0627\u0645\u0627\u062A \u0627\u0644\u0648\u0633\u0627\u0626\u0637 \u0641\u064A CSS \u0628\u062F\u0644 \u062A\u0628\u062F\u064A\u0644 \u0627\u0644\u0641\u0626\u0629 \u0639\u0628\u0631 JavaScript."
155
+ },
156
+ "attribute-mismatch.style": {
157
+ explanation: "\u064A\u062E\u062A\u0644\u0641 `style` \u0627\u0644\u0645\u0636\u0645\u0651\u0646 \u0628\u064A\u0646 \u0627\u0644\u062E\u0627\u062F\u0645 \u0648\u0627\u0644\u0639\u0645\u064A\u0644 \u2014 \u062D\u064F\u0633\u0628 \u0646\u0645\u0637 \u0645\u0636\u0645\u0651\u0646 \u0645\u0646 \u062D\u0627\u0644\u0629 \u062E\u0627\u0635\u0629 \u0628\u0627\u0644\u0639\u0645\u064A\u0644 (\u062D\u062C\u0645 \u0627\u0644\u0634\u0627\u0634\u0629 \u0623\u0648 \u0627\u0644\u0633\u0645\u0629 \u0623\u0648 \u0645\u0648\u0636\u0639 \u0627\u0644\u062A\u0645\u0631\u064A\u0631) \u0623\u062B\u0646\u0627\u0621 \u0627\u0644\u0639\u0631\u0636.",
158
+ suggestion: "\u0627\u062D\u0633\u0628 \u0627\u0644\u0646\u0645\u0637 \u0628\u0639\u062F \u0627\u0644\u062A\u0631\u0643\u064A\u0628 (`useEffect`) \u0644\u064A\u0637\u0627\u0628\u0642 \u0623\u0648\u0644 \u0639\u0631\u0636 \u0639\u0644\u0649 \u0627\u0644\u0639\u0645\u064A\u0644 \u0645\u0627 \u0639\u0631\u0636\u0647 \u0627\u0644\u062E\u0627\u062F\u0645\u060C \u0623\u0648 \u0627\u0646\u0642\u0644\u0647 \u0625\u0644\u0649 \u0641\u0626\u0629 CSS \u0623\u0648 \u0627\u0633\u062A\u0639\u0644\u0627\u0645 \u0648\u0633\u0627\u0626\u0637."
159
+ },
160
+ "attribute-mismatch.generic": {
161
+ explanation: "\u062A\u062E\u062A\u0644\u0641 \u0627\u0644\u0633\u0645\u0629 `{attribute}` \u0628\u064A\u0646 \u0627\u0644\u062E\u0627\u062F\u0645 (`{server}`) \u0648\u0627\u0644\u0639\u0645\u064A\u0644 (`{client}`) \u2014 \u0627\u0634\u062A\u064F\u0642\u0651\u062A \u0642\u064A\u0645\u062A\u0647\u0627 \u0645\u0646 \u0634\u064A\u0621 \u064A\u062E\u062A\u0644\u0641 \u0628\u064A\u0646 \u0627\u0644\u062E\u0627\u062F\u0645 \u0648\u0623\u0648\u0644 \u0639\u0631\u0636 \u0639\u0644\u0649 \u0627\u0644\u0639\u0645\u064A\u0644.",
162
+ suggestion: "\u0627\u062C\u0639\u0644 \u0642\u064A\u0645\u0629 \u0627\u0644\u0633\u0645\u0629 \u062D\u062A\u0645\u064A\u0629 \u0639\u0644\u0649 \u0627\u0644\u062E\u0627\u062F\u0645 \u0648\u0627\u0644\u0639\u0645\u064A\u0644\u060C \u0623\u0648 \u0639\u064A\u0651\u0646\u0647\u0627 \u0628\u0639\u062F \u0627\u0644\u062A\u0631\u0643\u064A\u0628 \u0644\u064A\u0637\u0627\u0628\u0642 \u0623\u0648\u0644 \u0639\u0631\u0636 \u0639\u0644\u0649 \u0627\u0644\u0639\u0645\u064A\u0644 HTML \u0627\u0644\u0642\u0627\u062F\u0645 \u0645\u0646 \u0627\u0644\u062E\u0627\u062F\u0645."
163
+ },
164
+ unknown: {
165
+ explanation: "\u0627\u0643\u062A\u064F\u0634\u0641 \u0639\u062F\u0645 \u062A\u0637\u0627\u0628\u0642 \u0641\u064A \u0627\u0644\u0640 Hydration \u0644\u0643\u0646 \u062A\u0639\u0630\u0651\u0631\u062A \u0645\u0637\u0627\u0628\u0642\u062A\u0647 \u0645\u0639 \u0633\u0628\u0628 \u0645\u0639\u0631\u0648\u0641. \u0627\u0641\u062D\u0635 \u0642\u064A\u0645\u062A\u064E\u064A \u0627\u0644\u062E\u0627\u062F\u0645 \u0648\u0627\u0644\u0639\u0645\u064A\u0644 \u0623\u0639\u0644\u0627\u0647.",
166
+ suggestion: "\u0642\u0627\u0631\u0646 \u0628\u064A\u0646 \u0642\u064A\u0645\u062A\u064E\u064A \u0627\u0644\u062E\u0627\u062F\u0645 \u0648\u0627\u0644\u0639\u0645\u064A\u0644. \u0645\u0646 \u0627\u0644\u0623\u0633\u0628\u0627\u0628 \u0627\u0644\u0634\u0627\u0626\u0639\u0629: \u0627\u0644\u0642\u064A\u0645 \u063A\u064A\u0631 \u0627\u0644\u062D\u062A\u0645\u064A\u0629\u060C \u0648\u0627\u0644\u062A\u0648\u0627\u0631\u064A\u062E \u0648\u0627\u0644\u0625\u0639\u062F\u0627\u062F\u0627\u062A \u0627\u0644\u0645\u062D\u0644\u064A\u0629\u060C \u0648\u0627\u0644\u0648\u0627\u062C\u0647\u0627\u062A \u0627\u0644\u062E\u0627\u0635\u0629 \u0628\u0627\u0644\u0645\u062A\u0635\u0641\u062D \u0627\u0644\u0645\u0633\u062A\u062E\u062F\u0645\u0629 \u0623\u062B\u0646\u0627\u0621 \u0627\u0644\u0639\u0631\u0636."
167
+ },
168
+ "unknown.no-location": {
169
+ explanation: "\u0623\u0628\u0644\u063A React \u0628\u0641\u0634\u0644 \u0627\u0644\u0640 Hydration \u062F\u0648\u0646 \u0623\u0646 \u064A\u062D\u062F\u062F \u0627\u0644\u0639\u0642\u062F\u0629 \u0627\u0644\u0645\u062E\u062A\u0644\u0641\u0629\u060C \u0648\u0644\u0645 \u064A\u062C\u062F \u0641\u062D\u0635 DOM \u0623\u064A \u0627\u062E\u062A\u0644\u0627\u0641 \u064A\u0645\u0643\u0646 \u0627\u0644\u0625\u0634\u0627\u0631\u0629 \u0625\u0644\u064A\u0647.",
170
+ suggestion: "\u062A\u0623\u0643\u062F \u0645\u0646 \u0648\u062C\u0648\u062F `<HydrationSnapshotScript>` (\u0623\u0648 \u0633\u0643\u0631\u0628\u062A \u0627\u0644\u0644\u0642\u0637\u0629 \u0627\u0644\u064A\u062F\u0648\u064A) \u062F\u0627\u062E\u0644 `<head>` \u0644\u064A\u062A\u0645\u0643\u0646 \u0641\u062D\u0635 DOM \u0645\u0646 \u062A\u062D\u062F\u064A\u062F \u0627\u0644\u0639\u0642\u062F\u0629\u060C \u0648\u0627\u0642\u0631\u0623 \u062A\u062D\u0630\u064A\u0631 React \u0627\u0644\u0643\u0627\u0645\u0644 \u0641\u064A \u0648\u062D\u062F\u0629 \u062A\u062D\u0643\u0645 \u0627\u0644\u0645\u062A\u0635\u0641\u062D."
171
+ }
172
+ };
173
+ var arPlural;
174
+ function arabicPlural(count) {
175
+ if (arPlural === void 0) {
176
+ arPlural = typeof Intl !== "undefined" && typeof Intl.PluralRules === "function" ? new Intl.PluralRules("ar") : null;
177
+ }
178
+ return arPlural?.select(count) ?? "other";
179
+ }
180
+ function arabicIssues(count) {
181
+ switch (arabicPlural(count)) {
182
+ case "zero":
183
+ return "\u0644\u0627 \u0645\u0634\u0643\u0644\u0627\u062A";
184
+ case "one":
185
+ return "\u0645\u0634\u0643\u0644\u0629 \u0648\u0627\u062D\u062F\u0629";
186
+ case "two":
187
+ return "\u0645\u0634\u0643\u0644\u062A\u0627\u0646";
188
+ case "few":
189
+ return `${count} \u0645\u0634\u0643\u0644\u0627\u062A`;
190
+ default:
191
+ return `${count} \u0645\u0634\u0643\u0644\u0629`;
192
+ }
193
+ }
194
+ var AR = {
195
+ dir: "rtl",
196
+ title: "\u0639\u062F\u0645 \u062A\u0637\u0627\u0628\u0642 \u0641\u064A \u0627\u0644\u0640 Hydration",
197
+ dialogLabel: "\u062A\u0634\u062E\u064A\u0635 \u0639\u062F\u0645 \u062A\u0637\u0627\u0628\u0642 \u0627\u0644\u0640 Hydration",
198
+ dismiss: "\u0625\u063A\u0644\u0627\u0642",
199
+ dismissLabel: "\u0625\u063A\u0644\u0627\u0642 \u0644\u0648\u062D\u0629 \u0627\u0644\u062A\u0634\u062E\u064A\u0635",
200
+ hintDismissLabel: "\u0625\u062E\u0641\u0627\u0621 \u0627\u0644\u062A\u0644\u0645\u064A\u062D",
201
+ server: "\u0627\u0644\u062E\u0627\u062F\u0645",
202
+ client: "\u0627\u0644\u0639\u0645\u064A\u0644",
203
+ fix: "\u0627\u0644\u062D\u0644:",
204
+ // The docs are only written in English, so say so rather than surprise.
205
+ learnMore: "\u0627\u0639\u0631\u0641 \u0627\u0644\u0645\u0632\u064A\u062F (\u0628\u0627\u0644\u0625\u0646\u062C\u0644\u064A\u0632\u064A\u0629) \u2190",
206
+ none: "(\u0644\u0627 \u0634\u064A\u0621)",
207
+ empty: "(\u0641\u0627\u0631\u063A)",
208
+ fallbackCategory: "\u0639\u062F\u0645 \u062A\u0637\u0627\u0628\u0642",
209
+ categories: {
210
+ "non-deterministic-value": "\u0642\u064A\u0645\u0629 \u063A\u064A\u0631 \u062D\u062A\u0645\u064A\u0629",
211
+ "date-time": "\u0627\u0644\u062A\u0627\u0631\u064A\u062E / \u0627\u0644\u0648\u0642\u062A",
212
+ "locale-format": "\u062A\u0646\u0633\u064A\u0642 \u0627\u0644\u0644\u063A\u0629 \u0648\u0627\u0644\u0645\u0646\u0637\u0642\u0629",
213
+ "browser-only-api": "\u0648\u0627\u062C\u0647\u0629 \u062E\u0627\u0635\u0629 \u0628\u0627\u0644\u0645\u062A\u0635\u0641\u062D",
214
+ "viewport-branching": "\u062A\u0641\u0631\u0651\u0639 \u062D\u0633\u0628 \u062D\u062C\u0645 \u0627\u0644\u0634\u0627\u0634\u0629",
215
+ "invalid-html-nesting": "\u062A\u062F\u0627\u062E\u0644 HTML \u063A\u064A\u0631 \u0635\u0627\u0644\u062D",
216
+ "whitespace-minification": "\u0627\u0644\u0645\u0633\u0627\u0641\u0627\u062A / \u0627\u0644\u062A\u0635\u063A\u064A\u0631",
217
+ "third-party-dom-mutation": "\u062A\u0639\u062F\u064A\u0644 DOM \u0645\u0646 \u0637\u0631\u0641 \u062E\u0627\u0631\u062C\u064A",
218
+ "attribute-mismatch": "\u0627\u062E\u062A\u0644\u0627\u0641 \u0641\u064A \u0627\u0644\u0633\u0645\u0629",
219
+ unknown: "\u063A\u064A\u0631 \u0645\u0639\u0631\u0648\u0641"
220
+ },
221
+ messages: AR_MESSAGES,
222
+ hint: (count) => `\u2193 ${arabicIssues(count)} \u2014 \u0645\u0631\u0651\u0631 \u0644\u0631\u0624\u064A\u0629 \u0627\u0644\u0643\u0644`
223
+ };
224
+
225
+ // src/react/locales/fa.ts
226
+ var FA_MESSAGES = {
227
+ "non-deterministic-value": {
228
+ explanation: "\u0633\u0631\u0648\u0631 \u0648 \u06A9\u0644\u0627\u06CC\u0646\u062A \u062F\u0648 \u0645\u0642\u062F\u0627\u0631 \u0645\u062A\u0641\u0627\u0648\u062A \u0648 \u0628\u0647\u200C\u0638\u0627\u0647\u0631 \u062A\u0635\u0627\u062F\u0641\u06CC \u0631\u0646\u062F\u0631 \u06A9\u0631\u062F\u0646\u062F (\u06CC\u06A9 \u0634\u0646\u0627\u0633\u0647\u060C \u062A\u0648\u06A9\u0646 \u06CC\u0627 \u062E\u0631\u0648\u062C\u06CC `Math.random()`). \u0647\u0631 \u0686\u06CC\u0632 \u063A\u06CC\u0631\u0642\u0637\u0639\u06CC \u062F\u0631 \u0631\u0646\u062F\u0631\u060C \u062F\u0631 \u0647\u0631 \u0637\u0631\u0641 \u0645\u0642\u062F\u0627\u0631 \u0645\u062A\u0641\u0627\u0648\u062A\u06CC \u062A\u0648\u0644\u06CC\u062F \u0645\u06CC\u200C\u06A9\u0646\u062F.",
229
+ suggestion: "\u0628\u0631\u0627\u06CC \u0634\u0646\u0627\u0633\u0647\u200C\u0647\u0627 \u0627\u0632 `useId()` \u062F\u0631 React \u0627\u0633\u062A\u0641\u0627\u062F\u0647 \u06A9\u0646\u06CC\u062F. \u0645\u0642\u062F\u0627\u0631\u0647\u0627\u06CC \u062A\u0635\u0627\u062F\u0641\u06CC \u0631\u0627 \u0628\u0639\u062F \u0627\u0632 mount (\u062F\u0627\u062E\u0644 `useEffect`) \u0628\u0633\u0627\u0632\u06CC\u062F \u06CC\u0627 \u0645\u0642\u062F\u0627\u0631\u06CC \u0631\u0627 \u0627\u0632 \u0633\u0631\u0648\u0631 \u067E\u0627\u0633 \u0628\u062F\u0647\u06CC\u062F \u062A\u0627 \u0647\u0631 \u062F\u0648 \u0637\u0631\u0641 \u06CC\u06A9\u0633\u0627\u0646 \u0628\u0627\u0634\u0646\u062F. \u0647\u0646\u06AF\u0627\u0645 \u0631\u0646\u062F\u0631 \u0647\u0631\u06AF\u0632 `Math.random()` \u06CC\u0627 `crypto` \u0631\u0627 \u0635\u062F\u0627 \u0646\u0632\u0646\u06CC\u062F."
230
+ },
231
+ "date-time": {
232
+ explanation: "\u0645\u0642\u062F\u0627\u0631\u0647\u0627 \u062A\u0627\u0631\u06CC\u062E \u06CC\u0627 \u0632\u0645\u0627\u0646\u200C\u0647\u0627\u06CC\u06CC \u0647\u0633\u062A\u0646\u062F \u06A9\u0647 \u0628\u06CC\u0646 \u0631\u0646\u062F\u0631 \u0633\u0631\u0648\u0631 \u0648 \u0631\u0646\u062F\u0631 \u06A9\u0644\u0627\u06CC\u0646\u062A \u0641\u0631\u0642 \u062F\u0627\u0631\u0646\u062F \u2014 \u0633\u0627\u0639\u062A \u062C\u0644\u0648 \u0631\u0641\u062A\u0647 (\u06CC\u0627 \u0645\u0646\u0637\u0642\u0647\u0654 \u0632\u0645\u0627\u0646\u06CC \u0645\u062A\u0641\u0627\u0648\u062A \u0627\u0633\u062A) \u0628\u06CC\u0646 \u062F\u0648 \u0645\u062D\u06CC\u0637.",
233
+ suggestion: "\u0632\u0645\u0627\u0646 \u0641\u0639\u0644\u06CC \u0631\u0627 \u0628\u0639\u062F \u0627\u0632 mount \u0646\u0645\u0627\u06CC\u0634 \u062F\u0647\u06CC\u062F\u060C \u06CC\u0627 \u06CC\u06A9 timestamp \u0627\u0632 \u0633\u0631\u0648\u0631 \u067E\u0627\u0633 \u0628\u062F\u0647\u06CC\u062F \u0648 \u062F\u0631 \u0647\u0631 \u062F\u0648 \u0637\u0631\u0641 \u06CC\u06A9\u0633\u0627\u0646 \u0642\u0627\u0644\u0628\u200C\u0628\u0646\u062F\u06CC \u06A9\u0646\u06CC\u062F. \u0647\u0646\u06AF\u0627\u0645 \u0642\u0627\u0644\u0628\u200C\u0628\u0646\u062F\u06CC \u06CC\u06A9 \u0645\u0646\u0637\u0642\u0647\u0654 \u0632\u0645\u0627\u0646\u06CC \u0645\u0634\u062E\u0635 \u062A\u0639\u06CC\u06CC\u0646 \u06A9\u0646\u06CC\u062F."
234
+ },
235
+ "locale-format.bidi": {
236
+ explanation: "\u0645\u0642\u062F\u0627\u0631\u0647\u0627 \u0641\u0642\u0637 \u062F\u0631 \u0646\u0648\u06CC\u0633\u0647\u200C\u0647\u0627\u06CC \u06A9\u0646\u062A\u0631\u0644\u06CC \u062F\u0648\u0633\u0648\u06CC\u0647\u0654 \u0646\u0627\u0645\u0631\u0626\u06CC (`LRM`\u060C `RLM` \u0648 \u0646\u0648\u06CC\u0633\u0647\u200C\u0647\u0627\u06CC \u062C\u062F\u0627\u0633\u0627\u0632\u06CC) \u0641\u0631\u0642 \u062F\u0627\u0631\u0646\u062F. `Intl` \u0627\u06CC\u0646 \u0646\u0648\u06CC\u0633\u0647\u200C\u0647\u0627 \u0631\u0627 \u062F\u0631 \u0632\u0628\u0627\u0646\u200C\u0647\u0627\u06CC \u0631\u0627\u0633\u062A\u200C\u0628\u0647\u200C\u0686\u067E \u062F\u0648\u0631 \u0627\u0639\u062F\u0627\u062F \u0648 \u062A\u0627\u0631\u06CC\u062E\u200C\u0647\u0627 \u0627\u0636\u0627\u0641\u0647 \u0645\u06CC\u200C\u06A9\u0646\u062F \u0648 \u0646\u0633\u062E\u0647\u200C\u0647\u0627\u06CC \u0645\u062E\u062A\u0644\u0641 ICU \u2014 Node \u062F\u0631 \u0628\u0631\u0627\u0628\u0631 \u0645\u0631\u0648\u0631\u06AF\u0631 \u2014 \u0628\u0631\u0627\u06CC \u0648\u0631\u0648\u062F\u06CC \u06CC\u06A9\u0633\u0627\u0646 \u0646\u0648\u06CC\u0633\u0647\u200C\u0647\u0627\u06CC \u0645\u062A\u0641\u0627\u0648\u062A\u06CC \u0627\u0636\u0627\u0641\u0647 \u0645\u06CC\u200C\u06A9\u0646\u0646\u062F.",
237
+ suggestion: "\u0645\u0642\u062F\u0627\u0631 \u0631\u0627 \u062F\u0631 \u06CC\u06A9 \u062C\u0627 \u0642\u0627\u0644\u0628\u200C\u0628\u0646\u062F\u06CC \u06A9\u0646\u06CC\u062F \u0648 \u0631\u0634\u062A\u0647\u0654 \u062D\u0627\u0635\u0644 \u0631\u0627 \u067E\u0627\u0633 \u0628\u062F\u0647\u06CC\u062F\u060C \u06CC\u0627 \u0632\u0628\u0627\u0646 \u0648 \u0645\u0646\u0637\u0642\u0647\u0654 \u0632\u0645\u0627\u0646\u06CC \u06CC\u06A9\u0633\u0627\u0646\u06CC \u062F\u0631 \u062F\u0648 \u0637\u0631\u0641 \u062A\u0639\u06CC\u06CC\u0646 \u06A9\u0646\u06CC\u062F. \u0627\u06AF\u0631 \u0627\u06CC\u0646 \u0646\u0648\u06CC\u0633\u0647\u200C\u0647\u0627 \u0628\u06CC\u200C\u0636\u0631\u0631\u0646\u062F\u060C `suppressHydrationWarning` \u0631\u0627 \u0628\u0647 \u0639\u0646\u0635\u0631 \u0627\u0636\u0627\u0641\u0647 \u06A9\u0646\u06CC\u062F."
238
+ },
239
+ "locale-format.script": {
240
+ explanation: "\u06CC\u06A9 \u0645\u0642\u062F\u0627\u0631 \u0628\u0627 \u062F\u0648 \u0646\u0638\u0627\u0645 \u0631\u0642\u0645 \u0645\u062A\u0641\u0627\u0648\u062A \u0642\u0627\u0644\u0628\u200C\u0628\u0646\u062F\u06CC \u0634\u062F\u0647 \u0627\u0633\u062A (\u0631\u0642\u0645\u200C\u0647\u0627\u06CC \u0639\u0631\u0628\u06CC-\u0647\u0646\u062F\u06CC `\u0660\u0661\u0662` \u062F\u0631 \u0628\u0631\u0627\u0628\u0631 \u0631\u0642\u0645\u200C\u0647\u0627\u06CC \u0644\u0627\u062A\u06CC\u0646 `012`). \u0633\u0631\u0648\u0631 \u0648 \u06A9\u0644\u0627\u06CC\u0646\u062A \u062A\u0646\u0638\u06CC\u0645\u0627\u062A \u0645\u0646\u0637\u0642\u0647\u200C\u0627\u06CC \u0645\u062A\u0641\u0627\u0648\u062A\u06CC \u0627\u0646\u062A\u062E\u0627\u0628 \u06A9\u0631\u062F\u0647\u200C\u0627\u0646\u062F.",
241
+ suggestion: "\u06CC\u06A9 `locale` \u0645\u0634\u062E\u0635 (\u0648 \u0645\u0646\u0637\u0642\u0647\u0654 \u0632\u0645\u0627\u0646\u06CC) \u0631\u0627 \u0647\u0645 \u062F\u0631 \u0633\u0631\u0648\u0631 \u0648 \u0647\u0645 \u062F\u0631 \u06A9\u0644\u0627\u06CC\u0646\u062A \u0628\u0647 `Intl.NumberFormat` \u06CC\u0627 `toLocaleString` \u0628\u062F\u0647\u06CC\u062F\u060C \u06CC\u0627 \u0645\u0642\u062F\u0627\u0631 \u0631\u0627 \u0628\u0639\u062F \u0627\u0632 mount \u0642\u0627\u0644\u0628\u200C\u0628\u0646\u062F\u06CC \u06A9\u0646\u06CC\u062F \u062A\u0627 \u0641\u0642\u0637 \u062A\u0646\u0638\u06CC\u0645\u0627\u062A \u06A9\u0644\u0627\u06CC\u0646\u062A \u0628\u0647 \u06A9\u0627\u0631 \u0631\u0648\u062F."
242
+ },
243
+ "locale-format.separators": {
244
+ explanation: "\u06CC\u06A9 \u0639\u062F\u062F \u0628\u0627 \u062C\u062F\u0627\u06A9\u0646\u0646\u062F\u0647\u0654 \u0647\u0632\u0627\u0631\u06AF\u0627\u0646 \u06CC\u0627 \u062C\u062F\u0627\u06A9\u0646\u0646\u062F\u0647\u0654 \u0627\u0639\u0634\u0627\u0631 \u0645\u062A\u0641\u0627\u0648\u062A \u0628\u06CC\u0646 \u0633\u0631\u0648\u0631 \u0648 \u06A9\u0644\u0627\u06CC\u0646\u062A \u0642\u0627\u0644\u0628\u200C\u0628\u0646\u062F\u06CC \u0634\u062F\u0647 \u0627\u0633\u062A (\u0645\u062B\u0644\u0627\u064B `1,234.56` \u062F\u0631 \u0628\u0631\u0627\u0628\u0631 `1.234,56`).",
245
+ suggestion: "\u06CC\u06A9 \u062A\u0646\u0638\u06CC\u0645 \u0645\u0646\u0637\u0642\u0647\u200C\u0627\u06CC \u0645\u0634\u062E\u0635 \u0631\u0627 \u062F\u0631 \u0647\u0631 \u062F\u0648 \u0637\u0631\u0641 \u0628\u0647 `Intl.NumberFormat` \u06CC\u0627 `toLocaleString` \u0628\u062F\u0647\u06CC\u062F \u062A\u0627 \u062C\u062F\u0627\u06A9\u0646\u0646\u062F\u0647\u200C\u0647\u0627 \u06CC\u06A9\u0633\u0627\u0646 \u0634\u0648\u0646\u062F."
246
+ },
247
+ "locale-format.date-order": {
248
+ explanation: "\u06CC\u06A9 \u062A\u0627\u0631\u06CC\u062E \u0628\u0627 \u062A\u0631\u062A\u06CC\u0628 \u0628\u062E\u0634\u200C\u0647\u0627\u06CC \u0645\u062A\u0641\u0627\u0648\u062A (`MM/DD` \u062F\u0631 \u0628\u0631\u0627\u0628\u0631 `DD/MM`) \u0628\u06CC\u0646 \u0633\u0631\u0648\u0631 \u0648 \u06A9\u0644\u0627\u06CC\u0646\u062A \u0646\u0645\u0627\u06CC\u0634 \u062F\u0627\u062F\u0647 \u0634\u062F\u0647 \u0627\u0633\u062A.",
249
+ suggestion: "\u062A\u0627\u0631\u06CC\u062E\u200C\u0647\u0627 \u0631\u0627 \u0628\u0627 \u062A\u0646\u0638\u06CC\u0645 \u0645\u0646\u0637\u0642\u0647\u200C\u0627\u06CC \u0648 \u0645\u0646\u0637\u0642\u0647\u0654 \u0632\u0645\u0627\u0646\u06CC \u0645\u0634\u062E\u0635 \u0627\u0632 \u0637\u0631\u06CC\u0642 `Intl` \u062F\u0631 \u0647\u0631 \u062F\u0648 \u0637\u0631\u0641 \u0642\u0627\u0644\u0628\u200C\u0628\u0646\u062F\u06CC \u06A9\u0646\u06CC\u062F."
250
+ },
251
+ "browser-only-api": {
252
+ explanation: "\u06A9\u0644\u0627\u06CC\u0646\u062A \u0645\u062D\u062A\u0648\u0627\u06CC\u06CC \u0631\u0646\u062F\u0631 \u06A9\u0631\u062F \u06A9\u0647 \u0633\u0631\u0648\u0631 \u062E\u0627\u0644\u06CC \u06AF\u0630\u0627\u0634\u062A\u0647 \u0628\u0648\u062F \u2014 \u0646\u0634\u0627\u0646\u0647\u0654 \u062E\u0648\u0627\u0646\u062F\u0646 \u06CC\u06A9 API \u0645\u062E\u0635\u0648\u0635 \u0645\u0631\u0648\u0631\u06AF\u0631 (`window`\u060C `document`\u060C `localStorage`\u060C `navigator`\u060C `matchMedia`) \u0647\u0646\u06AF\u0627\u0645 \u0631\u0646\u062F\u0631.",
253
+ suggestion: "\u062E\u0648\u0627\u0646\u062F\u0646 \u0627\u0632 \u0645\u0631\u0648\u0631\u06AF\u0631 \u0631\u0627 \u067E\u0634\u062A \u06CC\u06A9 \u067E\u0631\u0686\u0645 mount \u06CC\u0627 \u062F\u0627\u062E\u0644 `useEffect` \u0642\u0631\u0627\u0631 \u062F\u0647\u06CC\u062F\u060C \u06CC\u0627 \u0627\u0632 `useSyncExternalStore` \u0628\u0627 snapshot \u0633\u0631\u0648\u0631 \u0627\u0633\u062A\u0641\u0627\u062F\u0647 \u06A9\u0646\u06CC\u062F \u062A\u0627 \u0627\u0648\u0644\u06CC\u0646 \u0631\u0646\u062F\u0631 \u06A9\u0644\u0627\u06CC\u0646\u062A \u0628\u0627 \u0633\u0631\u0648\u0631 \u06CC\u06A9\u0633\u0627\u0646 \u0628\u0627\u0634\u062F."
254
+ },
255
+ "viewport-branching": {
256
+ explanation: "\u06CC\u06A9 \u0632\u06CC\u0631\u062F\u0631\u062E\u062A \u06A9\u0627\u0645\u0644 \u0628\u06CC\u0646 \u0633\u0631\u0648\u0631 \u0648 \u06A9\u0644\u0627\u06CC\u0646\u062A \u0627\u0636\u0627\u0641\u0647\u060C \u062D\u0630\u0641 \u06CC\u0627 \u062C\u0627\u06CC\u06AF\u0632\u06CC\u0646 \u0634\u062F\u0647 \u0627\u0633\u062A \u2014 \u0645\u0639\u0645\u0648\u0644\u0627\u064B \u06CC\u06A9 \u0628\u0631\u0631\u0633\u06CC \u0639\u0631\u0636 \u0635\u0641\u062D\u0647 \u062F\u0631 JavaScript \u06A9\u0647 \u062F\u0631\u062E\u062A \u0631\u0627 \u062F\u0631 \u0627\u0648\u0644\u06CC\u0646 \u0631\u0646\u062F\u0631 \u062F\u0648\u0634\u0627\u062E\u0647 \u0645\u06CC\u200C\u06A9\u0646\u062F.",
257
+ suggestion: "\u0647\u0631 \u062F\u0648 \u0634\u0627\u062E\u0647 \u0631\u0627 \u0631\u0646\u062F\u0631 \u06A9\u0646\u06CC\u062F \u0648 \u062F\u0631 \u0627\u0648\u0644\u06CC\u0646 \u0646\u0645\u0627\u06CC\u0634 \u0628\u0627 media query\u0647\u0627\u06CC CSS \u0628\u06CC\u0646\u0634\u0627\u0646 \u062C\u0627\u0628\u0647\u200C\u062C\u0627 \u0634\u0648\u06CC\u062F\u060C \u0646\u0647 \u0628\u0627 \u0627\u0646\u0634\u0639\u0627\u0628 \u062F\u0631 JavaScript\u061B \u06CC\u0627 \u0634\u0627\u062E\u0647\u0654 \u0648\u0627\u0628\u0633\u062A\u0647 \u0628\u0647 JavaScript \u0631\u0627 \u062A\u0627 \u0628\u0639\u062F \u0627\u0632 mount \u0628\u0647 \u062A\u0639\u0648\u06CC\u0642 \u0628\u06CC\u0646\u062F\u0627\u0632\u06CC\u062F."
258
+ },
259
+ "invalid-html-nesting": {
260
+ explanation: "\u06CC\u06A9 \u06AF\u0631\u0647 \u062C\u0627\u0628\u0647\u200C\u062C\u0627 \u06CC\u0627 \u0628\u06CC\u0631\u0648\u0646 \u0631\u0627\u0646\u062F\u0647 \u0634\u062F \u0686\u0648\u0646 HTML \u0646\u0627\u0645\u0639\u062A\u0628\u0631 \u0627\u0633\u062A (\u0645\u062B\u0644\u0627\u064B `<div>` \u062F\u0627\u062E\u0644 `<p>`\u060C \u06CC\u0627 `<a>` \u062F\u0627\u062E\u0644 `<a>`). \u0645\u0631\u0648\u0631\u06AF\u0631 DOM \u0631\u0633\u06CC\u062F\u0647 \u0627\u0632 \u0633\u0631\u0648\u0631 \u0631\u0627 \u0627\u0635\u0644\u0627\u062D \u0645\u06CC\u200C\u06A9\u0646\u062F \u0648 \u062F\u06CC\u06AF\u0631 \u0628\u0627 \u0627\u0646\u062A\u0638\u0627\u0631 React \u0645\u0637\u0627\u0628\u0642\u062A \u0646\u062F\u0627\u0631\u062F.",
261
+ suggestion: "\u0627\u0639\u062A\u0628\u0627\u0631 HTML \u0631\u0627 \u062F\u0631\u0633\u062A \u06A9\u0646\u06CC\u062F: \u0639\u0646\u0635\u0631\u0647\u0627\u06CC \u0628\u0644\u0648\u06A9\u06CC \u0646\u0645\u06CC\u200C\u062A\u0648\u0627\u0646\u0646\u062F \u062F\u0627\u062E\u0644 `<p>` \u0628\u0627\u0634\u0646\u062F\u060C \u067E\u06CC\u0648\u0646\u062F\u0647\u0627 \u0646\u0645\u06CC\u200C\u062A\u0648\u0627\u0646\u0646\u062F \u062A\u0648\u062F\u0631\u062A\u0648 \u0628\u0627\u0634\u0646\u062F \u0648 \u0645\u0627\u0646\u0646\u062F \u0622\u0646. \u0648\u0627\u0644\u062F \u0646\u0627\u0645\u0639\u062A\u0628\u0631 \u0631\u0627 \u0628\u0627 `<div>` \u062C\u0627\u06CC\u06AF\u0632\u06CC\u0646 \u06A9\u0646\u06CC\u062F \u06CC\u0627 \u0633\u0627\u062E\u062A\u0627\u0631 \u062F\u0631\u062E\u062A \u0631\u0627 \u062A\u063A\u06CC\u06CC\u0631 \u062F\u0647\u06CC\u062F."
262
+ },
263
+ "whitespace-minification": {
264
+ explanation: "\u062A\u0641\u0627\u0648\u062A \u0641\u0642\u0637 \u062F\u0631 \u0641\u0627\u0635\u0644\u0647\u200C\u0647\u0627\u0633\u062A \u2014 \u0645\u062A\u0646 \u062C\u0632 \u0641\u0627\u0635\u0644\u0647\u200C\u0647\u0627 \u0648 \u062E\u0637\u200C\u0647\u0627\u06CC \u062C\u062F\u06CC\u062F \u06CC\u06A9\u0633\u0627\u0646 \u0627\u0633\u062A. \u0627\u062D\u062A\u0645\u0627\u0644\u0627\u064B \u06CC\u06A9 \u06A9\u0648\u0686\u06A9\u200C\u06A9\u0646\u0646\u062F\u0647\u0654 HTML \u0641\u0627\u0635\u0644\u0647\u200C\u0647\u0627\u06CC \u0627\u0637\u0631\u0627\u0641 \u0631\u06CC\u0634\u0647\u0654 Hydration \u0631\u0627 \u0645\u062A\u0641\u0627\u0648\u062A \u0628\u0627 React \u0641\u0634\u0631\u062F\u0647 \u06A9\u0631\u062F\u0647 \u0627\u0633\u062A.",
265
+ suggestion: "\u062A\u0646\u0638\u06CC\u0645\u0627\u062A \u06A9\u0648\u0686\u06A9\u200C\u06A9\u0646\u0646\u062F\u0647\u0654 HTML (\u0645\u062B\u0644\u0627\u064B `conservativeCollapse`) \u0631\u0627 \u0627\u0637\u0631\u0627\u0641 \u0631\u06CC\u0634\u0647\u0654 \u0628\u0631\u0646\u0627\u0645\u0647 \u0628\u0631\u0631\u0633\u06CC \u06A9\u0646\u06CC\u062F\u060C \u06CC\u0627 \u0627\u0632 \u06A9\u0648\u0686\u06A9\u200C\u0633\u0627\u0632\u06CC \u0641\u0627\u0635\u0644\u0647\u200C\u0647\u0627 \u062F\u0631 markup\u06CC \u06A9\u0647 Hydration \u0645\u06CC\u200C\u0634\u0648\u062F \u067E\u0631\u0647\u06CC\u0632 \u06A9\u0646\u06CC\u062F."
266
+ },
267
+ "third-party-dom-mutation.extension-attribute": {
268
+ explanation: "\u0648\u06CC\u0698\u06AF\u06CC `{attribute}` \u067E\u06CC\u0634 \u0627\u0632 Hydration \u062A\u0648\u0633\u0637 \u06CC\u06A9 \u0627\u0641\u0632\u0648\u0646\u0647\u0654 \u0645\u0631\u0648\u0631\u06AF\u0631 \u06CC\u0627 \u0627\u0633\u06A9\u0631\u06CC\u067E\u062A \u0634\u062E\u0635 \u062B\u0627\u0644\u062B (\u0645\u062B\u0644\u0627\u064B Grammarly \u06CC\u0627 ColorZilla) \u062A\u0632\u0631\u06CC\u0642 \u0634\u062F\u0647 \u0627\u0633\u062A\u060C \u0628\u0646\u0627\u0628\u0631\u0627\u06CC\u0646 DOM \u06A9\u0644\u0627\u06CC\u0646\u062A \u062F\u06CC\u06AF\u0631 \u0628\u0627 \u0633\u0631\u0648\u0631 \u06CC\u06A9\u0633\u0627\u0646 \u0646\u06CC\u0633\u062A.",
269
+ suggestion: "\u0645\u0639\u0645\u0648\u0644\u0627\u064B \u0628\u06CC\u200C\u0636\u0631\u0631 \u0627\u0633\u062A. `suppressHydrationWarning` \u0631\u0627 \u0628\u0647 \u0639\u0646\u0635\u0631 \u0645\u0631\u0628\u0648\u0637 \u0627\u0636\u0627\u0641\u0647 \u06A9\u0646\u06CC\u062F\u060C \u06CC\u0627 \u0631\u0627\u0647\u200C\u0627\u0646\u062F\u0627\u0632\u06CC \u0627\u0633\u06A9\u0631\u06CC\u067E\u062A \u062E\u0627\u0631\u062C\u06CC \u0631\u0627 \u062A\u0627 \u0628\u0639\u062F \u0627\u0632 Hydration \u0628\u0647 \u062A\u0639\u0648\u06CC\u0642 \u0628\u06CC\u0646\u062F\u0627\u0632\u06CC\u062F."
270
+ },
271
+ "third-party-dom-mutation.root-attribute": {
272
+ explanation: "\u0648\u06CC\u0698\u06AF\u06CC\u200C\u0627\u06CC (`{attribute}`) \u0631\u0648\u06CC \u06CC\u06A9 \u0639\u0646\u0635\u0631 \u0631\u06CC\u0634\u0647 \u0638\u0627\u0647\u0631 \u0634\u062F \u06A9\u0647 \u0633\u0631\u0648\u0631 \u0647\u0631\u06AF\u0632 \u0646\u0641\u0631\u0633\u062A\u0627\u062F\u0647 \u0628\u0648\u062F \u2014 \u0646\u0634\u0627\u0646\u0647\u0654 \u0628\u0627\u0631\u0632 \u06CC\u06A9 \u0627\u0641\u0632\u0648\u0646\u0647 \u06CC\u0627 \u0627\u0633\u06A9\u0631\u06CC\u067E\u062A \u0634\u062E\u0635 \u062B\u0627\u0644\u062B \u0632\u0648\u062F\u0647\u0646\u06AF\u0627\u0645 \u06A9\u0647 DOM \u0631\u0627 \u062A\u063A\u06CC\u06CC\u0631 \u0645\u06CC\u200C\u062F\u0647\u062F.",
273
+ suggestion: "`suppressHydrationWarning` \u0631\u0627 \u0628\u0647 \u0639\u0646\u0635\u0631 \u0631\u06CC\u0634\u0647 \u0627\u0636\u0627\u0641\u0647 \u06A9\u0646\u06CC\u062F\u060C \u06CC\u0627 \u0627\u0633\u06A9\u0631\u06CC\u067E\u062A \u062E\u0627\u0631\u062C\u06CC \u0631\u0627 \u062A\u0627 \u0628\u0639\u062F \u0627\u0632 Hydration \u0628\u0647 \u062A\u0639\u0648\u06CC\u0642 \u0628\u06CC\u0646\u062F\u0627\u0632\u06CC\u062F."
274
+ },
275
+ "third-party-dom-mutation.injected-node": {
276
+ explanation: (p) => [
277
+ "\u06CC\u06A9 \u0627\u0633\u06A9\u0631\u06CC\u067E\u062A \u0634\u062E\u0635 \u062B\u0627\u0644\u062B \u06CC\u0627 \u0627\u0641\u0632\u0648\u0646\u0647\u0654 \u0645\u0631\u0648\u0631\u06AF\u0631 \u0639\u0646\u0635\u0631 ",
278
+ code(param(p, "tag")),
279
+ " \u0631\u0627 \u067E\u0633 \u0627\u0632 \u0631\u0646\u062F\u0631 \u0633\u0631\u0648\u0631 \u062A\u0632\u0631\u06CC\u0642 \u06A9\u0631\u062F (\u062A\u0628\u0644\u06CC\u063A\u0627\u062A\u060C \u0631\u0636\u0627\u06CC\u062A\u200C\u0646\u0627\u0645\u0647\u060C \u0622\u0646\u0627\u0644\u06CC\u062A\u06CC\u06A9\u0633 \u06CC\u0627 \u0686\u062A). \u0627\u06CC\u0646 \u0628\u062E\u0634\u06CC \u0627\u0632 Hydration \u0628\u0631\u0646\u0627\u0645\u0647\u0654 \u0634\u0645\u0627 \u0646\u06CC\u0633\u062A\u060C \u067E\u0633 \u0645\u0639\u0645\u0648\u0644\u0627\u064B \u0646\u0648\u06CC\u0632\u06CC \u0628\u06CC\u200C\u0636\u0631\u0631 \u0627\u0633\u062A."
280
+ ],
281
+ suggestion: '\u0627\u06AF\u0631 React \u062F\u0631\u0628\u0627\u0631\u0647\u0654 \u0622\u0646 \u0647\u0634\u062F\u0627\u0631 \u0645\u06CC\u200C\u062F\u0647\u062F\u060C `suppressHydrationWarning` \u0631\u0627 \u0628\u0647 \u0646\u0632\u062F\u06CC\u06A9\u200C\u062A\u0631\u06CC\u0646 \u067E\u0648\u0634\u0634 \u0631\u0646\u062F\u0631\u0634\u062F\u0647 \u062F\u0631 \u0633\u0631\u0648\u0631 \u0627\u0636\u0627\u0641\u0647 \u06A9\u0646\u06CC\u062F\u060C \u06CC\u0627 \u0627\u0633\u06A9\u0631\u06CC\u067E\u062A \u062E\u0627\u0631\u062C\u06CC \u0631\u0627 \u0628\u0639\u062F \u0627\u0632 Hydration \u0628\u0627\u0631\u06AF\u0630\u0627\u0631\u06CC \u06A9\u0646\u06CC\u062F (\u0645\u062B\u0644\u0627\u064B `<Script strategy="afterInteractive">` \u062F\u0631 Next.js).'
282
+ },
283
+ "attribute-mismatch.class": {
284
+ explanation: (p) => [
285
+ "\u0648\u06CC\u0698\u06AF\u06CC ",
286
+ code("class"),
287
+ " \u0628\u06CC\u0646 \u0633\u0631\u0648\u0631 \u0648 \u06A9\u0644\u0627\u06CC\u0646\u062A \u0641\u0631\u0642 \u062F\u0627\u0631\u062F",
288
+ ...classDetail(p, {
289
+ added: "\u062F\u0631 \u06A9\u0644\u0627\u06CC\u0646\u062A \u0627\u0636\u0627\u0641\u0647 \u0634\u062F: ",
290
+ removed: "\u062F\u0631 \u06A9\u0644\u0627\u06CC\u0646\u062A \u062D\u0630\u0641 \u0634\u062F: ",
291
+ listSeparator: "\u060C ",
292
+ partSeparator: "\u061B ",
293
+ open: " (",
294
+ close: ")"
295
+ }),
296
+ ". \u06CC\u06A9 \u06A9\u0644\u0627\u0633 \u0628\u0647\u200C\u0635\u0648\u0631\u062A \u0634\u0631\u0637\u06CC \u062F\u0631 \u06A9\u0644\u0627\u06CC\u0646\u062A \u0627\u0639\u0645\u0627\u0644 \u0634\u062F\u0647 \u0627\u0633\u062A \u2014 \u0645\u0639\u0645\u0648\u0644\u0627\u064B \u0628\u0631\u0631\u0633\u06CC \u0627\u0646\u062F\u0627\u0632\u0647\u0654 \u0635\u0641\u062D\u0647\u060C media query\u060C \u062A\u0645 \u06CC\u0627 feature flag \u06A9\u0647 \u062F\u0631 \u0627\u0648\u0644\u06CC\u0646 \u0631\u0646\u062F\u0631 \u0627\u062C\u0631\u0627 \u0645\u06CC\u200C\u0634\u0648\u062F."
297
+ ],
298
+ suggestion: "\u0647\u0645\u0627\u0646 `className` \u0631\u0627 \u062F\u0631 \u0633\u0631\u0648\u0631 \u0648 \u0627\u0648\u0644\u06CC\u0646 \u0646\u0645\u0627\u06CC\u0634 \u06A9\u0644\u0627\u06CC\u0646\u062A \u0631\u0646\u062F\u0631 \u06A9\u0646\u06CC\u062F. \u0634\u0631\u0637\u200C\u0647\u0627\u06CC \u0645\u062E\u0635\u0648\u0635 \u06A9\u0644\u0627\u06CC\u0646\u062A \u0631\u0627 \u0628\u0647 `useEffect` \u06CC\u0627 \u06CC\u06A9 \u067E\u0631\u0686\u0645 mount \u0645\u0646\u062A\u0642\u0644 \u06A9\u0646\u06CC\u062F\u060C \u06CC\u0627 \u062A\u063A\u06CC\u06CC\u0631 \u0638\u0627\u0647\u0631\u06CC \u0631\u0627 \u0628\u0627 media query\u0647\u0627\u06CC CSS \u0627\u0646\u062C\u0627\u0645 \u062F\u0647\u06CC\u062F \u0646\u0647 \u0628\u0627 \u062A\u063A\u06CC\u06CC\u0631 \u06A9\u0644\u0627\u0633 \u062F\u0631 JavaScript."
299
+ },
300
+ "attribute-mismatch.style": {
301
+ explanation: "`style` \u062F\u0631\u0648\u0646\u200C\u062E\u0637\u06CC \u0628\u06CC\u0646 \u0633\u0631\u0648\u0631 \u0648 \u06A9\u0644\u0627\u06CC\u0646\u062A \u0641\u0631\u0642 \u062F\u0627\u0631\u062F \u2014 \u06CC\u06A9 \u0627\u0633\u062A\u0627\u06CC\u0644 \u062F\u0631\u0648\u0646\u200C\u062E\u0637\u06CC \u0647\u0646\u06AF\u0627\u0645 \u0631\u0646\u062F\u0631 \u0627\u0632 \u0648\u0636\u0639\u06CC\u062A \u0645\u062E\u0635\u0648\u0635 \u06A9\u0644\u0627\u06CC\u0646\u062A (\u0627\u0646\u062F\u0627\u0632\u0647\u0654 \u0635\u0641\u062D\u0647\u060C \u062A\u0645\u060C \u0645\u0648\u0642\u0639\u06CC\u062A \u0627\u0633\u06A9\u0631\u0648\u0644) \u0645\u062D\u0627\u0633\u0628\u0647 \u0634\u062F\u0647 \u0627\u0633\u062A.",
302
+ suggestion: "\u0627\u0633\u062A\u0627\u06CC\u0644 \u0631\u0627 \u0628\u0639\u062F \u0627\u0632 mount (`useEffect`) \u0645\u062D\u0627\u0633\u0628\u0647 \u06A9\u0646\u06CC\u062F \u062A\u0627 \u0627\u0648\u0644\u06CC\u0646 \u0631\u0646\u062F\u0631 \u06A9\u0644\u0627\u06CC\u0646\u062A \u0628\u0627 \u0633\u0631\u0648\u0631 \u06CC\u06A9\u0633\u0627\u0646 \u0628\u0627\u0634\u062F\u060C \u06CC\u0627 \u0622\u0646 \u0631\u0627 \u0628\u0647 \u06CC\u06A9 \u06A9\u0644\u0627\u0633 CSS \u06CC\u0627 media query \u0645\u0646\u062A\u0642\u0644 \u06A9\u0646\u06CC\u062F."
303
+ },
304
+ "attribute-mismatch.generic": {
305
+ explanation: "\u0648\u06CC\u0698\u06AF\u06CC `{attribute}` \u0628\u06CC\u0646 \u0633\u0631\u0648\u0631 (`{server}`) \u0648 \u06A9\u0644\u0627\u06CC\u0646\u062A (`{client}`) \u0641\u0631\u0642 \u062F\u0627\u0631\u062F \u2014 \u0645\u0642\u062F\u0627\u0631 \u0622\u0646 \u0627\u0632 \u0686\u06CC\u0632\u06CC \u06AF\u0631\u0641\u062A\u0647 \u0634\u062F\u0647 \u06A9\u0647 \u0628\u06CC\u0646 \u0633\u0631\u0648\u0631 \u0648 \u0627\u0648\u0644\u06CC\u0646 \u0631\u0646\u062F\u0631 \u06A9\u0644\u0627\u06CC\u0646\u062A \u0645\u062A\u0641\u0627\u0648\u062A \u0627\u0633\u062A.",
306
+ suggestion: "\u0648\u06CC\u0698\u06AF\u06CC \u0631\u0627 \u062F\u0631 \u0633\u0631\u0648\u0631 \u0648 \u06A9\u0644\u0627\u06CC\u0646\u062A \u0642\u0637\u0639\u06CC \u06A9\u0646\u06CC\u062F\u060C \u06CC\u0627 \u0622\u0646 \u0631\u0627 \u0628\u0639\u062F \u0627\u0632 mount \u062A\u0646\u0638\u06CC\u0645 \u06A9\u0646\u06CC\u062F \u062A\u0627 \u0627\u0648\u0644\u06CC\u0646 \u0631\u0646\u062F\u0631 \u06A9\u0644\u0627\u06CC\u0646\u062A \u0628\u0627 HTML \u0633\u0631\u0648\u0631 \u06CC\u06A9\u0633\u0627\u0646 \u0628\u0627\u0634\u062F."
307
+ },
308
+ unknown: {
309
+ explanation: "\u06CC\u06A9 \u0646\u0627\u0647\u0645\u062E\u0648\u0627\u0646\u06CC Hydration \u067E\u06CC\u062F\u0627 \u0634\u062F \u0627\u0645\u0627 \u0628\u0627 \u0647\u06CC\u0686 \u0639\u0644\u062A \u0634\u0646\u0627\u062E\u062A\u0647\u200C\u0634\u062F\u0647\u200C\u0627\u06CC \u062A\u0637\u0628\u06CC\u0642 \u062F\u0627\u062F\u0647 \u0646\u0634\u062F. \u0645\u0642\u062F\u0627\u0631\u0647\u0627\u06CC \u0633\u0631\u0648\u0631 \u0648 \u06A9\u0644\u0627\u06CC\u0646\u062A \u0631\u0627 \u062F\u0631 \u0628\u0627\u0644\u0627 \u0628\u0631\u0631\u0633\u06CC \u06A9\u0646\u06CC\u062F.",
310
+ suggestion: "\u0645\u0642\u062F\u0627\u0631\u0647\u0627\u06CC \u0633\u0631\u0648\u0631 \u0648 \u06A9\u0644\u0627\u06CC\u0646\u062A \u0631\u0627 \u0645\u0642\u0627\u06CC\u0633\u0647 \u06A9\u0646\u06CC\u062F. \u0639\u0644\u062A\u200C\u0647\u0627\u06CC \u0631\u0627\u06CC\u062C: \u0645\u0642\u062F\u0627\u0631\u0647\u0627\u06CC \u063A\u06CC\u0631\u0642\u0637\u0639\u06CC\u060C \u062A\u0627\u0631\u06CC\u062E\u200C\u0647\u0627 \u0648 \u062A\u0646\u0638\u06CC\u0645\u0627\u062A \u0645\u0646\u0637\u0642\u0647\u200C\u0627\u06CC\u060C \u0648 API\u0647\u0627\u06CC \u0645\u062E\u0635\u0648\u0635 \u0645\u0631\u0648\u0631\u06AF\u0631 \u06A9\u0647 \u0647\u0646\u06AF\u0627\u0645 \u0631\u0646\u062F\u0631 \u0627\u0633\u062A\u0641\u0627\u062F\u0647 \u0645\u06CC\u200C\u0634\u0648\u0646\u062F."
311
+ },
312
+ "unknown.no-location": {
313
+ explanation: "React \u06AF\u0632\u0627\u0631\u0634 \u062F\u0627\u062F \u06A9\u0647 Hydration \u0634\u06A9\u0633\u062A \u062E\u0648\u0631\u062F\u0647 \u0627\u0645\u0627 \u0646\u06AF\u0641\u062A \u06A9\u062F\u0627\u0645 \u06AF\u0631\u0647 \u0645\u062A\u0641\u0627\u0648\u062A \u0628\u0648\u062F\u0647 \u0627\u0633\u062A\u060C \u0648 \u0628\u0631\u0631\u0633\u06CC DOM \u0647\u0645 \u062A\u0641\u0627\u0648\u062A\u06CC \u0628\u0631\u0627\u06CC \u0646\u0634\u0627\u0646 \u062F\u0627\u062F\u0646 \u067E\u06CC\u062F\u0627 \u0646\u06A9\u0631\u062F.",
314
+ suggestion: "\u0645\u0637\u0645\u0626\u0646 \u0634\u0648\u06CC\u062F `<HydrationSnapshotScript>` (\u06CC\u0627 \u0627\u0633\u06A9\u0631\u06CC\u067E\u062A snapshot \u062F\u0633\u062A\u06CC) \u062F\u0627\u062E\u0644 `<head>` \u0627\u0633\u062A \u062A\u0627 \u0628\u0631\u0631\u0633\u06CC DOM \u0628\u062A\u0648\u0627\u0646\u062F \u06AF\u0631\u0647 \u0631\u0627 \u067E\u06CC\u062F\u0627 \u06A9\u0646\u062F\u060C \u0648 \u0647\u0634\u062F\u0627\u0631 \u06A9\u0627\u0645\u0644 React \u0631\u0627 \u062F\u0631 \u06A9\u0646\u0633\u0648\u0644 \u0645\u0631\u0648\u0631\u06AF\u0631 \u0628\u062E\u0648\u0627\u0646\u06CC\u062F."
315
+ }
316
+ };
317
+ var FA = {
318
+ dir: "rtl",
319
+ title: "\u0646\u0627\u0647\u0645\u062E\u0648\u0627\u0646\u06CC \u062F\u0631 Hydration",
320
+ dialogLabel: "\u0639\u06CC\u0628\u200C\u06CC\u0627\u0628\u06CC \u0646\u0627\u0647\u0645\u062E\u0648\u0627\u0646\u06CC Hydration",
321
+ dismiss: "\u0628\u0633\u062A\u0646",
322
+ dismissLabel: "\u0628\u0633\u062A\u0646 \u067E\u0646\u0644 \u0639\u06CC\u0628\u200C\u06CC\u0627\u0628\u06CC",
323
+ hintDismissLabel: "\u067E\u0646\u0647\u0627\u0646 \u06A9\u0631\u062F\u0646 \u0631\u0627\u0647\u0646\u0645\u0627",
324
+ server: "\u0633\u0631\u0648\u0631",
325
+ client: "\u06A9\u0644\u0627\u06CC\u0646\u062A",
326
+ fix: "\u0631\u0627\u0647\u200C\u062D\u0644:",
327
+ // The docs are only written in English, so say so rather than surprise.
328
+ learnMore: "\u0627\u0637\u0644\u0627\u0639\u0627\u062A \u0628\u06CC\u0634\u062A\u0631 (\u0628\u0647 \u0627\u0646\u06AF\u0644\u06CC\u0633\u06CC) \u2190",
329
+ none: "(\u0647\u06CC\u0686)",
330
+ empty: "(\u062E\u0627\u0644\u06CC)",
331
+ fallbackCategory: "\u0646\u0627\u0647\u0645\u062E\u0648\u0627\u0646\u06CC",
332
+ categories: {
333
+ "non-deterministic-value": "\u0645\u0642\u062F\u0627\u0631 \u063A\u06CC\u0631\u0642\u0637\u0639\u06CC",
334
+ "date-time": "\u062A\u0627\u0631\u06CC\u062E / \u0632\u0645\u0627\u0646",
335
+ "locale-format": "\u0642\u0627\u0644\u0628\u200C\u0628\u0646\u062F\u06CC \u0632\u0628\u0627\u0646 \u0648 \u0645\u0646\u0637\u0642\u0647",
336
+ "browser-only-api": "API \u0645\u062E\u0635\u0648\u0635 \u0645\u0631\u0648\u0631\u06AF\u0631",
337
+ "viewport-branching": "\u0627\u0646\u0634\u0639\u0627\u0628 \u0628\u0631 \u0627\u0633\u0627\u0633 \u0627\u0646\u062F\u0627\u0632\u0647\u0654 \u0635\u0641\u062D\u0647",
338
+ "invalid-html-nesting": "\u062A\u0648\u062F\u0631\u062A\u0648\u06CC\u06CC \u0646\u0627\u0645\u0639\u062A\u0628\u0631 HTML",
339
+ "whitespace-minification": "\u0641\u0627\u0635\u0644\u0647\u200C\u0647\u0627 / \u06A9\u0648\u0686\u06A9\u200C\u0633\u0627\u0632\u06CC",
340
+ "third-party-dom-mutation": "\u062A\u063A\u06CC\u06CC\u0631 DOM \u062A\u0648\u0633\u0637 \u0634\u062E\u0635 \u062B\u0627\u0644\u062B",
341
+ "attribute-mismatch": "\u0646\u0627\u0647\u0645\u062E\u0648\u0627\u0646\u06CC \u0648\u06CC\u0698\u06AF\u06CC",
342
+ unknown: "\u0646\u0627\u0645\u0634\u062E\u0635"
343
+ },
344
+ messages: FA_MESSAGES,
345
+ hint: (count) => `\u2193 ${count === 1 ? "\u06CC\u06A9 \u0645\u0634\u06A9\u0644" : `${count} \u0645\u0634\u06A9\u0644`} \u2014 \u0628\u0631\u0627\u06CC \u062F\u06CC\u062F\u0646 \u0647\u0645\u0647 \u0627\u0633\u06A9\u0631\u0648\u0644 \u06A9\u0646\u06CC\u062F`
346
+ };
347
+
348
+ // src/react/locales/he.ts
349
+ var HE_MESSAGES = {
350
+ "non-deterministic-value": {
351
+ explanation: "\u05D4\u05E9\u05E8\u05EA \u05D5\u05D4\u05DC\u05E7\u05D5\u05D7 \u05E8\u05D9\u05E0\u05D3\u05E8\u05D5 \u05E2\u05E8\u05DB\u05D9\u05DD \u05E9\u05D5\u05E0\u05D9\u05DD \u05E9\u05E0\u05E8\u05D0\u05D9\u05DD \u05D0\u05E7\u05E8\u05D0\u05D9\u05D9\u05DD (\u05DE\u05D6\u05D4\u05D4, \u05D8\u05D5\u05E7\u05DF \u05D0\u05D5 \u05EA\u05D5\u05E6\u05D0\u05D4 \u05E9\u05DC `Math.random()`). \u05DB\u05DC \u05D3\u05D1\u05E8 \u05DC\u05D0 \u05D3\u05D8\u05E8\u05DE\u05D9\u05E0\u05D9\u05E1\u05D8\u05D9 \u05D1\u05E8\u05D9\u05E0\u05D3\u05D5\u05E8 \u05DE\u05E4\u05D9\u05E7 \u05E2\u05E8\u05DA \u05E9\u05D5\u05E0\u05D4 \u05D1\u05DB\u05DC \u05E6\u05D3.",
352
+ suggestion: "\u05D4\u05E9\u05EA\u05DE\u05E9\u05D5 \u05D1-`useId()` \u05E9\u05DC React \u05E2\u05D1\u05D5\u05E8 \u05DE\u05D6\u05D4\u05D9\u05DD. \u05E2\u05E8\u05DB\u05D9\u05DD \u05D0\u05E7\u05E8\u05D0\u05D9\u05D9\u05DD \u05E6\u05E8\u05D5 \u05D0\u05D7\u05E8\u05D9 \u05D4\u05D8\u05E2\u05D9\u05E0\u05D4 (\u05D1\u05EA\u05D5\u05DA `useEffect`) \u05D0\u05D5 \u05D4\u05E2\u05D1\u05D9\u05E8\u05D5 \u05E2\u05E8\u05DA \u05DE\u05D4\u05E9\u05E8\u05EA \u05DB\u05D3\u05D9 \u05E9\u05E9\u05E0\u05D9 \u05D4\u05E6\u05D3\u05D3\u05D9\u05DD \u05D9\u05E1\u05DB\u05D9\u05DE\u05D5. \u05D0\u05DC \u05EA\u05E7\u05E8\u05D0\u05D5 \u05DC-`Math.random()` \u05D0\u05D5 \u05DC-`crypto` \u05D1\u05D6\u05DE\u05DF \u05E8\u05D9\u05E0\u05D3\u05D5\u05E8."
353
+ },
354
+ "date-time": {
355
+ explanation: "\u05D4\u05E2\u05E8\u05DB\u05D9\u05DD \u05D4\u05DD \u05EA\u05D0\u05E8\u05D9\u05DB\u05D9\u05DD \u05D0\u05D5 \u05E9\u05E2\u05D5\u05EA \u05E9\u05E9\u05D5\u05E0\u05D9\u05DD \u05D1\u05D9\u05DF \u05E8\u05D9\u05E0\u05D3\u05D5\u05E8 \u05D4\u05E9\u05E8\u05EA \u05DC\u05E8\u05D9\u05E0\u05D3\u05D5\u05E8 \u05D4\u05DC\u05E7\u05D5\u05D7 \u2014 \u05D4\u05E9\u05E2\u05D5\u05DF \u05D4\u05EA\u05E7\u05D3\u05DD (\u05D0\u05D5 \u05E9\u05D0\u05D6\u05D5\u05E8 \u05D4\u05D6\u05DE\u05DF \u05E9\u05D5\u05E0\u05D4) \u05D1\u05D9\u05DF \u05E9\u05EA\u05D9 \u05D4\u05E1\u05D1\u05D9\u05D1\u05D5\u05EA.",
356
+ suggestion: "\u05D4\u05E6\u05D9\u05D2\u05D5 \u05D0\u05EA \u05D4\u05E9\u05E2\u05D4 \u05D4\u05E0\u05D5\u05DB\u05D7\u05D9\u05EA \u05D0\u05D7\u05E8\u05D9 \u05D4\u05D8\u05E2\u05D9\u05E0\u05D4, \u05D0\u05D5 \u05D4\u05E2\u05D1\u05D9\u05E8\u05D5 \u05D7\u05D5\u05EA\u05DE\u05EA \u05D6\u05DE\u05DF \u05D0\u05D7\u05EA \u05DE\u05D4\u05E9\u05E8\u05EA \u05D5\u05E2\u05E6\u05D1\u05D5 \u05D0\u05D5\u05EA\u05D4 \u05D1\u05D0\u05D5\u05EA\u05D5 \u05D0\u05D5\u05E4\u05DF \u05D1\u05E9\u05E0\u05D9 \u05D4\u05E6\u05D3\u05D3\u05D9\u05DD. \u05E7\u05D1\u05E2\u05D5 \u05D0\u05D6\u05D5\u05E8 \u05D6\u05DE\u05DF \u05DE\u05E4\u05D5\u05E8\u05E9 \u05D1\u05E2\u05EA \u05D4\u05E2\u05D9\u05E6\u05D5\u05D1."
357
+ },
358
+ "locale-format.bidi": {
359
+ explanation: "\u05D4\u05E2\u05E8\u05DB\u05D9\u05DD \u05E9\u05D5\u05E0\u05D9\u05DD \u05E8\u05E7 \u05D1\u05EA\u05D5\u05D5\u05D9 \u05D1\u05E7\u05E8\u05D4 \u05D3\u05D5-\u05DB\u05D9\u05D5\u05D5\u05E0\u05D9\u05D9\u05DD \u05D1\u05DC\u05EA\u05D9 \u05E0\u05E8\u05D0\u05D9\u05DD (`LRM`, `RLM` \u05D5\u05EA\u05D5\u05D5\u05D9 \u05D1\u05D9\u05D3\u05D5\u05D3). `Intl` \u05DE\u05D5\u05E1\u05D9\u05E3 \u05D0\u05D5\u05EA\u05DD \u05E1\u05D1\u05D9\u05D1 \u05DE\u05E1\u05E4\u05E8\u05D9\u05DD \u05D5\u05EA\u05D0\u05E8\u05D9\u05DB\u05D9\u05DD \u05D1\u05E9\u05E4\u05D5\u05EA \u05DE\u05D9\u05DE\u05D9\u05DF \u05DC\u05E9\u05DE\u05D0\u05DC, \u05D5\u05D2\u05E8\u05E1\u05D0\u05D5\u05EA ICU \u05E9\u05D5\u05E0\u05D5\u05EA \u2014 Node \u05DC\u05E2\u05D5\u05DE\u05EA \u05D4\u05D3\u05E4\u05D3\u05E4\u05DF \u2014 \u05DE\u05D5\u05E1\u05D9\u05E4\u05D5\u05EA \u05EA\u05D5\u05D5\u05D9\u05DD \u05E9\u05D5\u05E0\u05D9\u05DD \u05DC\u05D0\u05D5\u05EA\u05D5 \u05E7\u05DC\u05D8.",
360
+ suggestion: "\u05E2\u05E6\u05D1\u05D5 \u05D0\u05EA \u05D4\u05E2\u05E8\u05DA \u05D1\u05DE\u05E7\u05D5\u05DD \u05D0\u05D7\u05D3 \u05D5\u05D4\u05E2\u05D1\u05D9\u05E8\u05D5 \u05D0\u05EA \u05D4\u05DE\u05D7\u05E8\u05D5\u05D6\u05EA \u05D4\u05DC\u05D0\u05D4, \u05D0\u05D5 \u05E7\u05D1\u05E2\u05D5 \u05D0\u05EA \u05D0\u05D5\u05EA\u05D4 \u05E9\u05E4\u05D4 \u05D5\u05D0\u05D5\u05EA\u05D5 \u05D0\u05D6\u05D5\u05E8 \u05D6\u05DE\u05DF \u05D1\u05E9\u05E0\u05D9 \u05D4\u05E6\u05D3\u05D3\u05D9\u05DD. \u05D0\u05DD \u05D4\u05EA\u05D5\u05D5\u05D9\u05DD \u05D0\u05D9\u05E0\u05DD \u05DE\u05D6\u05D9\u05E7\u05D9\u05DD, \u05D4\u05D5\u05E1\u05D9\u05E4\u05D5 `suppressHydrationWarning` \u05DC\u05D0\u05DC\u05DE\u05E0\u05D8."
361
+ },
362
+ "locale-format.script": {
363
+ explanation: "\u05D0\u05D5\u05EA\u05D5 \u05E2\u05E8\u05DA \u05E2\u05D5\u05E6\u05D1 \u05D1\u05DE\u05E2\u05E8\u05DB\u05D5\u05EA \u05E1\u05E4\u05E8\u05D5\u05EA \u05E9\u05D5\u05E0\u05D5\u05EA (\u05E1\u05E4\u05E8\u05D5\u05EA \u05E2\u05E8\u05D1\u05D9\u05D5\u05EA-\u05D4\u05D5\u05D3\u05D9\u05D5\u05EA `\u0660\u0661\u0662` \u05DC\u05E2\u05D5\u05DE\u05EA \u05E1\u05E4\u05E8\u05D5\u05EA \u05DC\u05D8\u05D9\u05E0\u05D9\u05D5\u05EA `012`). \u05D4\u05E9\u05E8\u05EA \u05D5\u05D4\u05DC\u05E7\u05D5\u05D7 \u05D1\u05D7\u05E8\u05D5 \u05D4\u05D2\u05D3\u05E8\u05D5\u05EA \u05D0\u05D6\u05D5\u05E8 \u05E9\u05D5\u05E0\u05D5\u05EA.",
364
+ suggestion: "\u05D4\u05E2\u05D1\u05D9\u05E8\u05D5 `locale` \u05DE\u05E4\u05D5\u05E8\u05E9 (\u05D5\u05D0\u05D6\u05D5\u05E8 \u05D6\u05DE\u05DF) \u05DC-`Intl.NumberFormat` \u05D0\u05D5 \u05DC-`toLocaleString` \u05D2\u05DD \u05D1\u05E9\u05E8\u05EA \u05D5\u05D2\u05DD \u05D1\u05DC\u05E7\u05D5\u05D7, \u05D0\u05D5 \u05E2\u05E6\u05D1\u05D5 \u05D0\u05EA \u05D4\u05E2\u05E8\u05DA \u05D0\u05D7\u05E8\u05D9 \u05D4\u05D8\u05E2\u05D9\u05E0\u05D4 \u05DB\u05DA \u05E9\u05E8\u05E7 \u05D4\u05D2\u05D3\u05E8\u05EA \u05D4\u05DC\u05E7\u05D5\u05D7 \u05EA\u05E9\u05DE\u05E9."
365
+ },
366
+ "locale-format.separators": {
367
+ explanation: "\u05D0\u05D5\u05EA\u05D5 \u05DE\u05E1\u05E4\u05E8 \u05E2\u05D5\u05E6\u05D1 \u05E2\u05DD \u05DE\u05E4\u05E8\u05D9\u05D3\u05D9 \u05D0\u05DC\u05E4\u05D9\u05DD \u05D0\u05D5 \u05DE\u05E4\u05E8\u05D9\u05D3\u05D9\u05DD \u05E2\u05E9\u05E8\u05D5\u05E0\u05D9\u05D9\u05DD \u05E9\u05D5\u05E0\u05D9\u05DD \u05D1\u05D9\u05DF \u05D4\u05E9\u05E8\u05EA \u05DC\u05DC\u05E7\u05D5\u05D7 (\u05DC\u05DE\u05E9\u05DC `1,234.56` \u05DC\u05E2\u05D5\u05DE\u05EA `1.234,56`).",
368
+ suggestion: "\u05D4\u05E2\u05D1\u05D9\u05E8\u05D5 \u05D4\u05D2\u05D3\u05E8\u05EA \u05D0\u05D6\u05D5\u05E8 \u05DE\u05E4\u05D5\u05E8\u05E9\u05EA \u05DC-`Intl.NumberFormat` \u05D0\u05D5 \u05DC-`toLocaleString` \u05D1\u05E9\u05E0\u05D9 \u05D4\u05E6\u05D3\u05D3\u05D9\u05DD \u05DB\u05D3\u05D9 \u05E9\u05D4\u05DE\u05E4\u05E8\u05D9\u05D3\u05D9\u05DD \u05D9\u05EA\u05D0\u05D9\u05DE\u05D5."
369
+ },
370
+ "locale-format.date-order": {
371
+ explanation: "\u05D0\u05D5\u05EA\u05D5 \u05EA\u05D0\u05E8\u05D9\u05DA \u05D4\u05D5\u05E6\u05D2 \u05D1\u05E1\u05D3\u05E8 \u05E9\u05D3\u05D5\u05EA \u05E9\u05D5\u05E0\u05D4 (`MM/DD` \u05DC\u05E2\u05D5\u05DE\u05EA `DD/MM`) \u05D1\u05D9\u05DF \u05D4\u05E9\u05E8\u05EA \u05DC\u05DC\u05E7\u05D5\u05D7.",
372
+ suggestion: "\u05E2\u05E6\u05D1\u05D5 \u05EA\u05D0\u05E8\u05D9\u05DB\u05D9\u05DD \u05E2\u05DD \u05D4\u05D2\u05D3\u05E8\u05EA \u05D0\u05D6\u05D5\u05E8 \u05D5\u05D0\u05D6\u05D5\u05E8 \u05D6\u05DE\u05DF \u05DE\u05E4\u05D5\u05E8\u05E9\u05D9\u05DD \u05D1\u05D0\u05DE\u05E6\u05E2\u05D5\u05EA `Intl` \u05D1\u05E9\u05E0\u05D9 \u05D4\u05E6\u05D3\u05D3\u05D9\u05DD."
373
+ },
374
+ "browser-only-api": {
375
+ explanation: "\u05D4\u05DC\u05E7\u05D5\u05D7 \u05E8\u05D9\u05E0\u05D3\u05E8 \u05EA\u05D5\u05DB\u05DF \u05E9\u05D4\u05E9\u05E8\u05EA \u05D4\u05E9\u05D0\u05D9\u05E8 \u05E8\u05D9\u05E7 \u2014 \u05E1\u05D9\u05DE\u05DF \u05DE\u05D5\u05D1\u05D4\u05E7 \u05DC\u05E7\u05E8\u05D9\u05D0\u05D4 \u05DC-API \u05E9\u05E7\u05D9\u05D9\u05DD \u05E8\u05E7 \u05D1\u05D3\u05E4\u05D3\u05E4\u05DF (`window`, `document`, `localStorage`, `navigator`, `matchMedia`) \u05D1\u05D6\u05DE\u05DF \u05E8\u05D9\u05E0\u05D3\u05D5\u05E8.",
376
+ suggestion: "\u05D4\u05EA\u05E0\u05D5 \u05E7\u05E8\u05D9\u05D0\u05D5\u05EA \u05DE\u05D4\u05D3\u05E4\u05D3\u05E4\u05DF \u05D1\u05D3\u05D2\u05DC \u05D8\u05E2\u05D9\u05E0\u05D4 \u05D0\u05D5 \u05D1-`useEffect`, \u05D0\u05D5 \u05D4\u05E9\u05EA\u05DE\u05E9\u05D5 \u05D1-`useSyncExternalStore` \u05E2\u05DD snapshot \u05DC\u05E9\u05E8\u05EA, \u05DB\u05DA \u05E9\u05D4\u05E8\u05D9\u05E0\u05D3\u05D5\u05E8 \u05D4\u05E8\u05D0\u05E9\u05D5\u05DF \u05D1\u05DC\u05E7\u05D5\u05D7 \u05D9\u05EA\u05D0\u05D9\u05DD \u05DC\u05E9\u05E8\u05EA."
377
+ },
378
+ "viewport-branching": {
379
+ explanation: "\u05EA\u05EA-\u05E2\u05E5 \u05E9\u05DC\u05DD \u05E0\u05D5\u05E1\u05E3, \u05D4\u05D5\u05E1\u05E8 \u05D0\u05D5 \u05D4\u05D5\u05D7\u05DC\u05E3 \u05D1\u05D9\u05DF \u05D4\u05E9\u05E8\u05EA \u05DC\u05DC\u05E7\u05D5\u05D7 \u2014 \u05D1\u05D3\u05E8\u05DA \u05DB\u05DC\u05DC \u05D1\u05D3\u05D9\u05E7\u05D4 \u05E9\u05DC \u05E8\u05D5\u05D7\u05D1 \u05D4\u05DE\u05E1\u05DA \u05D1-JavaScript \u05E9\u05DE\u05E4\u05E6\u05DC\u05EA \u05D0\u05EA \u05D4\u05E2\u05E5 \u05D1\u05E8\u05D9\u05E0\u05D3\u05D5\u05E8 \u05D4\u05E8\u05D0\u05E9\u05D5\u05DF.",
380
+ suggestion: "\u05E8\u05E0\u05D3\u05E8\u05D5 \u05D0\u05EA \u05E9\u05E0\u05D9 \u05D4\u05E2\u05E0\u05E4\u05D9\u05DD \u05D5\u05D4\u05D7\u05DC\u05D9\u05E4\u05D5 \u05D1\u05D9\u05E0\u05D9\u05D4\u05DD \u05E2\u05DD media queries \u05E9\u05DC CSS \u05D1\u05E6\u05D9\u05D5\u05E8 \u05D4\u05E8\u05D0\u05E9\u05D5\u05DF \u05D1\u05DE\u05E7\u05D5\u05DD \u05DC\u05E4\u05E6\u05DC \u05D1-JavaScript, \u05D0\u05D5 \u05D3\u05D7\u05D5 \u05D0\u05EA \u05D4\u05E2\u05E0\u05E3 \u05E9\u05EA\u05DC\u05D5\u05D9 \u05D1-JavaScript \u05DC\u05D0\u05D7\u05E8 \u05D4\u05D8\u05E2\u05D9\u05E0\u05D4."
381
+ },
382
+ "invalid-html-nesting": {
383
+ explanation: "\u05E6\u05D5\u05DE\u05EA \u05D4\u05D5\u05D6\u05D6 \u05D0\u05D5 \u05E0\u05E4\u05DC\u05D8 \u05DB\u05D9 \u05D4-HTML \u05D0\u05D9\u05E0\u05D5 \u05EA\u05E7\u05D9\u05DF (\u05DC\u05DE\u05E9\u05DC `<div>` \u05D1\u05EA\u05D5\u05DA `<p>`, \u05D0\u05D5 `<a>` \u05D1\u05EA\u05D5\u05DA `<a>`). \u05D4\u05D3\u05E4\u05D3\u05E4\u05DF \u05DE\u05EA\u05E7\u05DF \u05D0\u05EA \u05D4-DOM \u05E9\u05D4\u05D2\u05D9\u05E2 \u05DE\u05D4\u05E9\u05E8\u05EA, \u05D5\u05DC\u05DB\u05DF \u05D4\u05D5\u05D0 \u05DB\u05D1\u05E8 \u05DC\u05D0 \u05EA\u05D5\u05D0\u05DD \u05D0\u05EA \u05DE\u05D4 \u05E9-React \u05DE\u05E6\u05E4\u05D4 \u05DC\u05D5.",
384
+ suggestion: "\u05EA\u05E7\u05E0\u05D5 \u05D0\u05EA \u05EA\u05E7\u05D9\u05E0\u05D5\u05EA \u05D4-HTML: \u05D0\u05DC\u05DE\u05E0\u05D8\u05D9 \u05D1\u05DC\u05D5\u05E7 \u05DC\u05D0 \u05D9\u05DB\u05D5\u05DC\u05D9\u05DD \u05DC\u05D4\u05D9\u05D5\u05EA \u05D1\u05EA\u05D5\u05DA `<p>`, \u05E7\u05D9\u05E9\u05D5\u05E8\u05D9\u05DD \u05DC\u05D0 \u05D9\u05DB\u05D5\u05DC\u05D9\u05DD \u05DC\u05D4\u05D9\u05D5\u05EA \u05DE\u05E7\u05D5\u05E0\u05E0\u05D9\u05DD \u05D5\u05DB\u05D3\u05D5\u05DE\u05D4. \u05D4\u05D7\u05DC\u05D9\u05E4\u05D5 \u05D0\u05EA \u05D4\u05D4\u05D5\u05E8\u05D4 \u05D4\u05DC\u05D0 \u05EA\u05E7\u05D9\u05DF \u05D1-`<div>` \u05D0\u05D5 \u05D0\u05E8\u05D2\u05E0\u05D5 \u05DE\u05D7\u05D3\u05E9 \u05D0\u05EA \u05D4\u05E2\u05E5."
385
+ },
386
+ "whitespace-minification": {
387
+ explanation: "\u05D4\u05D4\u05D1\u05D3\u05DC \u05D4\u05D5\u05D0 \u05D1\u05E8\u05D5\u05D5\u05D7\u05D9\u05DD \u05D1\u05DC\u05D1\u05D3 \u2014 \u05D4\u05D8\u05E7\u05E1\u05D8 \u05D6\u05D4\u05D4 \u05DE\u05DC\u05D1\u05D3 \u05E8\u05D5\u05D5\u05D7\u05D9\u05DD \u05D5\u05E9\u05D5\u05E8\u05D5\u05EA \u05D7\u05D3\u05E9\u05D5\u05EA. \u05DB\u05E0\u05E8\u05D0\u05D4 \u05E9-minifier \u05E9\u05DC HTML \u05DB\u05D9\u05D5\u05D5\u05E5 \u05E8\u05D5\u05D5\u05D7\u05D9\u05DD \u05E1\u05D1\u05D9\u05D1 \u05E9\u05D5\u05E8\u05E9 \u05D4-Hydration \u05D1\u05D0\u05D5\u05E4\u05DF \u05E9\u05D5\u05E0\u05D4 \u05DE-React.",
388
+ suggestion: "\u05D1\u05D3\u05E7\u05D5 \u05D0\u05EA \u05D4\u05D2\u05D3\u05E8\u05D5\u05EA \u05D4-minifier \u05E9\u05DC \u05D4-HTML (\u05DC\u05DE\u05E9\u05DC `conservativeCollapse`) \u05E1\u05D1\u05D9\u05D1 \u05E9\u05D5\u05E8\u05E9 \u05D4\u05D0\u05E4\u05DC\u05D9\u05E7\u05E6\u05D9\u05D4, \u05D0\u05D5 \u05D4\u05D9\u05DE\u05E0\u05E2\u05D5 \u05DE\u05DE\u05D9\u05D6\u05E2\u05D5\u05E8 \u05E8\u05D5\u05D5\u05D7\u05D9\u05DD \u05D1\u05EA\u05D5\u05DA markup \u05E9\u05E2\u05D5\u05D1\u05E8 Hydration."
389
+ },
390
+ "third-party-dom-mutation.extension-attribute": {
391
+ explanation: "\u05D4\u05DE\u05D0\u05E4\u05D9\u05D9\u05DF `{attribute}` \u05D4\u05D5\u05D6\u05E8\u05E7 \u05E2\u05DC \u05D9\u05D3\u05D9 \u05EA\u05D5\u05E1\u05E3 \u05D3\u05E4\u05D3\u05E4\u05DF \u05D0\u05D5 \u05E1\u05E7\u05E8\u05D9\u05E4\u05D8 \u05E6\u05D3 \u05E9\u05DC\u05D9\u05E9\u05D9 (\u05DC\u05DE\u05E9\u05DC Grammarly \u05D0\u05D5 ColorZilla) \u05DC\u05E4\u05E0\u05D9 \u05D4-Hydration, \u05D5\u05DC\u05DB\u05DF \u05D4-DOM \u05D1\u05DC\u05E7\u05D5\u05D7 \u05DB\u05D1\u05E8 \u05DC\u05D0 \u05EA\u05D5\u05D0\u05DD \u05DC\u05E9\u05E8\u05EA.",
392
+ suggestion: "\u05D1\u05D3\u05E8\u05DA \u05DB\u05DC\u05DC \u05D6\u05D4 \u05DC\u05D0 \u05DE\u05D6\u05D9\u05E7. \u05D4\u05D5\u05E1\u05D9\u05E4\u05D5 `suppressHydrationWarning` \u05DC\u05D0\u05DC\u05DE\u05E0\u05D8 \u05D4\u05DE\u05D5\u05E9\u05E4\u05E2, \u05D0\u05D5 \u05D3\u05D7\u05D5 \u05D0\u05EA \u05D0\u05EA\u05D7\u05D5\u05DC \u05D4\u05E1\u05E7\u05E8\u05D9\u05E4\u05D8 \u05D4\u05D7\u05D9\u05E6\u05D5\u05E0\u05D9 \u05E2\u05D3 \u05D0\u05D7\u05E8\u05D9 \u05D4-Hydration."
393
+ },
394
+ "third-party-dom-mutation.root-attribute": {
395
+ explanation: "\u05DE\u05D0\u05E4\u05D9\u05D9\u05DF (`{attribute}`) \u05D4\u05D5\u05E4\u05D9\u05E2 \u05E2\u05DC \u05D0\u05DC\u05DE\u05E0\u05D8 \u05E9\u05D5\u05E8\u05E9 \u05E9\u05D4\u05E9\u05E8\u05EA \u05DE\u05E2\u05D5\u05DC\u05DD \u05DC\u05D0 \u05E9\u05DC\u05D7 \u2014 \u05E1\u05D9\u05DE\u05DF \u05D4\u05D9\u05DB\u05E8 \u05DC\u05EA\u05D5\u05E1\u05E3 \u05D0\u05D5 \u05DC\u05E1\u05E7\u05E8\u05D9\u05E4\u05D8 \u05E6\u05D3 \u05E9\u05DC\u05D9\u05E9\u05D9 \u05DE\u05D5\u05E7\u05D3\u05DD \u05E9\u05DE\u05E9\u05E0\u05D4 \u05D0\u05EA \u05D4-DOM.",
396
+ suggestion: "\u05D4\u05D5\u05E1\u05D9\u05E4\u05D5 `suppressHydrationWarning` \u05DC\u05D0\u05DC\u05DE\u05E0\u05D8 \u05D4\u05E9\u05D5\u05E8\u05E9, \u05D0\u05D5 \u05D3\u05D7\u05D5 \u05D0\u05EA \u05D4\u05E1\u05E7\u05E8\u05D9\u05E4\u05D8 \u05D4\u05D7\u05D9\u05E6\u05D5\u05E0\u05D9 \u05E2\u05D3 \u05D0\u05D7\u05E8\u05D9 \u05D4-Hydration."
397
+ },
398
+ "third-party-dom-mutation.injected-node": {
399
+ explanation: (p) => [
400
+ "\u05E1\u05E7\u05E8\u05D9\u05E4\u05D8 \u05E6\u05D3 \u05E9\u05DC\u05D9\u05E9\u05D9 \u05D0\u05D5 \u05EA\u05D5\u05E1\u05E3 \u05D3\u05E4\u05D3\u05E4\u05DF \u05D4\u05D6\u05E8\u05D9\u05E7 \u05D0\u05EA \u05D4\u05D0\u05DC\u05DE\u05E0\u05D8 ",
401
+ code(param(p, "tag")),
402
+ " (\u05E4\u05E8\u05E1\u05D5\u05DE\u05D5\u05EA, \u05D4\u05E1\u05DB\u05DE\u05D4, \u05D0\u05E0\u05DC\u05D9\u05D8\u05D9\u05E7\u05D4 \u05D0\u05D5 \u05E6\u05F3\u05D0\u05D8) \u05D0\u05D7\u05E8\u05D9 \u05E8\u05D9\u05E0\u05D3\u05D5\u05E8 \u05D4\u05E9\u05E8\u05EA. \u05D4\u05D5\u05D0 \u05DC\u05D0 \u05D7\u05DC\u05E7 \u05DE\u05D4-Hydration \u05E9\u05DC \u05D4\u05D0\u05E4\u05DC\u05D9\u05E7\u05E6\u05D9\u05D4 \u05E9\u05DC\u05DB\u05DD, \u05D5\u05DC\u05DB\u05DF \u05D6\u05D4 \u05D1\u05D3\u05E8\u05DA \u05DB\u05DC\u05DC \u05E8\u05E2\u05E9 \u05DC\u05D0 \u05DE\u05D6\u05D9\u05E7."
403
+ ],
404
+ suggestion: '\u05D0\u05DD React \u05DE\u05D6\u05D4\u05D9\u05E8 \u05DC\u05D2\u05D1\u05D9\u05D5, \u05D4\u05D5\u05E1\u05D9\u05E4\u05D5 `suppressHydrationWarning` \u05DC\u05E2\u05D8\u05D9\u05E4\u05D4 \u05D4\u05E7\u05E8\u05D5\u05D1\u05D4 \u05D1\u05D9\u05D5\u05EA\u05E8 \u05E9\u05E8\u05D5\u05E0\u05D3\u05E8\u05D4 \u05D1\u05E9\u05E8\u05EA, \u05D0\u05D5 \u05D8\u05E2\u05E0\u05D5 \u05D0\u05EA \u05D4\u05E1\u05E7\u05E8\u05D9\u05E4\u05D8 \u05D4\u05D7\u05D9\u05E6\u05D5\u05E0\u05D9 \u05D0\u05D7\u05E8\u05D9 \u05D4-Hydration (\u05DC\u05DE\u05E9\u05DC `<Script strategy="afterInteractive">` \u05D1-Next.js).'
405
+ },
406
+ "attribute-mismatch.class": {
407
+ explanation: (p) => [
408
+ "\u05D4-",
409
+ code("class"),
410
+ " \u05E9\u05D5\u05E0\u05D4 \u05D1\u05D9\u05DF \u05D4\u05E9\u05E8\u05EA \u05DC\u05DC\u05E7\u05D5\u05D7",
411
+ ...classDetail(p, {
412
+ added: "\u05E0\u05D5\u05E1\u05E3 \u05D1\u05DC\u05E7\u05D5\u05D7: ",
413
+ removed: "\u05D4\u05D5\u05E1\u05E8 \u05D1\u05DC\u05E7\u05D5\u05D7: ",
414
+ listSeparator: ", ",
415
+ partSeparator: "; ",
416
+ open: " (",
417
+ close: ")"
418
+ }),
419
+ ". \u05DE\u05D7\u05DC\u05E7\u05D4 \u05D4\u05D5\u05D7\u05DC\u05D4 \u05D1\u05EA\u05E0\u05D0\u05D9 \u05D1\u05DC\u05E7\u05D5\u05D7 \u2014 \u05DC\u05E8\u05D5\u05D1 \u05D1\u05D3\u05D9\u05E7\u05D4 \u05E9\u05DC \u05D2\u05D5\u05D3\u05DC \u05DE\u05E1\u05DA, media query, \u05E2\u05E8\u05DB\u05EA \u05E0\u05D5\u05E9\u05D0 \u05D0\u05D5 feature flag \u05E9\u05E8\u05E6\u05D4 \u05D1\u05E8\u05D9\u05E0\u05D3\u05D5\u05E8 \u05D4\u05E8\u05D0\u05E9\u05D5\u05DF."
420
+ ],
421
+ suggestion: "\u05E8\u05E0\u05D3\u05E8\u05D5 \u05D0\u05EA \u05D0\u05D5\u05EA\u05D5 `className` \u05D1\u05E9\u05E8\u05EA \u05D5\u05D1\u05E6\u05D9\u05D5\u05E8 \u05D4\u05E8\u05D0\u05E9\u05D5\u05DF \u05D1\u05DC\u05E7\u05D5\u05D7. \u05D4\u05E2\u05D1\u05D9\u05E8\u05D5 \u05EA\u05E0\u05D0\u05D9\u05DD \u05E9\u05E7\u05D9\u05D9\u05DE\u05D9\u05DD \u05E8\u05E7 \u05D1\u05DC\u05E7\u05D5\u05D7 \u05DC-`useEffect` \u05D0\u05D5 \u05DC\u05D3\u05D2\u05DC \u05D8\u05E2\u05D9\u05E0\u05D4, \u05D0\u05D5 \u05D1\u05E6\u05E2\u05D5 \u05D0\u05EA \u05D4\u05E9\u05D9\u05E0\u05D5\u05D9 \u05D4\u05D7\u05D6\u05D5\u05EA\u05D9 \u05E2\u05DD media queries \u05E9\u05DC CSS \u05D1\u05DE\u05E7\u05D5\u05DD \u05D4\u05D7\u05DC\u05E4\u05EA \u05DE\u05D7\u05DC\u05E7\u05D4 \u05D1-JavaScript."
422
+ },
423
+ "attribute-mismatch.style": {
424
+ explanation: "\u05D4-`style` \u05D4\u05DE\u05D5\u05D8\u05D1\u05E2 \u05E9\u05D5\u05E0\u05D4 \u05D1\u05D9\u05DF \u05D4\u05E9\u05E8\u05EA \u05DC\u05DC\u05E7\u05D5\u05D7 \u2014 \u05E1\u05D2\u05E0\u05D5\u05DF \u05DE\u05D5\u05D8\u05D1\u05E2 \u05D7\u05D5\u05E9\u05D1 \u05DE\u05DE\u05E6\u05D1 \u05E9\u05E7\u05D9\u05D9\u05DD \u05E8\u05E7 \u05D1\u05DC\u05E7\u05D5\u05D7 (\u05D2\u05D5\u05D3\u05DC \u05DE\u05E1\u05DA, \u05E2\u05E8\u05DB\u05EA \u05E0\u05D5\u05E9\u05D0, \u05DE\u05D9\u05E7\u05D5\u05DD \u05D2\u05DC\u05D9\u05DC\u05D4) \u05D1\u05D6\u05DE\u05DF \u05E8\u05D9\u05E0\u05D3\u05D5\u05E8.",
425
+ suggestion: "\u05D7\u05E9\u05D1\u05D5 \u05D0\u05EA \u05D4\u05E1\u05D2\u05E0\u05D5\u05DF \u05D0\u05D7\u05E8\u05D9 \u05D4\u05D8\u05E2\u05D9\u05E0\u05D4 (`useEffect`) \u05DB\u05D3\u05D9 \u05E9\u05D4\u05E8\u05D9\u05E0\u05D3\u05D5\u05E8 \u05D4\u05E8\u05D0\u05E9\u05D5\u05DF \u05D1\u05DC\u05E7\u05D5\u05D7 \u05D9\u05EA\u05D0\u05D9\u05DD \u05DC\u05E9\u05E8\u05EA, \u05D0\u05D5 \u05D4\u05E2\u05D1\u05D9\u05E8\u05D5 \u05D0\u05D5\u05EA\u05D5 \u05DC\u05DE\u05D7\u05DC\u05E7\u05EA CSS \u05D0\u05D5 \u05DC-media query."
426
+ },
427
+ "attribute-mismatch.generic": {
428
+ explanation: "\u05D4\u05DE\u05D0\u05E4\u05D9\u05D9\u05DF `{attribute}` \u05E9\u05D5\u05E0\u05D4 \u05D1\u05D9\u05DF \u05D4\u05E9\u05E8\u05EA (`{server}`) \u05DC\u05DC\u05E7\u05D5\u05D7 (`{client}`) \u2014 \u05D4\u05E2\u05E8\u05DA \u05E9\u05DC\u05D5 \u05E0\u05D2\u05D6\u05E8 \u05DE\u05DE\u05E9\u05D4\u05D5 \u05E9\u05E9\u05D5\u05E0\u05D4 \u05D1\u05D9\u05DF \u05D4\u05E9\u05E8\u05EA \u05DC\u05E8\u05D9\u05E0\u05D3\u05D5\u05E8 \u05D4\u05E8\u05D0\u05E9\u05D5\u05DF \u05D1\u05DC\u05E7\u05D5\u05D7.",
429
+ suggestion: "\u05D4\u05E4\u05DB\u05D5 \u05D0\u05EA \u05D4\u05DE\u05D0\u05E4\u05D9\u05D9\u05DF \u05DC\u05D3\u05D8\u05E8\u05DE\u05D9\u05E0\u05D9\u05E1\u05D8\u05D9 \u05D1\u05E9\u05E8\u05EA \u05D5\u05D1\u05DC\u05E7\u05D5\u05D7, \u05D0\u05D5 \u05E7\u05D1\u05E2\u05D5 \u05D0\u05D5\u05EA\u05D5 \u05D0\u05D7\u05E8\u05D9 \u05D4\u05D8\u05E2\u05D9\u05E0\u05D4 \u05DB\u05DA \u05E9\u05D4\u05E8\u05D9\u05E0\u05D3\u05D5\u05E8 \u05D4\u05E8\u05D0\u05E9\u05D5\u05DF \u05D1\u05DC\u05E7\u05D5\u05D7 \u05D9\u05EA\u05D0\u05D9\u05DD \u05DC-HTML \u05DE\u05D4\u05E9\u05E8\u05EA."
430
+ },
431
+ unknown: {
432
+ explanation: "\u05D6\u05D5\u05D4\u05EA\u05D4 \u05D0\u05D9-\u05D4\u05EA\u05D0\u05DE\u05D4 \u05D1-Hydration \u05D0\u05DA \u05DC\u05D0 \u05E0\u05D9\u05EA\u05DF \u05D4\u05D9\u05D4 \u05DC\u05E9\u05D9\u05D9\u05DA \u05D0\u05D5\u05EA\u05D4 \u05DC\u05E1\u05D9\u05D1\u05D4 \u05D9\u05D3\u05D5\u05E2\u05D4. \u05D1\u05D3\u05E7\u05D5 \u05D0\u05EA \u05E2\u05E8\u05DB\u05D9 \u05D4\u05E9\u05E8\u05EA \u05D5\u05D4\u05DC\u05E7\u05D5\u05D7 \u05DC\u05DE\u05E2\u05DC\u05D4.",
433
+ suggestion: "\u05D4\u05E9\u05D5\u05D5 \u05D1\u05D9\u05DF \u05E2\u05E8\u05DB\u05D9 \u05D4\u05E9\u05E8\u05EA \u05D5\u05D4\u05DC\u05E7\u05D5\u05D7. \u05E1\u05D9\u05D1\u05D5\u05EA \u05E0\u05E4\u05D5\u05E6\u05D5\u05EA \u05D4\u05DF \u05E2\u05E8\u05DB\u05D9\u05DD \u05DC\u05D0 \u05D3\u05D8\u05E8\u05DE\u05D9\u05E0\u05D9\u05E1\u05D8\u05D9\u05D9\u05DD, \u05EA\u05D0\u05E8\u05D9\u05DB\u05D9\u05DD \u05D5\u05D4\u05D2\u05D3\u05E8\u05D5\u05EA \u05D0\u05D6\u05D5\u05E8, \u05D5-API \u05E9\u05DC \u05D3\u05E4\u05D3\u05E4\u05DF \u05E9\u05DE\u05E9\u05DE\u05E9\u05D9\u05DD \u05D1\u05D6\u05DE\u05DF \u05E8\u05D9\u05E0\u05D3\u05D5\u05E8."
434
+ },
435
+ "unknown.no-location": {
436
+ explanation: "React \u05D3\u05D9\u05D5\u05D5\u05D7 \u05E9\u05D4-Hydration \u05E0\u05DB\u05E9\u05DC \u05D0\u05DA \u05DC\u05D0 \u05E6\u05D9\u05D9\u05DF \u05D0\u05D9\u05D6\u05D4 \u05E6\u05D5\u05DE\u05EA \u05E9\u05D5\u05E0\u05D4, \u05D5\u05D1\u05D3\u05D9\u05E7\u05EA \u05D4-DOM \u05DC\u05D0 \u05DE\u05E6\u05D0\u05D4 \u05D4\u05D1\u05D3\u05DC \u05DC\u05D4\u05E6\u05D1\u05D9\u05E2 \u05E2\u05DC\u05D9\u05D5.",
437
+ suggestion: "\u05D5\u05D3\u05D0\u05D5 \u05E9-`<HydrationSnapshotScript>` (\u05D0\u05D5 \u05E1\u05E7\u05E8\u05D9\u05E4\u05D8 \u05D4-snapshot \u05D4\u05D9\u05D3\u05E0\u05D9) \u05E0\u05DE\u05E6\u05D0 \u05D1-`<head>` \u05DB\u05D3\u05D9 \u05E9\u05D1\u05D3\u05D9\u05E7\u05EA \u05D4-DOM \u05EA\u05D5\u05DB\u05DC \u05DC\u05D0\u05EA\u05E8 \u05D0\u05EA \u05D4\u05E6\u05D5\u05DE\u05EA, \u05D5\u05E7\u05E8\u05D0\u05D5 \u05D0\u05EA \u05D4\u05D0\u05D6\u05D4\u05E8\u05D4 \u05D4\u05DE\u05DC\u05D0\u05D4 \u05E9\u05DC React \u05D1\u05E7\u05D5\u05E0\u05E1\u05D5\u05DC\u05EA \u05D4\u05D3\u05E4\u05D3\u05E4\u05DF."
438
+ }
439
+ };
440
+ var hePlural;
441
+ function hebrewIssues(count) {
442
+ if (hePlural === void 0) {
443
+ hePlural = typeof Intl !== "undefined" && typeof Intl.PluralRules === "function" ? new Intl.PluralRules("he") : null;
444
+ }
445
+ switch (hePlural?.select(count) ?? "other") {
446
+ case "one":
447
+ return "\u05D1\u05E2\u05D9\u05D4 \u05D0\u05D7\u05EA";
448
+ case "two":
449
+ return "\u05E9\u05EA\u05D9 \u05D1\u05E2\u05D9\u05D5\u05EA";
450
+ default:
451
+ return `${count} \u05D1\u05E2\u05D9\u05D5\u05EA`;
452
+ }
453
+ }
454
+ var HE = {
455
+ dir: "rtl",
456
+ title: "\u05D0\u05D9-\u05D4\u05EA\u05D0\u05DE\u05D4 \u05D1-Hydration",
457
+ dialogLabel: "\u05D0\u05D1\u05D7\u05D5\u05DF \u05D0\u05D9-\u05D4\u05EA\u05D0\u05DE\u05D4 \u05D1-Hydration",
458
+ dismiss: "\u05E1\u05D2\u05D9\u05E8\u05D4",
459
+ dismissLabel: "\u05E1\u05D2\u05D9\u05E8\u05EA \u05D7\u05DC\u05D5\u05E0\u05D9\u05EA \u05D4\u05D0\u05D1\u05D7\u05D5\u05DF",
460
+ hintDismissLabel: "\u05D4\u05E1\u05EA\u05E8\u05EA \u05D4\u05E8\u05DE\u05D6",
461
+ server: "\u05E9\u05E8\u05EA",
462
+ client: "\u05DC\u05E7\u05D5\u05D7",
463
+ fix: "\u05EA\u05D9\u05E7\u05D5\u05DF:",
464
+ // The docs are only written in English, so say so rather than surprise.
465
+ learnMore: "\u05DC\u05DE\u05D9\u05D3\u05E2 \u05E0\u05D5\u05E1\u05E3 (\u05D1\u05D0\u05E0\u05D2\u05DC\u05D9\u05EA) \u2190",
466
+ none: "(\u05D0\u05D9\u05DF)",
467
+ empty: "(\u05E8\u05D9\u05E7)",
468
+ fallbackCategory: "\u05D0\u05D9-\u05D4\u05EA\u05D0\u05DE\u05D4",
469
+ categories: {
470
+ "non-deterministic-value": "\u05E2\u05E8\u05DA \u05DC\u05D0 \u05D3\u05D8\u05E8\u05DE\u05D9\u05E0\u05D9\u05E1\u05D8\u05D9",
471
+ "date-time": "\u05EA\u05D0\u05E8\u05D9\u05DA / \u05E9\u05E2\u05D4",
472
+ "locale-format": "\u05E2\u05D9\u05E6\u05D5\u05D1 \u05DC\u05E4\u05D9 \u05E9\u05E4\u05D4 \u05D5\u05D0\u05D6\u05D5\u05E8",
473
+ "browser-only-api": "API \u05E9\u05DC \u05D3\u05E4\u05D3\u05E4\u05DF \u05D1\u05DC\u05D1\u05D3",
474
+ "viewport-branching": "\u05D4\u05E1\u05EA\u05E2\u05E4\u05D5\u05EA \u05DC\u05E4\u05D9 \u05D2\u05D5\u05D3\u05DC \u05DE\u05E1\u05DA",
475
+ "invalid-html-nesting": "\u05E7\u05D9\u05E0\u05D5\u05DF HTML \u05DC\u05D0 \u05EA\u05E7\u05D9\u05DF",
476
+ "whitespace-minification": "\u05E8\u05D5\u05D5\u05D7\u05D9\u05DD / \u05DE\u05D9\u05D6\u05E2\u05D5\u05E8",
477
+ "third-party-dom-mutation": "\u05E9\u05D9\u05E0\u05D5\u05D9 DOM \u05E2\u05DC \u05D9\u05D3\u05D9 \u05E6\u05D3 \u05E9\u05DC\u05D9\u05E9\u05D9",
478
+ "attribute-mismatch": "\u05D0\u05D9-\u05D4\u05EA\u05D0\u05DE\u05D4 \u05D1\u05DE\u05D0\u05E4\u05D9\u05D9\u05DF",
479
+ unknown: "\u05DC\u05D0 \u05D9\u05D3\u05D5\u05E2"
480
+ },
481
+ messages: HE_MESSAGES,
482
+ hint: (count) => `\u2193 ${hebrewIssues(count)} \u2014 \u05D2\u05DC\u05DC\u05D5 \u05DB\u05D3\u05D9 \u05DC\u05E8\u05D0\u05D5\u05EA \u05D4\u05DB\u05D5\u05DC`
483
+ };
484
+
485
+ // src/react/i18n.ts
486
+ var EN = {
487
+ dir: "ltr",
488
+ title: "Hydration mismatch",
489
+ dialogLabel: "Hydration mismatch diagnostics",
490
+ dismiss: "Dismiss",
491
+ dismissLabel: "Dismiss diagnostics overlay",
492
+ hintDismissLabel: "Dismiss hint",
493
+ server: "Server",
494
+ client: "Client",
495
+ fix: "Fix:",
496
+ learnMore: "Learn more \u2192",
497
+ none: "(none)",
498
+ empty: "(empty)",
499
+ fallbackCategory: "Mismatch",
500
+ categories: {
501
+ "non-deterministic-value": "Non-deterministic value",
502
+ "date-time": "Date / time",
503
+ "locale-format": "Locale formatting",
504
+ "browser-only-api": "Browser-only API",
505
+ "viewport-branching": "Viewport branching",
506
+ "invalid-html-nesting": "Invalid HTML nesting",
507
+ "whitespace-minification": "Whitespace / minification",
508
+ "third-party-dom-mutation": "Third-party DOM mutation",
509
+ "attribute-mismatch": "Attribute mismatch",
510
+ unknown: "Unknown"
511
+ },
512
+ messages: EN_MESSAGES,
513
+ hint: (count) => `\u2193 ${count} issues \u2014 scroll to see all`
514
+ };
515
+ var OVERLAY_STRINGS = {
516
+ en: EN,
517
+ ar: AR,
518
+ he: HE,
519
+ fa: FA
520
+ };
521
+ var LANG_CODES = [
522
+ ["ar", /^(?:ar|arb|arz|ary|arq|aeb|apc|ajp|acm|afb|ars|acw|ayl|apd)(?:-|$)/i],
523
+ ["he", /^(?:he|iw)(?:-|$)/i],
524
+ ["fa", /^(?:fa|pes|prs)(?:-|$)/i]
525
+ ];
526
+ var SUPPORTED = /* @__PURE__ */ new Set(["en", "ar", "he", "fa"]);
527
+ function resolveLocale(preference) {
528
+ if (preference != null && preference !== "auto") {
529
+ return SUPPORTED.has(preference) ? preference : "en";
530
+ }
531
+ if (typeof document === "undefined") return "en";
532
+ const lang = (document.documentElement.getAttribute("lang") ?? "").trim();
533
+ for (const [locale, codes] of LANG_CODES) if (codes.test(lang)) return locale;
534
+ return "en";
535
+ }
536
+
537
+ // src/react/overlay.ts
538
+ var CONTAINER_ID = "why-hydration-overlay";
539
+ var ARABIC_FACES = 'Tahoma, "Noto Sans Arabic", "Geeza Pro", "Segoe UI"';
540
+ var UI_FONT = `ui-sans-serif, system-ui, -apple-system, "Segoe UI", Roboto, ${ARABIC_FACES}, sans-serif`;
541
+ var MONO_FONT = "ui-monospace, SFMono-Regular, Menlo, Consolas, monospace";
542
+ var STYLES = `
543
+ :host {
544
+ all: initial;
545
+ /* The "all" shorthand deliberately excludes direction/unicode-bidi (CSS
546
+ spec), so these are set explicitly: the host page's own dir must never
547
+ leak in. The panel below then takes its direction from the overlay's
548
+ language, set inside this shadow root where no page style can reach it. */
549
+ direction: ltr;
550
+ unicode-bidi: isolate;
551
+ }
552
+ * { box-sizing: border-box; }
553
+ .wh-panel {
554
+ position: fixed;
555
+ z-index: 2147483647;
556
+ width: min(420px, calc(100vw - 32px));
557
+ max-height: min(70vh, 640px);
558
+ display: flex;
559
+ flex-direction: column;
560
+ font: 13px/1.5 ${UI_FONT};
561
+ color: #e5e7eb;
562
+ background: #0b0f17;
563
+ border: 1px solid #1f2937;
564
+ border-radius: 12px;
565
+ box-shadow: 0 12px 40px rgba(0,0,0,.5);
566
+ overflow: hidden;
567
+ text-align: start;
568
+ }
569
+ .wh-panel[dir="ltr"] { direction: ltr; }
570
+ /* Arabic reads poorly at Latin sizes, and letter-spacing or uppercasing breaks
571
+ the joining between its letters, so the right-to-left panel resets both. */
572
+ .wh-panel[dir="rtl"] { direction: rtl; font-size: 14px; line-height: 1.7; }
573
+ .wh-panel[dir="rtl"] .wh-side .wh-label { text-transform: none; letter-spacing: 0; font-size: 11px; }
574
+ .wh-bottom-right { bottom: 16px; right: 16px; }
575
+ .wh-bottom-left { bottom: 16px; left: 16px; }
576
+ .wh-top-right { top: 16px; right: 16px; }
577
+ .wh-top-left { top: 16px; left: 16px; }
578
+ .wh-header {
579
+ display: flex; align-items: center; gap: 8px;
580
+ padding: 10px 12px;
581
+ background: linear-gradient(180deg, #151b26, #0d1220);
582
+ border-bottom: 1px solid #1f2937;
583
+ }
584
+ .wh-dot { width: 8px; height: 8px; border-radius: 50%; background: #f59e0b; flex: none; }
585
+ .wh-title { font-weight: 600; color: #f3f4f6; }
586
+ .wh-count {
587
+ margin-inline-start: auto; font-size: 11px; color: #9ca3af;
588
+ background: #111827; border: 1px solid #1f2937; border-radius: 999px;
589
+ padding: 1px 8px;
590
+ }
591
+ .wh-btn {
592
+ appearance: none; border: 1px solid #1f2937; background: #111827;
593
+ color: #9ca3af; border-radius: 6px; cursor: pointer;
594
+ font: inherit; font-size: 12px; padding: 3px 8px;
595
+ }
596
+ .wh-btn:hover { color: #f3f4f6; border-color: #374151; }
597
+ .wh-list { flex: 1 1 auto; min-height: 0; overflow-y: auto; overscroll-behavior: contain; padding: 8px; display: flex; flex-direction: column; gap: 8px; }
598
+ .wh-card { flex: 0 0 auto; border: 1px solid #1f2937; border-radius: 10px; background: #0f1521; overflow: hidden; }
599
+ .wh-card-head { display: flex; align-items: center; gap: 8px; padding: 8px 10px; }
600
+ .wh-cat { font-weight: 600; color: #fbbf24; font-size: 12px; }
601
+ .wh-conf { margin-inline-start: auto; font-size: 11px; color: #6b7280; unicode-bidi: isolate; }
602
+ .wh-body { padding: 0 10px 10px; }
603
+ .wh-where { font-size: 11px; color: #9ca3af; overflow-wrap: anywhere; margin-bottom: 4px; }
604
+ /* Selectors, component names, file paths and attribute names are code: they
605
+ stay left-to-right and isolated, or an RTL line mirrors their brackets and
606
+ reorders their segments. */
607
+ .wh-where code, .wh-comp, .wh-attr { unicode-bidi: isolate; font-family: ${MONO_FONT}; }
608
+ .wh-where code { color: #93c5fd; }
609
+ .wh-comp { color: #f3f4f6; font-weight: 600; }
610
+ .wh-attr { color: #c4b5fd; }
611
+ .wh-loc { font-size: 11px; color: #7dd3fc; overflow-wrap: anywhere; margin-bottom: 8px; font-family: ${MONO_FONT}; unicode-bidi: isolate; text-align: start; }
612
+ .wh-diff { display: grid; grid-template-columns: 1fr 1fr; gap: 6px; margin-bottom: 8px; }
613
+ .wh-side { border-radius: 8px; padding: 6px 8px; font-size: 11px; min-width: 0; }
614
+ .wh-server { background: rgba(244,63,94,.08); border: 1px solid rgba(244,63,94,.35); }
615
+ .wh-client { background: rgba(34,197,94,.08); border: 1px solid rgba(34,197,94,.35); }
616
+ .wh-side .wh-label { display: block; font-size: 9px; text-transform: uppercase; letter-spacing: .04em; margin-bottom: 3px; }
617
+ .wh-server .wh-label { color: #fb7185; }
618
+ .wh-client .wh-label { color: #4ade80; }
619
+ /* A value is page data in any script. Each line takes its direction from its
620
+ own first strong character, so Arabic values read right-to-left with their
621
+ punctuation at the end even inside the English panel, and English values
622
+ stay left-to-right inside the Arabic one. Whitespace is preserved: a diff
623
+ viewer that collapses spaces hides whitespace-only mismatches. */
624
+ .wh-value {
625
+ display: block; unicode-bidi: plaintext; text-align: start;
626
+ white-space: pre-wrap; overflow-wrap: anywhere;
627
+ font-family: ${MONO_FONT};
628
+ }
629
+ .wh-value.wh-prose { font-family: ${UI_FONT}; font-size: 12px; }
630
+ .wh-empty-value { color: #6b7280; font-style: italic; font-family: ${UI_FONT}; }
631
+ .wh-invisible {
632
+ display: inline-block; margin: 0 1px; padding: 0 3px; border-radius: 3px;
633
+ font: 600 8px/1.6 ${MONO_FONT}; letter-spacing: .02em; vertical-align: 1px;
634
+ color: #fde68a; background: rgba(245,158,11,.18); border: 1px solid rgba(245,158,11,.45);
635
+ unicode-bidi: isolate; direction: ltr;
636
+ }
637
+ .wh-explain { color: #cbd5e1; margin-bottom: 8px; }
638
+ .wh-fix { color: #e5e7eb; background: #111827; border-inline-start: 3px solid #22c55e; border-radius: 4px; padding: 6px 8px; }
639
+ .wh-fix strong { color: #86efac; }
640
+ .wh-code {
641
+ font-family: ${MONO_FONT}; font-size: .92em; color: #e2e8f0;
642
+ background: rgba(148,163,184,.14); border-radius: 4px; padding: 0 3px;
643
+ unicode-bidi: isolate; overflow-wrap: anywhere;
644
+ }
645
+ .wh-param { unicode-bidi: isolate; color: #f8fafc; }
646
+ .wh-docs { display: inline-block; margin-top: 6px; color: #60a5fa; text-decoration: none; font-size: 11px; }
647
+ .wh-docs:hover { text-decoration: underline; }
648
+ .wh-hint {
649
+ display: none; align-items: center; gap: 8px;
650
+ padding: 7px 12px; font-size: 11px; color: #cbd5e1;
651
+ background: #0d1220; border-top: 1px solid #1f2937;
652
+ animation: wh-fade .2s ease;
653
+ }
654
+ .wh-hint.wh-show { display: flex; }
655
+ .wh-hint-text { flex: 1; }
656
+ .wh-hint-x {
657
+ appearance: none; border: 0; background: transparent; cursor: pointer;
658
+ color: #9ca3af; font-size: 14px; line-height: 1; padding: 2px 4px;
659
+ }
660
+ .wh-hint-x:hover { color: #f3f4f6; }
661
+ @keyframes wh-fade { from { opacity: 0 } to { opacity: 1 } }
662
+ @media (max-width: 420px) {
663
+ .wh-panel { width: auto; max-height: min(80vh, 640px); }
664
+ .wh-bottom-right, .wh-bottom-left { left: 8px; right: 8px; }
665
+ .wh-top-right, .wh-top-left { left: 8px; right: 8px; }
666
+ .wh-diff { grid-template-columns: 1fr; }
667
+ }
668
+ `;
669
+ function el(tag, className, text) {
670
+ const node = document.createElement(tag);
671
+ if (className) node.className = className;
672
+ if (text != null) node.textContent = text;
673
+ return node;
674
+ }
675
+ function shortenPath(file) {
676
+ const normalized = file.replace(/\\/g, "/");
677
+ const marker = normalized.match(/(?:^|\/)(?:src|app|pages|components)\//);
678
+ if (marker && marker.index != null) {
679
+ return normalized.slice(marker.index).replace(/^\//, "");
680
+ }
681
+ const parts = normalized.split("/");
682
+ return parts.slice(-2).join("/");
683
+ }
684
+ var INVISIBLE = {
685
+ "\u200B": "ZWSP",
686
+ "\u200E": "LRM",
687
+ "\u200F": "RLM",
688
+ "\u061C": "ALM",
689
+ "\u202A": "LRE",
690
+ "\u202B": "RLE",
691
+ "\u202C": "PDF",
692
+ "\u202D": "LRO",
693
+ "\u202E": "RLO",
694
+ "\u2066": "LRI",
695
+ "\u2067": "RLI",
696
+ "\u2068": "FSI",
697
+ "\u2069": "PDI",
698
+ "\uFEFF": "BOM"
699
+ };
700
+ var INVISIBLE_RE = /[\u200b\u200e\u200f\u061c\u202a-\u202e\u2066-\u2069\ufeff]/;
701
+ var INVISIBLE_SPLIT = /([\u200b\u200e\u200f\u061c\u202a-\u202e\u2066-\u2069\ufeff])/;
702
+ var RTL_SCRIPT = /[֐-ࣿיִ-﷿ﹰ-ﻼ]/;
703
+ function renderValue(value, strings) {
704
+ if (value == null || value === "") {
705
+ return el(
706
+ "span",
707
+ "wh-empty-value",
708
+ value === "" ? strings.empty : strings.none
709
+ );
710
+ }
711
+ const block = el("div", "wh-value");
712
+ block.dir = "auto";
713
+ if (RTL_SCRIPT.test(value)) block.classList.add("wh-prose");
714
+ if (!INVISIBLE_RE.test(value)) {
715
+ block.textContent = value;
716
+ return block;
717
+ }
718
+ for (const part of value.split(INVISIBLE_SPLIT)) {
719
+ if (!part) continue;
720
+ const name = INVISIBLE[part];
721
+ if (!name) {
722
+ block.append(part);
723
+ continue;
724
+ }
725
+ const badge = el("span", "wh-invisible", name);
726
+ const cp = part.codePointAt(0).toString(16).toUpperCase().padStart(4, "0");
727
+ badge.title = `U+${cp} ${name}`;
728
+ block.appendChild(badge);
729
+ }
730
+ return block;
731
+ }
732
+ function renderSegments(segments) {
733
+ const out = document.createDocumentFragment();
734
+ for (const s of segments) {
735
+ if (typeof s === "string") {
736
+ out.append(s);
737
+ } else if ("code" in s) {
738
+ const c = el("code", "wh-code", s.code);
739
+ c.dir = "auto";
740
+ out.appendChild(c);
741
+ } else {
742
+ const v = el("bdi", "wh-param", s.value);
743
+ out.appendChild(v);
744
+ }
745
+ }
746
+ return out;
747
+ }
748
+ function splitCode(text) {
749
+ return text.split("`").map((part, i) => i % 2 === 1 ? { code: part } : part).filter((s) => s !== "");
750
+ }
751
+ function causeText(cause, field, strings) {
752
+ const id = cause.messageId;
753
+ const params = cause.params ?? {};
754
+ if (id && Object.prototype.hasOwnProperty.call(EN_MESSAGES, id)) {
755
+ const english = plainText(renderMessage(EN_MESSAGES[id][field], params));
756
+ if (english === cause[field]) {
757
+ return {
758
+ segments: renderMessage(strings.messages[id][field], params),
759
+ translated: true
760
+ };
761
+ }
762
+ }
763
+ return { segments: splitCode(cause[field]), translated: false };
764
+ }
765
+ function renderCard(report, strings) {
766
+ const card = el("div", "wh-card");
767
+ const head = el("div", "wh-card-head");
768
+ head.appendChild(
769
+ el(
770
+ "span",
771
+ "wh-cat",
772
+ strings.categories[report.cause.category] ?? strings.fallbackCategory
773
+ )
774
+ );
775
+ const conf = el(
776
+ "span",
777
+ "wh-conf",
778
+ `${Math.round(report.cause.confidence * 100)}%`
779
+ );
780
+ conf.dir = "ltr";
781
+ head.appendChild(conf);
782
+ card.appendChild(head);
783
+ const body = el("div", "wh-body");
784
+ const where = el("div", "wh-where");
785
+ const name = report.component ?? report.node.tagName?.toLowerCase();
786
+ if (name) {
787
+ const comp = el(
788
+ "bdi",
789
+ report.component ? "wh-comp" : "wh-attr",
790
+ `<${name}>`
791
+ );
792
+ comp.dir = "ltr";
793
+ where.append(comp, " \xB7 ");
794
+ }
795
+ const path = el("code", void 0, report.node.path);
796
+ path.dir = "ltr";
797
+ where.appendChild(path);
798
+ if (report.node.attribute) {
799
+ const attr = el("bdi", "wh-attr", `@${report.node.attribute}`);
800
+ attr.dir = "ltr";
801
+ where.append(" \xB7 ", attr);
802
+ }
803
+ body.appendChild(where);
804
+ if (report.location?.file) {
805
+ const file = shortenPath(report.location.file);
806
+ const loc = el(
807
+ "div",
808
+ "wh-loc",
809
+ report.location.line ? `${file}:${report.location.line}` : file
810
+ );
811
+ loc.dir = "ltr";
812
+ body.appendChild(loc);
813
+ }
814
+ const diff = el("div", "wh-diff");
815
+ const server = el("div", "wh-side wh-server");
816
+ server.appendChild(el("span", "wh-label", strings.server));
817
+ server.appendChild(renderValue(report.server, strings));
818
+ const client = el("div", "wh-side wh-client");
819
+ client.appendChild(el("span", "wh-label", strings.client));
820
+ client.appendChild(renderValue(report.client, strings));
821
+ diff.appendChild(server);
822
+ diff.appendChild(client);
823
+ body.appendChild(diff);
824
+ const explanation = causeText(report.cause, "explanation", strings);
825
+ const explain = el("div", "wh-explain");
826
+ explain.dir = explanation.translated ? strings.dir : "auto";
827
+ explain.appendChild(renderSegments(explanation.segments));
828
+ body.appendChild(explain);
829
+ const suggestion = causeText(report.cause, "suggestion", strings);
830
+ const fix = el("div", "wh-fix");
831
+ fix.appendChild(el("strong", void 0, strings.fix));
832
+ fix.append(" ");
833
+ const fixText = el("span");
834
+ fixText.dir = suggestion.translated ? strings.dir : "auto";
835
+ fixText.appendChild(renderSegments(suggestion.segments));
836
+ fix.appendChild(fixText);
837
+ body.appendChild(fix);
838
+ if (report.cause.docsUrl && /^https?:\/\//i.test(report.cause.docsUrl)) {
839
+ const a = el("a", "wh-docs", strings.learnMore);
840
+ a.href = report.cause.docsUrl;
841
+ a.target = "_blank";
842
+ a.rel = "noreferrer noopener";
843
+ body.appendChild(a);
844
+ }
845
+ card.appendChild(body);
846
+ return card;
847
+ }
848
+ function createOverlay(options = {}) {
849
+ const position = options.position ?? "bottom-right";
850
+ let host = null;
851
+ let listEl = null;
852
+ let countEl = null;
853
+ let hintEl = null;
854
+ let hintTextEl = null;
855
+ let hintCheckTimer = null;
856
+ let hintDismissed = false;
857
+ let count = 0;
858
+ let strings = OVERLAY_STRINGS.en;
859
+ function ensureMounted() {
860
+ if (host) return;
861
+ document.getElementById(CONTAINER_ID)?.remove();
862
+ const locale = resolveLocale(options.locale);
863
+ strings = OVERLAY_STRINGS[locale];
864
+ host = document.createElement("div");
865
+ host.id = CONTAINER_ID;
866
+ host.setAttribute("data-why-hydration", "overlay");
867
+ host.setAttribute("aria-hidden", "false");
868
+ host.setAttribute("dir", strings.dir);
869
+ host.setAttribute("lang", locale);
870
+ const shadow = host.attachShadow({ mode: "open" });
871
+ const style = document.createElement("style");
872
+ style.textContent = STYLES;
873
+ shadow.appendChild(style);
874
+ const panel = el("div", `wh-panel wh-${position}`);
875
+ panel.setAttribute("dir", strings.dir);
876
+ panel.setAttribute("lang", locale);
877
+ panel.setAttribute("role", "dialog");
878
+ panel.setAttribute("aria-label", strings.dialogLabel);
879
+ const header = el("div", "wh-header");
880
+ header.appendChild(el("span", "wh-dot"));
881
+ header.appendChild(el("span", "wh-title", strings.title));
882
+ countEl = el("span", "wh-count", "0");
883
+ countEl.dir = "ltr";
884
+ header.appendChild(countEl);
885
+ const close = el("button", "wh-btn", strings.dismiss);
886
+ close.setAttribute("aria-label", strings.dismissLabel);
887
+ close.addEventListener("click", () => destroy());
888
+ header.appendChild(close);
889
+ panel.appendChild(header);
890
+ listEl = el("div", "wh-list");
891
+ panel.appendChild(listEl);
892
+ hintEl = el("div", "wh-hint");
893
+ hintTextEl = el("span", "wh-hint-text");
894
+ hintEl.appendChild(hintTextEl);
895
+ const hintX = el("button", "wh-hint-x", "\u2715");
896
+ hintX.setAttribute("aria-label", strings.hintDismissLabel);
897
+ hintX.addEventListener("click", () => dismissHint());
898
+ hintEl.appendChild(hintX);
899
+ panel.appendChild(hintEl);
900
+ shadow.appendChild(panel);
901
+ document.body.appendChild(host);
902
+ host.addEventListener("keydown", (e) => {
903
+ if (e.key === "Escape") destroy();
904
+ });
905
+ }
906
+ function dismissHint() {
907
+ hintDismissed = true;
908
+ hintEl?.classList.remove("wh-show");
909
+ }
910
+ function updateHint() {
911
+ if (!hintEl || !hintTextEl || hintDismissed) return;
912
+ hintTextEl.textContent = strings.hint(count);
913
+ if (count >= 4) hintEl.classList.add("wh-show");
914
+ }
915
+ function destroy() {
916
+ if (hintCheckTimer) clearTimeout(hintCheckTimer);
917
+ hintCheckTimer = null;
918
+ host?.remove();
919
+ host = null;
920
+ listEl = null;
921
+ countEl = null;
922
+ hintEl = null;
923
+ hintTextEl = null;
924
+ count = 0;
925
+ hintDismissed = false;
926
+ }
927
+ function push(report) {
928
+ ensureMounted();
929
+ count += 1;
930
+ if (countEl) countEl.textContent = String(count);
931
+ listEl?.appendChild(renderCard(report, strings));
932
+ if (hintCheckTimer) clearTimeout(hintCheckTimer);
933
+ hintCheckTimer = setTimeout(updateHint, 400);
934
+ }
935
+ return { push, destroy };
936
+ }
937
+
938
+ // src/react/fiber.ts
939
+ function getFiber(node) {
940
+ for (const key in node) {
941
+ if (key.startsWith("__reactFiber$") || key.startsWith("__reactInternalInstance$")) {
942
+ return node[key] ?? null;
943
+ }
944
+ }
945
+ return null;
946
+ }
947
+ function componentName(type) {
948
+ if (!type || typeof type === "string") return void 0;
949
+ if (typeof type === "function") {
950
+ const fn = type;
951
+ return fn.displayName || fn.name || void 0;
952
+ }
953
+ if (typeof type === "object") {
954
+ const obj = type;
955
+ if (obj.displayName) return obj.displayName;
956
+ if (obj.render) return obj.render.displayName || obj.render.name;
957
+ if (obj.type) return componentName(obj.type);
958
+ }
959
+ return void 0;
960
+ }
961
+ function resolveReactSource(node) {
962
+ if (!node) return {};
963
+ try {
964
+ let fiber = getFiber(node);
965
+ let component;
966
+ let location;
967
+ let hops = 0;
968
+ while (fiber && hops < 80) {
969
+ if (!component) {
970
+ const name = componentName(fiber.type);
971
+ if (name && !/^[a-z]/.test(name)) component = name;
972
+ }
973
+ if (!location && fiber._debugSource?.fileName) {
974
+ location = {
975
+ file: fiber._debugSource.fileName,
976
+ line: fiber._debugSource.lineNumber,
977
+ column: fiber._debugSource.columnNumber
978
+ };
979
+ }
980
+ if (component && location) break;
981
+ fiber = fiber.return ?? null;
982
+ hops += 1;
983
+ }
984
+ const result = {};
985
+ if (component) result.component = component;
986
+ if (location) result.location = location;
987
+ return result;
988
+ } catch {
989
+ return {};
990
+ }
991
+ }
992
+
993
+ // src/react/controller.ts
994
+ var INSPECT_FALLBACK_MS = 50;
995
+ function buildIgnore(ignore) {
996
+ if (!ignore || ignore.length === 0) return void 0;
997
+ return (divergence) => {
998
+ const node = divergence.element ?? null;
999
+ for (const rule of ignore) {
1000
+ if (typeof rule === "function") {
1001
+ if (node && rule(node)) return true;
1002
+ } else if (node) {
1003
+ try {
1004
+ if (node.matches(rule) || node.closest(rule)) return true;
1005
+ } catch {
1006
+ }
1007
+ }
1008
+ }
1009
+ return false;
1010
+ };
1011
+ }
1012
+ var InspectorController = class {
1013
+ constructor(options = {}) {
1014
+ this.overlayTeardown = null;
1015
+ this.matchedRoots = /* @__PURE__ */ new Set();
1016
+ this.cleanups = [];
1017
+ this.started = false;
1018
+ this.pendingContext = {};
1019
+ this.messages = /* @__PURE__ */ new Set();
1020
+ // The component a recoverable error's own stack names, per message. A report
1021
+ // parsed from a message may only carry *that* message's context: borrowing
1022
+ // the latest error's instead labelled unrelated reports with the component
1023
+ // from some other error (a localStorage read attributed to <InvalidNesting>).
1024
+ this.messageContext = /* @__PURE__ */ new Map();
1025
+ this.warnedRoots = /* @__PURE__ */ new Set();
1026
+ this.settlingTimers = [];
1027
+ this.inspectScheduled = false;
1028
+ this.inspectTimer = null;
1029
+ this.onRecoverableError = (error, info) => {
1030
+ if (!isDev) return;
1031
+ const message = error instanceof Error ? error.message : String(error);
1032
+ this.rememberMessage(message);
1033
+ if (this.messages.has(message) && info?.componentStack) {
1034
+ this.messageContext.set(message, {
1035
+ componentStack: info.componentStack,
1036
+ component: firstComponentFromStack(info.componentStack)
1037
+ });
1038
+ }
1039
+ this.mergeContext({
1040
+ componentStack: info?.componentStack,
1041
+ component: firstComponentFromStack(info?.componentStack),
1042
+ reactMessage: message
1043
+ });
1044
+ this.scheduleInspect();
1045
+ };
1046
+ this.options = options;
1047
+ this.collector = new ReportCollector({
1048
+ maxReports: options.maxReports,
1049
+ extra: options.classify,
1050
+ ignore: buildIgnore(options?.ignore)
1051
+ });
1052
+ }
1053
+ start() {
1054
+ if (this.started || !isDev || typeof window === "undefined") return;
1055
+ this.started = true;
1056
+ this.cleanups.push(
1057
+ this.collector.addSink((report) => this.options.onReport?.(report))
1058
+ );
1059
+ this.cleanups.push(this.collector.addSink(createConsoleReporter()));
1060
+ this.mountOverlay();
1061
+ this.cleanups.push(
1062
+ subscribeCapture((message) => {
1063
+ this.rememberMessage(message);
1064
+ this.mergeContext({ reactMessage: message });
1065
+ this.scheduleInspect();
1066
+ })
1067
+ );
1068
+ this.scheduleSettlingInspections();
1069
+ }
1070
+ // React applies client values to mismatched subtrees via a client re-render a
1071
+ // few hundred ms after the initial hydration commit. We diff once per frame
1072
+ // and then across this short "settling window" to catch that, deduped. This
1073
+ // is a bounded, one-shot window — NOT a standing observer — so DOM changes
1074
+ // from later app state are never mistaken for hydration mismatches.
1075
+ scheduleSettlingInspections() {
1076
+ this.scheduleInspect();
1077
+ const delays = [80, 250, 700, 1500];
1078
+ for (const delay of delays) {
1079
+ const last = delay === delays[delays.length - 1];
1080
+ const timer = setTimeout(() => {
1081
+ this.inspectAllRoots();
1082
+ if (last) this.warnUnmatchedRoots();
1083
+ }, delay);
1084
+ this.settlingTimers.push(timer);
1085
+ }
1086
+ }
1087
+ rememberMessage(message) {
1088
+ if (this.messages.size >= MAX_CAPTURED && !this.messages.has(message)) {
1089
+ return;
1090
+ }
1091
+ this.messages.add(message);
1092
+ }
1093
+ mergeContext(ctx) {
1094
+ this.pendingContext = {
1095
+ componentStack: ctx.componentStack ?? this.pendingContext.componentStack,
1096
+ component: ctx.component ?? this.pendingContext.component,
1097
+ location: ctx.location ?? this.pendingContext.location,
1098
+ reactMessage: ctx.reactMessage ?? this.pendingContext.reactMessage
1099
+ };
1100
+ }
1101
+ // Context for reports parsed from one message: that message's own component
1102
+ // and stack if it came with one, plus the source location the caller gave.
1103
+ contextFor(message) {
1104
+ return {
1105
+ location: this.pendingContext.location,
1106
+ ...this.messageContext.get(message)
1107
+ };
1108
+ }
1109
+ domContext() {
1110
+ return {
1111
+ componentStack: this.pendingContext.componentStack,
1112
+ component: this.pendingContext.component,
1113
+ location: this.pendingContext.location
1114
+ };
1115
+ }
1116
+ /**
1117
+ * Apply new options to a running inspector. `<HydrationInspector>` calls
1118
+ * this when its props change; before, it read them once at mount and every
1119
+ * later change was silently ignored until a reload.
1120
+ *
1121
+ * - `onReport` takes effect for the next report.
1122
+ * - `overlay` (on/off, `position`, `locale`) rebuilds the panel, replaying
1123
+ * the reports so far — only when it actually changed, so inline objects
1124
+ * re-created on every render do not remount it.
1125
+ * - `ignore`, `classify` and `maxReports` apply to everything reported from
1126
+ * now on; reports already made stay as they are.
1127
+ */
1128
+ update(options) {
1129
+ const overlayBefore = overlayKey(this.options.overlay);
1130
+ this.options = options;
1131
+ this.collector.configure({
1132
+ maxReports: options.maxReports,
1133
+ extra: options.classify,
1134
+ ignore: buildIgnore(options.ignore)
1135
+ });
1136
+ if (this.started && overlayKey(options.overlay) !== overlayBefore) {
1137
+ this.unmountOverlay();
1138
+ this.mountOverlay();
1139
+ }
1140
+ }
1141
+ mountOverlay() {
1142
+ if (this.options.overlay === false) return;
1143
+ const handle = createOverlay(
1144
+ typeof this.options.overlay === "object" ? this.options.overlay : {}
1145
+ );
1146
+ const detach = this.collector.addSink(handle.push, { replay: true });
1147
+ this.overlayTeardown = () => {
1148
+ detach();
1149
+ handle.destroy();
1150
+ };
1151
+ }
1152
+ unmountOverlay() {
1153
+ this.overlayTeardown?.();
1154
+ this.overlayTeardown = null;
1155
+ }
1156
+ stop() {
1157
+ for (const timer of this.settlingTimers.splice(0)) clearTimeout(timer);
1158
+ this.clearScheduledInspect();
1159
+ this.unmountOverlay();
1160
+ for (const cleanup of this.cleanups.splice(0)) cleanup();
1161
+ this.started = false;
1162
+ }
1163
+ getReports() {
1164
+ return this.collector.getReports();
1165
+ }
1166
+ inspectNow(context = {}) {
1167
+ this.mergeContext(context);
1168
+ this.inspectAllRoots();
1169
+ }
1170
+ inspectAllRoots() {
1171
+ if (!this.started || typeof document === "undefined" || this.collector.isFull) {
1172
+ return;
1173
+ }
1174
+ const configured = this.options.roots;
1175
+ const selectors = configured ?? snapshotSelectors();
1176
+ const context = this.domContext();
1177
+ const seen = /* @__PURE__ */ new Set();
1178
+ for (const selector of selectors) {
1179
+ let root = null;
1180
+ try {
1181
+ root = document.querySelector(selector);
1182
+ } catch {
1183
+ this.warnRoot(selector, `"${selector}" is not a valid CSS selector.`);
1184
+ continue;
1185
+ }
1186
+ if (!root) continue;
1187
+ this.matchedRoots.add(selector);
1188
+ if (seen.has(root)) continue;
1189
+ seen.add(root);
1190
+ if (configured && getServerHtmlForRoot(root) == null) {
1191
+ this.warnRoot(
1192
+ selector,
1193
+ `no server HTML was captured for "${selector}". Add it to the \`selectors\` prop of <HydrationSnapshotScript> so the server markup for that root is snapshotted.`
1194
+ );
1195
+ continue;
1196
+ }
1197
+ inspectRoot(
1198
+ root,
1199
+ this.collector,
1200
+ context,
1201
+ (divergence) => resolveReactSource(divergence.element ?? null)
1202
+ );
1203
+ }
1204
+ for (const message of this.messages) {
1205
+ reportFromMessage(message, this.collector, this.contextFor(message), {
1206
+ locationless: "skip"
1207
+ });
1208
+ }
1209
+ const concrete = this.collector.getReports().some((r) => r.cause.messageId !== "unknown.no-location");
1210
+ if (!concrete) {
1211
+ for (const message of this.messages) {
1212
+ reportFromMessage(message, this.collector, this.contextFor(message), {
1213
+ locationless: "only"
1214
+ });
1215
+ }
1216
+ }
1217
+ }
1218
+ // A configured root that matches nothing can never be inspected — usually a
1219
+ // typo, or a selector for markup this page does not have. Checked once the
1220
+ // settling window is over rather than on the first pass, so a root that is
1221
+ // rendered a moment after hydration is not reported by mistake.
1222
+ warnUnmatchedRoots() {
1223
+ if (!this.started) return;
1224
+ for (const selector of this.options.roots ?? []) {
1225
+ if (this.matchedRoots.has(selector)) continue;
1226
+ this.warnRoot(
1227
+ selector,
1228
+ `no element matches "${selector}" on this page, so it was never inspected. Check the selector against your markup.`
1229
+ );
1230
+ }
1231
+ }
1232
+ warnRoot(selector, detail) {
1233
+ if (this.warnedRoots.has(selector)) return;
1234
+ this.warnedRoots.add(selector);
1235
+ console.warn(`[why-hydration] Skipping root: ${detail}`);
1236
+ }
1237
+ scheduleInspect() {
1238
+ if (this.inspectScheduled) return;
1239
+ this.inspectScheduled = true;
1240
+ const run = () => {
1241
+ if (!this.inspectScheduled) return;
1242
+ this.clearScheduledInspect();
1243
+ this.inspectAllRoots();
1244
+ };
1245
+ if (typeof requestAnimationFrame === "function") requestAnimationFrame(run);
1246
+ this.inspectTimer = setTimeout(run, INSPECT_FALLBACK_MS);
1247
+ }
1248
+ clearScheduledInspect() {
1249
+ this.inspectScheduled = false;
1250
+ if (this.inspectTimer != null) {
1251
+ clearTimeout(this.inspectTimer);
1252
+ this.inspectTimer = null;
1253
+ }
1254
+ }
1255
+ };
1256
+ function overlayKey(overlay) {
1257
+ if (overlay === false) return "off";
1258
+ const o = typeof overlay === "object" ? overlay : {};
1259
+ return `${o.position ?? "bottom-right"}|${o.locale ?? "auto"}`;
1260
+ }
1261
+ function snapshotSelectors() {
1262
+ const snapshot = readSnapshot();
1263
+ const keys = snapshot ? Object.keys(snapshot.roots) : [];
1264
+ return keys.length > 0 ? keys : [...DEFAULT_SNAPSHOT_SELECTORS];
1265
+ }
1266
+ function firstComponentFromStack(stack) {
1267
+ if (!stack) return void 0;
1268
+ const frame = /(?:^|\n)\s*(?:at|in)\s+([A-Za-z0-9_$]+)/g;
1269
+ for (const match of stack.matchAll(frame)) {
1270
+ const name = match[1];
1271
+ if (/^[A-Z]/.test(name) && !isInternalComponent(name)) return name;
1272
+ }
1273
+ return void 0;
1274
+ }
1275
+ function InspectorImpl(props) {
1276
+ const { children, overlay, onReport, ignore, classify, maxReports } = props;
1277
+ startCapture();
1278
+ const options = {
1279
+ overlay,
1280
+ onReport,
1281
+ ignore,
1282
+ classify,
1283
+ maxReports
1284
+ };
1285
+ const optionsRef = React.useRef(options);
1286
+ const controllerRef = React.useRef(null);
1287
+ React.useEffect(() => {
1288
+ const controller = new InspectorController(optionsRef.current);
1289
+ controllerRef.current = controller;
1290
+ controller.start();
1291
+ return () => {
1292
+ controller.stop();
1293
+ if (controllerRef.current === controller) controllerRef.current = null;
1294
+ };
1295
+ }, []);
1296
+ React.useEffect(() => {
1297
+ optionsRef.current = options;
1298
+ controllerRef.current?.update(options);
1299
+ }, [overlay, onReport, ignore, classify, maxReports]);
1300
+ return React.createElement(React.Fragment, null, children);
1301
+ }
1302
+
1303
+ // src/react/index.tsx
1304
+ function PassThrough(props) {
1305
+ return React.createElement(React.Fragment, null, props.children);
1306
+ }
1307
+ var HydrationInspector = process.env.NODE_ENV !== "production" ? InspectorImpl : PassThrough;
1308
+ function createHydrationInspector(options = {}) {
1309
+ if (process.env.NODE_ENV === "production") {
1310
+ return {
1311
+ onRecoverableError: () => {
1312
+ },
1313
+ Provider: PassThrough
1314
+ };
1315
+ }
1316
+ const controller = new InspectorController(options);
1317
+ controller.start();
1318
+ function Provider(props) {
1319
+ React.useEffect(() => {
1320
+ controller.start();
1321
+ return () => controller.stop();
1322
+ }, []);
1323
+ return React.createElement(React.Fragment, null, props.children);
1324
+ }
1325
+ return {
1326
+ onRecoverableError: controller.onRecoverableError,
1327
+ Provider
1328
+ };
1329
+ }
1330
+
1331
+ export { HydrationInspector, createHydrationInspector };
1332
+ //# sourceMappingURL=chunk-CER5NQRR.js.map
1333
+ //# sourceMappingURL=chunk-CER5NQRR.js.map