@elementor/editor-audits 4.4.0-1101 → 4.4.0-1103

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js CHANGED
@@ -45,17 +45,17 @@ var import_editor_app_bar = require("@elementor/editor-app-bar");
45
45
 
46
46
  // src/hooks/use-audit-toggle-props.ts
47
47
  var import_icons12 = require("@elementor/icons");
48
- var import_i18n22 = require("@wordpress/i18n");
48
+ var import_i18n24 = require("@wordpress/i18n");
49
49
 
50
50
  // src/editor-panel.tsx
51
51
  var import_editor_floating_panels2 = require("@elementor/editor-floating-panels");
52
52
 
53
53
  // src/components/audit-panel.tsx
54
- var React23 = __toESM(require("react"));
54
+ var React25 = __toESM(require("react"));
55
55
  var import_editor_elements5 = require("@elementor/editor-elements");
56
56
  var import_editor_floating_panels = require("@elementor/editor-floating-panels");
57
- var import_ui22 = require("@elementor/ui");
58
- var import_i18n21 = require("@wordpress/i18n");
57
+ var import_ui24 = require("@elementor/ui");
58
+ var import_i18n23 = require("@wordpress/i18n");
59
59
 
60
60
  // src/hooks/use-audit-report.ts
61
61
  var import_react = require("react");
@@ -172,7 +172,7 @@ var CATEGORY_LABELS = {
172
172
  seo: (0, import_i18n.__)("SEO", "elementor"),
173
173
  accessibility: (0, import_i18n.__)("Accessibility", "elementor"),
174
174
  performance: (0, import_i18n.__)("Performance", "elementor"),
175
- compliance: (0, import_i18n.__)("Compliance", "elementor")
175
+ compliance: (0, import_i18n.__)("Site compliance", "elementor")
176
176
  };
177
177
 
178
178
  // src/utils/audit-status-summary.ts
@@ -759,10 +759,10 @@ function WelcomePage() {
759
759
  }
760
760
 
761
761
  // src/components/report-shell.tsx
762
- var React22 = __toESM(require("react"));
763
- var import_react5 = require("react");
764
- var import_ui21 = require("@elementor/ui");
765
- var import_i18n20 = require("@wordpress/i18n");
762
+ var React24 = __toESM(require("react"));
763
+ var import_react6 = require("react");
764
+ var import_ui23 = require("@elementor/ui");
765
+ var import_i18n22 = require("@wordpress/i18n");
766
766
 
767
767
  // src/components/pages/all-audits-page.tsx
768
768
  var React12 = __toESM(require("react"));
@@ -928,7 +928,7 @@ var import_icons5 = require("@elementor/icons");
928
928
  var SEVERITY_CONFIG = {
929
929
  error: { Icon: import_icons5.AlertTriangleFilledIcon, color: "error" },
930
930
  warning: { Icon: import_icons5.AlertCircleIcon, color: "warning" },
931
- info: { Icon: import_icons5.InfoCircleIcon, color: "info" }
931
+ info: { Icon: import_icons5.BulbIcon, color: "info" }
932
932
  };
933
933
  function SeverityIcon({ severity }) {
934
934
  const { Icon, color } = SEVERITY_CONFIG[severity];
@@ -1064,7 +1064,12 @@ function ViolationRow({ audit: audit23, skipReason, violations }) {
1064
1064
  },
1065
1065
  /* @__PURE__ */ React11.createElement(ViolationIcon, { violation, widgetIcon }),
1066
1066
  /* @__PURE__ */ React11.createElement(import_ui10.Box, { sx: { flex: 1 } }, /* @__PURE__ */ React11.createElement(import_ui10.Typography, { variant: "caption" }, rowLabel), violation.detail && /* @__PURE__ */ React11.createElement(import_ui10.Typography, { variant: "caption", color: "text.secondary" }, violation.detail)),
1067
- violation.angieFix && /* @__PURE__ */ React11.createElement(FixViolationWithAngie, { prompt: buildAngiePrompt(rowLabel) }),
1067
+ violation.angieFix && /* @__PURE__ */ React11.createElement(
1068
+ FixViolationWithAngie,
1069
+ {
1070
+ prompt: violation.angiePrompt ?? buildAngiePrompt(rowLabel)
1071
+ }
1072
+ ),
1068
1073
  violation.ctaLabel && violation.externalUrl ? /* @__PURE__ */ React11.createElement(
1069
1074
  ViolationCtaButton,
1070
1075
  {
@@ -1128,10 +1133,10 @@ var import_i18n13 = require("@wordpress/i18n");
1128
1133
  var import_icons8 = require("@elementor/icons");
1129
1134
  var CATEGORY_ICONS = {
1130
1135
  "best-practices": import_icons8.Settings2Icon,
1131
- seo: import_icons8.FilterIcon,
1136
+ seo: import_icons8.FileSearchIcon,
1132
1137
  accessibility: import_icons8.ElementorAccessibilityIcon,
1133
- performance: import_icons8.ShieldHalfFilledIcon,
1134
- compliance: import_icons8.HeartHandShakeIcon
1138
+ performance: import_icons8.BoltIcon,
1139
+ compliance: import_icons8.ShieldCheckIcon
1135
1140
  };
1136
1141
 
1137
1142
  // src/components/pages/category-page.tsx
@@ -1159,8 +1164,9 @@ function CategoryPage({ category, report, onBack }) {
1159
1164
  }
1160
1165
 
1161
1166
  // src/components/pages/issues-page.tsx
1162
- var React17 = __toESM(require("react"));
1163
- var import_ui16 = require("@elementor/ui");
1167
+ var React18 = __toESM(require("react"));
1168
+ var import_react5 = require("react");
1169
+ var import_ui17 = require("@elementor/ui");
1164
1170
  var import_i18n17 = require("@wordpress/i18n");
1165
1171
 
1166
1172
  // src/utils/severity-counts.ts
@@ -1189,41 +1195,115 @@ function severityPluralLabel(severity) {
1189
1195
  case "warning":
1190
1196
  return (0, import_i18n14.__)("Warnings", "elementor");
1191
1197
  case "info":
1192
- return (0, import_i18n14.__)("Info", "elementor");
1198
+ return (0, import_i18n14.__)("Suggestions", "elementor");
1193
1199
  }
1194
1200
  }
1195
- function severityRemainingCountLabel(severity, count) {
1196
- switch (severity) {
1197
- case "error":
1198
- return (0, import_i18n14.sprintf)(
1199
- /* translators: %d: number of remaining error violations. */
1200
- (0, import_i18n14.__)("%d errors", "elementor"),
1201
- count
1202
- );
1203
- case "warning":
1204
- return (0, import_i18n14.sprintf)(
1205
- /* translators: %d: number of remaining warning violations. */
1206
- (0, import_i18n14.__)("%d warnings", "elementor"),
1207
- count
1208
- );
1209
- case "info":
1210
- return (0, import_i18n14.sprintf)(
1211
- /* translators: %d: number of remaining info violations. */
1212
- (0, import_i18n14.__)("%d info", "elementor"),
1213
- count
1214
- );
1201
+
1202
+ // src/components/audit-statuses-section.tsx
1203
+ var React15 = __toESM(require("react"));
1204
+ var import_ui14 = require("@elementor/ui");
1205
+ var import_i18n15 = require("@wordpress/i18n");
1206
+
1207
+ // src/components/count-summary-circle.tsx
1208
+ var React14 = __toESM(require("react"));
1209
+ var import_ui13 = require("@elementor/ui");
1210
+ var COUNT_SUMMARY_CIRCLE_SIZE = 64;
1211
+ var COUNT_SUMMARY_BORDER_WIDTH = 4;
1212
+ function chipBorderColor(theme, color) {
1213
+ if (color === "default" || !color) {
1214
+ return theme.palette.text.secondary;
1215
1215
  }
1216
+ return theme.palette[color].main;
1217
+ }
1218
+ function CountSummaryCircle({ ariaLabel, color, count, label, onClick }) {
1219
+ return /* @__PURE__ */ React14.createElement(
1220
+ import_ui13.Box,
1221
+ {
1222
+ "aria-label": ariaLabel,
1223
+ component: "button",
1224
+ onClick,
1225
+ type: "button",
1226
+ sx: {
1227
+ alignItems: "center",
1228
+ background: "none",
1229
+ border: "none",
1230
+ cursor: "pointer",
1231
+ display: "flex",
1232
+ flex: 1,
1233
+ flexDirection: "column",
1234
+ gap: 0.5,
1235
+ padding: 0
1236
+ }
1237
+ },
1238
+ /* @__PURE__ */ React14.createElement(
1239
+ import_ui13.Chip,
1240
+ {
1241
+ color,
1242
+ label: count,
1243
+ size: "small",
1244
+ variant: "standard",
1245
+ sx: (theme) => ({
1246
+ border: `${COUNT_SUMMARY_BORDER_WIDTH}px solid ${chipBorderColor(theme, color)}`,
1247
+ borderRadius: "50%",
1248
+ height: COUNT_SUMMARY_CIRCLE_SIZE,
1249
+ maxWidth: COUNT_SUMMARY_CIRCLE_SIZE,
1250
+ width: COUNT_SUMMARY_CIRCLE_SIZE,
1251
+ "& .MuiChip-label": {
1252
+ fontSize: theme.typography.body2.fontSize,
1253
+ fontWeight: 700,
1254
+ lineHeight: 1,
1255
+ padding: 0
1256
+ }
1257
+ })
1258
+ }
1259
+ ),
1260
+ /* @__PURE__ */ React14.createElement(import_ui13.Typography, { color: "text.secondary", sx: { textAlign: "center" }, variant: "caption" }, label)
1261
+ );
1262
+ }
1263
+
1264
+ // src/components/audit-statuses-section.tsx
1265
+ var STATUS_ARIA_LABELS = {
1266
+ pass: (count) => (0, import_i18n15.sprintf)(
1267
+ /* translators: %d: number of passed audits. */
1268
+ (0, import_i18n15.__)("%d passed audits, view all", "elementor"),
1269
+ count
1270
+ ),
1271
+ fail: (count) => (0, import_i18n15.sprintf)(
1272
+ /* translators: %d: number of failed audit violations. */
1273
+ (0, import_i18n15.__)("%d failed audits, view all", "elementor"),
1274
+ count
1275
+ ),
1276
+ skipped: (count) => (0, import_i18n15.sprintf)(
1277
+ /* translators: %d: number of skipped audits. */
1278
+ (0, import_i18n15.__)("%d skipped audits, view all", "elementor"),
1279
+ count
1280
+ )
1281
+ };
1282
+ var STATUS_GROUPS = ["fail", "pass", "skipped"];
1283
+ function AuditStatusesSection({ report, onStatusClick }) {
1284
+ const statusCounts = auditStatusDisplayCounts(report);
1285
+ return /* @__PURE__ */ React15.createElement(React15.Fragment, null, /* @__PURE__ */ React15.createElement(import_ui14.Typography, { variant: "subtitle1", fontWeight: "bold" }, (0, import_i18n15.__)("Audit statuses", "elementor")), /* @__PURE__ */ React15.createElement(import_ui14.Box, { sx: { display: "flex", justifyContent: "space-around", gap: 2 } }, STATUS_GROUPS.map((status) => /* @__PURE__ */ React15.createElement(
1286
+ CountSummaryCircle,
1287
+ {
1288
+ key: status,
1289
+ ariaLabel: STATUS_ARIA_LABELS[status](statusCounts[status]),
1290
+ color: auditStatusColor(status),
1291
+ count: statusCounts[status],
1292
+ label: auditStatusLabel(status),
1293
+ onClick: () => onStatusClick(status)
1294
+ }
1295
+ ))), /* @__PURE__ */ React15.createElement(import_ui14.Divider, null));
1216
1296
  }
1217
1297
 
1218
1298
  // src/components/issues-category-row.tsx
1219
- var React14 = __toESM(require("react"));
1299
+ var React16 = __toESM(require("react"));
1220
1300
  var import_icons9 = require("@elementor/icons");
1221
- var import_ui13 = require("@elementor/ui");
1301
+ var import_ui15 = require("@elementor/ui");
1222
1302
  function IssuesCategoryRow({ category, label, counts, onClick }) {
1223
- const isRtl = "rtl" === (0, import_ui13.useTheme)().direction;
1303
+ const isRtl = "rtl" === (0, import_ui15.useTheme)().direction;
1224
1304
  const Icon = CATEGORY_ICONS[category];
1225
- return /* @__PURE__ */ React14.createElement(
1226
- import_ui13.Box,
1305
+ return /* @__PURE__ */ React16.createElement(
1306
+ import_ui15.Box,
1227
1307
  {
1228
1308
  role: "button",
1229
1309
  tabIndex: 0,
@@ -1244,21 +1324,112 @@ function IssuesCategoryRow({ category, label, counts, onClick }) {
1244
1324
  "&:focus-visible": { outline: "2px solid", outlineColor: "primary.main" }
1245
1325
  }
1246
1326
  },
1247
- /* @__PURE__ */ React14.createElement(Icon, { fontSize: "small", color: "action" }),
1248
- /* @__PURE__ */ React14.createElement(import_ui13.Typography, { variant: "body2", fontWeight: "bold", sx: { flex: 1 } }, label),
1249
- /* @__PURE__ */ React14.createElement(import_ui13.Box, { sx: { display: "flex", alignItems: "center", gap: 0.5 } }, ALL_SEVERITIES.filter((s) => counts[s] > 0).map((severity) => /* @__PURE__ */ React14.createElement(import_ui13.Box, { key: severity, sx: { display: "flex", alignItems: "center", gap: 0.25 } }, /* @__PURE__ */ React14.createElement(SeverityIcon, { severity }), /* @__PURE__ */ React14.createElement(import_ui13.Typography, { variant: "caption", color: "text.primary", fontWeight: "bold" }, counts[severity])))),
1250
- /* @__PURE__ */ React14.createElement(import_ui13.Rotate, { in: isRtl }, /* @__PURE__ */ React14.createElement(import_icons9.ChevronRightIcon, { fontSize: "small", color: "action" }))
1327
+ /* @__PURE__ */ React16.createElement(Icon, { fontSize: "small", color: "action" }),
1328
+ /* @__PURE__ */ React16.createElement(import_ui15.Typography, { variant: "body2", fontWeight: "bold", sx: { flex: 1 } }, label),
1329
+ /* @__PURE__ */ React16.createElement(import_ui15.Box, { sx: { display: "flex", alignItems: "center", gap: 0.5 } }, ALL_SEVERITIES.filter((s) => counts[s] > 0).map((severity) => /* @__PURE__ */ React16.createElement(import_ui15.Box, { key: severity, sx: { display: "flex", alignItems: "center", gap: 0.25 } }, /* @__PURE__ */ React16.createElement(SeverityIcon, { severity }), /* @__PURE__ */ React16.createElement(import_ui15.Typography, { variant: "caption", color: "text.primary", fontWeight: "bold" }, counts[severity])))),
1330
+ /* @__PURE__ */ React16.createElement(import_ui15.Rotate, { in: isRtl }, /* @__PURE__ */ React16.createElement(import_icons9.ChevronRightIcon, { fontSize: "small", color: "action" }))
1251
1331
  );
1252
1332
  }
1253
1333
 
1254
- // src/components/promotions.tsx
1255
- var React16 = __toESM(require("react"));
1256
- var import_ui15 = require("@elementor/ui");
1334
+ // src/components/severity-filter-chips.tsx
1335
+ var React17 = __toESM(require("react"));
1336
+ var import_ui16 = require("@elementor/ui");
1257
1337
  var import_i18n16 = require("@wordpress/i18n");
1338
+ function SeverityFilterChips({ selected, onChange }) {
1339
+ return /* @__PURE__ */ React17.createElement(import_ui16.Box, { sx: { display: "flex", alignItems: "center", gap: 1 } }, /* @__PURE__ */ React17.createElement(
1340
+ FilterChip,
1341
+ {
1342
+ label: (0, import_i18n16.__)("All", "elementor"),
1343
+ isSelected: selected === "all",
1344
+ onClick: () => onChange("all")
1345
+ }
1346
+ ), ALL_SEVERITIES.map((severity) => /* @__PURE__ */ React17.createElement(
1347
+ FilterChip,
1348
+ {
1349
+ key: severity,
1350
+ label: severityPluralLabel(severity),
1351
+ icon: /* @__PURE__ */ React17.createElement(SeverityIcon, { severity }),
1352
+ isSelected: selected === severity,
1353
+ onClick: () => onChange(severity)
1354
+ }
1355
+ )));
1356
+ }
1357
+ function FilterChip({ label, icon, isSelected, onClick }) {
1358
+ return /* @__PURE__ */ React17.createElement(
1359
+ import_ui16.Chip,
1360
+ {
1361
+ label,
1362
+ icon,
1363
+ size: "small",
1364
+ variant: "filled",
1365
+ color: "default",
1366
+ onClick,
1367
+ "aria-pressed": isSelected,
1368
+ sx: { bgcolor: isSelected ? "action.selected" : "transparent" }
1369
+ }
1370
+ );
1371
+ }
1372
+
1373
+ // src/components/pages/issues-page.tsx
1374
+ function filterCounts(counts, filter) {
1375
+ if (filter === "all") {
1376
+ return counts;
1377
+ }
1378
+ return { error: 0, warning: 0, info: 0, [filter]: counts[filter] };
1379
+ }
1380
+ function IssuesPage({ report, onCategoryClick, onAllAuditsClick, onStatusClick }) {
1381
+ const [filter, setFilter] = (0, import_react5.useState)("all");
1382
+ const populatedCategories = getPopulatedCategories(report.categories, ALL_CATEGORIES);
1383
+ const categoryRows = populatedCategories.map((category) => ({ category, counts: filterCounts(countSeverities(report, category), filter) })).filter(({ counts }) => Object.values(counts).some((count) => count > 0));
1384
+ return /* @__PURE__ */ React18.createElement(import_ui17.Box, { sx: { display: "flex", flexDirection: "column", gap: 4, p: 2 } }, /* @__PURE__ */ React18.createElement(AuditStatusesSection, { report, onStatusClick }), /* @__PURE__ */ React18.createElement(
1385
+ import_ui17.Link,
1386
+ {
1387
+ component: "button",
1388
+ underline: "none",
1389
+ color: "inherit",
1390
+ onClick: onAllAuditsClick,
1391
+ sx: { textAlign: "start" }
1392
+ },
1393
+ /* @__PURE__ */ React18.createElement(import_ui17.Typography, { variant: "subtitle1", component: "h2" }, (0, import_i18n17.__)("All issues", "elementor"))
1394
+ ), /* @__PURE__ */ React18.createElement(SeverityFilterChips, { selected: filter, onChange: setFilter }), /* @__PURE__ */ React18.createElement(import_ui17.Box, { sx: { display: "flex", flexDirection: "column", gap: 1 } }, categoryRows.map(({ category, counts }) => /* @__PURE__ */ React18.createElement(
1395
+ IssuesCategoryRow,
1396
+ {
1397
+ key: category,
1398
+ category,
1399
+ label: CATEGORY_LABELS[category],
1400
+ counts,
1401
+ onClick: () => onCategoryClick(category)
1402
+ }
1403
+ ))));
1404
+ }
1405
+
1406
+ // src/components/pages/overview-page.tsx
1407
+ var React23 = __toESM(require("react"));
1408
+ var import_ui22 = require("@elementor/ui");
1409
+ var import_i18n21 = require("@wordpress/i18n");
1410
+
1411
+ // src/utils/score-thresholds.ts
1412
+ var import_i18n18 = require("@wordpress/i18n");
1413
+ var GOOD_THRESHOLD = 90;
1414
+ var OK_THRESHOLD = 50;
1415
+ function getScoreTier(score) {
1416
+ if (score >= GOOD_THRESHOLD) {
1417
+ return { color: "success", label: (0, import_i18n18.__)("Good", "elementor") };
1418
+ }
1419
+ if (score >= OK_THRESHOLD) {
1420
+ return { color: "warning", label: (0, import_i18n18.__)("Needs work", "elementor") };
1421
+ }
1422
+ return { color: "error", label: (0, import_i18n18.__)("At risk", "elementor") };
1423
+ }
1424
+
1425
+ // src/components/promotions.tsx
1426
+ var React20 = __toESM(require("react"));
1427
+ var import_ui19 = require("@elementor/ui");
1428
+ var import_i18n20 = require("@wordpress/i18n");
1258
1429
 
1259
1430
  // src/register-promotions.ts
1260
1431
  var import_icons10 = require("@elementor/icons");
1261
- var import_i18n15 = require("@wordpress/i18n");
1432
+ var import_i18n19 = require("@wordpress/i18n");
1262
1433
  function firstFailExternalUrl(run) {
1263
1434
  return run.result.status === "fail" ? run.result.violations[0]?.externalUrl : void 0;
1264
1435
  }
@@ -1266,7 +1437,7 @@ var PROMOTIONS = [
1266
1437
  {
1267
1438
  auditId: "audits/images-alt-text",
1268
1439
  icon: import_icons10.PhotoIcon,
1269
- ctaLabel: (0, import_i18n15.__)("Fix with Ally", "elementor"),
1440
+ ctaLabel: (0, import_i18n19.__)("Fix with Ally", "elementor"),
1270
1441
  formatSubtitle: (run) => {
1271
1442
  if (run.result.status !== "fail") {
1272
1443
  return null;
@@ -1275,9 +1446,9 @@ var PROMOTIONS = [
1275
1446
  if (count === 0) {
1276
1447
  return null;
1277
1448
  }
1278
- return (0, import_i18n15.sprintf)(
1449
+ return (0, import_i18n19.sprintf)(
1279
1450
  /* translators: %d: number of images missing alt text. */
1280
- (0, import_i18n15._n)("%d image", "%d images", count, "elementor"),
1451
+ (0, import_i18n19._n)("%d image", "%d images", count, "elementor"),
1281
1452
  count
1282
1453
  );
1283
1454
  },
@@ -1286,21 +1457,21 @@ var PROMOTIONS = [
1286
1457
  {
1287
1458
  auditId: "audits/cookie-policy",
1288
1459
  icon: import_icons10.ElementorCookieIcon,
1289
- ctaLabel: (0, import_i18n15.__)("Fix with Cookiez", "elementor"),
1290
- formatSubtitle: (run) => run.result.status === "fail" ? (0, import_i18n15.__)("Generate cookie policy", "elementor") : null,
1460
+ ctaLabel: (0, import_i18n19.__)("Fix with Cookiez", "elementor"),
1461
+ formatSubtitle: (run) => run.result.status === "fail" ? (0, import_i18n19.__)("Generate cookie policy", "elementor") : null,
1291
1462
  getCtaUrl: firstFailExternalUrl
1292
1463
  },
1293
1464
  {
1294
1465
  auditId: "audits/scan-for-cookies",
1295
1466
  icon: import_icons10.ElementorCookieIcon,
1296
- ctaLabel: (0, import_i18n15.__)("Scan", "elementor"),
1297
- formatSubtitle: (run) => run.result.status === "fail" ? (0, import_i18n15.__)("Scan this page for cookies", "elementor") : null,
1467
+ ctaLabel: (0, import_i18n19.__)("Scan", "elementor"),
1468
+ formatSubtitle: (run) => run.result.status === "fail" ? (0, import_i18n19.__)("Scan this page for cookies", "elementor") : null,
1298
1469
  getCtaUrl: firstFailExternalUrl
1299
1470
  },
1300
1471
  {
1301
1472
  auditId: "audits/images-too-large",
1302
1473
  icon: import_icons10.ShieldHalfFilledIcon,
1303
- ctaLabel: (0, import_i18n15.__)("Optimize all", "elementor"),
1474
+ ctaLabel: (0, import_i18n19.__)("Optimize all", "elementor"),
1304
1475
  formatSubtitle: (run) => {
1305
1476
  if (run.result.status !== "fail") {
1306
1477
  return null;
@@ -1309,9 +1480,9 @@ var PROMOTIONS = [
1309
1480
  if (count === 0) {
1310
1481
  return null;
1311
1482
  }
1312
- return (0, import_i18n15.sprintf)(
1483
+ return (0, import_i18n19.sprintf)(
1313
1484
  /* translators: %d: number of oversized images. */
1314
- (0, import_i18n15._n)("%d image", "%d images", count, "elementor"),
1485
+ (0, import_i18n19._n)("%d image", "%d images", count, "elementor"),
1315
1486
  count
1316
1487
  );
1317
1488
  },
@@ -1325,11 +1496,11 @@ function findAuditRun(report, auditId) {
1325
1496
  }
1326
1497
 
1327
1498
  // src/components/promotion-card.tsx
1328
- var React15 = __toESM(require("react"));
1329
- var import_ui14 = require("@elementor/ui");
1499
+ var React19 = __toESM(require("react"));
1500
+ var import_ui18 = require("@elementor/ui");
1330
1501
  function PromotionCard({ ctaDisabled, ctaLabel, icon: Icon, onCtaClick, subtitle, title }) {
1331
- return /* @__PURE__ */ React15.createElement(
1332
- import_ui14.Box,
1502
+ return /* @__PURE__ */ React19.createElement(
1503
+ import_ui18.Box,
1333
1504
  {
1334
1505
  sx: {
1335
1506
  alignItems: "center",
@@ -1342,9 +1513,9 @@ function PromotionCard({ ctaDisabled, ctaLabel, icon: Icon, onCtaClick, subtitle
1342
1513
  py: 1.5
1343
1514
  }
1344
1515
  },
1345
- /* @__PURE__ */ React15.createElement(Icon, { fontSize: "small", color: "action" }),
1346
- /* @__PURE__ */ React15.createElement(import_ui14.Box, { sx: { display: "flex", flex: 1, flexDirection: "column", gap: 0.25, minWidth: 0 } }, /* @__PURE__ */ React15.createElement(import_ui14.Typography, { variant: "body2", fontWeight: "bold" }, title), /* @__PURE__ */ React15.createElement(import_ui14.Typography, { variant: "caption", color: "text.secondary" }, subtitle)),
1347
- /* @__PURE__ */ React15.createElement(import_ui14.Button, { variant: "outlined", color: "secondary", size: "small", disabled: ctaDisabled, onClick: onCtaClick }, ctaLabel)
1516
+ /* @__PURE__ */ React19.createElement(Icon, { fontSize: "small", color: "action" }),
1517
+ /* @__PURE__ */ React19.createElement(import_ui18.Box, { sx: { display: "flex", flex: 1, flexDirection: "column", gap: 0.25, minWidth: 0 } }, /* @__PURE__ */ React19.createElement(import_ui18.Typography, { variant: "body2", fontWeight: "bold" }, title), /* @__PURE__ */ React19.createElement(import_ui18.Typography, { variant: "caption", color: "text.secondary" }, subtitle)),
1518
+ /* @__PURE__ */ React19.createElement(import_ui18.Button, { variant: "outlined", color: "secondary", size: "small", disabled: ctaDisabled, onClick: onCtaClick }, ctaLabel)
1348
1519
  );
1349
1520
  }
1350
1521
 
@@ -1373,7 +1544,7 @@ function Promotions({ report }) {
1373
1544
  if (cards.length === 0) {
1374
1545
  return null;
1375
1546
  }
1376
- return /* @__PURE__ */ React16.createElement(React16.Fragment, null, /* @__PURE__ */ React16.createElement(import_ui15.Typography, { variant: "subtitle1", fontWeight: "bold" }, (0, import_i18n16.__)("Quick wins", "elementor")), /* @__PURE__ */ React16.createElement(import_ui15.Box, { sx: { display: "flex", flexDirection: "column", gap: 1 } }, cards.map(({ config, ctaUrl, key, run, subtitle }) => /* @__PURE__ */ React16.createElement(
1547
+ return /* @__PURE__ */ React20.createElement(React20.Fragment, null, /* @__PURE__ */ React20.createElement(import_ui19.Divider, null), /* @__PURE__ */ React20.createElement(import_ui19.Typography, { variant: "subtitle1", fontWeight: "bold" }, (0, import_i18n20.__)("Quick actions", "elementor")), /* @__PURE__ */ React20.createElement(import_ui19.Box, { sx: { display: "flex", flexDirection: "column", gap: 1 } }, cards.map(({ config, ctaUrl, key, run, subtitle }) => /* @__PURE__ */ React20.createElement(
1377
1548
  PromotionCard,
1378
1549
  {
1379
1550
  key,
@@ -1391,115 +1562,14 @@ function Promotions({ report }) {
1391
1562
  ))));
1392
1563
  }
1393
1564
 
1394
- // src/components/pages/issues-page.tsx
1395
- function IssuesPage({ report, onCategoryClick, onAllAuditsClick }) {
1396
- const populatedCategories = getPopulatedCategories(report.categories, ALL_CATEGORIES);
1397
- return /* @__PURE__ */ React17.createElement(import_ui16.Box, { sx: { display: "flex", flexDirection: "column", gap: 4, p: 2 } }, /* @__PURE__ */ React17.createElement(
1398
- import_ui16.Link,
1399
- {
1400
- component: "button",
1401
- underline: "none",
1402
- color: "inherit",
1403
- onClick: onAllAuditsClick,
1404
- sx: { textAlign: "start" }
1405
- },
1406
- /* @__PURE__ */ React17.createElement(import_ui16.Typography, { variant: "subtitle1", component: "h2" }, (0, import_i18n17.__)("All issues", "elementor"))
1407
- ), /* @__PURE__ */ React17.createElement(import_ui16.Box, { sx: { display: "flex", flexDirection: "column", gap: 1 } }, populatedCategories.map((category) => /* @__PURE__ */ React17.createElement(
1408
- IssuesCategoryRow,
1409
- {
1410
- key: category,
1411
- category,
1412
- label: CATEGORY_LABELS[category],
1413
- counts: countSeverities(report, category),
1414
- onClick: () => onCategoryClick(category)
1415
- }
1416
- ))), /* @__PURE__ */ React17.createElement(Promotions, { report }));
1417
- }
1418
-
1419
- // src/components/pages/overview-page.tsx
1420
- var React21 = __toESM(require("react"));
1421
- var import_ui20 = require("@elementor/ui");
1422
- var import_i18n19 = require("@wordpress/i18n");
1423
-
1424
- // src/utils/score-thresholds.ts
1425
- var import_i18n18 = require("@wordpress/i18n");
1426
- var GOOD_THRESHOLD = 90;
1427
- var OK_THRESHOLD = 50;
1428
- function getScoreTier(score) {
1429
- if (score >= GOOD_THRESHOLD) {
1430
- return { color: "success", label: (0, import_i18n18.__)("Good", "elementor") };
1431
- }
1432
- if (score >= OK_THRESHOLD) {
1433
- return { color: "warning", label: (0, import_i18n18.__)("Needs work", "elementor") };
1434
- }
1435
- return { color: "error", label: (0, import_i18n18.__)("At risk", "elementor") };
1436
- }
1437
-
1438
- // src/components/count-summary-circle.tsx
1439
- var React18 = __toESM(require("react"));
1440
- var import_ui17 = require("@elementor/ui");
1441
- var COUNT_SUMMARY_CIRCLE_SIZE = 64;
1442
- var COUNT_SUMMARY_BORDER_WIDTH = 4;
1443
- function chipBorderColor(theme, color) {
1444
- if (color === "default" || !color) {
1445
- return theme.palette.text.secondary;
1446
- }
1447
- return theme.palette[color].main;
1448
- }
1449
- function CountSummaryCircle({ ariaLabel, color, count, label, onClick }) {
1450
- return /* @__PURE__ */ React18.createElement(
1451
- import_ui17.Box,
1452
- {
1453
- "aria-label": ariaLabel,
1454
- component: "button",
1455
- onClick,
1456
- type: "button",
1457
- sx: {
1458
- alignItems: "center",
1459
- background: "none",
1460
- border: "none",
1461
- cursor: "pointer",
1462
- display: "flex",
1463
- flex: 1,
1464
- flexDirection: "column",
1465
- gap: 0.5,
1466
- padding: 0
1467
- }
1468
- },
1469
- /* @__PURE__ */ React18.createElement(
1470
- import_ui17.Chip,
1471
- {
1472
- color,
1473
- label: count,
1474
- size: "small",
1475
- variant: "standard",
1476
- sx: (theme) => ({
1477
- border: `${COUNT_SUMMARY_BORDER_WIDTH}px solid ${chipBorderColor(theme, color)}`,
1478
- borderRadius: "50%",
1479
- height: COUNT_SUMMARY_CIRCLE_SIZE,
1480
- maxWidth: COUNT_SUMMARY_CIRCLE_SIZE,
1481
- width: COUNT_SUMMARY_CIRCLE_SIZE,
1482
- "& .MuiChip-label": {
1483
- fontSize: theme.typography.body2.fontSize,
1484
- fontWeight: 700,
1485
- lineHeight: 1,
1486
- padding: 0
1487
- }
1488
- })
1489
- }
1490
- ),
1491
- /* @__PURE__ */ React18.createElement(import_ui17.Typography, { color: "text.secondary", sx: { textAlign: "center" }, variant: "caption" }, label)
1492
- );
1493
- }
1494
-
1495
1565
  // src/components/score-bar.tsx
1496
- var React19 = __toESM(require("react"));
1566
+ var React21 = __toESM(require("react"));
1497
1567
  var import_icons11 = require("@elementor/icons");
1498
- var import_ui18 = require("@elementor/ui");
1568
+ var import_ui20 = require("@elementor/ui");
1499
1569
  function ScoreBar({ label, score, onClick }) {
1500
- const isRtl = "rtl" === (0, import_ui18.useTheme)().direction;
1501
- return /* @__PURE__ */ React19.createElement(
1502
- import_ui18.Box,
1570
+ const isRtl = "rtl" === (0, import_ui20.useTheme)().direction;
1571
+ return /* @__PURE__ */ React21.createElement(
1572
+ import_ui20.Box,
1503
1573
  {
1504
1574
  role: onClick ? "button" : void 0,
1505
1575
  tabIndex: onClick ? 0 : void 0,
@@ -1515,9 +1585,9 @@ function ScoreBar({ label, score, onClick }) {
1515
1585
  py: 0.5
1516
1586
  }
1517
1587
  },
1518
- /* @__PURE__ */ React19.createElement(import_ui18.Typography, { variant: "body2", sx: { minWidth: 96 } }, label),
1519
- /* @__PURE__ */ React19.createElement(
1520
- import_ui18.LinearProgress,
1588
+ /* @__PURE__ */ React21.createElement(import_ui20.Typography, { variant: "body2", sx: { minWidth: 96 } }, label),
1589
+ /* @__PURE__ */ React21.createElement(
1590
+ import_ui20.LinearProgress,
1521
1591
  {
1522
1592
  variant: "determinate",
1523
1593
  value: score,
@@ -1525,8 +1595,8 @@ function ScoreBar({ label, score, onClick }) {
1525
1595
  sx: { flex: 1, height: 6, borderRadius: 4, bgcolor: "action.disabledBackground" }
1526
1596
  }
1527
1597
  ),
1528
- /* @__PURE__ */ React19.createElement(
1529
- import_ui18.Typography,
1598
+ /* @__PURE__ */ React21.createElement(
1599
+ import_ui20.Typography,
1530
1600
  {
1531
1601
  variant: "body2",
1532
1602
  color: "text.primary",
@@ -1534,19 +1604,19 @@ function ScoreBar({ label, score, onClick }) {
1534
1604
  },
1535
1605
  score
1536
1606
  ),
1537
- onClick && /* @__PURE__ */ React19.createElement(import_ui18.Rotate, { in: isRtl }, /* @__PURE__ */ React19.createElement(import_icons11.ChevronRightIcon, { fontSize: "small", color: "action" }))
1607
+ onClick && /* @__PURE__ */ React21.createElement(import_ui20.Rotate, { in: isRtl }, /* @__PURE__ */ React21.createElement(import_icons11.ChevronRightIcon, { fontSize: "small", color: "action" }))
1538
1608
  );
1539
1609
  }
1540
1610
 
1541
1611
  // src/components/score-circle.tsx
1542
- var React20 = __toESM(require("react"));
1543
- var import_ui19 = require("@elementor/ui");
1612
+ var React22 = __toESM(require("react"));
1613
+ var import_ui21 = require("@elementor/ui");
1544
1614
  var SCORE_CIRCLE_SIZE = 88;
1545
1615
  var SCORE_CIRCLE_THICKNESS = 3;
1546
1616
  function ScoreCircle({ color, score }) {
1547
1617
  const progressColor = color ?? getScoreTier(score).color;
1548
- return /* @__PURE__ */ React20.createElement(
1549
- import_ui19.Box,
1618
+ return /* @__PURE__ */ React22.createElement(
1619
+ import_ui21.Box,
1550
1620
  {
1551
1621
  role: "progressbar",
1552
1622
  "aria-valuenow": score,
@@ -1554,8 +1624,8 @@ function ScoreCircle({ color, score }) {
1554
1624
  "aria-valuemax": 100,
1555
1625
  sx: { position: "relative", display: "inline-flex" }
1556
1626
  },
1557
- /* @__PURE__ */ React20.createElement(
1558
- import_ui19.CircularProgress,
1627
+ /* @__PURE__ */ React22.createElement(
1628
+ import_ui21.CircularProgress,
1559
1629
  {
1560
1630
  variant: "determinate",
1561
1631
  value: 100,
@@ -1564,8 +1634,8 @@ function ScoreCircle({ color, score }) {
1564
1634
  sx: { color: "action.disabledBackground" }
1565
1635
  }
1566
1636
  ),
1567
- /* @__PURE__ */ React20.createElement(
1568
- import_ui19.CircularProgress,
1637
+ /* @__PURE__ */ React22.createElement(
1638
+ import_ui21.CircularProgress,
1569
1639
  {
1570
1640
  variant: "determinate",
1571
1641
  value: score,
@@ -1575,8 +1645,8 @@ function ScoreCircle({ color, score }) {
1575
1645
  sx: { position: "absolute", left: 0 }
1576
1646
  }
1577
1647
  ),
1578
- /* @__PURE__ */ React20.createElement(
1579
- import_ui19.Box,
1648
+ /* @__PURE__ */ React22.createElement(
1649
+ import_ui21.Box,
1580
1650
  {
1581
1651
  sx: {
1582
1652
  position: "absolute",
@@ -1586,8 +1656,8 @@ function ScoreCircle({ color, score }) {
1586
1656
  justifyContent: "center"
1587
1657
  }
1588
1658
  },
1589
- /* @__PURE__ */ React20.createElement(
1590
- import_ui19.Typography,
1659
+ /* @__PURE__ */ React22.createElement(
1660
+ import_ui21.Typography,
1591
1661
  {
1592
1662
  variant: "h4",
1593
1663
  component: "span",
@@ -1601,31 +1671,11 @@ function ScoreCircle({ color, score }) {
1601
1671
  }
1602
1672
 
1603
1673
  // src/components/pages/overview-page.tsx
1604
- var STATUS_ARIA_LABELS = {
1605
- pass: (count) => (0, import_i18n19.sprintf)(
1606
- /* translators: %d: number of passed audits. */
1607
- (0, import_i18n19.__)("%d passed audits, view all", "elementor"),
1608
- count
1609
- ),
1610
- fail: (count) => (0, import_i18n19.sprintf)(
1611
- /* translators: %d: number of failed audit violations. */
1612
- (0, import_i18n19.__)("%d failed audits, view all", "elementor"),
1613
- count
1614
- ),
1615
- skipped: (count) => (0, import_i18n19.sprintf)(
1616
- /* translators: %d: number of skipped audits. */
1617
- (0, import_i18n19.__)("%d skipped audits, view all", "elementor"),
1618
- count
1619
- )
1620
- };
1621
- var STATUS_GROUPS = ["fail", "pass", "skipped"];
1622
- function OverviewPage({ onCategoryClick, onStatusClick, report }) {
1674
+ function OverviewPage({ onCategoryClick, report }) {
1623
1675
  const populatedCategories = getPopulatedCategories(report.categories, ALL_CATEGORIES);
1624
- const severityCounts = countSeverities(report);
1625
- const statusCounts = auditStatusDisplayCounts(report);
1626
1676
  const overallScore = getScoreTier(report.overall);
1627
- return /* @__PURE__ */ React21.createElement(import_ui20.Box, { sx: { display: "flex", flexDirection: "column", gap: 4, p: 2 } }, /* @__PURE__ */ React21.createElement(import_ui20.Box, { sx: { display: "flex", alignItems: "center", gap: 2 } }, /* @__PURE__ */ React21.createElement(ScoreCircle, { color: overallScore.color, score: report.overall }), /* @__PURE__ */ React21.createElement(import_ui20.Box, { sx: { display: "flex", flexDirection: "column", gap: 0.5 } }, /* @__PURE__ */ React21.createElement(
1628
- import_ui20.Chip,
1677
+ return /* @__PURE__ */ React23.createElement(import_ui22.Box, { sx: { display: "flex", flexDirection: "column", gap: 4, p: 2 } }, /* @__PURE__ */ React23.createElement(import_ui22.Box, { sx: { display: "flex", alignItems: "center", gap: 2 } }, /* @__PURE__ */ React23.createElement(ScoreCircle, { color: overallScore.color, score: report.overall }), /* @__PURE__ */ React23.createElement(import_ui22.Box, { sx: { display: "flex", flexDirection: "column", gap: 0.5 } }, /* @__PURE__ */ React23.createElement(
1678
+ import_ui22.Chip,
1629
1679
  {
1630
1680
  label: overallScore.label,
1631
1681
  color: overallScore.color,
@@ -1633,7 +1683,7 @@ function OverviewPage({ onCategoryClick, onStatusClick, report }) {
1633
1683
  size: "small",
1634
1684
  sx: { fontWeight: 600, alignSelf: "flex-start" }
1635
1685
  }
1636
- ), /* @__PURE__ */ React21.createElement(import_ui20.Typography, { variant: "body2", color: "text.secondary" }, (0, import_i18n19.__)("Overall score", "elementor")))), /* @__PURE__ */ React21.createElement(import_ui20.Box, { sx: { display: "flex", flexDirection: "column", gap: 2 } }, populatedCategories.map((category) => /* @__PURE__ */ React21.createElement(
1686
+ ), /* @__PURE__ */ React23.createElement(import_ui22.Typography, { variant: "body2", color: "text.secondary" }, (0, import_i18n21.__)("Overall score", "elementor")))), /* @__PURE__ */ React23.createElement(import_ui22.Box, { sx: { display: "flex", flexDirection: "column", gap: 2 } }, populatedCategories.map((category) => /* @__PURE__ */ React23.createElement(
1637
1687
  ScoreBar,
1638
1688
  {
1639
1689
  key: category,
@@ -1641,45 +1691,7 @@ function OverviewPage({ onCategoryClick, onStatusClick, report }) {
1641
1691
  score: report.categories[category].score,
1642
1692
  onClick: () => onCategoryClick(category)
1643
1693
  }
1644
- ))), /* @__PURE__ */ React21.createElement(import_ui20.Divider, null), /* @__PURE__ */ React21.createElement(import_ui20.Typography, { variant: "subtitle1", fontWeight: "bold" }, (0, import_i18n19.__)("Audit statuses", "elementor")), /* @__PURE__ */ React21.createElement(import_ui20.Box, { sx: { display: "flex", justifyContent: "space-around", gap: 2 } }, STATUS_GROUPS.map((status) => /* @__PURE__ */ React21.createElement(
1645
- CountSummaryCircle,
1646
- {
1647
- key: status,
1648
- ariaLabel: STATUS_ARIA_LABELS[status](statusCounts[status]),
1649
- color: auditStatusColor(status),
1650
- count: statusCounts[status],
1651
- label: auditStatusLabel(status),
1652
- onClick: () => onStatusClick(status)
1653
- }
1654
- ))), /* @__PURE__ */ React21.createElement(import_ui20.Divider, null), /* @__PURE__ */ React21.createElement(import_ui20.Typography, { variant: "subtitle1", fontWeight: "bold" }, (0, import_i18n19.__)("Remaining issues", "elementor")), /* @__PURE__ */ React21.createElement(
1655
- import_ui20.Box,
1656
- {
1657
- component: "ul",
1658
- sx: {
1659
- display: "flex",
1660
- flexDirection: "column",
1661
- gap: 1,
1662
- listStyle: "none",
1663
- m: 0,
1664
- p: 0
1665
- }
1666
- },
1667
- ALL_SEVERITIES.map((severity) => {
1668
- const count = severityCounts[severity];
1669
- return /* @__PURE__ */ React21.createElement(
1670
- import_ui20.Box,
1671
- {
1672
- "aria-label": severityRemainingCountLabel(severity, count),
1673
- component: "li",
1674
- key: severity,
1675
- sx: { alignItems: "center", display: "flex", gap: 0.5 }
1676
- },
1677
- /* @__PURE__ */ React21.createElement(SeverityIcon, { severity }),
1678
- /* @__PURE__ */ React21.createElement(import_ui20.Typography, { variant: "body2", fontWeight: "bold" }, count),
1679
- /* @__PURE__ */ React21.createElement(import_ui20.Typography, { variant: "body2" }, severityPluralLabel(severity))
1680
- );
1681
- })
1682
- ));
1694
+ ))), /* @__PURE__ */ React23.createElement(Promotions, { report }));
1683
1695
  }
1684
1696
 
1685
1697
  // src/components/report-shell.tsx
@@ -1699,7 +1711,7 @@ function isCategoryPage(page) {
1699
1711
  return typeof page === "object" && "category" in page;
1700
1712
  }
1701
1713
  function ReportShell({ report }) {
1702
- const [activePage, setActivePage] = (0, import_react5.useState)("overview");
1714
+ const [activePage, setActivePage] = (0, import_react6.useState)("overview");
1703
1715
  const currentTab = activeTab(activePage);
1704
1716
  const handleTabChange = (_, value) => {
1705
1717
  setActivePage(value);
@@ -1715,10 +1727,10 @@ function ReportShell({ report }) {
1715
1727
  setActivePage(activePage.backTo);
1716
1728
  }
1717
1729
  };
1718
- return /* @__PURE__ */ React22.createElement(import_ui21.Box, null, /* @__PURE__ */ React22.createElement(
1719
- import_ui21.Tabs,
1730
+ return /* @__PURE__ */ React24.createElement(import_ui23.Box, { sx: { display: "flex", flexDirection: "column", flex: 1, minHeight: 0 } }, /* @__PURE__ */ React24.createElement(import_ui23.Box, { sx: { flexShrink: 0 } }, /* @__PURE__ */ React24.createElement(
1731
+ import_ui23.Tabs,
1720
1732
  {
1721
- "aria-label": (0, import_i18n20.__)("Audit navigation", "elementor"),
1733
+ "aria-label": (0, import_i18n22.__)("Audit navigation", "elementor"),
1722
1734
  value: currentTab,
1723
1735
  onChange: handleTabChange,
1724
1736
  textColor: "secondary",
@@ -1727,30 +1739,30 @@ function ReportShell({ report }) {
1727
1739
  centered: true,
1728
1740
  variant: "fullWidth"
1729
1741
  },
1730
- /* @__PURE__ */ React22.createElement(import_ui21.Tab, { value: "overview", label: (0, import_i18n20.__)("Overview", "elementor") }),
1731
- /* @__PURE__ */ React22.createElement(import_ui21.Tab, { value: "issues", label: (0, import_i18n20.__)("Issues", "elementor") })
1732
- ), /* @__PURE__ */ React22.createElement(import_ui21.Divider, null), activePage === "overview" && /* @__PURE__ */ React22.createElement(
1742
+ /* @__PURE__ */ React24.createElement(import_ui23.Tab, { value: "overview", label: (0, import_i18n22.__)("Overview", "elementor") }),
1743
+ /* @__PURE__ */ React24.createElement(import_ui23.Tab, { value: "issues", label: (0, import_i18n22.__)("Issues", "elementor") })
1744
+ ), /* @__PURE__ */ React24.createElement(import_ui23.Divider, null)), /* @__PURE__ */ React24.createElement(import_ui23.Box, { sx: { flex: 1, minHeight: 0, overflowY: "auto" } }, activePage === "overview" && /* @__PURE__ */ React24.createElement(
1733
1745
  OverviewPage,
1734
1746
  {
1735
1747
  report,
1736
- onCategoryClick: (category) => openCategory(category, "overview"),
1737
- onStatusClick: (status) => openAllAudits(status, "overview")
1748
+ onCategoryClick: (category) => openCategory(category, "overview")
1738
1749
  }
1739
- ), activePage === "issues" && /* @__PURE__ */ React22.createElement(
1750
+ ), activePage === "issues" && /* @__PURE__ */ React24.createElement(
1740
1751
  IssuesPage,
1741
1752
  {
1742
1753
  report,
1743
1754
  onCategoryClick: (category) => openCategory(category, "issues"),
1744
- onAllAuditsClick: () => openAllAudits()
1755
+ onAllAuditsClick: () => openAllAudits(),
1756
+ onStatusClick: (status) => openAllAudits(status)
1745
1757
  }
1746
- ), isAllAuditsPage(activePage) && /* @__PURE__ */ React22.createElement(
1758
+ ), isAllAuditsPage(activePage) && /* @__PURE__ */ React24.createElement(
1747
1759
  AllAuditsPage,
1748
1760
  {
1749
1761
  report,
1750
1762
  initialExpandedStatus: activePage.expand,
1751
1763
  onBack: backFromSubPage
1752
1764
  }
1753
- ), isCategoryPage(activePage) && /* @__PURE__ */ React22.createElement(CategoryPage, { category: activePage.category, report, onBack: backFromSubPage }));
1765
+ ), isCategoryPage(activePage) && /* @__PURE__ */ React24.createElement(CategoryPage, { category: activePage.category, report, onBack: backFromSubPage })));
1754
1766
  }
1755
1767
 
1756
1768
  // src/components/audit-panel.tsx
@@ -1759,23 +1771,32 @@ function AuditPanel() {
1759
1771
  const currentDocumentId = (0, import_editor_elements5.getCurrentDocumentId)() ?? 0;
1760
1772
  const onRun = () => run(currentDocumentId);
1761
1773
  const lastScanLabel = report ? new Date(report.runAt).toLocaleTimeString() : null;
1762
- return /* @__PURE__ */ React23.createElement(React23.Fragment, null, /* @__PURE__ */ React23.createElement(
1774
+ return /* @__PURE__ */ React25.createElement(React25.Fragment, null, /* @__PURE__ */ React25.createElement(
1763
1775
  import_editor_floating_panels.FloatingPanelHeader,
1764
1776
  {
1765
1777
  panelId: "audit-panel",
1766
- title: (0, import_i18n21.__)("Page Audit", "elementor"),
1767
- badge: (0, import_i18n21.__)("Beta", "elementor"),
1778
+ title: (0, import_i18n23.__)("Page Audit", "elementor"),
1779
+ badge: (0, import_i18n23.__)("Beta", "elementor"),
1768
1780
  titleVariant: "subtitle2"
1769
1781
  }
1770
- ), /* @__PURE__ */ React23.createElement(import_editor_floating_panels.FloatingPanelBody, null, status === "idle" && /* @__PURE__ */ React23.createElement(WelcomePage, null), status === "loading" && /* @__PURE__ */ React23.createElement(LoadingPage, null), status === "error" && /* @__PURE__ */ React23.createElement(ErrorPage, { message: error ?? "", onRetry: onRun }), status === "ready" && report && /* @__PURE__ */ React23.createElement(ReportShell, { report })), /* @__PURE__ */ React23.createElement(import_editor_floating_panels.FloatingPanelFooter, null, lastScanLabel ? /* @__PURE__ */ React23.createElement(import_ui22.Typography, { variant: "caption", sx: { flex: 1 } }, (0, import_i18n21.__)("Last scan:", "elementor"), " ", lastScanLabel) : /* @__PURE__ */ React23.createElement(import_ui22.Box, { sx: { flex: 1 } }), lastScanLabel && /* @__PURE__ */ React23.createElement(AuditFeedback, null), /* @__PURE__ */ React23.createElement(
1771
- import_ui22.Button,
1782
+ ), /* @__PURE__ */ React25.createElement(
1783
+ import_editor_floating_panels.FloatingPanelBody,
1784
+ {
1785
+ sx: status === "ready" ? { display: "flex", flexDirection: "column", overflow: "hidden", minHeight: 0 } : void 0
1786
+ },
1787
+ status === "idle" && /* @__PURE__ */ React25.createElement(WelcomePage, null),
1788
+ status === "loading" && /* @__PURE__ */ React25.createElement(LoadingPage, null),
1789
+ status === "error" && /* @__PURE__ */ React25.createElement(ErrorPage, { message: error ?? "", onRetry: onRun }),
1790
+ status === "ready" && report && /* @__PURE__ */ React25.createElement(ReportShell, { report })
1791
+ ), /* @__PURE__ */ React25.createElement(import_editor_floating_panels.FloatingPanelFooter, null, lastScanLabel ? /* @__PURE__ */ React25.createElement(import_ui24.Typography, { variant: "caption", sx: { flex: 1 } }, (0, import_i18n23.__)("Last scan:", "elementor"), " ", lastScanLabel) : /* @__PURE__ */ React25.createElement(import_ui24.Box, { sx: { flex: 1 } }), lastScanLabel && /* @__PURE__ */ React25.createElement(AuditFeedback, null), /* @__PURE__ */ React25.createElement(
1792
+ import_ui24.Button,
1772
1793
  {
1773
1794
  variant: "contained",
1774
1795
  size: "small",
1775
1796
  onClick: onRun,
1776
1797
  disabled: status === "loading" || currentDocumentId === 0
1777
1798
  },
1778
- lastScanLabel ? (0, import_i18n21.__)("Re-scan", "elementor") : (0, import_i18n21.__)("Run page audit", "elementor")
1799
+ lastScanLabel ? (0, import_i18n23.__)("Re-scan", "elementor") : (0, import_i18n23.__)("Run page audit", "elementor")
1779
1800
  )));
1780
1801
  }
1781
1802
 
@@ -1800,7 +1821,7 @@ function useAuditToggleProps() {
1800
1821
  const { isOpen } = auditPanel.useFloatingPanelStatus();
1801
1822
  const { toggle } = auditPanel.useFloatingPanelActions();
1802
1823
  return {
1803
- title: (0, import_i18n22.__)("Audit Page", "elementor"),
1824
+ title: (0, import_i18n24.__)("Audit Page", "elementor"),
1804
1825
  icon: import_icons12.ShieldCheckIcon,
1805
1826
  selected: isOpen,
1806
1827
  onClick: () => toggle()
@@ -1818,15 +1839,15 @@ function registerAppBarAuditsToggle() {
1818
1839
  }
1819
1840
 
1820
1841
  // src/audits/accessibility-policy.ts
1821
- var import_i18n23 = require("@wordpress/i18n");
1842
+ var import_i18n25 = require("@wordpress/i18n");
1822
1843
  var audit = {
1823
1844
  id: "audits/accessibility-policy",
1824
- title: (0, import_i18n23.__)("Accessibility policy", "elementor"),
1825
- description: (0, import_i18n23.__)(
1845
+ title: (0, import_i18n25.__)("Accessibility policy", "elementor"),
1846
+ description: (0, import_i18n25.__)(
1826
1847
  "An accessibility policy demonstrates your commitment to digital inclusion and may be legally required in some regions.",
1827
1848
  "elementor"
1828
1849
  ),
1829
- fixHint: (0, import_i18n23.__)("Install the Ally plugin to add an accessibility policy to your website.", "elementor"),
1850
+ fixHint: (0, import_i18n25.__)("Install the Ally plugin to add an accessibility policy to your website.", "elementor"),
1830
1851
  categories: ["compliance"],
1831
1852
  severity: "info",
1832
1853
  weight: 1,
@@ -1839,7 +1860,7 @@ var audit = {
1839
1860
  violations: [
1840
1861
  {
1841
1862
  auditId: audit.id,
1842
- label: (0, import_i18n23.__)("Ally plugin is not installed or active.", "elementor"),
1863
+ label: (0, import_i18n25.__)("Ally plugin is not installed or active.", "elementor"),
1843
1864
  externalUrl: ctx.pageContext.ally_plugin_url
1844
1865
  }
1845
1866
  ]
@@ -1848,15 +1869,15 @@ var audit = {
1848
1869
  };
1849
1870
 
1850
1871
  // src/audits/cookie-policy.ts
1851
- var import_i18n24 = require("@wordpress/i18n");
1872
+ var import_i18n26 = require("@wordpress/i18n");
1852
1873
  var audit2 = {
1853
1874
  id: "audits/cookie-policy",
1854
- title: (0, import_i18n24.__)("Cookie policy", "elementor"),
1855
- description: (0, import_i18n24.__)(
1875
+ title: (0, import_i18n26.__)("Cookie policy", "elementor"),
1876
+ description: (0, import_i18n26.__)(
1856
1877
  "A cookie policy is required by privacy regulations such as GDPR (EU) or CCPA (US) to inform visitors about tracking and data collection.",
1857
1878
  "elementor"
1858
1879
  ),
1859
- fixHint: (0, import_i18n24.__)("Install the Cookiez plugin to add a cookie policy to your website.", "elementor"),
1880
+ fixHint: (0, import_i18n26.__)("Install the Cookiez plugin to add a cookie policy to your website.", "elementor"),
1860
1881
  categories: ["compliance"],
1861
1882
  severity: "info",
1862
1883
  weight: 1,
@@ -1869,7 +1890,7 @@ var audit2 = {
1869
1890
  violations: [
1870
1891
  {
1871
1892
  auditId: audit2.id,
1872
- label: (0, import_i18n24.__)("Cookiez plugin is not installed or active.", "elementor"),
1893
+ label: (0, import_i18n26.__)("Cookiez plugin is not installed or active.", "elementor"),
1873
1894
  externalUrl: ctx.pageContext.cookiez_plugin_url
1874
1895
  }
1875
1896
  ]
@@ -1879,7 +1900,7 @@ var audit2 = {
1879
1900
 
1880
1901
  // src/audits/deep-nesting.ts
1881
1902
  var import_editor_elements6 = require("@elementor/editor-elements");
1882
- var import_i18n25 = require("@wordpress/i18n");
1903
+ var import_i18n27 = require("@wordpress/i18n");
1883
1904
  var MAX_NESTING_DEPTH = 6;
1884
1905
  function isNestingElement(node, widgetsCache) {
1885
1906
  if (node.elType === "container") {
@@ -1889,18 +1910,18 @@ function isNestingElement(node, widgetsCache) {
1889
1910
  }
1890
1911
  var audit3 = {
1891
1912
  id: "audits/deep-nesting",
1892
- title: (0, import_i18n25.__)("Deep container nesting", "elementor"),
1893
- description: (0, import_i18n25.__)(
1913
+ title: (0, import_i18n27.__)("Deep container nesting", "elementor"),
1914
+ description: (0, import_i18n27.__)(
1894
1915
  "Container nesting exceeds the recommended depth. Deep DOM trees hurt rendering performance and readability.",
1895
1916
  "elementor"
1896
1917
  ),
1897
- fixHint: (0, import_i18n25.__)("Flatten the layout by removing unnecessary wrapper containers.", "elementor"),
1918
+ fixHint: (0, import_i18n27.__)("Flatten the layout by removing unnecessary wrapper containers.", "elementor"),
1898
1919
  categories: ["performance", "best-practices"],
1899
1920
  severity: "warning",
1900
1921
  weight: 5,
1901
1922
  evaluate: (ctx) => {
1902
1923
  if (ctx.elements.tree.length === 0) {
1903
- return { status: "skipped", reason: (0, import_i18n25.__)("No elements", "elementor") };
1924
+ return { status: "skipped", reason: (0, import_i18n27.__)("No elements", "elementor") };
1904
1925
  }
1905
1926
  const widgetsCache = (0, import_editor_elements6.getWidgetsCache)();
1906
1927
  const violations = [];
@@ -1914,7 +1935,7 @@ var audit3 = {
1914
1935
  auditId: audit3.id,
1915
1936
  elementId: node.id,
1916
1937
  targetHint: "element-settings",
1917
- label: (0, import_i18n25.__)("Container nesting is too deep.", "elementor")
1938
+ label: (0, import_i18n27.__)("Container nesting is too deep.", "elementor")
1918
1939
  });
1919
1940
  }
1920
1941
  });
@@ -1923,15 +1944,15 @@ var audit3 = {
1923
1944
  };
1924
1945
 
1925
1946
  // src/audits/default-design-system.ts
1926
- var import_i18n26 = require("@wordpress/i18n");
1947
+ var import_i18n28 = require("@wordpress/i18n");
1927
1948
  var audit4 = {
1928
1949
  id: "audits/default-design-system",
1929
- title: (0, import_i18n26.__)("Default website kit", "elementor"),
1930
- description: (0, import_i18n26.__)(
1950
+ title: (0, import_i18n28.__)("Default website kit", "elementor"),
1951
+ description: (0, import_i18n28.__)(
1931
1952
  "Your website is using the default design system colors and fonts. Custom branding makes the website feel uniquely yours.",
1932
1953
  "elementor"
1933
1954
  ),
1934
- fixHint: (0, import_i18n26.__)("Open Site Settings and customize your kit (colors, fonts, layout).", "elementor"),
1955
+ fixHint: (0, import_i18n28.__)("Open Site Settings and customize your kit (colors, fonts, layout).", "elementor"),
1935
1956
  categories: ["best-practices"],
1936
1957
  severity: "info",
1937
1958
  weight: 1,
@@ -1944,7 +1965,7 @@ var audit4 = {
1944
1965
  violations: [
1945
1966
  {
1946
1967
  auditId: audit4.id,
1947
- label: (0, import_i18n26.__)("Kit appears unchanged from default.", "elementor"),
1968
+ label: (0, import_i18n28.__)("Kit appears unchanged from default.", "elementor"),
1948
1969
  targetHint: "site-settings"
1949
1970
  }
1950
1971
  ]
@@ -1954,16 +1975,16 @@ var audit4 = {
1954
1975
 
1955
1976
  // src/audits/deprecated-widgets.ts
1956
1977
  var import_editor_elements7 = require("@elementor/editor-elements");
1957
- var import_i18n27 = require("@wordpress/i18n");
1978
+ var import_i18n29 = require("@wordpress/i18n");
1958
1979
  var DEPRECATION_CONTROL_NAME = "deprecation_message";
1959
1980
  var audit5 = {
1960
1981
  id: "audits/deprecated-widgets",
1961
- title: (0, import_i18n27.__)("Deprecated widgets", "elementor"),
1962
- description: (0, import_i18n27.__)(
1982
+ title: (0, import_i18n29.__)("Deprecated widgets", "elementor"),
1983
+ description: (0, import_i18n29.__)(
1963
1984
  "Deprecated widgets should not be used. For better capabilities use the recommended replacement.",
1964
1985
  "elementor"
1965
1986
  ),
1966
- fixHint: (0, import_i18n27.__)("Replace each deprecated widget with the recommended new widget shown in its panel.", "elementor"),
1987
+ fixHint: (0, import_i18n29.__)("Replace each deprecated widget with the recommended new widget shown in its panel.", "elementor"),
1967
1988
  categories: ["best-practices", "performance"],
1968
1989
  severity: "warning",
1969
1990
  weight: 7,
@@ -1990,7 +2011,7 @@ var audit5 = {
1990
2011
  auditId: audit5.id,
1991
2012
  elementId: node.id,
1992
2013
  targetHint: "element-settings",
1993
- label: (0, import_i18n27.__)("Using deprecated widget.", "elementor")
2014
+ label: (0, import_i18n29.__)("Using deprecated widget.", "elementor")
1994
2015
  });
1995
2016
  });
1996
2017
  return violations.length === 0 ? { status: "pass" } : { status: "fail", violations };
@@ -1998,7 +2019,7 @@ var audit5 = {
1998
2019
  };
1999
2020
 
2000
2021
  // src/audits/google-consent-mode.ts
2001
- var import_i18n28 = require("@wordpress/i18n");
2022
+ var import_i18n30 = require("@wordpress/i18n");
2002
2023
 
2003
2024
  // src/utils/fetch-rendered-html.ts
2004
2025
  var FETCH_TIMEOUT_MS = 1e4;
@@ -2042,12 +2063,12 @@ function hasConsentDefaultCall(html) {
2042
2063
  // src/audits/google-consent-mode.ts
2043
2064
  var audit6 = {
2044
2065
  id: "audits/google-consent-mode",
2045
- title: (0, import_i18n28.__)("Google Consent Mode", "elementor"),
2046
- description: (0, import_i18n28.__)(
2066
+ title: (0, import_i18n30.__)("Google Consent Mode", "elementor"),
2067
+ description: (0, import_i18n30.__)(
2047
2068
  "Google Analytics, Ads, or Tag Manager are running on this site and may not receive a consent signal, which risks losing conversion/analytics data and compliance exposure.",
2048
2069
  "elementor"
2049
2070
  ),
2050
- fixHint: (0, import_i18n28.__)(
2071
+ fixHint: (0, import_i18n30.__)(
2051
2072
  "Turn on Google Consent Mode in your cookie consent plugin so Google tags respect visitor consent choices.",
2052
2073
  "elementor"
2053
2074
  ),
@@ -2056,19 +2077,19 @@ var audit6 = {
2056
2077
  weight: 1,
2057
2078
  evaluate: async (ctx) => {
2058
2079
  if (!ctx.pageContext.frontend_url) {
2059
- return { status: "skipped", reason: (0, import_i18n28.__)("Page is not published.", "elementor") };
2080
+ return { status: "skipped", reason: (0, import_i18n30.__)("Page is not published.", "elementor") };
2060
2081
  }
2061
2082
  const html = await fetchRenderedHtml(ctx.pageContext.frontend_url);
2062
2083
  if (!html) {
2063
- return { status: "skipped", reason: (0, import_i18n28.__)("Could not fetch the published page.", "elementor") };
2084
+ return { status: "skipped", reason: (0, import_i18n30.__)("Could not fetch the published page.", "elementor") };
2064
2085
  }
2065
2086
  if (!hasGoogleTracking(html)) {
2066
- return { status: "skipped", reason: (0, import_i18n28.__)("No Google tracking product detected.", "elementor") };
2087
+ return { status: "skipped", reason: (0, import_i18n30.__)("No Google tracking product detected.", "elementor") };
2067
2088
  }
2068
2089
  if (hasConsentDefaultCall(html)) {
2069
2090
  return { status: "pass" };
2070
2091
  }
2071
- const label = (0, import_i18n28.__)("No Google Consent Mode signal was found on the page.", "elementor");
2092
+ const label = (0, import_i18n30.__)("No Google Consent Mode signal was found on the page.", "elementor");
2072
2093
  const isCookiezReady = ctx.pageContext.cookiez_plugin_installed && ctx.pageContext.cookiez_plugin_active;
2073
2094
  if (isCookiezReady) {
2074
2095
  return {
@@ -2077,7 +2098,7 @@ var audit6 = {
2077
2098
  {
2078
2099
  auditId: audit6.id,
2079
2100
  label,
2080
- ctaLabel: (0, import_i18n28.__)("Enable", "elementor"),
2101
+ ctaLabel: (0, import_i18n30.__)("Enable", "elementor"),
2081
2102
  externalUrl: ctx.pageContext.cookiez_consent_mode_settings_url
2082
2103
  }
2083
2104
  ]
@@ -2097,7 +2118,7 @@ var audit6 = {
2097
2118
  };
2098
2119
 
2099
2120
  // src/audits/heading-structure.ts
2100
- var import_i18n29 = require("@wordpress/i18n");
2121
+ var import_i18n31 = require("@wordpress/i18n");
2101
2122
  var HEADING_LEVELS = ["h1", "h2", "h3", "h4", "h5", "h6"];
2102
2123
  var HEADING_CONTROLS_REGISTRY = {
2103
2124
  // Core
@@ -2275,27 +2296,27 @@ function extractPageHeadings(tree) {
2275
2296
  }
2276
2297
  var audit7 = {
2277
2298
  id: "audits/heading-structure",
2278
- title: (0, import_i18n29.__)("Heading structure", "elementor"),
2279
- description: (0, import_i18n29.__)("Pages should have exactly one H1 and a non-skipping heading order.", "elementor"),
2280
- fixHint: (0, import_i18n29.__)("Ensure your page has one H1 and that heading levels do not skip (no H2 \u2192 H4).", "elementor"),
2299
+ title: (0, import_i18n31.__)("Heading structure", "elementor"),
2300
+ description: (0, import_i18n31.__)("Pages should have exactly one H1 and a non-skipping heading order.", "elementor"),
2301
+ fixHint: (0, import_i18n31.__)("Ensure your page has one H1 and that heading levels do not skip (no H2 \u2192 H4).", "elementor"),
2281
2302
  categories: ["seo", "accessibility"],
2282
2303
  severity: "error",
2283
2304
  weight: 10,
2284
2305
  evaluate: (ctx) => {
2285
2306
  if (ctx.elements.tree.length === 0) {
2286
- return { status: "skipped", reason: (0, import_i18n29.__)("No elements", "elementor") };
2307
+ return { status: "skipped", reason: (0, import_i18n31.__)("No elements", "elementor") };
2287
2308
  }
2288
2309
  const headings = extractPageHeadings(ctx.elements.tree);
2289
2310
  const violations = [];
2290
2311
  if (headings.length === 0) {
2291
2312
  violations.push({
2292
2313
  auditId: audit7.id,
2293
- label: (0, import_i18n29.__)("No headings found on the page.", "elementor")
2314
+ label: (0, import_i18n31.__)("No headings found on the page.", "elementor")
2294
2315
  });
2295
2316
  } else {
2296
2317
  const h1Count = headings.filter((h) => h.level === 1).length;
2297
2318
  if (h1Count === 0) {
2298
- violations.push({ auditId: audit7.id, label: (0, import_i18n29.__)("No H1 on the page.", "elementor") });
2319
+ violations.push({ auditId: audit7.id, label: (0, import_i18n31.__)("No H1 on the page.", "elementor") });
2299
2320
  }
2300
2321
  if (h1Count > 1) {
2301
2322
  headings.filter((h) => h.level === 1).slice(1).forEach(
@@ -2303,7 +2324,7 @@ var audit7 = {
2303
2324
  auditId: audit7.id,
2304
2325
  elementId: h.elementId,
2305
2326
  targetHint: "element-settings",
2306
- label: (0, import_i18n29.__)("More than one H1 on the page.", "elementor")
2327
+ label: (0, import_i18n31.__)("More than one H1 on the page.", "elementor")
2307
2328
  })
2308
2329
  );
2309
2330
  }
@@ -2313,7 +2334,7 @@ var audit7 = {
2313
2334
  auditId: audit7.id,
2314
2335
  elementId: headings[i].elementId,
2315
2336
  targetHint: "element-settings",
2316
- label: (0, import_i18n29.__)("Heading level skipped.", "elementor")
2337
+ label: (0, import_i18n31.__)("Heading level skipped.", "elementor")
2317
2338
  });
2318
2339
  }
2319
2340
  }
@@ -2323,24 +2344,24 @@ var audit7 = {
2323
2344
  };
2324
2345
 
2325
2346
  // src/audits/hidden-elements.ts
2326
- var import_i18n30 = require("@wordpress/i18n");
2347
+ var import_i18n32 = require("@wordpress/i18n");
2327
2348
  function isHiddenOnAllDevices(settings) {
2328
2349
  return Boolean(settings.hide_desktop) && Boolean(settings.hide_tablet) && Boolean(settings.hide_mobile);
2329
2350
  }
2330
2351
  var audit8 = {
2331
2352
  id: "audits/hidden-elements",
2332
- title: (0, import_i18n30.__)("Hidden elements", "elementor"),
2333
- description: (0, import_i18n30.__)(
2353
+ title: (0, import_i18n32.__)("Hidden elements", "elementor"),
2354
+ description: (0, import_i18n32.__)(
2334
2355
  "Elements hidden on all devices simultaneously are effectively dead code in the page tree.",
2335
2356
  "elementor"
2336
2357
  ),
2337
- fixHint: (0, import_i18n30.__)("Remove the element or make it visible on at least one device breakpoint.", "elementor"),
2358
+ fixHint: (0, import_i18n32.__)("Remove the element or make it visible on at least one device breakpoint.", "elementor"),
2338
2359
  categories: ["best-practices", "performance"],
2339
2360
  severity: "info",
2340
2361
  weight: 3,
2341
2362
  evaluate: (ctx) => {
2342
2363
  if (ctx.elements.tree.length === 0) {
2343
- return { status: "skipped", reason: (0, import_i18n30.__)("No elements", "elementor") };
2364
+ return { status: "skipped", reason: (0, import_i18n32.__)("No elements", "elementor") };
2344
2365
  }
2345
2366
  const violations = [];
2346
2367
  walkElements(ctx.elements.tree, (node) => {
@@ -2349,7 +2370,7 @@ var audit8 = {
2349
2370
  auditId: audit8.id,
2350
2371
  elementId: node.id,
2351
2372
  targetHint: "element-settings",
2352
- label: (0, import_i18n30.__)("Element is hidden on all devices.", "elementor")
2373
+ label: (0, import_i18n32.__)("Element is hidden on all devices.", "elementor")
2353
2374
  });
2354
2375
  }
2355
2376
  });
@@ -2358,7 +2379,7 @@ var audit8 = {
2358
2379
  };
2359
2380
 
2360
2381
  // src/audits/images-alt-text.ts
2361
- var import_i18n31 = require("@wordpress/i18n");
2382
+ var import_i18n33 = require("@wordpress/i18n");
2362
2383
 
2363
2384
  // src/utils/image-alt.ts
2364
2385
  function hasMeaningfulAlt(media, pageContext) {
@@ -2378,15 +2399,15 @@ function isImageSourcePresent(media) {
2378
2399
  // src/audits/images-alt-text.ts
2379
2400
  var audit9 = {
2380
2401
  id: "audits/images-alt-text",
2381
- title: (0, import_i18n31.__)("Images alt text", "elementor"),
2382
- description: (0, import_i18n31.__)("Every image needs a meaningful alt attribute for screen readers and image-search.", "elementor"),
2383
- fixHint: (0, import_i18n31.__)("Open the image's settings and add an Alt Text describing the image.", "elementor"),
2402
+ title: (0, import_i18n33.__)("Images alt text", "elementor"),
2403
+ description: (0, import_i18n33.__)("Every image needs a meaningful alt attribute for screen readers and image-search.", "elementor"),
2404
+ fixHint: (0, import_i18n33.__)("Open the image's settings and add an Alt Text describing the image.", "elementor"),
2384
2405
  categories: ["seo", "accessibility"],
2385
2406
  severity: "error",
2386
2407
  weight: 10,
2387
2408
  evaluate: (ctx) => {
2388
2409
  if (!hasPageImages(ctx.elements.tree)) {
2389
- return { status: "skipped", reason: (0, import_i18n31.__)("No images", "elementor") };
2410
+ return { status: "skipped", reason: (0, import_i18n33.__)("No images", "elementor") };
2390
2411
  }
2391
2412
  const violations = [];
2392
2413
  const failedWidgetIds = /* @__PURE__ */ new Set();
@@ -2402,7 +2423,7 @@ var audit9 = {
2402
2423
  auditId: audit9.id,
2403
2424
  elementId: node.id,
2404
2425
  targetHint: "element-settings",
2405
- label: (0, import_i18n31.__)("Image is missing alt text.", "elementor"),
2426
+ label: (0, import_i18n33.__)("Image is missing alt text.", "elementor"),
2406
2427
  externalUrl: ctx.pageContext.ally_plugin_url
2407
2428
  });
2408
2429
  }
@@ -2412,20 +2433,20 @@ var audit9 = {
2412
2433
  };
2413
2434
 
2414
2435
  // src/audits/images-too-large.ts
2415
- var import_i18n32 = require("@wordpress/i18n");
2436
+ var import_i18n34 = require("@wordpress/i18n");
2416
2437
  var SIZE_THRESHOLD_BYTES = 500 * 1024;
2417
2438
  var BYTES_PER_KB = 1024;
2418
2439
  var audit10 = {
2419
2440
  id: "audits/images-too-large",
2420
- title: (0, import_i18n32.__)("Oversized images", "elementor"),
2421
- description: (0, import_i18n32.__)("Large image files slow down the page.", "elementor"),
2422
- fixHint: (0, import_i18n32.__)("Replace the image with a smaller version or enable image optimization.", "elementor"),
2441
+ title: (0, import_i18n34.__)("Oversized images", "elementor"),
2442
+ description: (0, import_i18n34.__)("Large image files slow down the page.", "elementor"),
2443
+ fixHint: (0, import_i18n34.__)("Replace the image with a smaller version or enable image optimization.", "elementor"),
2423
2444
  categories: ["performance"],
2424
2445
  severity: "warning",
2425
2446
  weight: 7,
2426
2447
  evaluate: (ctx) => {
2427
2448
  if (!hasPageImages(ctx.elements.tree)) {
2428
- return { status: "skipped", reason: (0, import_i18n32.__)("No images", "elementor") };
2449
+ return { status: "skipped", reason: (0, import_i18n34.__)("No images", "elementor") };
2429
2450
  }
2430
2451
  const widgetMaxKb = /* @__PURE__ */ new Map();
2431
2452
  let oversizedImageCount = 0;
@@ -2447,9 +2468,9 @@ var audit10 = {
2447
2468
  auditId: audit10.id,
2448
2469
  elementId,
2449
2470
  targetHint: "element-settings",
2450
- label: (0, import_i18n32.sprintf)(
2471
+ label: (0, import_i18n34.sprintf)(
2451
2472
  /* translators: %d is the image file size in kilobytes. */
2452
- (0, import_i18n32.__)("Image is %d KB (over 500 KB).", "elementor"),
2473
+ (0, import_i18n34.__)("Image is %d KB (over 500 KB).", "elementor"),
2453
2474
  kb
2454
2475
  ),
2455
2476
  externalUrl: ctx.pageContext.image_optimization_plugin_url
@@ -2459,21 +2480,21 @@ var audit10 = {
2459
2480
  };
2460
2481
 
2461
2482
  // src/audits/nested-boxed-containers.ts
2462
- var import_i18n33 = require("@wordpress/i18n");
2483
+ var import_i18n35 = require("@wordpress/i18n");
2463
2484
  function isBoxed(settings) {
2464
2485
  return settings.content_width === "boxed";
2465
2486
  }
2466
2487
  var audit11 = {
2467
2488
  id: "audits/nested-boxed-containers",
2468
- title: (0, import_i18n33.__)("Boxed container nested inside a boxed parent", "elementor"),
2469
- description: (0, import_i18n33.__)("An inner container does not need to be boxed when its parent already is.", "elementor"),
2470
- fixHint: (0, import_i18n33.__)("Change the inner container's content width to Full Width.", "elementor"),
2489
+ title: (0, import_i18n35.__)("Boxed container nested inside a boxed parent", "elementor"),
2490
+ description: (0, import_i18n35.__)("An inner container does not need to be boxed when its parent already is.", "elementor"),
2491
+ fixHint: (0, import_i18n35.__)("Change the inner container's content width to Full Width.", "elementor"),
2471
2492
  categories: ["best-practices", "performance"],
2472
2493
  severity: "info",
2473
2494
  weight: 5,
2474
2495
  evaluate: (ctx) => {
2475
2496
  if (ctx.elements.tree.length === 0) {
2476
- return { status: "skipped", reason: (0, import_i18n33.__)("No elements", "elementor") };
2497
+ return { status: "skipped", reason: (0, import_i18n35.__)("No elements", "elementor") };
2477
2498
  }
2478
2499
  const violations = [];
2479
2500
  walkElements(ctx.elements.tree, (node, parents) => {
@@ -2486,7 +2507,7 @@ var audit11 = {
2486
2507
  auditId: audit11.id,
2487
2508
  elementId: node.id,
2488
2509
  targetHint: "element-settings",
2489
- label: (0, import_i18n33.__)("Nested boxed container.", "elementor")
2510
+ label: (0, import_i18n35.__)("Nested boxed container.", "elementor")
2490
2511
  });
2491
2512
  }
2492
2513
  });
@@ -2495,12 +2516,12 @@ var audit11 = {
2495
2516
  };
2496
2517
 
2497
2518
  // src/audits/page-excerpt.ts
2498
- var import_i18n34 = require("@wordpress/i18n");
2519
+ var import_i18n36 = require("@wordpress/i18n");
2499
2520
  var audit12 = {
2500
2521
  id: "audits/page-excerpt",
2501
- title: (0, import_i18n34.__)("Page excerpt", "elementor"),
2502
- description: (0, import_i18n34.__)("A descriptive excerpt helps search engines and previews summarize the page.", "elementor"),
2503
- fixHint: (0, import_i18n34.__)("Open Page Settings and write a short excerpt.", "elementor"),
2522
+ title: (0, import_i18n36.__)("Page excerpt", "elementor"),
2523
+ description: (0, import_i18n36.__)("A descriptive excerpt helps search engines and previews summarize the page.", "elementor"),
2524
+ fixHint: (0, import_i18n36.__)("Open Page Settings and write a short excerpt.", "elementor"),
2504
2525
  categories: ["seo"],
2505
2526
  severity: "warning",
2506
2527
  weight: 5,
@@ -2513,7 +2534,7 @@ var audit12 = {
2513
2534
  violations: [
2514
2535
  {
2515
2536
  auditId: audit12.id,
2516
- label: (0, import_i18n34.__)("Page has no excerpt.", "elementor"),
2537
+ label: (0, import_i18n36.__)("Page has no excerpt.", "elementor"),
2517
2538
  targetHint: "page-settings",
2518
2539
  angieFix: true
2519
2540
  }
@@ -2523,12 +2544,12 @@ var audit12 = {
2523
2544
  };
2524
2545
 
2525
2546
  // src/audits/page-featured-image.ts
2526
- var import_i18n35 = require("@wordpress/i18n");
2547
+ var import_i18n37 = require("@wordpress/i18n");
2527
2548
  var audit13 = {
2528
2549
  id: "audits/page-featured-image",
2529
- title: (0, import_i18n35.__)("Page featured image", "elementor"),
2530
- description: (0, import_i18n35.__)("Featured images are used by social shares and many themes for hero visuals.", "elementor"),
2531
- fixHint: (0, import_i18n35.__)("Open Page Settings and set a featured image.", "elementor"),
2550
+ title: (0, import_i18n37.__)("Page featured image", "elementor"),
2551
+ description: (0, import_i18n37.__)("Featured images are used by social shares and many themes for hero visuals.", "elementor"),
2552
+ fixHint: (0, import_i18n37.__)("Open Page Settings and set a featured image.", "elementor"),
2532
2553
  categories: ["seo"],
2533
2554
  severity: "info",
2534
2555
  weight: 5,
@@ -2541,7 +2562,7 @@ var audit13 = {
2541
2562
  violations: [
2542
2563
  {
2543
2564
  auditId: audit13.id,
2544
- label: (0, import_i18n35.__)("No featured image set.", "elementor"),
2565
+ label: (0, import_i18n37.__)("No featured image set.", "elementor"),
2545
2566
  targetHint: "page-settings"
2546
2567
  }
2547
2568
  ]
@@ -2550,13 +2571,13 @@ var audit13 = {
2550
2571
  };
2551
2572
 
2552
2573
  // src/audits/page-title.ts
2553
- var import_i18n36 = require("@wordpress/i18n");
2574
+ var import_i18n38 = require("@wordpress/i18n");
2554
2575
  var MAX_TITLE_LENGTH = 60;
2555
2576
  var audit14 = {
2556
2577
  id: "audits/page-title",
2557
- title: (0, import_i18n36.__)("Page title", "elementor"),
2558
- description: (0, import_i18n36.__)("Pages need a clear title for SEO and screen-reader navigation.", "elementor"),
2559
- fixHint: (0, import_i18n36.__)("Open Page Settings and add a title.", "elementor"),
2578
+ title: (0, import_i18n38.__)("Page title", "elementor"),
2579
+ description: (0, import_i18n38.__)("Pages need a clear title for SEO and screen-reader navigation.", "elementor"),
2580
+ fixHint: (0, import_i18n38.__)("Open Page Settings and add a title.", "elementor"),
2560
2581
  categories: ["seo"],
2561
2582
  severity: "error",
2562
2583
  weight: 10,
@@ -2568,9 +2589,13 @@ var audit14 = {
2568
2589
  violations: [
2569
2590
  {
2570
2591
  auditId: audit14.id,
2571
- label: (0, import_i18n36.__)("Page has no title.", "elementor"),
2592
+ label: (0, import_i18n38.__)("Page has no title.", "elementor"),
2572
2593
  targetHint: "page-settings",
2573
- angieFix: true
2594
+ angieFix: true,
2595
+ angiePrompt: (0, import_i18n38.__)(
2596
+ "Based on this page's contents, generate a title for this page.",
2597
+ "elementor"
2598
+ )
2574
2599
  }
2575
2600
  ]
2576
2601
  };
@@ -2581,7 +2606,7 @@ var audit14 = {
2581
2606
  violations: [
2582
2607
  {
2583
2608
  auditId: audit14.id,
2584
- label: (0, import_i18n36.__)("Page title is too long.", "elementor"),
2609
+ label: (0, import_i18n38.__)("Page title is too long.", "elementor"),
2585
2610
  targetHint: "page-settings",
2586
2611
  angieFix: true
2587
2612
  }
@@ -2593,7 +2618,7 @@ var audit14 = {
2593
2618
  };
2594
2619
 
2595
2620
  // src/audits/prefer-global-colors.ts
2596
- var import_i18n37 = require("@wordpress/i18n");
2621
+ var import_i18n39 = require("@wordpress/i18n");
2597
2622
 
2598
2623
  // src/utils/collect-hardcoded-colors.ts
2599
2624
  var RESERVED_SETTING_KEYS = /* @__PURE__ */ new Set(["__globals__", "__dynamic__"]);
@@ -2661,18 +2686,18 @@ function findMatchingGlobalByValue(value, globals) {
2661
2686
  // src/audits/prefer-global-colors.ts
2662
2687
  var audit15 = {
2663
2688
  id: "audits/prefer-global-colors",
2664
- title: (0, import_i18n37.__)("Prefer global colors", "elementor"),
2665
- description: (0, import_i18n37.__)("Global colors make the design consistent and easy to update site-wide.", "elementor"),
2666
- fixHint: (0, import_i18n37.__)("Replace the hard-coded value with the matching global color.", "elementor"),
2689
+ title: (0, import_i18n39.__)("Prefer global colors", "elementor"),
2690
+ description: (0, import_i18n39.__)("Global colors make the design consistent and easy to update site-wide.", "elementor"),
2691
+ fixHint: (0, import_i18n39.__)("Replace the hard-coded value with the matching global color.", "elementor"),
2667
2692
  categories: ["best-practices"],
2668
2693
  severity: "info",
2669
2694
  weight: 3,
2670
2695
  evaluate: (ctx) => {
2671
2696
  if (ctx.elements.tree.length === 0) {
2672
- return { status: "skipped", reason: (0, import_i18n37.__)("No elements", "elementor") };
2697
+ return { status: "skipped", reason: (0, import_i18n39.__)("No elements", "elementor") };
2673
2698
  }
2674
2699
  if (ctx.kit.globals.colors.length === 0) {
2675
- return { status: "skipped", reason: (0, import_i18n37.__)("No global colors", "elementor") };
2700
+ return { status: "skipped", reason: (0, import_i18n39.__)("No global colors", "elementor") };
2676
2701
  }
2677
2702
  const violations = [];
2678
2703
  walkElements(ctx.elements.tree, (node) => {
@@ -2686,9 +2711,9 @@ var audit15 = {
2686
2711
  elementId: node.id,
2687
2712
  targetHint: "element-settings",
2688
2713
  angieFix: true,
2689
- label: (0, import_i18n37.sprintf)(
2714
+ label: (0, import_i18n39.sprintf)(
2690
2715
  /* translators: 1: hard-coded color value, 2: global color title. */
2691
- (0, import_i18n37.__)('replace "%1$s" with "%2$s" global color', "elementor"),
2716
+ (0, import_i18n39.__)('replace "%1$s" with "%2$s" global color', "elementor"),
2692
2717
  value,
2693
2718
  global.title
2694
2719
  )
@@ -2700,7 +2725,7 @@ var audit15 = {
2700
2725
  };
2701
2726
 
2702
2727
  // src/audits/prefer-global-fonts.ts
2703
- var import_i18n38 = require("@wordpress/i18n");
2728
+ var import_i18n40 = require("@wordpress/i18n");
2704
2729
 
2705
2730
  // src/utils/collect-hardcoded-fonts.ts
2706
2731
  var RESERVED_SETTING_KEYS2 = /* @__PURE__ */ new Set(["__globals__", "__dynamic__"]);
@@ -2760,18 +2785,18 @@ function collectHardcodedFonts(settings, pathPrefix = "") {
2760
2785
  // src/audits/prefer-global-fonts.ts
2761
2786
  var audit16 = {
2762
2787
  id: "audits/prefer-global-fonts",
2763
- title: (0, import_i18n38.__)("Prefer global fonts", "elementor"),
2764
- description: (0, import_i18n38.__)("Global fonts make the design consistent and easy to update site-wide.", "elementor"),
2765
- fixHint: (0, import_i18n38.__)("Replace the hard-coded value with the matching global font.", "elementor"),
2788
+ title: (0, import_i18n40.__)("Prefer global fonts", "elementor"),
2789
+ description: (0, import_i18n40.__)("Global fonts make the design consistent and easy to update site-wide.", "elementor"),
2790
+ fixHint: (0, import_i18n40.__)("Replace the hard-coded value with the matching global font.", "elementor"),
2766
2791
  categories: ["best-practices", "performance"],
2767
2792
  severity: "info",
2768
2793
  weight: 3,
2769
2794
  evaluate: (ctx) => {
2770
2795
  if (ctx.elements.tree.length === 0) {
2771
- return { status: "skipped", reason: (0, import_i18n38.__)("No elements", "elementor") };
2796
+ return { status: "skipped", reason: (0, import_i18n40.__)("No elements", "elementor") };
2772
2797
  }
2773
2798
  if (ctx.kit.globals.fonts.length === 0) {
2774
- return { status: "skipped", reason: (0, import_i18n38.__)("No global fonts", "elementor") };
2799
+ return { status: "skipped", reason: (0, import_i18n40.__)("No global fonts", "elementor") };
2775
2800
  }
2776
2801
  const violations = [];
2777
2802
  walkElements(ctx.elements.tree, (node) => {
@@ -2784,9 +2809,9 @@ var audit16 = {
2784
2809
  auditId: audit16.id,
2785
2810
  elementId: node.id,
2786
2811
  targetHint: "element-settings",
2787
- label: (0, import_i18n38.sprintf)(
2812
+ label: (0, import_i18n40.sprintf)(
2788
2813
  /* translators: %s: global font title. */
2789
- (0, import_i18n38.__)('replace hardcoded typography with "%s" global font', "elementor"),
2814
+ (0, import_i18n40.__)('replace hardcoded typography with "%s" global font', "elementor"),
2790
2815
  global.title
2791
2816
  )
2792
2817
  });
@@ -2797,15 +2822,15 @@ var audit16 = {
2797
2822
  };
2798
2823
 
2799
2824
  // src/audits/privacy-policy.ts
2800
- var import_i18n39 = require("@wordpress/i18n");
2825
+ var import_i18n41 = require("@wordpress/i18n");
2801
2826
  var audit17 = {
2802
2827
  id: "audits/privacy-policy",
2803
- title: (0, import_i18n39.__)("Privacy policy", "elementor"),
2804
- description: (0, import_i18n39.__)(
2828
+ title: (0, import_i18n41.__)("Privacy policy", "elementor"),
2829
+ description: (0, import_i18n41.__)(
2805
2830
  "A privacy policy page is required by privacy regulations such as GDPR (EU) and CCPA (US).",
2806
2831
  "elementor"
2807
2832
  ),
2808
- fixHint: (0, import_i18n39.__)(
2833
+ fixHint: (0, import_i18n41.__)(
2809
2834
  "Go to Settings > Privacy in the WordPress admin and assign a published privacy policy page.",
2810
2835
  "elementor"
2811
2836
  ),
@@ -2821,9 +2846,9 @@ var audit17 = {
2821
2846
  violations: [
2822
2847
  {
2823
2848
  auditId: audit17.id,
2824
- label: (0, import_i18n39.__)("No privacy policy page is set.", "elementor"),
2849
+ label: (0, import_i18n41.__)("No privacy policy page is set.", "elementor"),
2825
2850
  externalUrl: ctx.pageContext.privacy_settings_url,
2826
- ctaLabel: (0, import_i18n39.__)("Create", "elementor")
2851
+ ctaLabel: (0, import_i18n41.__)("Create", "elementor")
2827
2852
  }
2828
2853
  ]
2829
2854
  };
@@ -2831,15 +2856,15 @@ var audit17 = {
2831
2856
  };
2832
2857
 
2833
2858
  // src/audits/robots-noindex.ts
2834
- var import_i18n40 = require("@wordpress/i18n");
2859
+ var import_i18n42 = require("@wordpress/i18n");
2835
2860
  var audit18 = {
2836
2861
  id: "audits/robots-noindex",
2837
- title: (0, import_i18n40.__)("Search engine visibility", "elementor"),
2838
- description: (0, import_i18n40.__)(
2862
+ title: (0, import_i18n42.__)("Search engine visibility", "elementor"),
2863
+ description: (0, import_i18n42.__)(
2839
2864
  "When search engine visibility is checked in WordPress Settings -> Reading -> Search Engine Visibility, search engines are discouraged from indexing the website.",
2840
2865
  "elementor"
2841
2866
  ),
2842
- fixHint: (0, import_i18n40.__)(
2867
+ fixHint: (0, import_i18n42.__)(
2843
2868
  'Go to Settings \u2192 Reading in the WordPress admin and uncheck "Discourage search engines from indexing this site" when the website should be indexed.',
2844
2869
  "elementor"
2845
2870
  ),
@@ -2855,7 +2880,7 @@ var audit18 = {
2855
2880
  violations: [
2856
2881
  {
2857
2882
  auditId: audit18.id,
2858
- label: (0, import_i18n40.__)("Search engines are discouraged from indexing this website.", "elementor"),
2883
+ label: (0, import_i18n42.__)("Search engines are discouraged from indexing this website.", "elementor"),
2859
2884
  externalUrl: ctx.pageContext.reading_settings_url
2860
2885
  }
2861
2886
  ]
@@ -2864,15 +2889,15 @@ var audit18 = {
2864
2889
  };
2865
2890
 
2866
2891
  // src/audits/scan-for-cookies.ts
2867
- var import_i18n41 = require("@wordpress/i18n");
2892
+ var import_i18n43 = require("@wordpress/i18n");
2868
2893
  var audit19 = {
2869
2894
  id: "audits/scan-for-cookies",
2870
- title: (0, import_i18n41.__)("Scan for cookies", "elementor"),
2871
- description: (0, import_i18n41.__)(
2895
+ title: (0, import_i18n43.__)("Scan for cookies", "elementor"),
2896
+ description: (0, import_i18n43.__)(
2872
2897
  "Your site may be setting cookies you haven't disclosed. Some countries require a banner even without a full consent policy. Scan to see what needs disclosure.",
2873
2898
  "elementor"
2874
2899
  ),
2875
- fixHint: (0, import_i18n41.__)("Run a Cookiez scan on this page to see which cookies need disclosure.", "elementor"),
2900
+ fixHint: (0, import_i18n43.__)("Run a Cookiez scan on this page to see which cookies need disclosure.", "elementor"),
2876
2901
  categories: ["compliance"],
2877
2902
  severity: "info",
2878
2903
  weight: 0,
@@ -2883,7 +2908,7 @@ var audit19 = {
2883
2908
  violations: [
2884
2909
  {
2885
2910
  auditId: audit19.id,
2886
- label: (0, import_i18n41.__)("This page has not been scanned for cookies yet.", "elementor"),
2911
+ label: (0, import_i18n43.__)("This page has not been scanned for cookies yet.", "elementor"),
2887
2912
  externalUrl: isReady ? ctx.pageContext.cookiez_scan_url : ctx.pageContext.cookiez_plugin_action_url
2888
2913
  }
2889
2914
  ]
@@ -2892,21 +2917,21 @@ var audit19 = {
2892
2917
  };
2893
2918
 
2894
2919
  // src/audits/sections-and-columns.ts
2895
- var import_i18n42 = require("@wordpress/i18n");
2920
+ var import_i18n44 = require("@wordpress/i18n");
2896
2921
  var audit20 = {
2897
2922
  id: "audits/sections-and-columns",
2898
- title: (0, import_i18n42.__)("Sections and columns", "elementor"),
2899
- description: (0, import_i18n42.__)(
2923
+ title: (0, import_i18n44.__)("Sections and columns", "elementor"),
2924
+ description: (0, import_i18n44.__)(
2900
2925
  "Sections and columns are legacy elements. Containers render fewer DOM nodes and are more flexible.",
2901
2926
  "elementor"
2902
2927
  ),
2903
- fixHint: (0, import_i18n42.__)("Use the Container Converter to replace each section/column with a container.", "elementor"),
2928
+ fixHint: (0, import_i18n44.__)("Use the Container Converter to replace each section/column with a container.", "elementor"),
2904
2929
  categories: ["best-practices", "performance"],
2905
2930
  severity: "warning",
2906
2931
  weight: 7,
2907
2932
  evaluate: (ctx) => {
2908
2933
  if (ctx.elements.tree.length === 0) {
2909
- return { status: "skipped", reason: (0, import_i18n42.__)("No elements", "elementor") };
2934
+ return { status: "skipped", reason: (0, import_i18n44.__)("No elements", "elementor") };
2910
2935
  }
2911
2936
  const violations = [];
2912
2937
  walkElements(ctx.elements.tree, (node) => {
@@ -2914,7 +2939,7 @@ var audit20 = {
2914
2939
  violations.push({
2915
2940
  auditId: audit20.id,
2916
2941
  elementId: node.id,
2917
- label: node.elType === "section" ? (0, import_i18n42.__)("Section element", "elementor") : (0, import_i18n42.__)("Column element", "elementor")
2942
+ label: node.elType === "section" ? (0, import_i18n44.__)("Section element", "elementor") : (0, import_i18n44.__)("Column element", "elementor")
2918
2943
  });
2919
2944
  }
2920
2945
  });
@@ -2923,15 +2948,15 @@ var audit20 = {
2923
2948
  };
2924
2949
 
2925
2950
  // src/audits/site-identity.ts
2926
- var import_i18n43 = require("@wordpress/i18n");
2951
+ var import_i18n45 = require("@wordpress/i18n");
2927
2952
  var audit21 = {
2928
2953
  id: "audits/site-identity",
2929
- title: (0, import_i18n43.__)("Site identity", "elementor"),
2930
- description: (0, import_i18n43.__)(
2954
+ title: (0, import_i18n45.__)("Site identity", "elementor"),
2955
+ description: (0, import_i18n45.__)(
2931
2956
  "Site name, description, logo, and favicon establish your brand and appear in search results and browser tabs.",
2932
2957
  "elementor"
2933
2958
  ),
2934
- fixHint: (0, import_i18n43.__)("Open Site Settings \u2192 Site Identity and complete all the missing fields.", "elementor"),
2959
+ fixHint: (0, import_i18n45.__)("Open Site Settings \u2192 Site Identity and complete all the missing fields.", "elementor"),
2935
2960
  categories: ["best-practices", "seo"],
2936
2961
  severity: "info",
2937
2962
  weight: 7,
@@ -2941,14 +2966,14 @@ var audit21 = {
2941
2966
  if (!identity.site_name_set) {
2942
2967
  violations.push({
2943
2968
  auditId: audit21.id,
2944
- label: (0, import_i18n43.__)("Site name is missing or still uses the default.", "elementor"),
2969
+ label: (0, import_i18n45.__)("Site name is missing or still uses the default.", "elementor"),
2945
2970
  targetHint: "site-identity-settings"
2946
2971
  });
2947
2972
  }
2948
2973
  if (!identity.site_description_set) {
2949
2974
  violations.push({
2950
2975
  auditId: audit21.id,
2951
- label: (0, import_i18n43.__)("Site description is missing or still uses the default.", "elementor"),
2976
+ label: (0, import_i18n45.__)("Site description is missing or still uses the default.", "elementor"),
2952
2977
  targetHint: "site-identity-settings",
2953
2978
  angieFix: true
2954
2979
  });
@@ -2956,14 +2981,14 @@ var audit21 = {
2956
2981
  if (!identity.site_logo_set) {
2957
2982
  violations.push({
2958
2983
  auditId: audit21.id,
2959
- label: (0, import_i18n43.__)("Site logo is not set.", "elementor"),
2984
+ label: (0, import_i18n45.__)("Site logo is not set.", "elementor"),
2960
2985
  targetHint: "site-identity-settings"
2961
2986
  });
2962
2987
  }
2963
2988
  if (!identity.site_favicon_set) {
2964
2989
  violations.push({
2965
2990
  auditId: audit21.id,
2966
- label: (0, import_i18n43.__)("Site favicon is not set.", "elementor"),
2991
+ label: (0, import_i18n45.__)("Site favicon is not set.", "elementor"),
2967
2992
  targetHint: "site-identity-settings"
2968
2993
  });
2969
2994
  }
@@ -2979,7 +3004,7 @@ var audit21 = {
2979
3004
 
2980
3005
  // src/audits/too-many-widgets.ts
2981
3006
  var import_editor_elements8 = require("@elementor/editor-elements");
2982
- var import_i18n44 = require("@wordpress/i18n");
3007
+ var import_i18n46 = require("@wordpress/i18n");
2983
3008
  var WIDGET_COUNT_THRESHOLD = 100;
2984
3009
  function isCountableWidget(node, widgetsCache) {
2985
3010
  if (node.elType === "widget") {
@@ -2989,15 +3014,15 @@ function isCountableWidget(node, widgetsCache) {
2989
3014
  }
2990
3015
  var audit22 = {
2991
3016
  id: "audits/too-many-widgets",
2992
- title: (0, import_i18n44.__)("Too many widgets", "elementor"),
2993
- description: (0, import_i18n44.__)("Excessive DOM size caused by too many widgets degrades rendering performance.", "elementor"),
2994
- fixHint: (0, import_i18n44.__)("Reduce the number of widgets on the page by removing or combining elements.", "elementor"),
3017
+ title: (0, import_i18n46.__)("Too many widgets", "elementor"),
3018
+ description: (0, import_i18n46.__)("Excessive DOM size caused by too many widgets degrades rendering performance.", "elementor"),
3019
+ fixHint: (0, import_i18n46.__)("Reduce the number of widgets on the page by removing or combining elements.", "elementor"),
2995
3020
  categories: ["best-practices", "performance"],
2996
3021
  severity: "warning",
2997
3022
  weight: 5,
2998
3023
  evaluate: (ctx) => {
2999
3024
  if (ctx.elements.tree.length === 0) {
3000
- return { status: "skipped", reason: (0, import_i18n44.__)("No elements", "elementor") };
3025
+ return { status: "skipped", reason: (0, import_i18n46.__)("No elements", "elementor") };
3001
3026
  }
3002
3027
  const widgetsCache = (0, import_editor_elements8.getWidgetsCache)();
3003
3028
  let widgetCount = 0;
@@ -3014,7 +3039,7 @@ var audit22 = {
3014
3039
  violations: [
3015
3040
  {
3016
3041
  auditId: audit22.id,
3017
- label: (0, import_i18n44.__)("Page has too many widgets.", "elementor")
3042
+ label: (0, import_i18n46.__)("Page has too many widgets.", "elementor")
3018
3043
  }
3019
3044
  ]
3020
3045
  };