@elementor/editor-audits 4.3.0-1036
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/CHANGELOG.md +5 -0
- package/dist/index.d.mts +122 -0
- package/dist/index.d.ts +122 -0
- package/dist/index.js +2822 -0
- package/dist/index.js.map +1 -0
- package/dist/index.mjs +2801 -0
- package/dist/index.mjs.map +1 -0
- package/package.json +65 -0
- package/src/api/page-context-client.ts +19 -0
- package/src/audits/accessibility-policy.ts +32 -0
- package/src/audits/cookie-policy.ts +32 -0
- package/src/audits/deep-nesting.ts +45 -0
- package/src/audits/default-design-system.ts +32 -0
- package/src/audits/deprecated-widgets.ts +57 -0
- package/src/audits/heading-structure.ts +294 -0
- package/src/audits/hidden-elements.ts +41 -0
- package/src/audits/images-alt-text.ts +47 -0
- package/src/audits/images-too-large.ts +61 -0
- package/src/audits/nested-boxed-containers.ts +44 -0
- package/src/audits/page-excerpt.ts +30 -0
- package/src/audits/page-featured-image.ts +29 -0
- package/src/audits/page-title.ts +48 -0
- package/src/audits/prefer-global-colors.ts +52 -0
- package/src/audits/prefer-global-fonts.ts +50 -0
- package/src/audits/privacy-policy.ts +35 -0
- package/src/audits/robots-noindex.ts +35 -0
- package/src/audits/sections-and-columns.ts +39 -0
- package/src/audits/site-identity.ts +62 -0
- package/src/audits/too-many-widgets.ts +43 -0
- package/src/components/audit-feedback.tsx +178 -0
- package/src/components/audit-panel.tsx +55 -0
- package/src/components/category-icons.ts +17 -0
- package/src/components/count-summary-circle.tsx +66 -0
- package/src/components/fix-violation-with-angie.tsx +50 -0
- package/src/components/issues-category-row.tsx +62 -0
- package/src/components/pages/all-audits-page.tsx +65 -0
- package/src/components/pages/category-page.tsx +50 -0
- package/src/components/pages/error-page.tsx +21 -0
- package/src/components/pages/issues-page.tsx +48 -0
- package/src/components/pages/loading-page.tsx +12 -0
- package/src/components/pages/overview-page.tsx +140 -0
- package/src/components/pages/welcome-page.tsx +48 -0
- package/src/components/promotion-card.tsx +43 -0
- package/src/components/promotions.tsx +69 -0
- package/src/components/report-shell.tsx +110 -0
- package/src/components/score-bar.tsx +56 -0
- package/src/components/score-circle.tsx +60 -0
- package/src/components/severity-icons.tsx +26 -0
- package/src/components/status-section.tsx +47 -0
- package/src/components/subpage-header.tsx +29 -0
- package/src/components/violation-icons.tsx +33 -0
- package/src/components/violation-row.tsx +169 -0
- package/src/constants.ts +35 -0
- package/src/editor-app-bar.tsx +13 -0
- package/src/editor-panel.tsx +19 -0
- package/src/hooks/focus-violation.ts +53 -0
- package/src/hooks/use-audit-report.ts +43 -0
- package/src/hooks/use-audit-toggle-props.ts +17 -0
- package/src/index.ts +14 -0
- package/src/init.ts +14 -0
- package/src/register-audits.ts +56 -0
- package/src/register-promotions.ts +75 -0
- package/src/registry.ts +19 -0
- package/src/runner.ts +44 -0
- package/src/store/index.ts +2 -0
- package/src/store/selectors.ts +15 -0
- package/src/store/slice.ts +42 -0
- package/src/types.ts +112 -0
- package/src/utils/audit-status-summary.ts +112 -0
- package/src/utils/build-angie-prompt.ts +9 -0
- package/src/utils/collect-hardcoded-colors.ts +74 -0
- package/src/utils/collect-hardcoded-fonts.ts +70 -0
- package/src/utils/compute-report.ts +51 -0
- package/src/utils/find-audit-run.ts +5 -0
- package/src/utils/image-alt.ts +19 -0
- package/src/utils/image-like-sources.ts +70 -0
- package/src/utils/keyboard-click.ts +10 -0
- package/src/utils/match-global-by-value.ts +5 -0
- package/src/utils/page-attachments.ts +14 -0
- package/src/utils/read-kit-snapshot.ts +149 -0
- package/src/utils/report-storage.ts +16 -0
- package/src/utils/score-thresholds.ts +23 -0
- package/src/utils/severity-counts.ts +59 -0
- package/src/utils/sort-failed-audits.ts +19 -0
- package/src/utils/v1-snapshot.ts +27 -0
- package/src/utils/walk.ts +17 -0
- package/src/utils/window-config.ts +20 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/init.ts","../src/editor-app-bar.tsx","../src/hooks/use-audit-toggle-props.ts","../src/editor-panel.tsx","../src/components/audit-panel.tsx","../src/hooks/use-audit-report.ts","../src/runner.ts","../src/api/page-context-client.ts","../src/utils/window-config.ts","../src/registry.ts","../src/constants.ts","../src/utils/audit-status-summary.ts","../src/utils/sort-failed-audits.ts","../src/utils/compute-report.ts","../src/utils/walk.ts","../src/utils/image-like-sources.ts","../src/utils/page-attachments.ts","../src/utils/read-kit-snapshot.ts","../src/utils/v1-snapshot.ts","../src/store/slice.ts","../src/store/selectors.ts","../src/utils/report-storage.ts","../src/components/audit-feedback.tsx","../src/components/pages/error-page.tsx","../src/components/pages/loading-page.tsx","../src/components/pages/welcome-page.tsx","../src/components/report-shell.tsx","../src/components/pages/all-audits-page.tsx","../src/components/status-section.tsx","../src/components/subpage-header.tsx","../src/components/violation-row.tsx","../src/hooks/focus-violation.ts","../src/utils/build-angie-prompt.ts","../src/utils/keyboard-click.ts","../src/components/fix-violation-with-angie.tsx","../src/components/severity-icons.tsx","../src/components/violation-icons.tsx","../src/components/pages/category-page.tsx","../src/components/category-icons.ts","../src/components/pages/issues-page.tsx","../src/utils/severity-counts.ts","../src/components/issues-category-row.tsx","../src/components/promotions.tsx","../src/register-promotions.ts","../src/utils/find-audit-run.ts","../src/components/promotion-card.tsx","../src/components/pages/overview-page.tsx","../src/utils/score-thresholds.ts","../src/components/count-summary-circle.tsx","../src/components/score-bar.tsx","../src/components/score-circle.tsx","../src/audits/accessibility-policy.ts","../src/audits/cookie-policy.ts","../src/audits/deep-nesting.ts","../src/audits/default-design-system.ts","../src/audits/deprecated-widgets.ts","../src/audits/heading-structure.ts","../src/audits/hidden-elements.ts","../src/audits/images-alt-text.ts","../src/utils/image-alt.ts","../src/audits/images-too-large.ts","../src/audits/nested-boxed-containers.ts","../src/audits/page-excerpt.ts","../src/audits/page-featured-image.ts","../src/audits/page-title.ts","../src/audits/prefer-global-colors.ts","../src/utils/collect-hardcoded-colors.ts","../src/utils/match-global-by-value.ts","../src/audits/prefer-global-fonts.ts","../src/utils/collect-hardcoded-fonts.ts","../src/audits/privacy-policy.ts","../src/audits/robots-noindex.ts","../src/audits/sections-and-columns.ts","../src/audits/site-identity.ts","../src/audits/too-many-widgets.ts","../src/register-audits.ts"],"sourcesContent":["import { registerFloatingPanel } from '@elementor/editor-floating-panels';\nimport { __registerSlice as registerSlice } from '@elementor/store';\n\nimport { registerAppBarAuditsToggle } from './editor-app-bar';\nimport { auditPanel } from './editor-panel';\nimport { registerAllAudits } from './register-audits';\nimport { slice } from './store/slice';\n\nexport function init(): void {\n\tregisterSlice( slice );\n\tregisterAllAudits();\n\tregisterFloatingPanel( auditPanel.panel );\n\tregisterAppBarAuditsToggle();\n}\n","import { utilitiesMenu } from '@elementor/editor-app-bar';\n\nimport { useAuditToggleProps } from './hooks/use-audit-toggle-props';\n\nconst AUDIT_TOGGLE_PRIORITY = 24;\n\nexport function registerAppBarAuditsToggle(): void {\n\tutilitiesMenu.registerToggleAction( {\n\t\tid: 'toggle-audit-panel',\n\t\tpriority: AUDIT_TOGGLE_PRIORITY,\n\t\tuseProps: useAuditToggleProps,\n\t} );\n}\n","import { type ToggleActionProps } from '@elementor/editor-app-bar';\nimport { ShieldCheckIcon } from '@elementor/icons';\nimport { __ } from '@wordpress/i18n';\n\nimport { auditPanel } from '../editor-panel';\n\nexport function useAuditToggleProps(): ToggleActionProps {\n\tconst { isOpen } = auditPanel.useFloatingPanelStatus();\n\tconst { toggle } = auditPanel.useFloatingPanelActions();\n\n\treturn {\n\t\ttitle: __( 'Audit Page', 'elementor' ),\n\t\ticon: ShieldCheckIcon,\n\t\tselected: isOpen,\n\t\tonClick: () => toggle(),\n\t};\n}\n","import { createFloatingPanel } from '@elementor/editor-floating-panels';\n\nimport AuditPanel from './components/audit-panel';\nimport { AUDIT_PANEL_ID } from './constants';\n\nexport const auditPanel = createFloatingPanel( {\n\tid: AUDIT_PANEL_ID,\n\ttitle: 'Audit',\n\ticon: () => null,\n\tcomponent: AuditPanel,\n\tisDraggable: true,\n\tisResizable: true,\n\tdefaults: {\n\t\twidth: 360,\n\t\theight: 600,\n\t\tminWidth: 280,\n\t\tminHeight: 400,\n\t},\n} );\n","import * as React from 'react';\nimport { getCurrentDocumentId } from '@elementor/editor-elements';\nimport { FloatingPanelBody, FloatingPanelFooter, FloatingPanelHeader } from '@elementor/editor-floating-panels';\nimport { Box, Button, Typography } from '@elementor/ui';\nimport { __ } from '@wordpress/i18n';\n\nimport { useAuditReport } from '../hooks/use-audit-report';\nimport AuditFeedback from './audit-feedback';\nimport ErrorPage from './pages/error-page';\nimport LoadingPage from './pages/loading-page';\nimport WelcomePage from './pages/welcome-page';\nimport ReportShell from './report-shell';\n\nexport default function AuditPanel() {\n\tconst { status, report, error, run } = useAuditReport();\n\n\tconst currentDocumentId = getCurrentDocumentId() ?? 0;\n\tconst onRun = () => run( currentDocumentId );\n\tconst lastScanLabel = report ? new Date( report.runAt ).toLocaleTimeString() : null;\n\n\treturn (\n\t\t<>\n\t\t\t<FloatingPanelHeader\n\t\t\t\tpanelId=\"audit-panel\"\n\t\t\t\ttitle={ __( 'Page Audit', 'elementor' ) }\n\t\t\t\tbadge={ __( 'Beta', 'elementor' ) }\n\t\t\t\ttitleVariant=\"subtitle2\"\n\t\t\t/>\n\t\t\t<FloatingPanelBody>\n\t\t\t\t{ status === 'idle' && <WelcomePage /> }\n\t\t\t\t{ status === 'loading' && <LoadingPage /> }\n\t\t\t\t{ status === 'error' && <ErrorPage message={ error ?? '' } onRetry={ onRun } /> }\n\t\t\t\t{ status === 'ready' && report && <ReportShell report={ report } /> }\n\t\t\t</FloatingPanelBody>\n\t\t\t<FloatingPanelFooter>\n\t\t\t\t{ lastScanLabel ? (\n\t\t\t\t\t<Typography variant=\"caption\" sx={ { flex: 1 } }>\n\t\t\t\t\t\t{ __( 'Last scan:', 'elementor' ) } { lastScanLabel }\n\t\t\t\t\t</Typography>\n\t\t\t\t) : (\n\t\t\t\t\t<Box sx={ { flex: 1 } } />\n\t\t\t\t) }\n\t\t\t\t{ lastScanLabel && <AuditFeedback /> }\n\t\t\t\t<Button\n\t\t\t\t\tvariant=\"contained\"\n\t\t\t\t\tsize=\"small\"\n\t\t\t\t\tonClick={ onRun }\n\t\t\t\t\tdisabled={ status === 'loading' || currentDocumentId === 0 }\n\t\t\t\t>\n\t\t\t\t\t{ lastScanLabel ? __( 'Re-scan', 'elementor' ) : __( 'Run page audit', 'elementor' ) }\n\t\t\t\t</Button>\n\t\t\t</FloatingPanelFooter>\n\t\t</>\n\t);\n}\n","import { useEffect } from 'react';\nimport { getCurrentDocumentId } from '@elementor/editor-elements';\nimport { __useDispatch as useDispatch, __useSelector as useSelector } from '@elementor/store';\n\nimport { runPageAudit } from '../runner';\nimport { type GlobalState, selectError, selectReport, selectStatus, slice } from '../store';\nimport { getPersistedReport, persistReport } from '../utils/report-storage';\n\nexport function useAuditReport() {\n\tconst status = useSelector( ( state: GlobalState ) => selectStatus( state ) );\n\tconst report = useSelector( ( state: GlobalState ) => selectReport( state ) );\n\tconst error = useSelector( ( state: GlobalState ) => selectError( state ) );\n\tconst dispatch = useDispatch();\n\tconst documentId = getCurrentDocumentId() ?? 0;\n\n\tuseEffect( () => {\n\t\tif ( ! documentId || report?.documentId === documentId ) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst persisted = getPersistedReport( documentId );\n\n\t\tif ( persisted ) {\n\t\t\tdispatch( slice.actions.reportRestored( persisted ) );\n\t\t} else if ( report ) {\n\t\t\tdispatch( slice.actions.reportCleared() );\n\t\t}\n\t}, [ documentId, report, dispatch ] );\n\n\tconst run = async ( documentIdToRun: number ) => {\n\t\tdispatch( slice.actions.runStarted() );\n\n\t\ttry {\n\t\t\tconst nextReport = await runPageAudit( documentIdToRun );\n\t\t\tdispatch( slice.actions.runSucceeded( nextReport ) );\n\t\t\tpersistReport( documentIdToRun, nextReport );\n\t\t} catch ( e ) {\n\t\t\tdispatch( slice.actions.runFailed( e instanceof Error ? e.message : 'Unknown error' ) );\n\t\t}\n\t};\n\n\treturn { status, report, error, run };\n}\n","import { getElements } from '@elementor/editor-elements';\n\nimport { fetchPageContext } from './api/page-context-client';\nimport { getRegisteredAudits } from './registry';\nimport {\n\ttype Audit,\n\ttype AuditContext,\n\ttype AuditMeta,\n\ttype AuditRun,\n\ttype ElementsModelSnapshot,\n\ttype KitSnapshot,\n\ttype PageAuditReport,\n} from './types';\nimport { computeReport } from './utils/compute-report';\nimport { extractAttachmentIds } from './utils/page-attachments';\nimport { readKitSnapshot } from './utils/read-kit-snapshot';\nimport { buildSnapshotTree } from './utils/v1-snapshot';\n\nexport async function runPageAudit( documentId: number ): Promise< PageAuditReport > {\n\tconst tree = buildSnapshotTree( getElements() );\n\tconst attachmentIds = extractAttachmentIds( tree );\n\tconst pageContext = await fetchPageContext( documentId, attachmentIds );\n\n\tconst elements: ElementsModelSnapshot = { documentId, tree };\n\tconst kit: KitSnapshot = await readKitSnapshot( pageContext.kit_id );\n\n\tconst ctx: AuditContext = { documentId, elements, pageContext, kit };\n\tconst registered = getRegisteredAudits();\n\n\tconst auditResults: AuditRun[] = await Promise.all(\n\t\tregistered.map( async ( audit ) => {\n\t\t\tconst { evaluate: _evaluate, ...meta }: AuditMeta & Pick< Audit, 'evaluate' > = audit;\n\t\t\ttry {\n\t\t\t\tconst result = await audit.evaluate( ctx );\n\t\t\t\treturn { audit: meta, result };\n\t\t\t} catch ( error ) {\n\t\t\t\tconst reason = error instanceof Error ? error.message : 'unknown-error';\n\t\t\t\treturn { audit: meta, result: { status: 'skipped' as const, reason } };\n\t\t\t}\n\t\t} )\n\t);\n\n\treturn computeReport( documentId, auditResults );\n}\n","import { httpService } from '@elementor/http-client';\n\nimport { type PageContextResponse } from '../types';\nimport { getWindowConfig } from '../utils/window-config';\n\nexport async function fetchPageContext( documentId: number, attachmentIds: number[] ): Promise< PageContextResponse > {\n\tconst { restNamespace, nonce } = getWindowConfig();\n\tconst url = `${ restNamespace }/audits/page-context`;\n\n\tconst response = await httpService().get< PageContextResponse >( url, {\n\t\tparams: {\n\t\t\tdocument_id: documentId,\n\t\t\tattachment_ids: attachmentIds,\n\t\t},\n\t\theaders: { 'X-WP-Nonce': nonce },\n\t} );\n\n\treturn response.data;\n}\n","type WindowConfig = {\n\trestNamespace: string;\n\tnonce: string;\n};\n\ndeclare global {\n\tinterface Window {\n\t\telementorAudits?: WindowConfig;\n\t}\n}\n\nexport function getWindowConfig(): WindowConfig {\n\tconst config = window.elementorAudits;\n\n\tif ( ! config ) {\n\t\treturn { restNamespace: 'elementor/v1', nonce: '' };\n\t}\n\n\treturn config;\n}\n","import { type Audit } from './types';\n\nconst registry = new Map< string, Audit >();\n\nexport function registerAudit( audit: Audit ): void {\n\tregistry.set( audit.id, audit );\n}\n\nexport function getRegisteredAudits(): Audit[] {\n\treturn Array.from( registry.values() );\n}\n\nexport function hasAudit( id: string ): boolean {\n\treturn registry.has( id );\n}\n\nexport function clearAuditRegistry(): void {\n\tregistry.clear();\n}\n","import { __ } from '@wordpress/i18n';\n\nimport { type AuditCategory } from './types';\n\nexport const AUDIT_PANEL_ID = 'audit-panel';\n\nexport const REPORT_STORAGE_KEY_PREFIX = 'elementor/audits/report';\n\nexport const CREATE_WIDGET_EVENT = 'elementor/editor/create-widget';\n\nexport const ANGIE_FIX_ENTRY_POINT = 'audit_violation';\n\nexport const FEEDBACK_EXPERIMENT_NAME = 'in_editor_feedback';\nexport const FEEDBACK_ENTRY_POINT = 'audit_panel';\n\nexport const FEEDBACK_CLICKED_EVENT = 'audit_feedback_clicked';\nexport const FEEDBACK_SENT_EVENT = 'audit_feedback_sent';\nexport const FEEDBACK_CANCELLED_EVENT = 'audit_feedback_cancelled';\nexport const FEEDBACK_CLOSED_EVENT = 'audit_feedback_closed';\n\nexport const ALL_CATEGORIES: AuditCategory[] = [\n\t'best-practices',\n\t'seo',\n\t'accessibility',\n\t'performance',\n\t'compliance',\n];\n\nexport const CATEGORY_LABELS: Record< AuditCategory, string > = {\n\t'best-practices': __( 'Best Practices', 'elementor' ),\n\tseo: __( 'SEO', 'elementor' ),\n\taccessibility: __( 'Accessibility', 'elementor' ),\n\tperformance: __( 'Performance', 'elementor' ),\n\tcompliance: __( 'Compliance', 'elementor' ),\n};\n","import { type ChipProps } from '@elementor/ui';\nimport { __ } from '@wordpress/i18n';\n\nimport { type AuditCategory, type AuditResult, type AuditRun, type PageAuditReport } from '../types';\nimport { sortFailedAuditResults } from './sort-failed-audits';\n\nexport type AuditStatusGroup = 'fail' | 'pass' | 'skipped';\n\nexport type PartitionedAuditResults = {\n\tfailed: Array< AuditRun & { result: Extract< AuditResult, { status: 'fail' } > } >;\n\tpassed: Array< AuditRun & { result: Extract< AuditResult, { status: 'pass' } > } >;\n\tskipped: Array< AuditRun & { result: Extract< AuditResult, { status: 'skipped' } > } >;\n\ttotalViolations: number;\n};\n\ntype PartitionOptions = {\n\tcategory?: AuditCategory;\n\tsortFailed?: boolean;\n};\n\nexport function partitionAuditResults(\n\treport: PageAuditReport,\n\toptions: PartitionOptions = {}\n): PartitionedAuditResults {\n\tconst { category, sortFailed = true } = options;\n\tconst failed: PartitionedAuditResults[ 'failed' ] = [];\n\tconst passed: PartitionedAuditResults[ 'passed' ] = [];\n\tconst skipped: PartitionedAuditResults[ 'skipped' ] = [];\n\n\tlet totalViolations = 0;\n\n\tfor ( const run of report.auditResults ) {\n\t\tif ( category && ! run.audit.categories.includes( category ) ) {\n\t\t\tcontinue;\n\t\t}\n\n\t\tswitch ( run.result.status ) {\n\t\t\tcase 'fail':\n\t\t\t\tfailed.push( { ...run, result: run.result } );\n\t\t\t\ttotalViolations += run.result.violations.length;\n\t\t\t\tbreak;\n\t\t\tcase 'pass':\n\t\t\t\tpassed.push( { ...run, result: run.result } );\n\t\t\t\tbreak;\n\t\t\tcase 'skipped':\n\t\t\t\tskipped.push( { ...run, result: run.result } );\n\t\t\t\tbreak;\n\t\t}\n\t}\n\n\treturn {\n\t\tfailed: sortFailed ? sortFailedAuditResults( failed ) : failed,\n\t\tpassed,\n\t\tskipped,\n\t\ttotalViolations,\n\t};\n}\n\nexport function auditStatusDisplayCounts( report: PageAuditReport ): Record< AuditStatusGroup, number > {\n\tlet pass = 0;\n\tlet skipped = 0;\n\tlet totalViolations = 0;\n\n\tfor ( const { result } of report.auditResults ) {\n\t\tswitch ( result.status ) {\n\t\t\tcase 'fail':\n\t\t\t\ttotalViolations += result.violations.length;\n\t\t\t\tbreak;\n\t\t\tcase 'pass':\n\t\t\t\tpass++;\n\t\t\t\tbreak;\n\t\t\tcase 'skipped':\n\t\t\t\tskipped++;\n\t\t\t\tbreak;\n\t\t}\n\t}\n\n\treturn {\n\t\tfail: totalViolations,\n\t\tpass,\n\t\tskipped,\n\t};\n}\n\nexport function auditStatusColor( status: AuditStatusGroup ): ChipProps[ 'color' ] {\n\tswitch ( status ) {\n\t\tcase 'fail':\n\t\t\treturn 'error';\n\t\tcase 'pass':\n\t\t\treturn 'success';\n\t\tcase 'skipped':\n\t\t\treturn 'default';\n\t}\n}\n\nexport function auditStatusLabel( status: AuditStatusGroup ): string {\n\tswitch ( status ) {\n\t\tcase 'fail':\n\t\t\treturn __( 'Failed audits', 'elementor' );\n\t\tcase 'pass':\n\t\t\treturn __( 'Passed audits', 'elementor' );\n\t\tcase 'skipped':\n\t\t\treturn __( 'Skipped audits', 'elementor' );\n\t}\n}\n\nexport function getPopulatedCategories(\n\tcategoryTotals: PageAuditReport[ 'categories' ],\n\tcategories: readonly AuditCategory[]\n): AuditCategory[] {\n\treturn categories.filter( ( category ) => categoryTotals[ category ].total > 0 );\n}\n","import { type AuditMeta, type AuditSeverity } from '../types';\n\nconst SEVERITY_SORTING_RANK: Record< AuditSeverity, number > = {\n\terror: 0,\n\twarning: 1,\n\tinfo: 2,\n};\n\nexport function sortFailedAuditResults< T extends { audit: AuditMeta } >( results: T[] ): T[] {\n\treturn [ ...results ].sort( ( a, b ) => {\n\t\tconst rankDiff = SEVERITY_SORTING_RANK[ a.audit.severity ] - SEVERITY_SORTING_RANK[ b.audit.severity ];\n\n\t\tif ( rankDiff !== 0 ) {\n\t\t\treturn rankDiff;\n\t\t}\n\n\t\treturn a.audit.title.localeCompare( b.audit.title );\n\t} );\n}\n","import { ALL_CATEGORIES } from '../constants';\nimport { type AuditRun, type PageAuditReport } from '../types';\nimport { getPopulatedCategories } from './audit-status-summary';\n\ntype CategoryAccumulator = { totalWeight: number; passedWeight: number; total: number; failed: number };\n\nexport function computeReport( documentId: number, results: AuditRun[] ): PageAuditReport {\n\tconst accumulators = Object.fromEntries(\n\t\tALL_CATEGORIES.map( ( c ) => [ c, { totalWeight: 0, passedWeight: 0, total: 0, failed: 0 } ] )\n\t) as Record< string, CategoryAccumulator >;\n\n\tfor ( const { audit, result } of results ) {\n\t\tif ( result.status === 'skipped' ) {\n\t\t\tcontinue;\n\t\t}\n\n\t\tfor ( const category of audit.categories ) {\n\t\t\tconst acc = accumulators[ category ];\n\t\t\tacc.total++;\n\t\t\tacc.totalWeight += audit.weight;\n\n\t\t\tif ( result.status === 'pass' ) {\n\t\t\t\tacc.passedWeight += audit.weight;\n\t\t\t} else {\n\t\t\t\tacc.failed++;\n\t\t\t}\n\t\t}\n\t}\n\n\tconst categories = Object.fromEntries(\n\t\tALL_CATEGORIES.map( ( c ) => {\n\t\t\tconst acc = accumulators[ c ];\n\t\t\tconst score = acc.totalWeight === 0 ? 0 : Math.round( ( acc.passedWeight / acc.totalWeight ) * 100 );\n\t\t\treturn [ c, { score, failed: acc.failed, total: acc.total } ];\n\t\t} )\n\t) as PageAuditReport[ 'categories' ];\n\n\tconst populated = getPopulatedCategories( categories, ALL_CATEGORIES );\n\tconst overall =\n\t\tpopulated.length === 0\n\t\t\t? 0\n\t\t\t: Math.round( populated.reduce( ( sum, c ) => sum + categories[ c ].score, 0 ) / populated.length );\n\n\treturn {\n\t\tdocumentId,\n\t\trunAt: Date.now(),\n\t\toverall,\n\t\tcategories,\n\t\tauditResults: results,\n\t};\n}\n","import { type ElementSnapshotNode } from '../types';\n\nexport type WalkVisitor = ( node: ElementSnapshotNode, parents: readonly ElementSnapshotNode[] ) => void;\n\nexport function walkElements( tree: ElementSnapshotNode[], visit: WalkVisitor ): void {\n\tconst parents: ElementSnapshotNode[] = [];\n\trecurse( tree, parents, visit );\n}\n\nfunction recurse( nodes: ElementSnapshotNode[], parents: ElementSnapshotNode[], visit: WalkVisitor ): void {\n\tfor ( const node of nodes ) {\n\t\tvisit( node, parents );\n\t\tparents.push( node );\n\t\trecurse( node.elements, parents, visit );\n\t\tparents.pop();\n\t}\n}\n","import { type ElementSnapshotNode } from '../types';\nimport { walkElements } from './walk';\n\nexport const IMAGE_LIKE_WIDGETS = new Set( [ 'image', 'image-box', 'image-carousel', 'gallery', 'image-gallery' ] );\n\nexport type ImageLikeMedia = {\n\tid?: number;\n\turl?: string;\n\talt?: string;\n};\n\nexport type ImageLikeSourceVisit = {\n\tnode: ElementSnapshotNode;\n\tmedia: ImageLikeMedia;\n};\n\nexport function hasPageImages( tree: ElementSnapshotNode[] ): boolean {\n\tlet found = false;\n\n\twalkImageLikeSources( tree, ( { media } ) => {\n\t\tif ( media.id || media.url ) {\n\t\t\tfound = true;\n\t\t}\n\t} );\n\n\treturn found;\n}\n\nexport function walkImageLikeSources(\n\ttree: ElementSnapshotNode[],\n\tvisit: ( source: ImageLikeSourceVisit ) => void\n): void {\n\twalkElements( tree, ( node ) => {\n\t\tif ( node.elType !== 'widget' ) {\n\t\t\treturn;\n\t\t}\n\n\t\tif ( ! IMAGE_LIKE_WIDGETS.has( node.widgetType ?? '' ) ) {\n\t\t\treturn;\n\t\t}\n\n\t\tfor ( const media of collectMediaFromNode( node ) ) {\n\t\t\tvisit( { node, media } );\n\t\t}\n\t} );\n}\n\nfunction collectMediaFromNode( node: ElementSnapshotNode ): ImageLikeMedia[] {\n\tconst sources: ImageLikeMedia[] = [];\n\n\tconst image = node.settings.image as ImageLikeMedia | undefined;\n\n\tif ( image?.id || image?.url ) {\n\t\tsources.push( image );\n\t}\n\n\tconst gallery = ( node.settings.carousel ?? node.settings.gallery ?? node.settings.wp_gallery ) as\n\t\t| ImageLikeMedia[]\n\t\t| undefined;\n\n\tif ( Array.isArray( gallery ) ) {\n\t\tfor ( const item of gallery ) {\n\t\t\tif ( item?.id || item?.url ) {\n\t\t\t\tsources.push( item );\n\t\t\t}\n\t\t}\n\t}\n\n\treturn sources;\n}\n","import { type ElementSnapshotNode } from '../types';\nimport { walkImageLikeSources } from './image-like-sources';\n\nexport function extractAttachmentIds( tree: ElementSnapshotNode[] ): number[] {\n\tconst ids = new Set< number >();\n\n\twalkImageLikeSources( tree, ( { media } ) => {\n\t\tif ( media.id ) {\n\t\t\tids.add( media.id );\n\t\t}\n\t} );\n\n\treturn Array.from( ids ).sort( ( a, b ) => a - b );\n}\n","import { type KitSnapshot } from '../types';\n\ntype GlobalColorApiItem = {\n\tid: string;\n\ttitle?: string;\n\tvalue?: string;\n};\n\ntype GlobalTypographyApiItem = {\n\tid: string;\n\ttitle?: string;\n\tvalue?: {\n\t\ttypography_font_family?: string;\n\t};\n};\n\ntype KitColorRow = {\n\t_id: string;\n\tcolor: string;\n\ttitle?: string;\n};\n\ntype KitTypographyRow = {\n\t_id: string;\n\ttitle: string;\n\ttypography_font_family?: string;\n};\n\ntype AuditWindow = Window & {\n\telementor?: {\n\t\tdocuments?: {\n\t\t\tget: ( id: number ) => { config?: { settings?: { settings?: KitDocumentSettings } } } | undefined;\n\t\t};\n\t};\n\t$e?: {\n\t\tdata?: {\n\t\t\tget: (\n\t\t\t\tcommand: string\n\t\t\t) => Promise< { data?: Record< string, GlobalColorApiItem | GlobalTypographyApiItem > } >;\n\t\t};\n\t};\n};\n\ntype KitDocumentSettings = {\n\tsystem_colors?: KitColorRow[];\n\tcustom_colors?: KitColorRow[];\n\tsystem_typography?: KitTypographyRow[];\n\tcustom_typography?: KitTypographyRow[];\n};\n\ntype GlobalWithValue = { value: string };\n\nfunction hasNonEmptyGlobalValue< T extends GlobalWithValue >( item: T ): boolean {\n\treturn item.value.length > 0;\n}\n\nexport async function readKitSnapshot( kitId: number ): Promise< KitSnapshot > {\n\tconst [ colorsFromApi, fontsFromApi ] = await Promise.all( [\n\t\treadGlobalsFromApi( 'globals/colors', mapApiColor, hasNonEmptyGlobalValue ),\n\t\treadGlobalsFromApi( 'globals/typography', mapApiTypography, hasNonEmptyGlobalValue ),\n\t] );\n\n\tconst documentSettings =\n\t\tcolorsFromApi.length === 0 || fontsFromApi.length === 0 ? getKitDocumentSettings( kitId ) : null;\n\n\tconst colors = colorsFromApi.length > 0 ? colorsFromApi : readColorsFromKitDocumentSettings( documentSettings );\n\tconst fonts = fontsFromApi.length > 0 ? fontsFromApi : readFontsFromKitDocumentSettings( documentSettings );\n\n\treturn { id: kitId, globals: { colors, fonts } };\n}\n\nasync function readGlobalsFromApi< TApiItem, TGlobal extends GlobalWithValue >(\n\tcommand: string,\n\tmapItem: ( item: TApiItem ) => TGlobal,\n\thasValue: ( item: TGlobal ) => boolean\n): Promise< TGlobal[] > {\n\tconst $e = ( window as AuditWindow ).$e;\n\n\tif ( ! $e?.data?.get ) {\n\t\treturn [];\n\t}\n\n\ttry {\n\t\tconst result = await $e.data.get( command );\n\t\tconst data = result?.data ?? {};\n\n\t\treturn Object.values( data )\n\t\t\t.map( ( item ) => mapItem( item as TApiItem ) )\n\t\t\t.filter( hasValue );\n\t} catch {\n\t\treturn [];\n\t}\n}\n\nfunction mapApiColor( item: GlobalColorApiItem ): KitSnapshot[ 'globals' ][ 'colors' ][ number ] {\n\treturn {\n\t\tid: item.id,\n\t\tvalue: item.value ?? '',\n\t\ttitle: item.title ?? item.id,\n\t};\n}\n\nfunction mapApiTypography( item: GlobalTypographyApiItem ): KitSnapshot[ 'globals' ][ 'fonts' ][ number ] {\n\treturn {\n\t\tid: item.id,\n\t\tvalue: item.value?.typography_font_family ?? '',\n\t\ttitle: item.title ?? item.id,\n\t};\n}\n\nfunction readColorsFromKitDocumentSettings(\n\tsettings: KitDocumentSettings | null\n): KitSnapshot[ 'globals' ][ 'colors' ] {\n\tif ( ! settings ) {\n\t\treturn [];\n\t}\n\n\tconst rows = [ ...( settings.system_colors ?? [] ), ...( settings.custom_colors ?? [] ) ];\n\n\treturn rows\n\t\t.map( ( row ) => ( {\n\t\t\tid: row._id,\n\t\t\tvalue: row.color,\n\t\t\ttitle: row.title ?? row._id,\n\t\t} ) )\n\t\t.filter( hasNonEmptyGlobalValue );\n}\n\nfunction readFontsFromKitDocumentSettings( settings: KitDocumentSettings | null ): KitSnapshot[ 'globals' ][ 'fonts' ] {\n\tif ( ! settings ) {\n\t\treturn [];\n\t}\n\n\tconst rows = [ ...( settings.system_typography ?? [] ), ...( settings.custom_typography ?? [] ) ];\n\n\treturn rows\n\t\t.map( ( row ) => ( {\n\t\t\tid: row._id,\n\t\t\tvalue: row.typography_font_family ?? '',\n\t\t\ttitle: row.title ?? row._id,\n\t\t} ) )\n\t\t.filter( hasNonEmptyGlobalValue );\n}\n\nfunction getKitDocumentSettings( kitId: number ): KitDocumentSettings | null {\n\tconst document = ( window as AuditWindow ).elementor?.documents?.get?.( kitId );\n\n\treturn document?.config?.settings?.settings ?? null;\n}\n","import { type V1Element } from '@elementor/editor-elements';\n\nimport { type ElementSnapshotNode } from '../types';\n\nexport function buildSnapshotTree( elements: V1Element[] ): ElementSnapshotNode[] {\n\tif ( elements.length === 0 ) {\n\t\treturn [];\n\t}\n\n\tconst root = elements[ 0 ];\n\tconst children = root.children ?? [];\n\n\treturn children.map( toSnapshot );\n}\n\nfunction toSnapshot( element: V1Element ): ElementSnapshotNode {\n\tconst model = element.model;\n\tconst settings = element.settings?.toJSON?.() ?? {};\n\n\treturn {\n\t\tid: element.id,\n\t\telType: ( model.get( 'elType' ) as string ) ?? '',\n\t\twidgetType: model.get( 'widgetType' ) as string | undefined,\n\t\tsettings: settings as Record< string, unknown >,\n\t\telements: ( element.children ?? [] ).map( toSnapshot ),\n\t};\n}\n","import { __createSlice, type PayloadAction } from '@elementor/store';\n\nimport { type PageAuditReport } from '../types';\n\ntype SliceState = {\n\tstatus: 'idle' | 'loading' | 'error' | 'ready';\n\treport: PageAuditReport | null;\n\terror: string | null;\n};\n\nconst initialState: SliceState = { status: 'idle', report: null, error: null };\n\nexport const slice = __createSlice( {\n\tname: 'audits',\n\tinitialState,\n\treducers: {\n\t\trunStarted( state ) {\n\t\t\tstate.status = 'loading';\n\t\t\tstate.error = null;\n\t\t},\n\t\trunSucceeded( state, action: PayloadAction< PageAuditReport > ) {\n\t\t\tstate.status = 'ready';\n\t\t\tstate.report = action.payload;\n\t\t},\n\t\trunFailed( state, action: PayloadAction< string > ) {\n\t\t\tstate.status = 'error';\n\t\t\tstate.error = action.payload;\n\t\t},\n\t\treportRestored( state, action: PayloadAction< PageAuditReport > ) {\n\t\t\tstate.status = 'ready';\n\t\t\tstate.report = action.payload;\n\t\t\tstate.error = null;\n\t\t},\n\t\treportCleared( state ) {\n\t\t\tstate.status = 'idle';\n\t\t\tstate.report = null;\n\t\t\tstate.error = null;\n\t\t},\n\t},\n} );\n\nexport type AuditsSliceState = SliceState;\n","import { type AuditsSliceState } from './slice';\n\nexport type GlobalState = { audits: AuditsSliceState };\n\nexport function selectStatus( state: GlobalState ) {\n\treturn state.audits.status;\n}\n\nexport function selectReport( state: GlobalState ) {\n\treturn state.audits.report;\n}\n\nexport function selectError( state: GlobalState ) {\n\treturn state.audits.error;\n}\n","import { getSessionStorageItem, setSessionStorageItem } from '@elementor/session';\n\nimport { REPORT_STORAGE_KEY_PREFIX } from '../constants';\nimport { type PageAuditReport } from '../types';\n\nfunction getStorageKey( documentId: number ): string {\n\treturn `${ REPORT_STORAGE_KEY_PREFIX }/${ documentId }`;\n}\n\nexport function getPersistedReport( documentId: number ): PageAuditReport | null {\n\treturn getSessionStorageItem< PageAuditReport >( getStorageKey( documentId ) ) ?? null;\n}\n\nexport function persistReport( documentId: number, report: PageAuditReport ): void {\n\tsetSessionStorageItem( getStorageKey( documentId ), report );\n}\n","import * as React from 'react';\nimport { useState } from 'react';\nimport { notify } from '@elementor/editor-notifications';\nimport { isExperimentActive } from '@elementor/editor-v1-adapters';\nimport { useMixpanel } from '@elementor/events';\nimport { httpService } from '@elementor/http-client';\nimport { MessageLinesIcon } from '@elementor/icons';\nimport {\n\tButton,\n\tDialog,\n\tDialogActions,\n\tDialogContent,\n\tDialogHeader,\n\tDialogTitle,\n\tIconButton,\n\tStack,\n\tTextField,\n\tTooltip,\n\tTypography,\n} from '@elementor/ui';\nimport { __ } from '@wordpress/i18n';\n\nimport {\n\tFEEDBACK_CANCELLED_EVENT,\n\tFEEDBACK_CLICKED_EVENT,\n\tFEEDBACK_CLOSED_EVENT,\n\tFEEDBACK_ENTRY_POINT,\n\tFEEDBACK_EXPERIMENT_NAME,\n\tFEEDBACK_SENT_EVENT,\n} from '../constants';\n\nconst FEEDBACK_SUBJECT = 'Page Audit Tool';\nconst FEEDBACK_SUBJECT_LABEL = __( 'Page Audit Tool', 'elementor' );\nconst SUCCESS_NOTIFICATION_ID = 'audit-feedback-success';\nconst ERROR_NOTIFICATION_ID = 'audit-feedback-error';\nconst DIALOG_TITLE_ID = 'audit-feedback-dialog-title';\nconst DIALOG_DESCRIPTION_ID = 'audit-feedback-dialog-description';\n\nconst isUserConnected = () =>\n\tBoolean( window.elementorCommon?.config?.library_connect?.is_connected || window.elementorPro?.config?.isActive );\n\nconst notifySuccess = () =>\n\tnotify( {\n\t\tid: SUCCESS_NOTIFICATION_ID,\n\t\ttype: 'success',\n\t\tmessage: __( 'Feedback sent. Thanks for helping us out.', 'elementor' ),\n\t} );\n\nconst notifyError = () =>\n\tnotify( {\n\t\tid: ERROR_NOTIFICATION_ID,\n\t\ttype: 'error',\n\t\tmessage: __( 'Something went wrong. Please try sending your feedback again.', 'elementor' ),\n\t} );\n\nexport default function AuditFeedback() {\n\tconst [ isOpen, setIsOpen ] = useState( false );\n\tconst [ feedbackText, setFeedbackText ] = useState( '' );\n\tconst [ isSubmitting, setIsSubmitting ] = useState( false );\n\tconst { dispatchEvent: trackEvent = ( ...args: unknown[] ) => void args } = useMixpanel();\n\n\tif ( ! isExperimentActive( FEEDBACK_EXPERIMENT_NAME ) ) {\n\t\treturn null;\n\t}\n\n\tconst connected = isUserConnected();\n\tconst connectUrl = window.elementor?.config?.user?.top_bar?.connect_url;\n\n\tif ( ! connected && ! connectUrl ) {\n\t\treturn null;\n\t}\n\n\tconst triggerLabel = __( 'Give feedback', 'elementor' );\n\n\tconst handleOpen = () => {\n\t\tif ( ! connected ) {\n\t\t\twindow.open( connectUrl, '_blank', 'noopener' );\n\t\t\ttrackEvent( FEEDBACK_CLICKED_EVENT, { entry_point: FEEDBACK_ENTRY_POINT, connected: false } );\n\t\t\treturn;\n\t\t}\n\n\t\tsetIsOpen( true );\n\t\ttrackEvent( FEEDBACK_CLICKED_EVENT, { entry_point: FEEDBACK_ENTRY_POINT, connected: true } );\n\t};\n\n\tconst dismiss = ( eventName: string ) => {\n\t\tsetIsOpen( false );\n\t\tsetFeedbackText( '' );\n\t\ttrackEvent( eventName, { entry_point: FEEDBACK_ENTRY_POINT } );\n\t};\n\n\tconst handleCancel = () => dismiss( FEEDBACK_CANCELLED_EVENT );\n\tconst handleClose = () => dismiss( FEEDBACK_CLOSED_EVENT );\n\n\tconst handleSubmit = () => {\n\t\tsetIsSubmitting( true );\n\n\t\thttpService()\n\t\t\t.post( 'elementor/v1/feedback/submit', {\n\t\t\t\tsubject: FEEDBACK_SUBJECT,\n\t\t\t\tdescription: feedbackText.trim(),\n\t\t\t} )\n\t\t\t.then( ( response ) => {\n\t\t\t\tif ( ! response.data.success ) {\n\t\t\t\t\tnotifyError();\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tsetIsOpen( false );\n\t\t\t\tsetFeedbackText( '' );\n\t\t\t\tnotifySuccess();\n\t\t\t\ttrackEvent( FEEDBACK_SENT_EVENT, { entry_point: FEEDBACK_ENTRY_POINT } );\n\t\t\t} )\n\t\t\t.catch( notifyError )\n\t\t\t.finally( () => setIsSubmitting( false ) );\n\t};\n\n\treturn (\n\t\t<>\n\t\t\t<Tooltip title={ triggerLabel } placement=\"top\">\n\t\t\t\t<IconButton size=\"small\" aria-label={ triggerLabel } onClick={ handleOpen }>\n\t\t\t\t\t<MessageLinesIcon fontSize=\"small\" />\n\t\t\t\t</IconButton>\n\t\t\t</Tooltip>\n\t\t\t<Dialog\n\t\t\t\topen={ isOpen }\n\t\t\t\tonClose={ handleClose }\n\t\t\t\taria-labelledby={ DIALOG_TITLE_ID }\n\t\t\t\taria-describedby={ DIALOG_DESCRIPTION_ID }\n\t\t\t\tPaperProps={ { sx: { borderRadius: 1 } } }\n\t\t\t>\n\t\t\t\t<DialogHeader logo={ false } onClose={ handleClose }>\n\t\t\t\t\t<DialogTitle id={ DIALOG_TITLE_ID }>\n\t\t\t\t\t\t{ __( 'Let us know what you think', 'elementor' ) }\n\t\t\t\t\t</DialogTitle>\n\t\t\t\t</DialogHeader>\n\t\t\t\t<DialogContent dividers>\n\t\t\t\t\t<Stack direction=\"column\" gap={ 2 }>\n\t\t\t\t\t\t<TextField value={ FEEDBACK_SUBJECT_LABEL } disabled fullWidth size=\"small\" />\n\t\t\t\t\t\t<TextField\n\t\t\t\t\t\t\tplaceholder={ __(\n\t\t\t\t\t\t\t\t'Tell us what you had in mind, what we can improve or fix to make this feature better.',\n\t\t\t\t\t\t\t\t'elementor'\n\t\t\t\t\t\t\t) }\n\t\t\t\t\t\t\tfullWidth\n\t\t\t\t\t\t\tmultiline\n\t\t\t\t\t\t\trows={ 4 }\n\t\t\t\t\t\t\tdisabled={ isSubmitting }\n\t\t\t\t\t\t\tonChange={ ( event: React.ChangeEvent< HTMLInputElement > ) =>\n\t\t\t\t\t\t\t\tsetFeedbackText( event.target.value )\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tvalue={ feedbackText }\n\t\t\t\t\t\t/>\n\t\t\t\t\t\t<Typography id={ DIALOG_DESCRIPTION_ID } variant=\"caption\" color=\"text.secondary\">\n\t\t\t\t\t\t\t{ __(\n\t\t\t\t\t\t\t\t\"We appreciate your feedback! While we review all submissions, we can't guarantee that every suggestion will result in a change or update.\",\n\t\t\t\t\t\t\t\t'elementor'\n\t\t\t\t\t\t\t) }\n\t\t\t\t\t\t</Typography>\n\t\t\t\t\t</Stack>\n\t\t\t\t</DialogContent>\n\t\t\t\t<DialogActions>\n\t\t\t\t\t<Button variant=\"text\" color=\"secondary\" onClick={ handleCancel }>\n\t\t\t\t\t\t{ __( 'Cancel', 'elementor' ) }\n\t\t\t\t\t</Button>\n\t\t\t\t\t<Button\n\t\t\t\t\t\tvariant=\"contained\"\n\t\t\t\t\t\tcolor=\"primary\"\n\t\t\t\t\t\tdisabled={ isSubmitting || feedbackText.trim().length === 0 }\n\t\t\t\t\t\tonClick={ handleSubmit }\n\t\t\t\t\t>\n\t\t\t\t\t\t{ __( 'Send', 'elementor' ) }\n\t\t\t\t\t</Button>\n\t\t\t\t</DialogActions>\n\t\t\t</Dialog>\n\t\t</>\n\t);\n}\n","import * as React from 'react';\nimport { Box, Button, Typography } from '@elementor/ui';\nimport { __ } from '@wordpress/i18n';\n\ntype Props = {\n\tmessage: string;\n\tonRetry: () => void;\n};\n\nexport default function ErrorPage( { message, onRetry }: Props ) {\n\treturn (\n\t\t<Box sx={ { display: 'flex', flexDirection: 'column', alignItems: 'center', gap: 1.5, p: 4 } }>\n\t\t\t<Typography variant=\"body2\" color=\"error\" textAlign=\"center\">\n\t\t\t\t{ message }\n\t\t\t</Typography>\n\t\t\t<Button variant=\"contained\" size=\"small\" onClick={ onRetry }>\n\t\t\t\t{ __( 'Try again', 'elementor' ) }\n\t\t\t</Button>\n\t\t</Box>\n\t);\n}\n","import * as React from 'react';\nimport { Box, CircularProgress, Typography } from '@elementor/ui';\nimport { __ } from '@wordpress/i18n';\n\nexport default function LoadingPage() {\n\treturn (\n\t\t<Box sx={ { display: 'flex', flexDirection: 'column', alignItems: 'center', gap: 1.5, p: 4 } }>\n\t\t\t<CircularProgress size={ 32 } />\n\t\t\t<Typography variant=\"body2\">{ __( 'Audit in progress.', 'elementor' ) }</Typography>\n\t\t</Box>\n\t);\n}\n","import * as React from 'react';\nimport { Box, Typography } from '@elementor/ui';\nimport { __ } from '@wordpress/i18n';\n\nconst INFORMATION_IMAGE_PATH = 'images/information.svg';\n\ntype ElementorCommonWindow = Window & {\n\telementorCommon?: {\n\t\tconfig?: {\n\t\t\turls?: {\n\t\t\t\tassets?: string;\n\t\t\t};\n\t\t};\n\t};\n};\n\nexport default function WelcomePage() {\n\tconst assetsUrl = ( window as ElementorCommonWindow ).elementorCommon?.config?.urls?.assets ?? '';\n\n\treturn (\n\t\t<Box\n\t\t\tsx={ {\n\t\t\t\tdisplay: 'flex',\n\t\t\t\tflexDirection: 'column',\n\t\t\t\talignItems: 'center',\n\t\t\t\tjustifyContent: 'center',\n\t\t\t\tgap: 1,\n\t\t\t\tp: 3,\n\t\t\t} }\n\t\t>\n\t\t\t<img\n\t\t\t\tclassName=\"elementor-nerd-box-icon\"\n\t\t\t\tsrc={ `${ assetsUrl }${ INFORMATION_IMAGE_PATH }` }\n\t\t\t\tloading=\"lazy\"\n\t\t\t\talt={ __( 'Elementor', 'elementor' ) }\n\t\t\t/>\n\t\t\t<Typography variant=\"subtitle1\" component=\"h3\" sx={ { marginBlockStart: 2 } }>\n\t\t\t\t{ __( 'Audit your page!', 'elementor' ) }\n\t\t\t</Typography>\n\t\t\t<Typography variant=\"caption\" textAlign=\"center\">\n\t\t\t\t{ __(\n\t\t\t\t\t'Check SEO, accessibility, performance, and best practices. Click \"Run page audit\" to begin.',\n\t\t\t\t\t'elementor'\n\t\t\t\t) }\n\t\t\t</Typography>\n\t\t</Box>\n\t);\n}\n","import * as React from 'react';\nimport { useState } from 'react';\nimport { Box, Divider, Tab, Tabs } from '@elementor/ui';\nimport { __ } from '@wordpress/i18n';\n\nimport { type AuditCategory, type PageAuditReport } from '../types';\nimport { type AuditStatusGroup } from '../utils/audit-status-summary';\nimport AllAuditsPage from './pages/all-audits-page';\nimport CategoryPage from './pages/category-page';\nimport IssuesPage from './pages/issues-page';\nimport OverviewPage from './pages/overview-page';\n\ntype TabId = 'overview' | 'issues';\n\ntype ActivePage =\n\t| 'overview'\n\t| 'issues'\n\t| { backTo: TabId; category: AuditCategory }\n\t| { backTo: TabId; expand?: AuditStatusGroup; page: 'all-audits' };\n\ntype Props = {\n\treport: PageAuditReport;\n};\n\nfunction activeTab( page: ActivePage ): TabId {\n\tif ( page === 'overview' ) {\n\t\treturn 'overview';\n\t}\n\n\tif ( page === 'issues' ) {\n\t\treturn 'issues';\n\t}\n\n\treturn page.backTo;\n}\n\nfunction isAllAuditsPage( page: ActivePage ): page is { backTo: TabId; expand?: AuditStatusGroup; page: 'all-audits' } {\n\treturn typeof page === 'object' && 'page' in page && page.page === 'all-audits';\n}\n\nfunction isCategoryPage( page: ActivePage ): page is { backTo: TabId; category: AuditCategory } {\n\treturn typeof page === 'object' && 'category' in page;\n}\n\nexport default function ReportShell( { report }: Props ) {\n\tconst [ activePage, setActivePage ] = useState< ActivePage >( 'overview' );\n\n\tconst currentTab = activeTab( activePage );\n\n\tconst handleTabChange = ( _: React.SyntheticEvent, value: TabId ) => {\n\t\tsetActivePage( value );\n\t};\n\n\tconst openCategory = ( category: AuditCategory, backTo: TabId ) => {\n\t\tsetActivePage( { category, backTo } );\n\t};\n\n\tconst openAllAudits = ( expand?: AuditStatusGroup, backTo: TabId = 'issues' ) => {\n\t\tsetActivePage( { page: 'all-audits', expand, backTo } );\n\t};\n\n\tconst backFromSubPage = () => {\n\t\tif ( isAllAuditsPage( activePage ) || isCategoryPage( activePage ) ) {\n\t\t\tsetActivePage( activePage.backTo );\n\t\t}\n\t};\n\n\treturn (\n\t\t<Box>\n\t\t\t<Tabs\n\t\t\t\taria-label={ __( 'Audit navigation', 'elementor' ) }\n\t\t\t\tvalue={ currentTab }\n\t\t\t\tonChange={ handleTabChange }\n\t\t\t\ttextColor=\"secondary\"\n\t\t\t\tindicatorColor=\"secondary\"\n\t\t\t\tsize=\"small\"\n\t\t\t\tcentered={ true }\n\t\t\t\tvariant=\"fullWidth\"\n\t\t\t>\n\t\t\t\t<Tab value=\"overview\" label={ __( 'Overview', 'elementor' ) } />\n\t\t\t\t<Tab value=\"issues\" label={ __( 'Issues', 'elementor' ) } />\n\t\t\t</Tabs>\n\t\t\t<Divider />\n\t\t\t{ activePage === 'overview' && (\n\t\t\t\t<OverviewPage\n\t\t\t\t\treport={ report }\n\t\t\t\t\tonCategoryClick={ ( category ) => openCategory( category, 'overview' ) }\n\t\t\t\t\tonStatusClick={ ( status ) => openAllAudits( status, 'overview' ) }\n\t\t\t\t/>\n\t\t\t) }\n\t\t\t{ activePage === 'issues' && (\n\t\t\t\t<IssuesPage\n\t\t\t\t\treport={ report }\n\t\t\t\t\tonCategoryClick={ ( category ) => openCategory( category, 'issues' ) }\n\t\t\t\t\tonAllAuditsClick={ () => openAllAudits() }\n\t\t\t\t/>\n\t\t\t) }\n\t\t\t{ isAllAuditsPage( activePage ) && (\n\t\t\t\t<AllAuditsPage\n\t\t\t\t\treport={ report }\n\t\t\t\t\tinitialExpandedStatus={ activePage.expand }\n\t\t\t\t\tonBack={ backFromSubPage }\n\t\t\t\t/>\n\t\t\t) }\n\t\t\t{ isCategoryPage( activePage ) && (\n\t\t\t\t<CategoryPage category={ activePage.category } report={ report } onBack={ backFromSubPage } />\n\t\t\t) }\n\t\t</Box>\n\t);\n}\n","import * as React from 'react';\nimport { Box } from '@elementor/ui';\nimport { __ } from '@wordpress/i18n';\n\nimport { type PageAuditReport } from '../../types';\nimport {\n\tauditStatusColor,\n\ttype AuditStatusGroup,\n\tauditStatusLabel,\n\tpartitionAuditResults,\n} from '../../utils/audit-status-summary';\nimport StatusSection from '../status-section';\nimport SubpageHeader from '../subpage-header';\nimport ViolationRow from '../violation-row';\n\ntype Props = {\n\tinitialExpandedStatus?: AuditStatusGroup;\n\tonBack: () => void;\n\treport: PageAuditReport;\n};\n\nexport default function AllAuditsPage( { initialExpandedStatus, onBack, report }: Props ) {\n\tconst { failed, passed, skipped, totalViolations } = partitionAuditResults( report );\n\tconst expandFail = ! initialExpandedStatus || initialExpandedStatus === 'fail';\n\tconst expandPass = initialExpandedStatus === 'pass';\n\tconst expandSkipped = initialExpandedStatus === 'skipped';\n\n\treturn (\n\t\t<Box key={ initialExpandedStatus ?? 'default' }>\n\t\t\t<SubpageHeader title={ __( 'All audits', 'elementor' ) } onBack={ onBack } />\n\t\t\t<Box sx={ { p: 1 } }>\n\t\t\t\t<StatusSection\n\t\t\t\t\tlabel={ auditStatusLabel( 'fail' ) }\n\t\t\t\t\tcount={ totalViolations }\n\t\t\t\t\tcolor={ auditStatusColor( 'fail' ) }\n\t\t\t\t\tdefaultExpanded={ expandFail }\n\t\t\t\t>\n\t\t\t\t\t{ failed.map( ( r ) => (\n\t\t\t\t\t\t<ViolationRow key={ r.audit.id } audit={ r.audit } violations={ r.result.violations } />\n\t\t\t\t\t) ) }\n\t\t\t\t</StatusSection>\n\t\t\t\t<StatusSection\n\t\t\t\t\tlabel={ auditStatusLabel( 'pass' ) }\n\t\t\t\t\tcount={ passed.length }\n\t\t\t\t\tcolor={ auditStatusColor( 'pass' ) }\n\t\t\t\t\tdefaultExpanded={ expandPass }\n\t\t\t\t>\n\t\t\t\t\t{ passed.map( ( r ) => (\n\t\t\t\t\t\t<ViolationRow key={ r.audit.id } audit={ r.audit } />\n\t\t\t\t\t) ) }\n\t\t\t\t</StatusSection>\n\t\t\t\t<StatusSection\n\t\t\t\t\tlabel={ auditStatusLabel( 'skipped' ) }\n\t\t\t\t\tcount={ skipped.length }\n\t\t\t\t\tcolor={ auditStatusColor( 'skipped' ) }\n\t\t\t\t\tdefaultExpanded={ expandSkipped }\n\t\t\t\t>\n\t\t\t\t\t{ skipped.map( ( r ) => (\n\t\t\t\t\t\t<ViolationRow key={ r.audit.id } audit={ r.audit } skipReason={ r.result.reason } />\n\t\t\t\t\t) ) }\n\t\t\t\t</StatusSection>\n\t\t\t</Box>\n\t\t</Box>\n\t);\n}\n","import * as React from 'react';\nimport { useState } from 'react';\nimport { ChevronDownIcon } from '@elementor/icons';\nimport { Box, Chip, type ChipProps, Collapse, IconButton } from '@elementor/ui';\nimport { __ } from '@wordpress/i18n';\n\ntype Props = {\n\tlabel: string;\n\tcount: number;\n\tcolor?: ChipProps[ 'color' ];\n\tdefaultExpanded?: boolean;\n\tchildren: React.ReactNode;\n};\n\nexport default function StatusSection( { label, count, color = 'default', defaultExpanded = false, children }: Props ) {\n\tconst [ expanded, setExpanded ] = useState( defaultExpanded );\n\n\tif ( count === 0 ) {\n\t\treturn null;\n\t}\n\n\treturn (\n\t\t<Box sx={ { paddingBlock: 1 } }>\n\t\t\t<Box\n\t\t\t\tsx={ { display: 'flex', alignItems: 'center', gap: 0.5, cursor: 'pointer' } }\n\t\t\t\tonClick={ () => setExpanded( ( v ) => ! v ) }\n\t\t\t>\n\t\t\t\t<IconButton\n\t\t\t\t\tsize=\"small\"\n\t\t\t\t\taria-label={ expanded ? __( 'Collapse', 'elementor' ) : __( 'Expand', 'elementor' ) }\n\t\t\t\t>\n\t\t\t\t\t<ChevronDownIcon\n\t\t\t\t\t\tfontSize=\"small\"\n\t\t\t\t\t\tsx={ {\n\t\t\t\t\t\t\ttransform: expanded ? 'rotate(180deg)' : undefined,\n\t\t\t\t\t\t\ttransition: 'transform .2s',\n\t\t\t\t\t\t} }\n\t\t\t\t\t/>\n\t\t\t\t</IconButton>\n\t\t\t\t<Chip label={ `${ label } (${ count })` } size=\"small\" color={ color } variant=\"standard\" />\n\t\t\t</Box>\n\t\t\t<Collapse in={ expanded }>\n\t\t\t\t<Box sx={ { paddingInlineStart: 4.25, paddingBlock: 2 } }>{ children }</Box>\n\t\t\t</Collapse>\n\t\t</Box>\n\t);\n}\n","import * as React from 'react';\nimport { ArrowLeftIcon } from '@elementor/icons';\nimport { Box, IconButton, Rotate, Typography, useTheme } from '@elementor/ui';\nimport { __ } from '@wordpress/i18n';\n\ntype Props = {\n\ttitle: string;\n\tonBack: () => void;\n\tbackLabel?: string;\n\ticon?: React.ReactNode;\n};\n\nexport default function SubpageHeader( { title, onBack, backLabel, icon }: Props ) {\n\tconst isRtl = 'rtl' === useTheme().direction;\n\n\treturn (\n\t\t<Box sx={ { display: 'flex', alignItems: 'center', gap: 0.5, p: 1 } }>\n\t\t\t<IconButton size=\"small\" onClick={ onBack } aria-label={ backLabel ?? __( 'Back', 'elementor' ) }>\n\t\t\t\t<Rotate in={ isRtl }>\n\t\t\t\t\t<ArrowLeftIcon fontSize=\"small\" />\n\t\t\t\t</Rotate>\n\t\t\t</IconButton>\n\t\t\t{ icon }\n\t\t\t<Typography variant=\"subtitle2\" fontWeight=\"bold\">\n\t\t\t\t{ title }\n\t\t\t</Typography>\n\t\t</Box>\n\t);\n}\n","import * as React from 'react';\nimport { useState } from 'react';\nimport { getElementIcon, getElementTitle } from '@elementor/editor-elements';\nimport { AlertCircleIcon, BulbIcon, CheckIcon, ChevronDownIcon, EyeIcon, HelpIcon } from '@elementor/icons';\nimport { Alert, AlertTitle, Box, Collapse, IconButton, Tooltip, Typography } from '@elementor/ui';\nimport { __ } from '@wordpress/i18n';\n\nimport { focusViolation } from '../hooks/focus-violation';\nimport { type AuditMeta, type AuditViolation } from '../types';\nimport { buildAngiePrompt } from '../utils/build-angie-prompt';\nimport { onKeyboardClick } from '../utils/keyboard-click';\nimport FixViolationWithAngie from './fix-violation-with-angie';\nimport SeverityIcon from './severity-icons';\nimport ViolationIcon from './violation-icons';\n\ntype Props = {\n\taudit: AuditMeta;\n\tskipReason?: string;\n\tviolations?: AuditViolation[];\n};\n\nfunction SkipReasonTooltip( { reason }: { reason: string } ) {\n\treturn (\n\t\t<Tooltip title={ reason } placement=\"top\">\n\t\t\t<Box aria-label={ reason } component=\"span\" sx={ { display: 'inline-flex', alignItems: 'center' } }>\n\t\t\t\t<HelpIcon fontSize=\"small\" color=\"action\" />\n\t\t\t</Box>\n\t\t</Tooltip>\n\t);\n}\n\nfunction StatusIndicator( { audit, violations }: Pick< Props, 'audit' | 'violations' > ) {\n\tif ( violations ) {\n\t\treturn (\n\t\t\t<>\n\t\t\t\t<Typography variant=\"caption\" color=\"text.secondary\" fontWeight=\"bold\">\n\t\t\t\t\t{ violations.length }\n\t\t\t\t</Typography>\n\t\t\t\t<SeverityIcon severity={ audit.severity } />\n\t\t\t</>\n\t\t);\n\t}\n\n\treturn <CheckIcon fontSize=\"small\" color=\"success\" />;\n}\n\nexport default function ViolationRow( { audit, skipReason, violations }: Props ) {\n\tconst [ expanded, setExpanded ] = useState( false );\n\n\tconst toggleExpanded = () => setExpanded( ( value ) => ! value );\n\n\treturn (\n\t\t<Box sx={ { borderBottom: 1, borderColor: 'divider', paddingBlock: 0.5 } }>\n\t\t\t<Box sx={ { display: 'flex', alignItems: 'center', gap: 0.5 } }>\n\t\t\t\t<Box\n\t\t\t\t\tsx={ {\n\t\t\t\t\t\talignItems: 'center',\n\t\t\t\t\t\tcursor: 'pointer',\n\t\t\t\t\t\tdisplay: 'flex',\n\t\t\t\t\t\tflex: 1,\n\t\t\t\t\t\tgap: 0.5,\n\t\t\t\t\t\tminWidth: 0,\n\t\t\t\t\t} }\n\t\t\t\t\tonClick={ toggleExpanded }\n\t\t\t\t>\n\t\t\t\t\t<Typography variant=\"body2\" sx={ { flex: 1 } }>\n\t\t\t\t\t\t{ audit.title }\n\t\t\t\t\t</Typography>\n\t\t\t\t\t{ ! skipReason && <StatusIndicator audit={ audit } violations={ violations } /> }\n\t\t\t\t</Box>\n\t\t\t\t{ skipReason && <SkipReasonTooltip reason={ skipReason } /> }\n\t\t\t\t<IconButton\n\t\t\t\t\tsize=\"small\"\n\t\t\t\t\taria-label={ expanded ? __( 'Collapse', 'elementor' ) : __( 'Expand', 'elementor' ) }\n\t\t\t\t\tonClick={ toggleExpanded }\n\t\t\t\t>\n\t\t\t\t\t<ChevronDownIcon\n\t\t\t\t\t\tfontSize=\"small\"\n\t\t\t\t\t\tsx={ {\n\t\t\t\t\t\t\ttransform: expanded ? 'rotate(180deg)' : undefined,\n\t\t\t\t\t\t\ttransition: 'transform .2s',\n\t\t\t\t\t\t} }\n\t\t\t\t\t/>\n\t\t\t\t</IconButton>\n\t\t\t</Box>\n\t\t\t<Collapse in={ expanded }>\n\t\t\t\t<Box sx={ { display: 'flex', flexDirection: 'column', gap: 1, paddingBlock: 1 } }>\n\t\t\t\t\t<Alert\n\t\t\t\t\t\tseverity=\"secondary\"\n\t\t\t\t\t\tsx={ { p: 1 } }\n\t\t\t\t\t\ticon={ <AlertCircleIcon fontSize=\"small\" color=\"secondary\" aria-hidden={ true } /> }\n\t\t\t\t\t>\n\t\t\t\t\t\t<AlertTitle>\n\t\t\t\t\t\t\t<Typography variant=\"caption\" component=\"p\" color=\"text.primary\" fontWeight=\"bold\">\n\t\t\t\t\t\t\t\t{ __( \"What's the issue\", 'elementor' ) }\n\t\t\t\t\t\t\t</Typography>\n\t\t\t\t\t\t</AlertTitle>\n\t\t\t\t\t\t<Typography variant=\"caption\" component=\"p\" color=\"text.secondary\">\n\t\t\t\t\t\t\t{ audit.description }\n\t\t\t\t\t\t</Typography>\n\t\t\t\t\t</Alert>\n\t\t\t\t\t<Alert\n\t\t\t\t\t\tseverity=\"info\"\n\t\t\t\t\t\tsx={ { p: 1 } }\n\t\t\t\t\t\ticon={ <BulbIcon fontSize=\"small\" color=\"info\" aria-hidden={ true } /> }\n\t\t\t\t\t>\n\t\t\t\t\t\t<AlertTitle>\n\t\t\t\t\t\t\t<Typography variant=\"caption\" component=\"p\" color=\"text.primary\" fontWeight=\"bold\">\n\t\t\t\t\t\t\t\t{ __( 'How to resolve', 'elementor' ) }\n\t\t\t\t\t\t\t</Typography>\n\t\t\t\t\t\t</AlertTitle>\n\t\t\t\t\t\t<Typography variant=\"caption\" component=\"p\" color=\"text.secondary\">\n\t\t\t\t\t\t\t{ audit.fixHint }\n\t\t\t\t\t\t</Typography>\n\t\t\t\t\t</Alert>\n\t\t\t\t</Box>\n\t\t\t\t{ violations && violations.length > 0 && (\n\t\t\t\t\t<Box role=\"list\" sx={ { paddingBlockEnd: 1, paddingInlineStart: 2 } }>\n\t\t\t\t\t\t{ violations.map( ( violation, idx ) => {\n\t\t\t\t\t\t\tconst widgetIcon = violation.elementId ? getElementIcon( violation.elementId ) : null;\n\t\t\t\t\t\t\tconst elementTitle = violation.elementId ? getElementTitle( violation.elementId ) : null;\n\t\t\t\t\t\t\tconst rowLabel = elementTitle\n\t\t\t\t\t\t\t\t? `${ elementTitle } - ${ violation.label }`\n\t\t\t\t\t\t\t\t: violation.label;\n\n\t\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t\t<Box\n\t\t\t\t\t\t\t\t\tkey={ idx }\n\t\t\t\t\t\t\t\t\trole=\"button\"\n\t\t\t\t\t\t\t\t\ttabIndex={ 0 }\n\t\t\t\t\t\t\t\t\tonClick={ () => focusViolation( violation ) }\n\t\t\t\t\t\t\t\t\tonKeyDown={ onKeyboardClick( () => focusViolation( violation ) ) }\n\t\t\t\t\t\t\t\t\tsx={ {\n\t\t\t\t\t\t\t\t\t\tdisplay: 'flex',\n\t\t\t\t\t\t\t\t\t\talignItems: 'center',\n\t\t\t\t\t\t\t\t\t\tgap: 1,\n\t\t\t\t\t\t\t\t\t\tpaddingBlock: 0.5,\n\t\t\t\t\t\t\t\t\t\tpaddingInline: 2,\n\t\t\t\t\t\t\t\t\t\tborderRadius: 1,\n\t\t\t\t\t\t\t\t\t\tcursor: 'pointer',\n\t\t\t\t\t\t\t\t\t\t'& .violation-hover-icon': { opacity: 0, transition: 'opacity .15s' },\n\t\t\t\t\t\t\t\t\t\t'&:hover': { bgcolor: 'action.hover' },\n\t\t\t\t\t\t\t\t\t\t'&:hover .violation-hover-icon, &:focus-visible .violation-hover-icon': {\n\t\t\t\t\t\t\t\t\t\t\topacity: 1,\n\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t} }\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t<ViolationIcon violation={ violation } widgetIcon={ widgetIcon } />\n\t\t\t\t\t\t\t\t\t<Box sx={ { flex: 1 } }>\n\t\t\t\t\t\t\t\t\t\t<Typography variant=\"caption\">{ rowLabel }</Typography>\n\t\t\t\t\t\t\t\t\t\t{ violation.detail && (\n\t\t\t\t\t\t\t\t\t\t\t<Typography variant=\"caption\" color=\"text.secondary\">\n\t\t\t\t\t\t\t\t\t\t\t\t{ violation.detail }\n\t\t\t\t\t\t\t\t\t\t\t</Typography>\n\t\t\t\t\t\t\t\t\t\t) }\n\t\t\t\t\t\t\t\t\t</Box>\n\t\t\t\t\t\t\t\t\t{ violation.angieFix && (\n\t\t\t\t\t\t\t\t\t\t<FixViolationWithAngie prompt={ buildAngiePrompt( rowLabel ) } />\n\t\t\t\t\t\t\t\t\t) }\n\t\t\t\t\t\t\t\t\t<EyeIcon className=\"violation-hover-icon\" fontSize=\"tiny\" aria-hidden={ true } />\n\t\t\t\t\t\t\t\t</Box>\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t} ) }\n\t\t\t\t\t</Box>\n\t\t\t\t) }\n\t\t\t</Collapse>\n\t\t</Box>\n\t);\n}\n","import { getContainer, selectElement } from '@elementor/editor-elements';\nimport { __privateOpenRoute as openRoute, __privateRunCommand as runCommand } from '@elementor/editor-v1-adapters';\n\nimport { type AuditViolation } from '../types';\n\nconst SCROLL_TO_VIEW_DELAY_MS = 200;\n\nexport function focusViolation( violation: AuditViolation ): void {\n\tif ( violation.elementId ) {\n\t\tconst container = getContainer( violation.elementId );\n\n\t\tif ( container ) {\n\t\t\tselectElement( violation.elementId );\n\n\t\t\tconst domElement = container.view?.getDomElement?.();\n\n\t\t\tif ( domElement ) {\n\t\t\t\t(\n\t\t\t\t\twindow as unknown as {\n\t\t\t\t\t\telementor?: { helpers?: { scrollToView?: ( element: unknown, timeout?: number ) => void } };\n\t\t\t\t\t}\n\t\t\t\t ).elementor?.helpers?.scrollToView?.( domElement, SCROLL_TO_VIEW_DELAY_MS );\n\t\t\t}\n\t\t}\n\n\t\tif ( violation.targetHint === 'element-settings' ) {\n\t\t\trunCommand( 'panel/editor/open' );\n\t\t}\n\n\t\treturn;\n\t}\n\n\tif ( violation.externalUrl ) {\n\t\twindow.open( violation.externalUrl, '_blank' );\n\t\treturn;\n\t}\n\n\tif ( violation.targetHint === 'page-settings' ) {\n\t\topenRoute( 'panel/page-settings/settings' );\n\t\treturn;\n\t}\n\n\tif ( violation.targetHint === 'site-settings' ) {\n\t\trunCommand( 'panel/global/open' );\n\t\treturn;\n\t}\n\n\tif ( violation.targetHint === 'site-identity-settings' ) {\n\t\tvoid runCommand( 'panel/global/open' ).then( () => {\n\t\t\topenRoute( 'panel/global/settings-site-identity' );\n\t\t} );\n\t}\n}\n","import { __, sprintf } from '@wordpress/i18n';\n\nexport function buildAngiePrompt( violationText: string ): string {\n\treturn sprintf(\n\t\t/* translators: %s: audit violation description. */\n\t\t__( 'Help me fix: %s', 'elementor' ),\n\t\tviolationText\n\t);\n}\n","import type * as React from 'react';\n\nexport function onKeyboardClick( callback: () => void ) {\n\treturn ( event: React.KeyboardEvent ) => {\n\t\tif ( event.key === 'Enter' || event.key === ' ' ) {\n\t\t\tevent.preventDefault();\n\t\t\tcallback();\n\t\t}\n\t};\n}\n","import * as React from 'react';\nimport { isAngieAvailable, sendPromptToAngie } from '@elementor/editor-mcp';\nimport { AngieIcon } from '@elementor/icons';\nimport { IconButton, Tooltip } from '@elementor/ui';\nimport { __ } from '@wordpress/i18n';\n\nimport { ANGIE_FIX_ENTRY_POINT, CREATE_WIDGET_EVENT } from '../constants';\n\ntype Props = {\n\tprompt: string;\n};\n\nexport default function FixViolationWithAngie( { prompt }: Props ) {\n\tconst label = __( 'Fix with Angie', 'elementor' );\n\tconst href = `#angie-prompt=${ encodeURIComponent( prompt ) }`;\n\n\tconst handleClick = ( event: React.MouseEvent< HTMLAnchorElement > ) => {\n\t\tevent.stopPropagation();\n\t\tevent.preventDefault();\n\n\t\tif ( isAngieAvailable() ) {\n\t\t\tsendPromptToAngie( prompt );\n\t\t\treturn;\n\t\t}\n\n\t\twindow.dispatchEvent(\n\t\t\tnew CustomEvent( CREATE_WIDGET_EVENT, {\n\t\t\t\tdetail: {\n\t\t\t\t\tentry_point: ANGIE_FIX_ENTRY_POINT,\n\t\t\t\t\tprompt,\n\t\t\t\t},\n\t\t\t} )\n\t\t);\n\t};\n\n\treturn (\n\t\t<Tooltip title={ label }>\n\t\t\t<IconButton\n\t\t\t\tclassName=\"violation-hover-icon\"\n\t\t\t\tcomponent=\"a\"\n\t\t\t\thref={ href }\n\t\t\t\tsize=\"small\"\n\t\t\t\taria-label={ label }\n\t\t\t\tonClick={ handleClick }\n\t\t\t>\n\t\t\t\t<AngieIcon fontSize=\"tiny\" />\n\t\t\t</IconButton>\n\t\t</Tooltip>\n\t);\n}\n","import * as React from 'react';\nimport { AlertCircleIcon, AlertTriangleFilledIcon, InfoCircleIcon } from '@elementor/icons';\n\nimport { type AuditSeverity } from '../types';\n\ntype IconComponent = typeof AlertTriangleFilledIcon;\n\ntype SeverityConfig = {\n\tIcon: IconComponent;\n\tcolor: 'error' | 'warning' | 'info';\n};\n\nconst SEVERITY_CONFIG: Record< AuditSeverity, SeverityConfig > = {\n\terror: { Icon: AlertTriangleFilledIcon, color: 'error' },\n\twarning: { Icon: AlertCircleIcon, color: 'warning' },\n\tinfo: { Icon: InfoCircleIcon, color: 'info' },\n};\n\ntype Props = {\n\tseverity: AuditSeverity;\n};\n\nexport default function SeverityIcon( { severity }: Props ) {\n\tconst { Icon, color } = SEVERITY_CONFIG[ severity ];\n\treturn <Icon fontSize=\"small\" color={ color } />;\n}\n","import * as React from 'react';\nimport { FileSettingsIcon, SettingsIcon, ShieldCheckIcon } from '@elementor/icons';\nimport { Box } from '@elementor/ui';\n\nimport { type AuditViolation } from '../types';\n\ntype Props = {\n\tviolation: AuditViolation;\n\twidgetIcon: string | null;\n};\n\nexport default function ViolationIcon( { violation, widgetIcon }: Props ) {\n\tif ( widgetIcon ) {\n\t\treturn (\n\t\t\t<Box\n\t\t\t\tcomponent=\"i\"\n\t\t\t\tclassName={ widgetIcon }\n\t\t\t\taria-hidden={ true }\n\t\t\t\tsx={ { fontSize: 'inherit', width: '1em', textAlign: 'center' } }\n\t\t\t/>\n\t\t);\n\t}\n\n\tif ( violation.targetHint === 'page-settings' ) {\n\t\treturn <FileSettingsIcon fontSize=\"inherit\" aria-hidden={ true } />;\n\t}\n\n\tif ( violation.targetHint === 'site-settings' || violation.targetHint === 'site-identity-settings' ) {\n\t\treturn <SettingsIcon fontSize=\"inherit\" aria-hidden={ true } />;\n\t}\n\n\treturn <ShieldCheckIcon fontSize=\"inherit\" aria-hidden={ true } />;\n}\n","import * as React from 'react';\nimport { Box } from '@elementor/ui';\nimport { __ } from '@wordpress/i18n';\n\nimport { CATEGORY_LABELS } from '../../constants';\nimport { type AuditCategory, type PageAuditReport } from '../../types';\nimport { partitionAuditResults } from '../../utils/audit-status-summary';\nimport { CATEGORY_ICONS } from '../category-icons';\nimport StatusSection from '../status-section';\nimport SubpageHeader from '../subpage-header';\nimport ViolationRow from '../violation-row';\n\ntype Props = {\n\tcategory: AuditCategory;\n\treport: PageAuditReport;\n\tonBack: () => void;\n};\n\nexport default function CategoryPage( { category, report, onBack }: Props ) {\n\tconst Icon = CATEGORY_ICONS[ category ];\n\tconst { failed, passed, totalViolations } = partitionAuditResults( report, { category } );\n\n\treturn (\n\t\t<>\n\t\t\t<SubpageHeader\n\t\t\t\ttitle={ CATEGORY_LABELS[ category ] }\n\t\t\t\tonBack={ onBack }\n\t\t\t\tbackLabel={ __( 'Back to all issues', 'elementor' ) }\n\t\t\t\ticon={ <Icon fontSize=\"small\" color=\"action\" /> }\n\t\t\t/>\n\t\t\t<Box sx={ { p: 1 } }>\n\t\t\t\t<StatusSection\n\t\t\t\t\tlabel={ __( 'Failed audits', 'elementor' ) }\n\t\t\t\t\tcount={ totalViolations }\n\t\t\t\t\tcolor=\"error\"\n\t\t\t\t\tdefaultExpanded\n\t\t\t\t>\n\t\t\t\t\t{ failed.map( ( r ) => (\n\t\t\t\t\t\t<ViolationRow key={ r.audit.id } audit={ r.audit } violations={ r.result.violations } />\n\t\t\t\t\t) ) }\n\t\t\t\t</StatusSection>\n\t\t\t\t<StatusSection label={ __( 'Passed audits', 'elementor' ) } count={ passed.length } color=\"success\">\n\t\t\t\t\t{ passed.map( ( r ) => (\n\t\t\t\t\t\t<ViolationRow key={ r.audit.id } audit={ r.audit } />\n\t\t\t\t\t) ) }\n\t\t\t\t</StatusSection>\n\t\t\t</Box>\n\t\t</>\n\t);\n}\n","import {\n\tElementorAccessibilityIcon,\n\tFilterIcon,\n\tHeartHandShakeIcon,\n\tSettings2Icon,\n\tShieldHalfFilledIcon,\n} from '@elementor/icons';\n\nimport type { AuditCategory } from '../types';\n\nexport const CATEGORY_ICONS: Record< AuditCategory, typeof Settings2Icon > = {\n\t'best-practices': Settings2Icon,\n\tseo: FilterIcon,\n\taccessibility: ElementorAccessibilityIcon,\n\tperformance: ShieldHalfFilledIcon,\n\tcompliance: HeartHandShakeIcon,\n};\n","import * as React from 'react';\nimport { Box, Link, Typography } from '@elementor/ui';\nimport { __ } from '@wordpress/i18n';\n\nimport { ALL_CATEGORIES, CATEGORY_LABELS } from '../../constants';\nimport { type AuditCategory, type PageAuditReport } from '../../types';\nimport { getPopulatedCategories } from '../../utils/audit-status-summary';\nimport { countSeverities } from '../../utils/severity-counts';\nimport IssuesCategoryRow from '../issues-category-row';\nimport Promotions from '../promotions';\n\ntype Props = {\n\treport: PageAuditReport;\n\tonCategoryClick: ( category: AuditCategory ) => void;\n\tonAllAuditsClick: () => void;\n};\n\nexport default function IssuesPage( { report, onCategoryClick, onAllAuditsClick }: Props ) {\n\tconst populatedCategories = getPopulatedCategories( report.categories, ALL_CATEGORIES );\n\n\treturn (\n\t\t<Box sx={ { display: 'flex', flexDirection: 'column', gap: 4, p: 2 } }>\n\t\t\t<Link\n\t\t\t\tcomponent=\"button\"\n\t\t\t\tunderline=\"none\"\n\t\t\t\tcolor=\"inherit\"\n\t\t\t\tonClick={ onAllAuditsClick }\n\t\t\t\tsx={ { textAlign: 'start' } }\n\t\t\t>\n\t\t\t\t<Typography variant=\"subtitle1\" component=\"h2\">\n\t\t\t\t\t{ __( 'All issues', 'elementor' ) }\n\t\t\t\t</Typography>\n\t\t\t</Link>\n\t\t\t<Box sx={ { display: 'flex', flexDirection: 'column', gap: 1 } }>\n\t\t\t\t{ populatedCategories.map( ( category ) => (\n\t\t\t\t\t<IssuesCategoryRow\n\t\t\t\t\t\tkey={ category }\n\t\t\t\t\t\tcategory={ category }\n\t\t\t\t\t\tlabel={ CATEGORY_LABELS[ category ] }\n\t\t\t\t\t\tcounts={ countSeverities( report, category ) }\n\t\t\t\t\t\tonClick={ () => onCategoryClick( category ) }\n\t\t\t\t\t/>\n\t\t\t\t) ) }\n\t\t\t</Box>\n\t\t\t<Promotions report={ report } />\n\t\t</Box>\n\t);\n}\n","import { __, sprintf } from '@wordpress/i18n';\n\nimport { type AuditCategory, type AuditSeverity, type PageAuditReport } from '../types';\n\nexport type SeverityCounts = Record< AuditSeverity, number >;\n\nexport const ALL_SEVERITIES = [ 'error', 'warning', 'info' ] as const;\n\nexport function countSeverities( report: PageAuditReport, category?: AuditCategory ): SeverityCounts {\n\tconst counts: SeverityCounts = { error: 0, warning: 0, info: 0 };\n\n\tfor ( const { audit, result } of report.auditResults ) {\n\t\tif ( result.status !== 'fail' ) {\n\t\t\tcontinue;\n\t\t}\n\n\t\tif ( category && ! audit.categories.includes( category ) ) {\n\t\t\tcontinue;\n\t\t}\n\n\t\tcounts[ audit.severity ] += result.violations.length;\n\t}\n\n\treturn counts;\n}\n\nexport function severityPluralLabel( severity: AuditSeverity ): string {\n\tswitch ( severity ) {\n\t\tcase 'error':\n\t\t\treturn __( 'Errors', 'elementor' );\n\t\tcase 'warning':\n\t\t\treturn __( 'Warnings', 'elementor' );\n\t\tcase 'info':\n\t\t\treturn __( 'Info', 'elementor' );\n\t}\n}\n\nexport function severityRemainingCountLabel( severity: AuditSeverity, count: number ): string {\n\tswitch ( severity ) {\n\t\tcase 'error':\n\t\t\treturn sprintf(\n\t\t\t\t/* translators: %d: number of remaining error violations. */\n\t\t\t\t__( '%d errors', 'elementor' ),\n\t\t\t\tcount\n\t\t\t);\n\t\tcase 'warning':\n\t\t\treturn sprintf(\n\t\t\t\t/* translators: %d: number of remaining warning violations. */\n\t\t\t\t__( '%d warnings', 'elementor' ),\n\t\t\t\tcount\n\t\t\t);\n\t\tcase 'info':\n\t\t\treturn sprintf(\n\t\t\t\t/* translators: %d: number of remaining info violations. */\n\t\t\t\t__( '%d info', 'elementor' ),\n\t\t\t\tcount\n\t\t\t);\n\t}\n}\n","import * as React from 'react';\nimport { ChevronRightIcon } from '@elementor/icons';\nimport { Box, Rotate, Typography, useTheme } from '@elementor/ui';\n\nimport { type AuditCategory } from '../types';\nimport { onKeyboardClick } from '../utils/keyboard-click';\nimport { ALL_SEVERITIES, type SeverityCounts } from '../utils/severity-counts';\nimport { CATEGORY_ICONS } from './category-icons';\nimport SeverityIcon from './severity-icons';\n\ntype Props = {\n\tcategory: AuditCategory;\n\tlabel: string;\n\tcounts: SeverityCounts;\n\tonClick: () => void;\n};\n\nexport default function IssuesCategoryRow( { category, label, counts, onClick }: Props ) {\n\tconst isRtl = 'rtl' === useTheme().direction;\n\tconst Icon = CATEGORY_ICONS[ category ];\n\n\treturn (\n\t\t<Box\n\t\t\trole=\"button\"\n\t\t\ttabIndex={ 0 }\n\t\t\tonClick={ onClick }\n\t\t\tonKeyDown={ onKeyboardClick( onClick ) }\n\t\t\tsx={ {\n\t\t\t\tdisplay: 'flex',\n\t\t\t\talignItems: 'center',\n\t\t\t\tgap: 1,\n\t\t\t\tpx: 2,\n\t\t\t\tpy: 1.5,\n\t\t\t\tcursor: 'pointer',\n\t\t\t\tborderRadius: 1,\n\t\t\t\tborder: 1,\n\t\t\t\tborderColor: 'divider',\n\t\t\t\t'&:hover': { bgcolor: 'action.hover' },\n\t\t\t\toutline: 'none',\n\t\t\t\t'&:focus-visible': { outline: '2px solid', outlineColor: 'primary.main' },\n\t\t\t} }\n\t\t>\n\t\t\t<Icon fontSize=\"small\" color=\"action\" />\n\t\t\t<Typography variant=\"body2\" fontWeight=\"bold\" sx={ { flex: 1 } }>\n\t\t\t\t{ label }\n\t\t\t</Typography>\n\t\t\t<Box sx={ { display: 'flex', alignItems: 'center', gap: 0.5 } }>\n\t\t\t\t{ ALL_SEVERITIES.filter( ( s ) => counts[ s ] > 0 ).map( ( severity ) => (\n\t\t\t\t\t<Box key={ severity } sx={ { display: 'flex', alignItems: 'center', gap: 0.25 } }>\n\t\t\t\t\t\t<SeverityIcon severity={ severity } />\n\t\t\t\t\t\t<Typography variant=\"caption\" color=\"text.primary\" fontWeight=\"bold\">\n\t\t\t\t\t\t\t{ counts[ severity ] }\n\t\t\t\t\t\t</Typography>\n\t\t\t\t\t</Box>\n\t\t\t\t) ) }\n\t\t\t</Box>\n\t\t\t<Rotate in={ isRtl }>\n\t\t\t\t<ChevronRightIcon fontSize=\"small\" color=\"action\" />\n\t\t\t</Rotate>\n\t\t</Box>\n\t);\n}\n","import * as React from 'react';\nimport { Box, Typography } from '@elementor/ui';\nimport { __ } from '@wordpress/i18n';\n\nimport { PROMOTIONS } from '../register-promotions';\nimport { type PageAuditReport } from '../types';\nimport { findAuditRun } from '../utils/find-audit-run';\nimport PromotionCard from './promotion-card';\n\ntype Props = {\n\treport: PageAuditReport;\n};\n\nexport default function Promotions( { report }: Props ) {\n\tconst cards = PROMOTIONS.flatMap( ( config ) => {\n\t\tconst run = findAuditRun( report, config.auditId );\n\n\t\tif ( ! run || run.result.status !== 'fail' ) {\n\t\t\treturn [];\n\t\t}\n\n\t\tconst subtitle = config.formatSubtitle( run );\n\n\t\tif ( ! subtitle ) {\n\t\t\treturn [];\n\t\t}\n\n\t\tconst ctaUrl = config.getCtaUrl( run );\n\n\t\treturn [\n\t\t\t{\n\t\t\t\tconfig,\n\t\t\t\tctaUrl,\n\t\t\t\tkey: config.auditId,\n\t\t\t\trun,\n\t\t\t\tsubtitle,\n\t\t\t},\n\t\t];\n\t} );\n\n\tif ( cards.length === 0 ) {\n\t\treturn null;\n\t}\n\n\treturn (\n\t\t<>\n\t\t\t<Typography variant=\"subtitle1\" fontWeight=\"bold\">\n\t\t\t\t{ __( 'Quick wins', 'elementor' ) }\n\t\t\t</Typography>\n\t\t\t<Box sx={ { display: 'flex', flexDirection: 'column', gap: 1 } }>\n\t\t\t\t{ cards.map( ( { config, ctaUrl, key, run, subtitle } ) => (\n\t\t\t\t\t<PromotionCard\n\t\t\t\t\t\tkey={ key }\n\t\t\t\t\t\ticon={ config.icon }\n\t\t\t\t\t\ttitle={ run.audit.title }\n\t\t\t\t\t\tsubtitle={ subtitle }\n\t\t\t\t\t\tctaLabel={ config.ctaLabel }\n\t\t\t\t\t\tctaDisabled={ ! ctaUrl }\n\t\t\t\t\t\tonCtaClick={ () => {\n\t\t\t\t\t\t\tif ( ctaUrl ) {\n\t\t\t\t\t\t\t\twindow.open( ctaUrl, '_blank' );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} }\n\t\t\t\t\t/>\n\t\t\t\t) ) }\n\t\t\t</Box>\n\t\t</>\n\t);\n}\n","import { ElementorCookieIcon, PhotoIcon, ShieldHalfFilledIcon } from '@elementor/icons';\nimport { __, _n, sprintf } from '@wordpress/i18n';\n\nimport { type AuditRun } from './types';\n\nexport type PromotionIcon = typeof PhotoIcon;\n\nexport type PromotionConfig = {\n\tauditId: string;\n\ticon: PromotionIcon;\n\tctaLabel: string;\n\tformatSubtitle: ( run: AuditRun ) => string | null;\n\tgetCtaUrl: ( run: AuditRun ) => string | undefined;\n};\n\nfunction firstFailExternalUrl( run: AuditRun ): string | undefined {\n\treturn run.result.status === 'fail' ? run.result.violations[ 0 ]?.externalUrl : undefined;\n}\n\nexport const PROMOTIONS: PromotionConfig[] = [\n\t{\n\t\tauditId: 'audits/images-alt-text',\n\t\ticon: PhotoIcon,\n\t\tctaLabel: __( 'Fix with Ally', 'elementor' ),\n\t\tformatSubtitle: ( run ) => {\n\t\t\tif ( run.result.status !== 'fail' ) {\n\t\t\t\treturn null;\n\t\t\t}\n\n\t\t\tconst count = run.result.metadata?.missingAltImageCount ?? 0;\n\n\t\t\tif ( count === 0 ) {\n\t\t\t\treturn null;\n\t\t\t}\n\n\t\t\treturn sprintf(\n\t\t\t\t/* translators: %d: number of images missing alt text. */\n\t\t\t\t_n( '%d image', '%d images', count, 'elementor' ),\n\t\t\t\tcount\n\t\t\t);\n\t\t},\n\t\tgetCtaUrl: firstFailExternalUrl,\n\t},\n\t{\n\t\tauditId: 'audits/cookie-policy',\n\t\ticon: ElementorCookieIcon,\n\t\tctaLabel: __( 'Fix with Cookiez', 'elementor' ),\n\t\tformatSubtitle: ( run ) =>\n\t\t\trun.result.status === 'fail' ? __( 'Generate cookie policy', 'elementor' ) : null,\n\t\tgetCtaUrl: firstFailExternalUrl,\n\t},\n\t{\n\t\tauditId: 'audits/images-too-large',\n\t\ticon: ShieldHalfFilledIcon,\n\t\tctaLabel: __( 'Optimize all', 'elementor' ),\n\t\tformatSubtitle: ( run ) => {\n\t\t\tif ( run.result.status !== 'fail' ) {\n\t\t\t\treturn null;\n\t\t\t}\n\n\t\t\tconst count = run.result.metadata?.oversizedImageCount ?? 0;\n\n\t\t\tif ( count === 0 ) {\n\t\t\t\treturn null;\n\t\t\t}\n\n\t\t\treturn sprintf(\n\t\t\t\t/* translators: %d: number of oversized images. */\n\t\t\t\t_n( '%d image', '%d images', count, 'elementor' ),\n\t\t\t\tcount\n\t\t\t);\n\t\t},\n\t\tgetCtaUrl: firstFailExternalUrl,\n\t},\n];\n","import { type AuditRun, type PageAuditReport } from '../types';\n\nexport function findAuditRun( report: PageAuditReport, auditId: string ): AuditRun | undefined {\n\treturn report.auditResults.find( ( run ) => run.audit.id === auditId );\n}\n","import * as React from 'react';\nimport { Box, Button, Typography } from '@elementor/ui';\n\nimport { type PromotionIcon } from '../register-promotions';\n\ntype Props = {\n\tctaDisabled: boolean;\n\tctaLabel: string;\n\ticon: PromotionIcon;\n\tonCtaClick: () => void;\n\tsubtitle: string;\n\ttitle: string;\n};\n\nexport default function PromotionCard( { ctaDisabled, ctaLabel, icon: Icon, onCtaClick, subtitle, title }: Props ) {\n\treturn (\n\t\t<Box\n\t\t\tsx={ {\n\t\t\t\talignItems: 'center',\n\t\t\t\tborder: 1,\n\t\t\t\tborderColor: 'divider',\n\t\t\t\tborderRadius: 1,\n\t\t\t\tdisplay: 'flex',\n\t\t\t\tgap: 1,\n\t\t\t\tpx: 2,\n\t\t\t\tpy: 1.5,\n\t\t\t} }\n\t\t>\n\t\t\t<Icon fontSize=\"small\" color=\"action\" />\n\t\t\t<Box sx={ { display: 'flex', flex: 1, flexDirection: 'column', gap: 0.25, minWidth: 0 } }>\n\t\t\t\t<Typography variant=\"body2\" fontWeight=\"bold\">\n\t\t\t\t\t{ title }\n\t\t\t\t</Typography>\n\t\t\t\t<Typography variant=\"caption\" color=\"text.secondary\">\n\t\t\t\t\t{ subtitle }\n\t\t\t\t</Typography>\n\t\t\t</Box>\n\t\t\t<Button variant=\"outlined\" color=\"secondary\" size=\"small\" disabled={ ctaDisabled } onClick={ onCtaClick }>\n\t\t\t\t{ ctaLabel }\n\t\t\t</Button>\n\t\t</Box>\n\t);\n}\n","import * as React from 'react';\nimport { Box, Chip, Divider, Typography } from '@elementor/ui';\nimport { __, sprintf } from '@wordpress/i18n';\n\nimport { ALL_CATEGORIES, CATEGORY_LABELS } from '../../constants';\nimport { type AuditCategory, type PageAuditReport } from '../../types';\nimport {\n\tauditStatusColor,\n\tauditStatusDisplayCounts,\n\ttype AuditStatusGroup,\n\tauditStatusLabel,\n\tgetPopulatedCategories,\n} from '../../utils/audit-status-summary';\nimport { getScoreTier } from '../../utils/score-thresholds';\nimport {\n\tALL_SEVERITIES,\n\tcountSeverities,\n\tseverityPluralLabel,\n\tseverityRemainingCountLabel,\n} from '../../utils/severity-counts';\nimport CountSummaryCircle from '../count-summary-circle';\nimport ScoreBar from '../score-bar';\nimport ScoreCircle from '../score-circle';\nimport SeverityIcon from '../severity-icons';\n\ntype Props = {\n\tonCategoryClick: ( category: AuditCategory ) => void;\n\tonStatusClick: ( status: AuditStatusGroup ) => void;\n\treport: PageAuditReport;\n};\n\nconst STATUS_ARIA_LABELS: Record< AuditStatusGroup, ( count: number ) => string > = {\n\tpass: ( count ) =>\n\t\tsprintf(\n\t\t\t/* translators: %d: number of passed audits. */\n\t\t\t__( '%d passed audits, view all', 'elementor' ),\n\t\t\tcount\n\t\t),\n\tfail: ( count ) =>\n\t\tsprintf(\n\t\t\t/* translators: %d: number of failed audit violations. */\n\t\t\t__( '%d failed audits, view all', 'elementor' ),\n\t\t\tcount\n\t\t),\n\tskipped: ( count ) =>\n\t\tsprintf(\n\t\t\t/* translators: %d: number of skipped audits. */\n\t\t\t__( '%d skipped audits, view all', 'elementor' ),\n\t\t\tcount\n\t\t),\n};\n\nconst STATUS_GROUPS = [ 'fail', 'pass', 'skipped' ] as const;\n\nexport default function OverviewPage( { onCategoryClick, onStatusClick, report }: Props ) {\n\tconst populatedCategories = getPopulatedCategories( report.categories, ALL_CATEGORIES );\n\tconst severityCounts = countSeverities( report );\n\tconst statusCounts = auditStatusDisplayCounts( report );\n\tconst overallScore = getScoreTier( report.overall );\n\n\treturn (\n\t\t<Box sx={ { display: 'flex', flexDirection: 'column', gap: 4, p: 2 } }>\n\t\t\t<Box sx={ { display: 'flex', alignItems: 'center', gap: 2 } }>\n\t\t\t\t<ScoreCircle color={ overallScore.color } score={ report.overall } />\n\t\t\t\t<Box sx={ { display: 'flex', flexDirection: 'column', gap: 0.5 } }>\n\t\t\t\t\t<Chip\n\t\t\t\t\t\tlabel={ overallScore.label }\n\t\t\t\t\t\tcolor={ overallScore.color }\n\t\t\t\t\t\tvariant=\"standard\"\n\t\t\t\t\t\tsize=\"small\"\n\t\t\t\t\t\tsx={ { fontWeight: 600, alignSelf: 'flex-start' } }\n\t\t\t\t\t/>\n\t\t\t\t\t<Typography variant=\"body2\" color=\"text.secondary\">\n\t\t\t\t\t\t{ __( 'Overall score', 'elementor' ) }\n\t\t\t\t\t</Typography>\n\t\t\t\t</Box>\n\t\t\t</Box>\n\t\t\t<Box sx={ { display: 'flex', flexDirection: 'column', gap: 2 } }>\n\t\t\t\t{ populatedCategories.map( ( category ) => (\n\t\t\t\t\t<ScoreBar\n\t\t\t\t\t\tkey={ category }\n\t\t\t\t\t\tlabel={ CATEGORY_LABELS[ category ] }\n\t\t\t\t\t\tscore={ report.categories[ category ].score }\n\t\t\t\t\t\tonClick={ () => onCategoryClick( category ) }\n\t\t\t\t\t/>\n\t\t\t\t) ) }\n\t\t\t</Box>\n\t\t\t<Divider />\n\t\t\t<Typography variant=\"subtitle1\" fontWeight=\"bold\">\n\t\t\t\t{ __( 'Audit statuses', 'elementor' ) }\n\t\t\t</Typography>\n\t\t\t<Box sx={ { display: 'flex', justifyContent: 'space-around', gap: 2 } }>\n\t\t\t\t{ STATUS_GROUPS.map( ( status ) => (\n\t\t\t\t\t<CountSummaryCircle\n\t\t\t\t\t\tkey={ status }\n\t\t\t\t\t\tariaLabel={ STATUS_ARIA_LABELS[ status ]( statusCounts[ status ] ) }\n\t\t\t\t\t\tcolor={ auditStatusColor( status ) }\n\t\t\t\t\t\tcount={ statusCounts[ status ] }\n\t\t\t\t\t\tlabel={ auditStatusLabel( status ) }\n\t\t\t\t\t\tonClick={ () => onStatusClick( status ) }\n\t\t\t\t\t/>\n\t\t\t\t) ) }\n\t\t\t</Box>\n\t\t\t<Divider />\n\t\t\t<Typography variant=\"subtitle1\" fontWeight=\"bold\">\n\t\t\t\t{ __( 'Remaining issues', 'elementor' ) }\n\t\t\t</Typography>\n\t\t\t<Box\n\t\t\t\tcomponent=\"ul\"\n\t\t\t\tsx={ {\n\t\t\t\t\tdisplay: 'flex',\n\t\t\t\t\tflexDirection: 'column',\n\t\t\t\t\tgap: 1,\n\t\t\t\t\tlistStyle: 'none',\n\t\t\t\t\tm: 0,\n\t\t\t\t\tp: 0,\n\t\t\t\t} }\n\t\t\t>\n\t\t\t\t{ ALL_SEVERITIES.map( ( severity ) => {\n\t\t\t\t\tconst count = severityCounts[ severity ];\n\n\t\t\t\t\treturn (\n\t\t\t\t\t\t<Box\n\t\t\t\t\t\t\taria-label={ severityRemainingCountLabel( severity, count ) }\n\t\t\t\t\t\t\tcomponent=\"li\"\n\t\t\t\t\t\t\tkey={ severity }\n\t\t\t\t\t\t\tsx={ { alignItems: 'center', display: 'flex', gap: 0.5 } }\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<SeverityIcon severity={ severity } />\n\t\t\t\t\t\t\t<Typography variant=\"body2\" fontWeight=\"bold\">\n\t\t\t\t\t\t\t\t{ count }\n\t\t\t\t\t\t\t</Typography>\n\t\t\t\t\t\t\t<Typography variant=\"body2\">{ severityPluralLabel( severity ) }</Typography>\n\t\t\t\t\t\t</Box>\n\t\t\t\t\t);\n\t\t\t\t} ) }\n\t\t\t</Box>\n\t\t</Box>\n\t);\n}\n","import { __ } from '@wordpress/i18n';\n\nexport const GOOD_THRESHOLD = 90;\nexport const OK_THRESHOLD = 50;\n\nexport type ScoreColor = 'success' | 'warning' | 'error';\n\nexport type ScoreTier = {\n\tcolor: ScoreColor;\n\tlabel: string;\n};\n\nexport function getScoreTier( score: number ): ScoreTier {\n\tif ( score >= GOOD_THRESHOLD ) {\n\t\treturn { color: 'success', label: __( 'Good', 'elementor' ) };\n\t}\n\n\tif ( score >= OK_THRESHOLD ) {\n\t\treturn { color: 'warning', label: __( 'Needs work', 'elementor' ) };\n\t}\n\n\treturn { color: 'error', label: __( 'At risk', 'elementor' ) };\n}\n","import * as React from 'react';\nimport { Box, Chip, type ChipProps, type Theme, Typography } from '@elementor/ui';\n\ntype Props = {\n\tariaLabel: string;\n\tcolor: ChipProps[ 'color' ];\n\tcount: number;\n\tlabel: string;\n\tonClick: () => void;\n};\n\nconst COUNT_SUMMARY_CIRCLE_SIZE = 64;\nconst COUNT_SUMMARY_BORDER_WIDTH = 4;\n\nfunction chipBorderColor( theme: Theme, color: ChipProps[ 'color' ] ): string {\n\tif ( color === 'default' || ! color ) {\n\t\treturn theme.palette.text.secondary;\n\t}\n\n\treturn theme.palette[ color ].main;\n}\n\nexport default function CountSummaryCircle( { ariaLabel, color, count, label, onClick }: Props ) {\n\treturn (\n\t\t<Box\n\t\t\taria-label={ ariaLabel }\n\t\t\tcomponent=\"button\"\n\t\t\tonClick={ onClick }\n\t\t\ttype=\"button\"\n\t\t\tsx={ {\n\t\t\t\talignItems: 'center',\n\t\t\t\tbackground: 'none',\n\t\t\t\tborder: 'none',\n\t\t\t\tcursor: 'pointer',\n\t\t\t\tdisplay: 'flex',\n\t\t\t\tflex: 1,\n\t\t\t\tflexDirection: 'column',\n\t\t\t\tgap: 0.5,\n\t\t\t\tpadding: 0,\n\t\t\t} }\n\t\t>\n\t\t\t<Chip\n\t\t\t\tcolor={ color }\n\t\t\t\tlabel={ count }\n\t\t\t\tsize=\"small\"\n\t\t\t\tvariant=\"standard\"\n\t\t\t\tsx={ ( theme: Theme ) => ( {\n\t\t\t\t\tborder: `${ COUNT_SUMMARY_BORDER_WIDTH }px solid ${ chipBorderColor( theme, color ) }`,\n\t\t\t\t\tborderRadius: '50%',\n\t\t\t\t\theight: COUNT_SUMMARY_CIRCLE_SIZE,\n\t\t\t\t\tmaxWidth: COUNT_SUMMARY_CIRCLE_SIZE,\n\t\t\t\t\twidth: COUNT_SUMMARY_CIRCLE_SIZE,\n\t\t\t\t\t'& .MuiChip-label': {\n\t\t\t\t\t\tfontSize: theme.typography.body2.fontSize,\n\t\t\t\t\t\tfontWeight: 700,\n\t\t\t\t\t\tlineHeight: 1,\n\t\t\t\t\t\tpadding: 0,\n\t\t\t\t\t},\n\t\t\t\t} ) }\n\t\t\t/>\n\t\t\t<Typography color=\"text.secondary\" sx={ { textAlign: 'center' } } variant=\"caption\">\n\t\t\t\t{ label }\n\t\t\t</Typography>\n\t\t</Box>\n\t);\n}\n","import * as React from 'react';\nimport { ChevronRightIcon } from '@elementor/icons';\nimport { Box, LinearProgress, Rotate, Typography, useTheme } from '@elementor/ui';\n\nimport { onKeyboardClick } from '../utils/keyboard-click';\nimport { getScoreTier } from '../utils/score-thresholds';\n\ntype Props = {\n\tlabel: string;\n\tscore: number;\n\tonClick?: () => void;\n};\n\nexport default function ScoreBar( { label, score, onClick }: Props ) {\n\tconst isRtl = 'rtl' === useTheme().direction;\n\n\treturn (\n\t\t<Box\n\t\t\trole={ onClick ? 'button' : undefined }\n\t\t\ttabIndex={ onClick ? 0 : undefined }\n\t\t\tonClick={ onClick }\n\t\t\tonKeyDown={ onClick ? onKeyboardClick( onClick ) : undefined }\n\t\t\tsx={ {\n\t\t\t\tdisplay: 'flex',\n\t\t\t\talignItems: 'center',\n\t\t\t\tgap: 1,\n\t\t\t\tcursor: onClick ? 'pointer' : 'default',\n\t\t\t\toutline: 'none',\n\t\t\t\t'&:focus-visible': { outline: '2px solid', outlineColor: 'primary.main', borderRadius: 1 },\n\t\t\t\tpy: 0.5,\n\t\t\t} }\n\t\t>\n\t\t\t<Typography variant=\"body2\" sx={ { minWidth: 96 } }>\n\t\t\t\t{ label }\n\t\t\t</Typography>\n\t\t\t<LinearProgress\n\t\t\t\tvariant=\"determinate\"\n\t\t\t\tvalue={ score }\n\t\t\t\tcolor={ getScoreTier( score ).color }\n\t\t\t\tsx={ { flex: 1, height: 6, borderRadius: 4, bgcolor: 'action.disabledBackground' } }\n\t\t\t/>\n\t\t\t<Typography\n\t\t\t\tvariant=\"body2\"\n\t\t\t\tcolor=\"text.primary\"\n\t\t\t\tsx={ { minWidth: 24, textAlign: 'right', fontWeight: 900 } }\n\t\t\t>\n\t\t\t\t{ score }\n\t\t\t</Typography>\n\t\t\t{ onClick && (\n\t\t\t\t<Rotate in={ isRtl }>\n\t\t\t\t\t<ChevronRightIcon fontSize=\"small\" color=\"action\" />\n\t\t\t\t</Rotate>\n\t\t\t) }\n\t\t</Box>\n\t);\n}\n","import * as React from 'react';\nimport { Box, CircularProgress, Typography } from '@elementor/ui';\n\nimport { getScoreTier, type ScoreColor } from '../utils/score-thresholds';\n\ntype Props = {\n\tcolor?: ScoreColor;\n\tscore: number;\n};\n\nconst SCORE_CIRCLE_SIZE = 88;\nconst SCORE_CIRCLE_THICKNESS = 3;\n\nexport default function ScoreCircle( { color, score }: Props ) {\n\tconst progressColor = color ?? getScoreTier( score ).color;\n\n\treturn (\n\t\t<Box\n\t\t\trole=\"progressbar\"\n\t\t\taria-valuenow={ score }\n\t\t\taria-valuemin={ 0 }\n\t\t\taria-valuemax={ 100 }\n\t\t\tsx={ { position: 'relative', display: 'inline-flex' } }\n\t\t>\n\t\t\t<CircularProgress\n\t\t\t\tvariant=\"determinate\"\n\t\t\t\tvalue={ 100 }\n\t\t\t\tsize={ SCORE_CIRCLE_SIZE }\n\t\t\t\tthickness={ SCORE_CIRCLE_THICKNESS }\n\t\t\t\tsx={ { color: 'action.disabledBackground' } }\n\t\t\t/>\n\t\t\t<CircularProgress\n\t\t\t\tvariant=\"determinate\"\n\t\t\t\tvalue={ score }\n\t\t\t\tsize={ SCORE_CIRCLE_SIZE }\n\t\t\t\tthickness={ SCORE_CIRCLE_THICKNESS }\n\t\t\t\tcolor={ progressColor }\n\t\t\t\tsx={ { position: 'absolute', left: 0 } }\n\t\t\t/>\n\t\t\t<Box\n\t\t\t\tsx={ {\n\t\t\t\t\tposition: 'absolute',\n\t\t\t\t\tinset: 0,\n\t\t\t\t\tdisplay: 'flex',\n\t\t\t\t\talignItems: 'center',\n\t\t\t\t\tjustifyContent: 'center',\n\t\t\t\t} }\n\t\t\t>\n\t\t\t\t<Typography\n\t\t\t\t\tvariant=\"h4\"\n\t\t\t\t\tcomponent=\"span\"\n\t\t\t\t\tcolor=\"text.primary\"\n\t\t\t\t\tsx={ { fontWeight: 700, lineHeight: 1 } }\n\t\t\t\t>\n\t\t\t\t\t{ score }\n\t\t\t\t</Typography>\n\t\t\t</Box>\n\t\t</Box>\n\t);\n}\n","import { __ } from '@wordpress/i18n';\n\nimport { type Audit } from '../types';\n\nexport const audit: Audit = {\n\tid: 'audits/accessibility-policy',\n\ttitle: __( 'Accessibility policy', 'elementor' ),\n\tdescription: __(\n\t\t'An accessibility policy demonstrates your commitment to digital inclusion and may be legally required in some regions.',\n\t\t'elementor'\n\t),\n\tfixHint: __( 'Install the Ally plugin to add an accessibility policy to your website.', 'elementor' ),\n\tcategories: [ 'compliance' ],\n\tseverity: 'info',\n\tweight: 1,\n\tevaluate: ( ctx ) => {\n\t\tif ( ctx.pageContext.ally_plugin_active ) {\n\t\t\treturn { status: 'pass' };\n\t\t}\n\n\t\treturn {\n\t\t\tstatus: 'fail',\n\t\t\tviolations: [\n\t\t\t\t{\n\t\t\t\t\tauditId: audit.id,\n\t\t\t\t\tlabel: __( 'Ally plugin is not installed or active.', 'elementor' ),\n\t\t\t\t\texternalUrl: ctx.pageContext.ally_plugin_url,\n\t\t\t\t},\n\t\t\t],\n\t\t};\n\t},\n};\n","import { __ } from '@wordpress/i18n';\n\nimport { type Audit } from '../types';\n\nexport const audit: Audit = {\n\tid: 'audits/cookie-policy',\n\ttitle: __( 'Cookie policy', 'elementor' ),\n\tdescription: __(\n\t\t'A cookie policy is required by privacy regulations such as GDPR (EU) or CCPA (US) to inform visitors about tracking and data collection.',\n\t\t'elementor'\n\t),\n\tfixHint: __( 'Install the Cookiez plugin to add a cookie policy to your website.', 'elementor' ),\n\tcategories: [ 'compliance' ],\n\tseverity: 'info',\n\tweight: 1,\n\tevaluate: ( ctx ) => {\n\t\tif ( ctx.pageContext.cookiez_plugin_active ) {\n\t\t\treturn { status: 'pass' };\n\t\t}\n\n\t\treturn {\n\t\t\tstatus: 'fail',\n\t\t\tviolations: [\n\t\t\t\t{\n\t\t\t\t\tauditId: audit.id,\n\t\t\t\t\tlabel: __( 'Cookiez plugin is not installed or active.', 'elementor' ),\n\t\t\t\t\texternalUrl: ctx.pageContext.cookiez_plugin_url,\n\t\t\t\t},\n\t\t\t],\n\t\t};\n\t},\n};\n","import { __ } from '@wordpress/i18n';\n\nimport { type Audit, type AuditViolation } from '../types';\nimport { walkElements } from '../utils/walk';\n\nconst MAX_NESTING_DEPTH = 6;\n\nexport const audit: Audit = {\n\tid: 'audits/deep-nesting',\n\ttitle: __( 'Deep container nesting', 'elementor' ),\n\tdescription: __(\n\t\t'Container nesting exceeds the recommended depth. Deep DOM trees hurt rendering performance and readability.',\n\t\t'elementor'\n\t),\n\tfixHint: __( 'Flatten the layout by removing unnecessary wrapper containers.', 'elementor' ),\n\tcategories: [ 'performance', 'best-practices' ],\n\tseverity: 'warning',\n\tweight: 5,\n\tevaluate: ( ctx ) => {\n\t\tif ( ctx.elements.tree.length === 0 ) {\n\t\t\treturn { status: 'skipped', reason: __( 'No elements', 'elementor' ) };\n\t\t}\n\n\t\tconst violations: AuditViolation[] = [];\n\n\t\twalkElements( ctx.elements.tree, ( node, parents ) => {\n\t\t\tif ( node.elType !== 'container' ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst depth = parents.length + 1;\n\n\t\t\tif ( depth > MAX_NESTING_DEPTH ) {\n\t\t\t\tviolations.push( {\n\t\t\t\t\tauditId: audit.id,\n\t\t\t\t\telementId: node.id,\n\t\t\t\t\ttargetHint: 'element-settings',\n\t\t\t\t\tlabel: __( 'Container nesting is too deep.', 'elementor' ),\n\t\t\t\t} );\n\t\t\t}\n\t\t} );\n\n\t\treturn violations.length === 0 ? { status: 'pass' } : { status: 'fail', violations };\n\t},\n};\n","import { __ } from '@wordpress/i18n';\n\nimport { type Audit } from '../types';\n\nexport const audit: Audit = {\n\tid: 'audits/default-design-system',\n\ttitle: __( 'Default website kit', 'elementor' ),\n\tdescription: __(\n\t\t'Your website is using the default design system colors and fonts. Custom branding makes the website feel uniquely yours.',\n\t\t'elementor'\n\t),\n\tfixHint: __( 'Open Site Settings and customize your kit (colors, fonts, layout).', 'elementor' ),\n\tcategories: [ 'best-practices' ],\n\tseverity: 'info',\n\tweight: 1,\n\tevaluate: ( ctx ) => {\n\t\tif ( ! ctx.pageContext.kit_is_default_unchanged ) {\n\t\t\treturn { status: 'pass' };\n\t\t}\n\n\t\treturn {\n\t\t\tstatus: 'fail',\n\t\t\tviolations: [\n\t\t\t\t{\n\t\t\t\t\tauditId: audit.id,\n\t\t\t\t\tlabel: __( 'Kit appears unchanged from default.', 'elementor' ),\n\t\t\t\t\ttargetHint: 'site-settings',\n\t\t\t\t},\n\t\t\t],\n\t\t};\n\t},\n};\n","import { getWidgetsCache } from '@elementor/editor-elements';\nimport { __ } from '@wordpress/i18n';\n\nimport { type Audit, type AuditViolation } from '../types';\nimport { walkElements } from '../utils/walk';\n\nconst DEPRECATION_CONTROL_NAME = 'deprecation_message';\n\nexport const audit: Audit = {\n\tid: 'audits/deprecated-widgets',\n\ttitle: __( 'Deprecated widgets', 'elementor' ),\n\tdescription: __(\n\t\t'Deprecated widgets should not be used. For better capabilities use the recommended replacement.',\n\t\t'elementor'\n\t),\n\tfixHint: __( 'Replace each deprecated widget with the recommended new widget shown in its panel.', 'elementor' ),\n\tcategories: [ 'best-practices', 'performance' ],\n\tseverity: 'warning',\n\tweight: 7,\n\tevaluate: ( ctx ) => {\n\t\tconst widgetsCache = getWidgetsCache();\n\n\t\tif ( ! widgetsCache ) {\n\t\t\treturn { status: 'skipped', reason: 'widgets-cache-unavailable' };\n\t\t}\n\n\t\tconst violations: AuditViolation[] = [];\n\n\t\twalkElements( ctx.elements.tree, ( node ) => {\n\t\t\tif ( node.elType !== 'widget' ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst config = widgetsCache[ node.widgetType ?? '' ];\n\n\t\t\tif ( ! config?.controls ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst controls = config.controls as Record< string, unknown >;\n\t\t\tconst deprecationControl = controls[ DEPRECATION_CONTROL_NAME ];\n\n\t\t\tif ( ! deprecationControl || typeof deprecationControl !== 'object' ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tviolations.push( {\n\t\t\t\tauditId: audit.id,\n\t\t\t\telementId: node.id,\n\t\t\t\ttargetHint: 'element-settings',\n\t\t\t\tlabel: __( 'Using deprecated widget.', 'elementor' ),\n\t\t\t} );\n\t\t} );\n\n\t\treturn violations.length === 0 ? { status: 'pass' } : { status: 'fail', violations };\n\t},\n};\n","import { __ } from '@wordpress/i18n';\n\nimport { type Audit, type AuditViolation } from '../types';\nimport { walkElements } from '../utils/walk';\n\ntype HeadingControlDescriptor = {\n\tcontrol: string;\n\twhen?: Record< string, string | string[] >;\n\trequiresNonEmpty?: string;\n\trequiresAnyNonEmpty?: string[];\n\trepeat?: {\n\t\titems: string;\n\t\ttextField?: string;\n\t\titemWhen?: Record< string, string | string[] >;\n\t\ttagSource?: 'widget' | 'item';\n\t};\n};\n\ntype HeadingControlsRegistry = Record< string, HeadingControlDescriptor[] >;\n\ntype PageHeading = {\n\telementId: string;\n\tlevel: number;\n};\n\ntype Settings = Record< string, unknown >;\n\nconst HEADING_LEVELS = [ 'h1', 'h2', 'h3', 'h4', 'h5', 'h6' ] as const;\n\nconst HEADING_CONTROLS_REGISTRY: HeadingControlsRegistry = {\n\t// Core\n\theading: [ { control: 'header_size', requiresNonEmpty: 'title' } ],\n\t'e-heading': [ { control: 'tag', requiresNonEmpty: 'title' } ],\n\t'icon-box': [ { control: 'title_size', requiresNonEmpty: 'title_text' } ],\n\t'image-box': [ { control: 'title_size', requiresNonEmpty: 'title_text' } ],\n\tcounter: [ { control: 'title_tag', requiresNonEmpty: 'title' } ],\n\tprogress: [ { control: 'title_tag', when: { title_display: 'yes' }, requiresNonEmpty: 'title' } ],\n\taccordion: [ { control: 'title_html_tag', repeat: { items: 'tabs', textField: 'tab_title' } } ],\n\ttoggle: [ { control: 'title_html_tag', repeat: { items: 'tabs', textField: 'tab_title' } } ],\n\tdivider: [ { control: 'html_tag', when: { look: 'line_text' }, requiresNonEmpty: 'text' } ],\n\t'nested-accordion': [ { control: 'title_tag', repeat: { items: 'items', textField: 'item_title' } } ],\n\t'link-in-bio': [\n\t\t{ control: 'bio_heading_tag', requiresNonEmpty: 'bio_heading' },\n\t\t{ control: 'bio_title_tag', requiresNonEmpty: 'bio_title' },\n\t\t{ control: 'bio_about_tag', requiresNonEmpty: 'bio_about' },\n\t],\n\t// Pro — static / repeater\n\t'animated-headline': [\n\t\t{\n\t\t\tcontrol: 'tag',\n\t\t\trequiresAnyNonEmpty: [ 'before_text', 'highlighted_text', 'rotating_text', 'after_text' ],\n\t\t},\n\t],\n\t'author-box': [ { control: 'author_name_tag', requiresNonEmpty: 'author_name' } ],\n\t'call-to-action': [\n\t\t{ control: 'title_tag', requiresNonEmpty: 'title' },\n\t\t{ control: 'description_tag', requiresNonEmpty: 'description' },\n\t],\n\t'flip-box': [\n\t\t{ control: 'title_tag', requiresNonEmpty: 'title_text_a' },\n\t\t{ control: 'description_tag', requiresNonEmpty: 'description_text_a' },\n\t\t{ control: 'title_tag', requiresNonEmpty: 'title_text_b' },\n\t\t{ control: 'description_tag', requiresNonEmpty: 'description_text_b' },\n\t],\n\t'price-list': [\n\t\t{ control: 'title_tag', repeat: { items: 'price_list', textField: 'title' } },\n\t\t{ control: 'description_tag', repeat: { items: 'price_list', textField: 'item_description' } },\n\t],\n\t'price-table': [ { control: 'heading_tag', requiresNonEmpty: 'heading' } ],\n\tslides: [\n\t\t{ control: 'slides_title_tag', repeat: { items: 'slides', textField: 'heading' } },\n\t\t{ control: 'slides_description_tag', repeat: { items: 'slides', textField: 'description' } },\n\t],\n\t'table-of-contents': [ { control: 'html_tag', requiresNonEmpty: 'title' } ],\n\t'video-playlist': [\n\t\t{ control: 'playlist_title_tag', requiresNonEmpty: 'playlist_title' },\n\t\t{\n\t\t\tcontrol: 'section_html_tag',\n\t\t\trepeat: { items: 'tabs', tagSource: 'item', itemWhen: { type: 'section' }, textField: 'title' },\n\t\t},\n\t\t{\n\t\t\tcontrol: 'video_html_tag',\n\t\t\trepeat: {\n\t\t\t\titems: 'tabs',\n\t\t\t\ttagSource: 'item',\n\t\t\t\titemWhen: { type: [ 'youtube', 'vimeo', 'hosted' ] },\n\t\t\t\ttextField: 'title',\n\t\t\t},\n\t\t},\n\t],\n\tsitemap: [ { control: 'sitemap_title_tag', repeat: { items: 'sitemap_items', textField: 'sitemap_title' } } ],\n\t'loop-grid': [\n\t\t{\n\t\t\tcontrol: 'nothing_found_message_html_tag',\n\t\t\twhen: { enable_nothing_found_message: 'yes' },\n\t\t\trequiresNonEmpty: 'nothing_found_message_text',\n\t\t},\n\t],\n\tsearch: [\n\t\t{\n\t\t\tcontrol: 'nothing_found_message_html_tag',\n\t\t\twhen: { enable_nothing_found_message: 'yes' },\n\t\t\trequiresNonEmpty: 'nothing_found_message_text',\n\t\t},\n\t],\n\t// Pro — theme / Woo\n\tposts: [ { control: 'title_tag', when: { show_title: 'yes' } } ],\n\t'archive-posts': [ { control: 'title_tag', when: { show_title: 'yes' } } ],\n\tportfolio: [ { control: 'title_tag', when: { show_title: 'yes' } } ],\n\t'theme-post-title': [ { control: 'header_size' } ],\n\t'theme-page-title': [ { control: 'header_size' } ],\n\t'theme-archive-title': [ { control: 'header_size' } ],\n\t'theme-site-title': [ { control: 'header_size' } ],\n\t'woocommerce-product-title': [ { control: 'header_size' } ],\n};\n\nfunction isNonEmptyString( value: unknown ): boolean {\n\treturn typeof value === 'string' && value.trim() !== '';\n}\n\nfunction matchesWhen( settings: Settings, when?: Record< string, string | string[] > ): boolean {\n\tif ( ! when ) {\n\t\treturn true;\n\t}\n\n\treturn Object.entries( when ).every( ( [ key, expected ] ) => {\n\t\tconst actual = settings[ key ];\n\n\t\tif ( Array.isArray( expected ) ) {\n\t\t\treturn expected.includes( String( actual ) );\n\t\t}\n\n\t\treturn String( actual ) === expected;\n\t} );\n}\n\nfunction hasRequiredText( settings: Settings, key?: string ): boolean {\n\tif ( ! key ) {\n\t\treturn true;\n\t}\n\n\treturn isNonEmptyString( settings[ key ] );\n}\n\nfunction hasAnyRequiredText( settings: Settings, keys?: string[] ): boolean {\n\tif ( ! keys?.length ) {\n\t\treturn true;\n\t}\n\n\treturn keys.some( ( key ) => isNonEmptyString( settings[ key ] ) );\n}\n\nfunction parseHeadingLevel( raw: unknown ): number | null {\n\tif ( typeof raw !== 'string' ) {\n\t\treturn null;\n\t}\n\n\tconst idx = HEADING_LEVELS.indexOf( raw.toLowerCase() as ( typeof HEADING_LEVELS )[ number ] );\n\n\treturn idx >= 0 ? idx + 1 : null;\n}\n\nfunction getRepeaterRows( settings: Settings, key: string ): Settings[] {\n\tconst rows = settings[ key ];\n\n\treturn Array.isArray( rows ) ? ( rows as Settings[] ) : [];\n}\n\nfunction pushHeading( headings: PageHeading[], elementId: string, raw: unknown ): void {\n\tconst level = parseHeadingLevel( raw );\n\n\tif ( level !== null ) {\n\t\theadings.push( { elementId, level } );\n\t}\n}\n\nfunction extractHeadingsFromWidget( elementId: string, widgetType: string, settings: Settings ): PageHeading[] {\n\tconst descriptors = HEADING_CONTROLS_REGISTRY[ widgetType ];\n\n\tif ( ! descriptors ) {\n\t\treturn [];\n\t}\n\n\tconst headings: PageHeading[] = [];\n\n\tfor ( const descriptor of descriptors ) {\n\t\tif ( ! matchesWhen( settings, descriptor.when ) ) {\n\t\t\tcontinue;\n\t\t}\n\n\t\tif ( ! hasRequiredText( settings, descriptor.requiresNonEmpty ) ) {\n\t\t\tcontinue;\n\t\t}\n\n\t\tif ( ! hasAnyRequiredText( settings, descriptor.requiresAnyNonEmpty ) ) {\n\t\t\tcontinue;\n\t\t}\n\n\t\tif ( descriptor.repeat ) {\n\t\t\tconst { items, textField, itemWhen, tagSource = 'widget' } = descriptor.repeat;\n\n\t\t\tfor ( const row of getRepeaterRows( settings, items ) ) {\n\t\t\t\tif ( ! matchesWhen( row, itemWhen ) ) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\tif ( textField && ! hasRequiredText( row, textField ) ) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\tconst raw = tagSource === 'item' ? row[ descriptor.control ] : settings[ descriptor.control ];\n\n\t\t\t\tpushHeading( headings, elementId, raw );\n\t\t\t}\n\t\t} else {\n\t\t\tpushHeading( headings, elementId, settings[ descriptor.control ] );\n\t\t}\n\t}\n\n\treturn headings;\n}\n\nfunction extractPageHeadings( tree: Parameters< typeof walkElements >[ 0 ] ): PageHeading[] {\n\tconst headings: PageHeading[] = [];\n\n\twalkElements( tree, ( node ) => {\n\t\tif ( node.elType !== 'widget' || ! node.widgetType ) {\n\t\t\treturn;\n\t\t}\n\n\t\theadings.push( ...extractHeadingsFromWidget( node.id, node.widgetType, node.settings ) );\n\t} );\n\n\treturn headings;\n}\n\nexport const audit: Audit = {\n\tid: 'audits/heading-structure',\n\ttitle: __( 'Heading structure', 'elementor' ),\n\tdescription: __( 'Pages should have exactly one H1 and a non-skipping heading order.', 'elementor' ),\n\tfixHint: __( 'Ensure your page has one H1 and that heading levels do not skip (no H2 → H4).', 'elementor' ),\n\tcategories: [ 'seo', 'accessibility' ],\n\tseverity: 'error',\n\tweight: 10,\n\tevaluate: ( ctx ) => {\n\t\tif ( ctx.elements.tree.length === 0 ) {\n\t\t\treturn { status: 'skipped', reason: __( 'No elements', 'elementor' ) };\n\t\t}\n\n\t\tconst headings = extractPageHeadings( ctx.elements.tree );\n\n\t\tconst violations: AuditViolation[] = [];\n\n\t\tif ( headings.length === 0 ) {\n\t\t\tviolations.push( {\n\t\t\t\tauditId: audit.id,\n\t\t\t\tlabel: __( 'No headings found on the page.', 'elementor' ),\n\t\t\t} );\n\t\t} else {\n\t\t\tconst h1Count = headings.filter( ( h ) => h.level === 1 ).length;\n\n\t\t\tif ( h1Count === 0 ) {\n\t\t\t\tviolations.push( { auditId: audit.id, label: __( 'No H1 on the page.', 'elementor' ) } );\n\t\t\t}\n\n\t\t\tif ( h1Count > 1 ) {\n\t\t\t\theadings\n\t\t\t\t\t.filter( ( h ) => h.level === 1 )\n\t\t\t\t\t.slice( 1 )\n\t\t\t\t\t.forEach( ( h ) =>\n\t\t\t\t\t\tviolations.push( {\n\t\t\t\t\t\t\tauditId: audit.id,\n\t\t\t\t\t\t\telementId: h.elementId,\n\t\t\t\t\t\t\ttargetHint: 'element-settings',\n\t\t\t\t\t\t\tlabel: __( 'More than one H1 on the page.', 'elementor' ),\n\t\t\t\t\t\t} )\n\t\t\t\t\t);\n\t\t\t}\n\n\t\t\tfor ( let i = 1; i < headings.length; i++ ) {\n\t\t\t\tif ( headings[ i ].level - headings[ i - 1 ].level > 1 ) {\n\t\t\t\t\tviolations.push( {\n\t\t\t\t\t\tauditId: audit.id,\n\t\t\t\t\t\telementId: headings[ i ].elementId,\n\t\t\t\t\t\ttargetHint: 'element-settings',\n\t\t\t\t\t\tlabel: __( 'Heading level skipped.', 'elementor' ),\n\t\t\t\t\t} );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn violations.length === 0 ? { status: 'pass' } : { status: 'fail', violations };\n\t},\n};\n","import { __ } from '@wordpress/i18n';\n\nimport { type Audit, type AuditViolation } from '../types';\nimport { walkElements } from '../utils/walk';\n\nfunction isHiddenOnAllDevices( settings: Record< string, unknown > ): boolean {\n\treturn Boolean( settings.hide_desktop ) && Boolean( settings.hide_tablet ) && Boolean( settings.hide_mobile );\n}\n\nexport const audit: Audit = {\n\tid: 'audits/hidden-elements',\n\ttitle: __( 'Hidden elements', 'elementor' ),\n\tdescription: __(\n\t\t'Elements hidden on all devices simultaneously are effectively dead code in the page tree.',\n\t\t'elementor'\n\t),\n\tfixHint: __( 'Remove the element or make it visible on at least one device breakpoint.', 'elementor' ),\n\tcategories: [ 'best-practices', 'performance' ],\n\tseverity: 'info',\n\tweight: 3,\n\tevaluate: ( ctx ) => {\n\t\tif ( ctx.elements.tree.length === 0 ) {\n\t\t\treturn { status: 'skipped', reason: __( 'No elements', 'elementor' ) };\n\t\t}\n\n\t\tconst violations: AuditViolation[] = [];\n\n\t\twalkElements( ctx.elements.tree, ( node ) => {\n\t\t\tif ( isHiddenOnAllDevices( node.settings ) ) {\n\t\t\t\tviolations.push( {\n\t\t\t\t\tauditId: audit.id,\n\t\t\t\t\telementId: node.id,\n\t\t\t\t\ttargetHint: 'element-settings',\n\t\t\t\t\tlabel: __( 'Element is hidden on all devices.', 'elementor' ),\n\t\t\t\t} );\n\t\t\t}\n\t\t} );\n\n\t\treturn violations.length === 0 ? { status: 'pass' } : { status: 'fail', violations };\n\t},\n};\n","import { __ } from '@wordpress/i18n';\n\nimport { type Audit, type AuditViolation } from '../types';\nimport { hasMeaningfulAlt, isImageSourcePresent } from '../utils/image-alt';\nimport { hasPageImages, walkImageLikeSources } from '../utils/image-like-sources';\n\nexport const audit: Audit = {\n\tid: 'audits/images-alt-text',\n\ttitle: __( 'Images alt text', 'elementor' ),\n\tdescription: __( 'Every image needs a meaningful alt attribute for screen readers and image-search.', 'elementor' ),\n\tfixHint: __( \"Open the image's settings and add an Alt Text describing the image.\", 'elementor' ),\n\tcategories: [ 'seo', 'accessibility' ],\n\tseverity: 'error',\n\tweight: 10,\n\tevaluate: ( ctx ) => {\n\t\tif ( ! hasPageImages( ctx.elements.tree ) ) {\n\t\t\treturn { status: 'skipped', reason: __( 'No images', 'elementor' ) };\n\t\t}\n\n\t\tconst violations: AuditViolation[] = [];\n\t\tconst failedWidgetIds = new Set< string >();\n\t\tlet missingAltImageCount = 0;\n\n\t\twalkImageLikeSources( ctx.elements.tree, ( { node, media } ) => {\n\t\t\tif ( ! isImageSourcePresent( media ) || hasMeaningfulAlt( media, ctx.pageContext ) ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tmissingAltImageCount++;\n\n\t\t\tif ( ! failedWidgetIds.has( node.id ) ) {\n\t\t\t\tfailedWidgetIds.add( node.id );\n\t\t\t\tviolations.push( {\n\t\t\t\t\tauditId: audit.id,\n\t\t\t\t\telementId: node.id,\n\t\t\t\t\ttargetHint: 'element-settings',\n\t\t\t\t\tlabel: __( 'Image is missing alt text.', 'elementor' ),\n\t\t\t\t\texternalUrl: ctx.pageContext.ally_plugin_url,\n\t\t\t\t} );\n\t\t\t}\n\t\t} );\n\n\t\treturn violations.length === 0\n\t\t\t? { status: 'pass' }\n\t\t\t: { status: 'fail', violations, metadata: { missingAltImageCount } };\n\t},\n};\n","import { type PageContextResponse } from '../types';\nimport { type ImageLikeMedia } from './image-like-sources';\n\nexport function hasMeaningfulAlt( media: ImageLikeMedia, pageContext: PageContextResponse ): boolean {\n\tif ( ! media.id && ! media.url ) {\n\t\treturn true;\n\t}\n\n\tif ( media.id ) {\n\t\tconst alt = pageContext.image_sizes[ media.id ]?.alt ?? '';\n\t\treturn alt.trim().length > 0;\n\t}\n\n\treturn ( media.alt ?? '' ).trim().length > 0;\n}\n\nexport function isImageSourcePresent( media: ImageLikeMedia ): boolean {\n\treturn Boolean( media.id || media.url );\n}\n","import { __, sprintf } from '@wordpress/i18n';\n\nimport { type Audit, type AuditViolation } from '../types';\nimport { hasPageImages, walkImageLikeSources } from '../utils/image-like-sources';\n\nconst SIZE_THRESHOLD_BYTES = 500 * 1024;\nconst BYTES_PER_KB = 1024;\n\nexport const audit: Audit = {\n\tid: 'audits/images-too-large',\n\ttitle: __( 'Oversized images', 'elementor' ),\n\tdescription: __( 'Large image files slow down the page.', 'elementor' ),\n\tfixHint: __( 'Replace the image with a smaller version or enable image optimization.', 'elementor' ),\n\tcategories: [ 'performance' ],\n\tseverity: 'warning',\n\tweight: 7,\n\tevaluate: ( ctx ) => {\n\t\tif ( ! hasPageImages( ctx.elements.tree ) ) {\n\t\t\treturn { status: 'skipped', reason: __( 'No images', 'elementor' ) };\n\t\t}\n\n\t\tconst widgetMaxKb = new Map< string, number >();\n\t\tlet oversizedImageCount = 0;\n\n\t\twalkImageLikeSources( ctx.elements.tree, ( { node, media } ) => {\n\t\t\tconst id = media.id;\n\n\t\t\tif ( ! id ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst size = ctx.pageContext.image_sizes[ id ];\n\n\t\t\tif ( ! size || size.filesize_bytes <= SIZE_THRESHOLD_BYTES ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\toversizedImageCount++;\n\n\t\t\tconst kb = Math.round( size.filesize_bytes / BYTES_PER_KB );\n\t\t\tconst currentMax = widgetMaxKb.get( node.id ) ?? 0;\n\t\t\twidgetMaxKb.set( node.id, Math.max( currentMax, kb ) );\n\t\t} );\n\n\t\tconst violations: AuditViolation[] = Array.from( widgetMaxKb.entries() ).map( ( [ elementId, kb ] ) => ( {\n\t\t\tauditId: audit.id,\n\t\t\telementId,\n\t\t\ttargetHint: 'element-settings' as const,\n\t\t\tlabel: sprintf(\n\t\t\t\t/* translators: %d is the image file size in kilobytes. */\n\t\t\t\t__( 'Image is %d KB (over 500 KB).', 'elementor' ),\n\t\t\t\tkb\n\t\t\t),\n\t\t\texternalUrl: ctx.pageContext.image_optimization_plugin_url,\n\t\t} ) );\n\n\t\treturn violations.length === 0\n\t\t\t? { status: 'pass' }\n\t\t\t: { status: 'fail', violations, metadata: { oversizedImageCount } };\n\t},\n};\n","import { __ } from '@wordpress/i18n';\n\nimport { type Audit, type AuditViolation } from '../types';\nimport { walkElements } from '../utils/walk';\n\nfunction isBoxed( settings: Record< string, unknown > ): boolean {\n\treturn settings.content_width === 'boxed';\n}\n\nexport const audit: Audit = {\n\tid: 'audits/nested-boxed-containers',\n\ttitle: __( 'Boxed container nested inside a boxed parent', 'elementor' ),\n\tdescription: __( 'An inner container does not need to be boxed when its parent already is.', 'elementor' ),\n\tfixHint: __( \"Change the inner container's content width to Full Width.\", 'elementor' ),\n\tcategories: [ 'best-practices', 'performance' ],\n\tseverity: 'info',\n\tweight: 5,\n\tevaluate: ( ctx ) => {\n\t\tif ( ctx.elements.tree.length === 0 ) {\n\t\t\treturn { status: 'skipped', reason: __( 'No elements', 'elementor' ) };\n\t\t}\n\n\t\tconst violations: AuditViolation[] = [];\n\n\t\twalkElements( ctx.elements.tree, ( node, parents ) => {\n\t\t\tif ( node.elType !== 'container' || ! isBoxed( node.settings ) ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst nearestContainerAncestor = [ ...parents ].reverse().find( ( p ) => p.elType === 'container' );\n\n\t\t\tif ( nearestContainerAncestor && isBoxed( nearestContainerAncestor.settings ) ) {\n\t\t\t\tviolations.push( {\n\t\t\t\t\tauditId: audit.id,\n\t\t\t\t\telementId: node.id,\n\t\t\t\t\ttargetHint: 'element-settings',\n\t\t\t\t\tlabel: __( 'Nested boxed container.', 'elementor' ),\n\t\t\t\t} );\n\t\t\t}\n\t\t} );\n\n\t\treturn violations.length === 0 ? { status: 'pass' } : { status: 'fail', violations };\n\t},\n};\n","import { __ } from '@wordpress/i18n';\n\nimport { type Audit } from '../types';\n\nexport const audit: Audit = {\n\tid: 'audits/page-excerpt',\n\ttitle: __( 'Page excerpt', 'elementor' ),\n\tdescription: __( 'A descriptive excerpt helps search engines and previews summarize the page.', 'elementor' ),\n\tfixHint: __( 'Open Page Settings and write a short excerpt.', 'elementor' ),\n\tcategories: [ 'seo' ],\n\tseverity: 'warning',\n\tweight: 5,\n\tevaluate: ( ctx ) => {\n\t\tif ( ctx.pageContext.post_excerpt ) {\n\t\t\treturn { status: 'pass' };\n\t\t}\n\n\t\treturn {\n\t\t\tstatus: 'fail',\n\t\t\tviolations: [\n\t\t\t\t{\n\t\t\t\t\tauditId: audit.id,\n\t\t\t\t\tlabel: __( 'Page has no excerpt.', 'elementor' ),\n\t\t\t\t\ttargetHint: 'page-settings',\n\t\t\t\t\tangieFix: true,\n\t\t\t\t},\n\t\t\t],\n\t\t};\n\t},\n};\n","import { __ } from '@wordpress/i18n';\n\nimport { type Audit } from '../types';\n\nexport const audit: Audit = {\n\tid: 'audits/page-featured-image',\n\ttitle: __( 'Page featured image', 'elementor' ),\n\tdescription: __( 'Featured images are used by social shares and many themes for hero visuals.', 'elementor' ),\n\tfixHint: __( 'Open Page Settings and set a featured image.', 'elementor' ),\n\tcategories: [ 'seo' ],\n\tseverity: 'info',\n\tweight: 5,\n\tevaluate: ( ctx ) => {\n\t\tif ( ctx.pageContext.featured_image_id ) {\n\t\t\treturn { status: 'pass' };\n\t\t}\n\n\t\treturn {\n\t\t\tstatus: 'fail',\n\t\t\tviolations: [\n\t\t\t\t{\n\t\t\t\t\tauditId: audit.id,\n\t\t\t\t\tlabel: __( 'No featured image set.', 'elementor' ),\n\t\t\t\t\ttargetHint: 'page-settings',\n\t\t\t\t},\n\t\t\t],\n\t\t};\n\t},\n};\n","import { __ } from '@wordpress/i18n';\n\nimport { type Audit } from '../types';\n\nconst MAX_TITLE_LENGTH = 60;\n\nexport const audit: Audit = {\n\tid: 'audits/page-title',\n\ttitle: __( 'Page title', 'elementor' ),\n\tdescription: __( 'Pages need a clear title for SEO and screen-reader navigation.', 'elementor' ),\n\tfixHint: __( 'Open Page Settings and add a title.', 'elementor' ),\n\tcategories: [ 'seo' ],\n\tseverity: 'error',\n\tweight: 10,\n\tevaluate: ( ctx ) => {\n\t\tconst title = ctx.pageContext.post_title;\n\n\t\tif ( ! title ) {\n\t\t\treturn {\n\t\t\t\tstatus: 'fail',\n\t\t\t\tviolations: [\n\t\t\t\t\t{\n\t\t\t\t\t\tauditId: audit.id,\n\t\t\t\t\t\tlabel: __( 'Page has no title.', 'elementor' ),\n\t\t\t\t\t\ttargetHint: 'page-settings',\n\t\t\t\t\t\tangieFix: true,\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t};\n\t\t}\n\n\t\tif ( title.length > MAX_TITLE_LENGTH ) {\n\t\t\treturn {\n\t\t\t\tstatus: 'fail',\n\t\t\t\tviolations: [\n\t\t\t\t\t{\n\t\t\t\t\t\tauditId: audit.id,\n\t\t\t\t\t\tlabel: __( 'Page title is too long.', 'elementor' ),\n\t\t\t\t\t\ttargetHint: 'page-settings',\n\t\t\t\t\t\tangieFix: true,\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t};\n\t\t}\n\n\t\treturn { status: 'pass' };\n\t},\n};\n","import { __, sprintf } from '@wordpress/i18n';\n\nimport { type Audit, type AuditViolation } from '../types';\nimport { collectHardcodedColors } from '../utils/collect-hardcoded-colors';\nimport { findMatchingGlobalByValue } from '../utils/match-global-by-value';\nimport { walkElements } from '../utils/walk';\n\nexport const audit: Audit = {\n\tid: 'audits/prefer-global-colors',\n\ttitle: __( 'Prefer global colors', 'elementor' ),\n\tdescription: __( 'Global colors make the design consistent and easy to update site-wide.', 'elementor' ),\n\tfixHint: __( 'Replace the hard-coded value with the matching global color.', 'elementor' ),\n\tcategories: [ 'best-practices' ],\n\tseverity: 'info',\n\tweight: 3,\n\tevaluate: ( ctx ) => {\n\t\tif ( ctx.elements.tree.length === 0 ) {\n\t\t\treturn { status: 'skipped', reason: __( 'No elements', 'elementor' ) };\n\t\t}\n\n\t\tif ( ctx.kit.globals.colors.length === 0 ) {\n\t\t\treturn { status: 'skipped', reason: __( 'No global colors', 'elementor' ) };\n\t\t}\n\n\t\tconst violations: AuditViolation[] = [];\n\n\t\twalkElements( ctx.elements.tree, ( node ) => {\n\t\t\tfor ( const { value } of collectHardcodedColors( node.settings ) ) {\n\t\t\t\tconst global = findMatchingGlobalByValue( value, ctx.kit.globals.colors );\n\n\t\t\t\tif ( ! global ) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\tviolations.push( {\n\t\t\t\t\tauditId: audit.id,\n\t\t\t\t\telementId: node.id,\n\t\t\t\t\ttargetHint: 'element-settings',\n\t\t\t\t\tangieFix: true,\n\t\t\t\t\tlabel: sprintf(\n\t\t\t\t\t\t/* translators: 1: hard-coded color value, 2: global color title. */\n\t\t\t\t\t\t__( 'replace \"%1$s\" with \"%2$s\" global color', 'elementor' ),\n\t\t\t\t\t\tvalue,\n\t\t\t\t\t\tglobal.title\n\t\t\t\t\t),\n\t\t\t\t} );\n\t\t\t}\n\t\t} );\n\n\t\treturn violations.length === 0 ? { status: 'pass' } : { status: 'fail', violations };\n\t},\n};\n","const RESERVED_SETTING_KEYS = new Set( [ '__globals__', '__dynamic__' ] );\nconst REPEATER_ROW_ID_KEY = '_id';\n\nconst HEX_COLOR_PATTERN = /^#[0-9a-f]{3,8}$/i;\nconst RGB_COLOR_PATTERN = /^rgba?\\(/i;\n\nexport type HardcodedColor = {\n\tpath: string;\n\tvalue: string;\n};\n\nfunction isGlobalColorReference( value: string ): boolean {\n\treturn value.startsWith( 'globals/' );\n}\n\nfunction isHardcodedColorCandidate( value: string ): boolean {\n\tconst trimmed = value.trim();\n\n\treturn HEX_COLOR_PATTERN.test( trimmed ) || RGB_COLOR_PATTERN.test( trimmed );\n}\n\nfunction formatPath( prefix: string, key: string ): string {\n\treturn prefix ? `${ prefix }.${ key }` : key;\n}\n\nfunction formatArrayPath( prefix: string, index: number ): string {\n\treturn `${ prefix }[${ index }]`;\n}\n\nexport function collectHardcodedColors( settings: Record< string, unknown >, pathPrefix = '' ): HardcodedColor[] {\n\tconst linkedGlobals = ( settings.__globals__ ?? {} ) as Record< string, string >;\n\tconst results: HardcodedColor[] = [];\n\n\tfor ( const [ key, value ] of Object.entries( settings ) ) {\n\t\tif ( RESERVED_SETTING_KEYS.has( key ) || key === REPEATER_ROW_ID_KEY ) {\n\t\t\tcontinue;\n\t\t}\n\n\t\tif ( linkedGlobals[ key ] ) {\n\t\t\tcontinue;\n\t\t}\n\n\t\tif ( typeof value === 'string' ) {\n\t\t\tif ( ! isGlobalColorReference( value ) && isHardcodedColorCandidate( value ) ) {\n\t\t\t\tresults.push( { path: formatPath( pathPrefix, key ), value } );\n\t\t\t}\n\t\t\tcontinue;\n\t\t}\n\n\t\tif ( Array.isArray( value ) ) {\n\t\t\tconst arrayPath = formatPath( pathPrefix, key );\n\n\t\t\tvalue.forEach( ( item, index ) => {\n\t\t\t\tif ( item && typeof item === 'object' && ! Array.isArray( item ) ) {\n\t\t\t\t\tresults.push(\n\t\t\t\t\t\t...collectHardcodedColors(\n\t\t\t\t\t\t\titem as Record< string, unknown >,\n\t\t\t\t\t\t\tformatArrayPath( arrayPath, index )\n\t\t\t\t\t\t)\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t} );\n\t\t\tcontinue;\n\t\t}\n\n\t\tif ( value && typeof value === 'object' ) {\n\t\t\tresults.push(\n\t\t\t\t...collectHardcodedColors( value as Record< string, unknown >, formatPath( pathPrefix, key ) )\n\t\t\t);\n\t\t}\n\t}\n\n\treturn results;\n}\n","export function findMatchingGlobalByValue< T extends { value: string } >( value: string, globals: T[] ): T | null {\n\tconst trimmed = value.trim();\n\n\treturn globals.find( ( global ) => global.value === trimmed ) ?? null;\n}\n","import { __, sprintf } from '@wordpress/i18n';\n\nimport { type Audit, type AuditViolation } from '../types';\nimport { collectHardcodedFonts } from '../utils/collect-hardcoded-fonts';\nimport { findMatchingGlobalByValue } from '../utils/match-global-by-value';\nimport { walkElements } from '../utils/walk';\n\nexport const audit: Audit = {\n\tid: 'audits/prefer-global-fonts',\n\ttitle: __( 'Prefer global fonts', 'elementor' ),\n\tdescription: __( 'Global fonts make the design consistent and easy to update site-wide.', 'elementor' ),\n\tfixHint: __( 'Replace the hard-coded value with the matching global font.', 'elementor' ),\n\tcategories: [ 'best-practices', 'performance' ],\n\tseverity: 'info',\n\tweight: 3,\n\tevaluate: ( ctx ) => {\n\t\tif ( ctx.elements.tree.length === 0 ) {\n\t\t\treturn { status: 'skipped', reason: __( 'No elements', 'elementor' ) };\n\t\t}\n\n\t\tif ( ctx.kit.globals.fonts.length === 0 ) {\n\t\t\treturn { status: 'skipped', reason: __( 'No global fonts', 'elementor' ) };\n\t\t}\n\n\t\tconst violations: AuditViolation[] = [];\n\n\t\twalkElements( ctx.elements.tree, ( node ) => {\n\t\t\tfor ( const { value } of collectHardcodedFonts( node.settings ) ) {\n\t\t\t\tconst global = findMatchingGlobalByValue( value, ctx.kit.globals.fonts );\n\n\t\t\t\tif ( ! global ) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\tviolations.push( {\n\t\t\t\t\tauditId: audit.id,\n\t\t\t\t\telementId: node.id,\n\t\t\t\t\ttargetHint: 'element-settings',\n\t\t\t\t\tlabel: sprintf(\n\t\t\t\t\t\t/* translators: %s: global font title. */\n\t\t\t\t\t\t__( 'replace hardcoded typography with \"%s\" global font', 'elementor' ),\n\t\t\t\t\t\tglobal.title\n\t\t\t\t\t),\n\t\t\t\t} );\n\t\t\t}\n\t\t} );\n\n\t\treturn violations.length === 0 ? { status: 'pass' } : { status: 'fail', violations };\n\t},\n};\n","const RESERVED_SETTING_KEYS = new Set( [ '__globals__', '__dynamic__' ] );\nconst REPEATER_ROW_ID_KEY = '_id';\nconst FONT_FAMILY_KEY_PATTERN = /font_family/;\n\nexport type HardcodedFont = {\n\tpath: string;\n\tvalue: string;\n};\n\nfunction isGlobalFontReference( value: string ): boolean {\n\treturn value.startsWith( 'globals/' );\n}\n\nfunction isHardcodedFontCandidate( key: string, value: string ): boolean {\n\treturn FONT_FAMILY_KEY_PATTERN.test( key ) && value.trim().length > 0;\n}\n\nfunction formatPath( prefix: string, key: string ): string {\n\treturn prefix ? `${ prefix }.${ key }` : key;\n}\n\nfunction formatArrayPath( prefix: string, index: number ): string {\n\treturn `${ prefix }[${ index }]`;\n}\n\nexport function collectHardcodedFonts( settings: Record< string, unknown >, pathPrefix = '' ): HardcodedFont[] {\n\tconst linkedGlobals = ( settings.__globals__ ?? {} ) as Record< string, string >;\n\tconst results: HardcodedFont[] = [];\n\n\tfor ( const [ key, value ] of Object.entries( settings ) ) {\n\t\tif ( RESERVED_SETTING_KEYS.has( key ) || key === REPEATER_ROW_ID_KEY ) {\n\t\t\tcontinue;\n\t\t}\n\n\t\tif ( linkedGlobals[ key ] ) {\n\t\t\tcontinue;\n\t\t}\n\n\t\tif ( typeof value === 'string' ) {\n\t\t\tif ( ! isGlobalFontReference( value ) && isHardcodedFontCandidate( key, value ) ) {\n\t\t\t\tresults.push( { path: formatPath( pathPrefix, key ), value } );\n\t\t\t}\n\t\t\tcontinue;\n\t\t}\n\n\t\tif ( Array.isArray( value ) ) {\n\t\t\tconst arrayPath = formatPath( pathPrefix, key );\n\n\t\t\tvalue.forEach( ( item, index ) => {\n\t\t\t\tif ( item && typeof item === 'object' && ! Array.isArray( item ) ) {\n\t\t\t\t\tresults.push(\n\t\t\t\t\t\t...collectHardcodedFonts(\n\t\t\t\t\t\t\titem as Record< string, unknown >,\n\t\t\t\t\t\t\tformatArrayPath( arrayPath, index )\n\t\t\t\t\t\t)\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t} );\n\t\t\tcontinue;\n\t\t}\n\n\t\tif ( value && typeof value === 'object' ) {\n\t\t\tresults.push(\n\t\t\t\t...collectHardcodedFonts( value as Record< string, unknown >, formatPath( pathPrefix, key ) )\n\t\t\t);\n\t\t}\n\t}\n\n\treturn results;\n}\n","import { __ } from '@wordpress/i18n';\n\nimport { type Audit } from '../types';\n\nexport const audit: Audit = {\n\tid: 'audits/privacy-policy',\n\ttitle: __( 'Privacy policy', 'elementor' ),\n\tdescription: __(\n\t\t'A privacy policy page is required by privacy regulations such as GDPR (EU) and CCPA (US).',\n\t\t'elementor'\n\t),\n\tfixHint: __(\n\t\t'Go to Settings > Privacy in the WordPress admin and assign a published privacy policy page.',\n\t\t'elementor'\n\t),\n\tcategories: [ 'compliance' ],\n\tseverity: 'info',\n\tweight: 1,\n\tevaluate: ( ctx ) => {\n\t\tif ( ctx.pageContext.privacy_policy_url ) {\n\t\t\treturn { status: 'pass' };\n\t\t}\n\n\t\treturn {\n\t\t\tstatus: 'fail',\n\t\t\tviolations: [\n\t\t\t\t{\n\t\t\t\t\tauditId: audit.id,\n\t\t\t\t\tlabel: __( 'No privacy policy page is set.', 'elementor' ),\n\t\t\t\t\texternalUrl: ctx.pageContext.privacy_settings_url,\n\t\t\t\t},\n\t\t\t],\n\t\t};\n\t},\n};\n","import { __ } from '@wordpress/i18n';\n\nimport { type Audit } from '../types';\n\nexport const audit: Audit = {\n\tid: 'audits/robots-noindex',\n\ttitle: __( 'Search engine visibility', 'elementor' ),\n\tdescription: __(\n\t\t'When search engine visibility is checked in WordPress Settings -> Reading -> Search Engine Visibility, search engines are discouraged from indexing the website.',\n\t\t'elementor'\n\t),\n\tfixHint: __(\n\t\t'Go to Settings → Reading in the WordPress admin and uncheck \"Discourage search engines from indexing this site\" when the website should be indexed.',\n\t\t'elementor'\n\t),\n\tcategories: [ 'seo' ],\n\tseverity: 'error',\n\tweight: 7,\n\tevaluate: ( ctx ) => {\n\t\tif ( ! ctx.pageContext.is_noindex ) {\n\t\t\treturn { status: 'pass' };\n\t\t}\n\n\t\treturn {\n\t\t\tstatus: 'fail',\n\t\t\tviolations: [\n\t\t\t\t{\n\t\t\t\t\tauditId: audit.id,\n\t\t\t\t\tlabel: __( 'Search engines are discouraged from indexing this website.', 'elementor' ),\n\t\t\t\t\texternalUrl: ctx.pageContext.reading_settings_url,\n\t\t\t\t},\n\t\t\t],\n\t\t};\n\t},\n};\n","import { __ } from '@wordpress/i18n';\n\nimport { type Audit, type AuditViolation } from '../types';\nimport { walkElements } from '../utils/walk';\n\nexport const audit: Audit = {\n\tid: 'audits/sections-and-columns',\n\ttitle: __( 'Sections and columns', 'elementor' ),\n\tdescription: __(\n\t\t'Sections and columns are legacy elements. Containers render fewer DOM nodes and are more flexible.',\n\t\t'elementor'\n\t),\n\tfixHint: __( 'Use the Container Converter to replace each section/column with a container.', 'elementor' ),\n\tcategories: [ 'best-practices', 'performance' ],\n\tseverity: 'warning',\n\tweight: 7,\n\tevaluate: ( ctx ) => {\n\t\tif ( ctx.elements.tree.length === 0 ) {\n\t\t\treturn { status: 'skipped', reason: __( 'No elements', 'elementor' ) };\n\t\t}\n\n\t\tconst violations: AuditViolation[] = [];\n\n\t\twalkElements( ctx.elements.tree, ( node ) => {\n\t\t\tif ( node.elType === 'section' || node.elType === 'column' ) {\n\t\t\t\tviolations.push( {\n\t\t\t\t\tauditId: audit.id,\n\t\t\t\t\telementId: node.id,\n\t\t\t\t\tlabel:\n\t\t\t\t\t\tnode.elType === 'section'\n\t\t\t\t\t\t\t? __( 'Section element', 'elementor' )\n\t\t\t\t\t\t\t: __( 'Column element', 'elementor' ),\n\t\t\t\t} );\n\t\t\t}\n\t\t} );\n\n\t\treturn violations.length === 0 ? { status: 'pass' } : { status: 'fail', violations };\n\t},\n};\n","import { __ } from '@wordpress/i18n';\n\nimport { type Audit, type AuditViolation } from '../types';\n\nexport const audit: Audit = {\n\tid: 'audits/site-identity',\n\ttitle: __( 'Site identity', 'elementor' ),\n\tdescription: __(\n\t\t'Site name, description, logo, and favicon establish your brand and appear in search results and browser tabs.',\n\t\t'elementor'\n\t),\n\tfixHint: __( 'Open Site Settings → Site Identity and complete all the missing fields.', 'elementor' ),\n\tcategories: [ 'best-practices', 'seo' ],\n\tseverity: 'info',\n\tweight: 7,\n\tevaluate: ( ctx ) => {\n\t\tconst { site_identity: identity } = ctx.pageContext;\n\t\tconst violations: AuditViolation[] = [];\n\n\t\tif ( ! identity.site_name_set ) {\n\t\t\tviolations.push( {\n\t\t\t\tauditId: audit.id,\n\t\t\t\tlabel: __( 'Site name is missing or still uses the default.', 'elementor' ),\n\t\t\t\ttargetHint: 'site-identity-settings',\n\t\t\t} );\n\t\t}\n\n\t\tif ( ! identity.site_description_set ) {\n\t\t\tviolations.push( {\n\t\t\t\tauditId: audit.id,\n\t\t\t\tlabel: __( 'Site description is missing or still uses the default.', 'elementor' ),\n\t\t\t\ttargetHint: 'site-identity-settings',\n\t\t\t\tangieFix: true,\n\t\t\t} );\n\t\t}\n\n\t\tif ( ! identity.site_logo_set ) {\n\t\t\tviolations.push( {\n\t\t\t\tauditId: audit.id,\n\t\t\t\tlabel: __( 'Site logo is not set.', 'elementor' ),\n\t\t\t\ttargetHint: 'site-identity-settings',\n\t\t\t} );\n\t\t}\n\n\t\tif ( ! identity.site_favicon_set ) {\n\t\t\tviolations.push( {\n\t\t\t\tauditId: audit.id,\n\t\t\t\tlabel: __( 'Site favicon is not set.', 'elementor' ),\n\t\t\t\ttargetHint: 'site-identity-settings',\n\t\t\t} );\n\t\t}\n\n\t\tif ( violations.length === 0 ) {\n\t\t\treturn { status: 'pass' };\n\t\t}\n\n\t\treturn {\n\t\t\tstatus: 'fail',\n\t\t\tviolations,\n\t\t};\n\t},\n};\n","import { __ } from '@wordpress/i18n';\n\nimport { type Audit } from '../types';\nimport { walkElements } from '../utils/walk';\n\nconst WIDGET_COUNT_THRESHOLD = 100;\n\nexport const audit: Audit = {\n\tid: 'audits/too-many-widgets',\n\ttitle: __( 'Too many widgets', 'elementor' ),\n\tdescription: __( 'Excessive DOM size caused by too many widgets degrades rendering performance.', 'elementor' ),\n\tfixHint: __( 'Reduce the number of widgets on the page by removing or combining elements.', 'elementor' ),\n\tcategories: [ 'best-practices', 'performance' ],\n\tseverity: 'warning',\n\tweight: 5,\n\tevaluate: ( ctx ) => {\n\t\tif ( ctx.elements.tree.length === 0 ) {\n\t\t\treturn { status: 'skipped', reason: __( 'No elements', 'elementor' ) };\n\t\t}\n\n\t\tlet widgetCount = 0;\n\n\t\twalkElements( ctx.elements.tree, ( node ) => {\n\t\t\tif ( node.elType === 'widget' ) {\n\t\t\t\twidgetCount++;\n\t\t\t}\n\t\t} );\n\n\t\tif ( widgetCount <= WIDGET_COUNT_THRESHOLD ) {\n\t\t\treturn { status: 'pass' };\n\t\t}\n\n\t\treturn {\n\t\t\tstatus: 'fail',\n\t\t\tviolations: [\n\t\t\t\t{\n\t\t\t\t\tauditId: audit.id,\n\t\t\t\t\tlabel: __( 'Page has too many widgets.', 'elementor' ),\n\t\t\t\t},\n\t\t\t],\n\t\t};\n\t},\n};\n","import * as accessibilityPolicy from './audits/accessibility-policy';\nimport * as cookiePolicy from './audits/cookie-policy';\nimport * as deepNesting from './audits/deep-nesting';\nimport * as defaultDesignSystem from './audits/default-design-system';\nimport * as deprecatedWidgets from './audits/deprecated-widgets';\nimport * as headingStructure from './audits/heading-structure';\nimport * as hiddenElements from './audits/hidden-elements';\nimport * as imagesAltText from './audits/images-alt-text';\nimport * as imagesTooLarge from './audits/images-too-large';\nimport * as nestedBoxedContainers from './audits/nested-boxed-containers';\nimport * as pageExcerpt from './audits/page-excerpt';\nimport * as pageFeaturedImage from './audits/page-featured-image';\nimport * as pageTitle from './audits/page-title';\nimport * as preferGlobalColors from './audits/prefer-global-colors';\nimport * as preferGlobalFonts from './audits/prefer-global-fonts';\nimport * as privacyPolicy from './audits/privacy-policy';\nimport * as robotsNoindex from './audits/robots-noindex';\nimport * as sectionsAndColumns from './audits/sections-and-columns';\nimport * as siteIdentity from './audits/site-identity';\nimport * as tooManyWidgets from './audits/too-many-widgets';\nimport { registerAudit } from './registry';\nimport { type Audit } from './types';\n\nconst AUDITS: Audit[] = [\n\tpageTitle.audit,\n\tpageExcerpt.audit,\n\tpageFeaturedImage.audit,\n\n\thiddenElements.audit,\n\tdeprecatedWidgets.audit,\n\ttooManyWidgets.audit,\n\tsectionsAndColumns.audit,\n\tdeepNesting.audit,\n\tnestedBoxedContainers.audit,\n\n\tdefaultDesignSystem.audit,\n\tsiteIdentity.audit,\n\tpreferGlobalColors.audit,\n\tpreferGlobalFonts.audit,\n\n\theadingStructure.audit,\n\timagesAltText.audit,\n\timagesTooLarge.audit,\n\n\trobotsNoindex.audit,\n\n\tprivacyPolicy.audit,\n\taccessibilityPolicy.audit,\n\tcookiePolicy.audit,\n];\n\nexport function registerAllAudits(): void {\n\tfor ( const audit of AUDITS ) {\n\t\tregisterAudit( audit );\n\t}\n}\n"],"mappings":"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","names":["ShieldCheckIcon","__","React","getCurrentDocumentId","Box","Button","Typography","__","audit","__","__","audit","audit","httpService","__","__","httpService","React","Button","Typography","__","React","Box","Typography","__","React","Box","Typography","__","React","useState","Box","Divider","__","React","Box","__","React","useState","Box","IconButton","__","React","Box","IconButton","Typography","__","React","useState","AlertCircleIcon","ChevronDownIcon","Box","Collapse","IconButton","Tooltip","Typography","__","__","React","IconButton","Tooltip","__","__","Tooltip","IconButton","React","React","Box","Tooltip","Box","audit","Typography","useState","IconButton","__","ChevronDownIcon","Collapse","AlertCircleIcon","Box","__","React","Box","__","__","Box","React","Box","Typography","__","__","sprintf","audit","React","Box","Rotate","Typography","useTheme","useTheme","Box","Typography","Rotate","React","Box","Typography","__","ShieldHalfFilledIcon","__","sprintf","React","Box","Button","Typography","Typography","__","Box","Box","Typography","__","React","Box","Chip","Typography","__","sprintf","__","React","Box","Chip","Typography","React","ChevronRightIcon","Box","Rotate","Typography","useTheme","useTheme","Box","Typography","Rotate","ChevronRightIcon","React","Box","CircularProgress","Typography","Box","CircularProgress","Typography","sprintf","__","Box","Chip","Typography","useState","Box","__","Divider","getCurrentDocumentId","__","Typography","Box","Button","__","ShieldCheckIcon","__","__","audit","__","audit","__","__","audit","__","audit","__","__","audit","__","__","audit","__","__","audit","__","__","sprintf","audit","__","sprintf","__","audit","__","__","audit","__","audit","__","audit","__","sprintf","audit","__","sprintf","__","sprintf","RESERVED_SETTING_KEYS","REPEATER_ROW_ID_KEY","formatPath","formatArrayPath","audit","__","sprintf","__","audit","__","audit","__","audit","__","__","audit","__","audit","__","audit"]}
|
package/package.json
ADDED
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@elementor/editor-audits",
|
|
3
|
+
"version": "4.3.0-1036",
|
|
4
|
+
"private": false,
|
|
5
|
+
"author": "Elementor Team",
|
|
6
|
+
"homepage": "https://elementor.com/",
|
|
7
|
+
"license": "GPL-3.0-or-later",
|
|
8
|
+
"main": "dist/index.js",
|
|
9
|
+
"module": "dist/index.mjs",
|
|
10
|
+
"types": "dist/index.d.ts",
|
|
11
|
+
"exports": {
|
|
12
|
+
".": {
|
|
13
|
+
"types": "./dist/index.d.ts",
|
|
14
|
+
"import": "./dist/index.mjs",
|
|
15
|
+
"require": "./dist/index.js"
|
|
16
|
+
},
|
|
17
|
+
"./package.json": "./package.json"
|
|
18
|
+
},
|
|
19
|
+
"repository": {
|
|
20
|
+
"type": "git",
|
|
21
|
+
"url": "git+https://github.com/elementor/elementor.git",
|
|
22
|
+
"directory": "packages/core/editor-audits"
|
|
23
|
+
},
|
|
24
|
+
"bugs": {
|
|
25
|
+
"url": "https://github.com/elementor/elementor/issues"
|
|
26
|
+
},
|
|
27
|
+
"publishConfig": {
|
|
28
|
+
"access": "public"
|
|
29
|
+
},
|
|
30
|
+
"files": [
|
|
31
|
+
"README.md",
|
|
32
|
+
"CHANGELOG.md",
|
|
33
|
+
"/dist",
|
|
34
|
+
"/src",
|
|
35
|
+
"!**/__tests__"
|
|
36
|
+
],
|
|
37
|
+
"scripts": {
|
|
38
|
+
"build": "tsup --config=../../tsup.build.ts",
|
|
39
|
+
"dev": "tsup --config=../../tsup.dev.ts"
|
|
40
|
+
},
|
|
41
|
+
"dependencies": {
|
|
42
|
+
"@elementor/editor": "4.3.0-1036",
|
|
43
|
+
"@elementor/editor-mcp": "4.3.0-1036",
|
|
44
|
+
"@elementor/editor-app-bar": "4.3.0-1036",
|
|
45
|
+
"@elementor/editor-elements": "4.3.0-1036",
|
|
46
|
+
"@elementor/editor-floating-panels": "4.3.0-1036",
|
|
47
|
+
"@elementor/editor-notifications": "4.3.0-1036",
|
|
48
|
+
"@elementor/editor-v1-adapters": "4.3.0-1036",
|
|
49
|
+
"@elementor/events": "4.3.0-1036",
|
|
50
|
+
"@elementor/http-client": "4.3.0-1036",
|
|
51
|
+
"@elementor/icons": "~1.77.0",
|
|
52
|
+
"@elementor/locations": "4.3.0-1036",
|
|
53
|
+
"@elementor/session": "4.3.0-1036",
|
|
54
|
+
"@elementor/store": "4.3.0-1036",
|
|
55
|
+
"@elementor/ui": "1.37.5"
|
|
56
|
+
},
|
|
57
|
+
"peerDependencies": {
|
|
58
|
+
"@wordpress/i18n": "^5.13.0",
|
|
59
|
+
"react": "^18.3.1",
|
|
60
|
+
"react-dom": "^18.3.1"
|
|
61
|
+
},
|
|
62
|
+
"devDependencies": {
|
|
63
|
+
"tsup": "^8.3.5"
|
|
64
|
+
}
|
|
65
|
+
}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { httpService } from '@elementor/http-client';
|
|
2
|
+
|
|
3
|
+
import { type PageContextResponse } from '../types';
|
|
4
|
+
import { getWindowConfig } from '../utils/window-config';
|
|
5
|
+
|
|
6
|
+
export async function fetchPageContext( documentId: number, attachmentIds: number[] ): Promise< PageContextResponse > {
|
|
7
|
+
const { restNamespace, nonce } = getWindowConfig();
|
|
8
|
+
const url = `${ restNamespace }/audits/page-context`;
|
|
9
|
+
|
|
10
|
+
const response = await httpService().get< PageContextResponse >( url, {
|
|
11
|
+
params: {
|
|
12
|
+
document_id: documentId,
|
|
13
|
+
attachment_ids: attachmentIds,
|
|
14
|
+
},
|
|
15
|
+
headers: { 'X-WP-Nonce': nonce },
|
|
16
|
+
} );
|
|
17
|
+
|
|
18
|
+
return response.data;
|
|
19
|
+
}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { __ } from '@wordpress/i18n';
|
|
2
|
+
|
|
3
|
+
import { type Audit } from '../types';
|
|
4
|
+
|
|
5
|
+
export const audit: Audit = {
|
|
6
|
+
id: 'audits/accessibility-policy',
|
|
7
|
+
title: __( 'Accessibility policy', 'elementor' ),
|
|
8
|
+
description: __(
|
|
9
|
+
'An accessibility policy demonstrates your commitment to digital inclusion and may be legally required in some regions.',
|
|
10
|
+
'elementor'
|
|
11
|
+
),
|
|
12
|
+
fixHint: __( 'Install the Ally plugin to add an accessibility policy to your website.', 'elementor' ),
|
|
13
|
+
categories: [ 'compliance' ],
|
|
14
|
+
severity: 'info',
|
|
15
|
+
weight: 1,
|
|
16
|
+
evaluate: ( ctx ) => {
|
|
17
|
+
if ( ctx.pageContext.ally_plugin_active ) {
|
|
18
|
+
return { status: 'pass' };
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
return {
|
|
22
|
+
status: 'fail',
|
|
23
|
+
violations: [
|
|
24
|
+
{
|
|
25
|
+
auditId: audit.id,
|
|
26
|
+
label: __( 'Ally plugin is not installed or active.', 'elementor' ),
|
|
27
|
+
externalUrl: ctx.pageContext.ally_plugin_url,
|
|
28
|
+
},
|
|
29
|
+
],
|
|
30
|
+
};
|
|
31
|
+
},
|
|
32
|
+
};
|