@elementor/editor-audits 4.4.0-1130 → 4.4.0-1132
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.js +35 -29
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +35 -29
- package/dist/index.mjs.map +1 -1
- package/package.json +15 -15
- package/src/audits/images-alt-text.ts +3 -3
- package/src/audits/images-inefficient-format.ts +3 -8
- package/src/audits/images-too-large.ts +3 -8
- package/src/utils/all-image-sources.ts +17 -0
- package/src/utils/alt-text-image-sources.ts +24 -0
- package/src/utils/atomic-image-sources.ts +8 -4
- package/src/utils/image-like-sources.ts +0 -12
- package/src/utils/page-attachments.ts +3 -11
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/init.ts","../src/editor-app-bar.tsx","../src/hooks/use-audit-toggle-props.ts","../src/components/audit-toggle-icon.tsx","../src/store/slice.ts","../src/store/selectors.ts","../src/editor-panel.tsx","../src/components/audit-panel.tsx","../src/constants.ts","../src/hooks/use-audit-report.ts","../src/runner.ts","../src/api/page-context-client.ts","../src/utils/window-config.ts","../src/utils/session-expiration.ts","../src/registry.ts","../src/utils/is-scored-audit.ts","../src/utils/sort-failed-audits.ts","../src/utils/audit-status-summary.ts","../src/utils/compute-report.ts","../src/utils/fetch-rendered-html.ts","../src/utils/atomic-background-image-sources.ts","../src/utils/atomic-image-sources.ts","../src/utils/walk.ts","../src/utils/background-image-sources.ts","../src/utils/image-like-sources.ts","../src/utils/image-size-key.ts","../src/utils/page-attachments.ts","../src/utils/read-kit-snapshot.ts","../src/utils/v1-snapshot.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/category-page.tsx","../src/hooks/use-single-expanded-card.ts","../src/components/category-icons.ts","../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-cta-button.tsx","../src/components/violation-icons.tsx","../src/components/pages/overview-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/severity-summary-cards.tsx","../src/components/rescan-button.tsx","../src/audits/accessibility-policy.ts","../src/audits/accessibility-statement.ts","../src/audits/accessibility-widget.ts","../src/utils/scan-accessibility-widgets.ts","../src/audits/cookie-policy.ts","../src/audits/deep-nesting.ts","../src/audits/default-design-system.ts","../src/audits/deprecated-widgets.ts","../src/audits/google-consent-mode.ts","../src/utils/scan-consent-signals.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-inefficient-format.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/scan-for-cookies.ts","../src/audits/sections-and-columns.ts","../src/audits/site-identity.ts","../src/register-audits.ts","../src/sync-report-staleness.ts"],"sourcesContent":["export { init } from './init';\nexport { registerAudit } from './registry';\nexport { runPageAudit } from './runner';\nexport type {\n\tAudit,\n\tAuditCategory,\n\tAuditContext,\n\tAuditMeta,\n\tAuditResult,\n\tAuditRun,\n\tAuditSeverity,\n\tAuditViolation,\n\tPageAuditReport,\n} from './types';\n","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';\nimport { syncReportStaleness } from './sync-report-staleness';\n\nexport function init(): void {\n\tregisterSlice( slice );\n\tregisterAllAudits();\n\tregisterFloatingPanel( auditPanel.panel );\n\tregisterAppBarAuditsToggle();\n\tsyncReportStaleness();\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 { __ } from '@wordpress/i18n';\n\nimport AuditToggleIcon from '../components/audit-toggle-icon';\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: AuditToggleIcon,\n\t\tselected: isOpen,\n\t\tonClick: () => toggle(),\n\t};\n}\n","import * as React from 'react';\nimport { ShieldCheckIcon } from '@elementor/icons';\nimport { __useSelector as useSelector } from '@elementor/store';\nimport { Badge } from '@elementor/ui';\n\nimport { type GlobalState, selectIsStale } from '../store';\n\nexport default function AuditToggleIcon() {\n\tconst isStale = useSelector( ( state: GlobalState ) => selectIsStale( state ) );\n\n\treturn (\n\t\t<Badge\n\t\t\tvariant=\"dot\"\n\t\t\tcolor=\"warning\"\n\t\t\tinvisible={ ! isStale }\n\t\t\toverlap=\"circular\"\n\t\t\tslotProps={ { badge: { 'data-testid': 'audit-stale-indicator' } } }\n\t\t>\n\t\t\t<ShieldCheckIcon />\n\t\t</Badge>\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\tisStale: boolean;\n};\n\nconst initialState: SliceState = { status: 'idle', report: null, error: null, isStale: false };\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\tstate.isStale = false;\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\trunAborted( state ) {\n\t\t\tstate.status = state.report ? 'ready' : 'idle';\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\tstate.isStale = false;\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\tstate.isStale = false;\n\t\t},\n\t\treportStale( state ) {\n\t\t\tif ( state.report ) {\n\t\t\t\tstate.isStale = true;\n\t\t\t}\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\nexport function selectIsStale( state: GlobalState ) {\n\treturn state.audits.isStale;\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 { getHostDocumentId } from '@elementor/editor-elements';\nimport { FloatingPanelBody, FloatingPanelFooter, FloatingPanelHeader } from '@elementor/editor-floating-panels';\nimport { Box, Typography } from '@elementor/ui';\nimport { __ } from '@wordpress/i18n';\n\nimport { AUDIT_PANEL_ID } from '../constants';\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';\nimport RescanButton from './rescan-button';\n\nexport default function AuditPanel() {\n\tconst { status, report, error, isStale, run } = useAuditReport();\n\n\tconst hostDocumentId = getHostDocumentId() ?? 0;\n\tconst onRun = () => run( hostDocumentId );\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_ID }\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\tsx={\n\t\t\t\t\tstatus === 'ready'\n\t\t\t\t\t\t? { display: 'flex', flexDirection: 'column', overflow: 'hidden', minHeight: 0 }\n\t\t\t\t\t\t: undefined\n\t\t\t\t}\n\t\t\t>\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<RescanButton\n\t\t\t\t\thasScanned={ Boolean( lastScanLabel ) }\n\t\t\t\t\tisStale={ isStale }\n\t\t\t\t\tdisabled={ status === 'loading' || hostDocumentId === 0 }\n\t\t\t\t\tonClick={ onRun }\n\t\t\t\t/>\n\t\t\t</FloatingPanelFooter>\n\t\t</>\n\t);\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: __( 'Site compliance', 'elementor' ),\n};\n","import { useEffect } from 'react';\nimport { getHostDocumentId } from '@elementor/editor-elements';\nimport { __useDispatch as useDispatch, __useSelector as useSelector } from '@elementor/store';\n\nimport { runPageAudit } from '../runner';\nimport { type GlobalState, selectError, selectIsStale, selectReport, selectStatus, slice } from '../store';\nimport { getPersistedReport, persistReport } from '../utils/report-storage';\nimport { SessionExpiredError } from '../utils/session-expiration';\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 isStale = useSelector( ( state: GlobalState ) => selectIsStale( state ) );\n\tconst dispatch = useDispatch();\n\tconst documentId = getHostDocumentId() ?? 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\tif ( e instanceof SessionExpiredError ) {\n\t\t\t\tdispatch( slice.actions.runAborted() );\n\t\t\t\treturn;\n\t\t\t}\n\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, isStale, run };\n}\n","import { getHostDocumentElements, getHostDocumentId } 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 { fetchRenderedHtml } from './utils/fetch-rendered-html';\nimport { extractImageSizeRequests } 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\tif ( documentId !== getHostDocumentId() ) {\n\t\tthrow new Error( 'runPageAudit: documentId must match the host document.' );\n\t}\n\n\tconst tree = buildSnapshotTree( getHostDocumentElements() );\n\tconst imageSizeRequests = extractImageSizeRequests( tree );\n\tconst pageContext = await fetchPageContext( documentId, imageSizeRequests );\n\n\tconst elements: ElementsModelSnapshot = { documentId, tree };\n\tconst [ kit, renderedHtml ]: [ KitSnapshot, string | null ] = await Promise.all( [\n\t\treadKitSnapshot( pageContext.kit_id ),\n\t\tfetchRenderedHtml( pageContext.frontend_url ),\n\t] );\n\n\tconst ctx: AuditContext = { documentId, elements, pageContext, kit, renderedHtml };\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 { isNonceInvalidError, refreshAuditsNonce } from '../utils/session-expiration';\nimport { getWindowConfig } from '../utils/window-config';\n\nexport async function fetchPageContext(\n\tdocumentId: number,\n\timageSizeRequests: string[]\n): Promise< PageContextResponse > {\n\treturn requestPageContext( documentId, imageSizeRequests, true );\n}\n\nasync function requestPageContext(\n\tdocumentId: number,\n\timageSizeRequests: string[],\n\tallowNonceRetry: boolean\n): Promise< PageContextResponse > {\n\tconst { restNamespace, nonce } = getWindowConfig();\n\tconst url = `${ restNamespace }/audits/page-context`;\n\n\ttry {\n\t\tconst response = await httpService().get< PageContextResponse >( url, {\n\t\t\tparams: {\n\t\t\t\tdocument_id: documentId,\n\t\t\t\timage_size_requests: imageSizeRequests,\n\t\t\t},\n\t\t\theaders: { 'X-WP-Nonce': nonce },\n\t\t} );\n\n\t\treturn response.data;\n\t} catch ( error ) {\n\t\tif ( ! allowNonceRetry || ! isNonceInvalidError( error ) ) {\n\t\t\tthrow error;\n\t\t}\n\n\t\tawait refreshAuditsNonce();\n\n\t\treturn requestPageContext( documentId, imageSizeRequests, false );\n\t}\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 { getWindowConfig } from './window-config';\n\nconst NONCE_INVALID_CODE = 'rest_cookie_invalid_nonce';\nconst DEFAULT_AJAX_URL = '/wp-admin/admin-ajax.php';\n\ntype AjaxErrorLikeResponse = {\n\tstatus?: number;\n\tdata?: { code?: string };\n};\n\ntype AjaxErrorLike = {\n\tresponse?: AjaxErrorLikeResponse;\n};\n\ntype SessionWindow = Window & {\n\telementorCommon?: { ajax?: { config?: { url?: string } } };\n};\n\nexport class SessionExpiredError extends Error {}\n\nlet nonceRefreshPromise: Promise< string > | null = null;\n\nexport function isNonceInvalidError( error: unknown ): boolean {\n\tconst response = ( error as AjaxErrorLike | undefined )?.response;\n\n\treturn response?.status === 403 && response?.data?.code === NONCE_INVALID_CODE;\n}\n\nexport async function refreshAuditsNonce(): Promise< string > {\n\tif ( nonceRefreshPromise ) {\n\t\treturn nonceRefreshPromise;\n\t}\n\n\tnonceRefreshPromise = requestFreshNonce();\n\n\ttry {\n\t\treturn await nonceRefreshPromise;\n\t} finally {\n\t\tnonceRefreshPromise = null;\n\t}\n}\n\nasync function requestFreshNonce(): Promise< string > {\n\tconst ajaxUrl = ( window as SessionWindow ).elementorCommon?.ajax?.config?.url ?? DEFAULT_AJAX_URL;\n\tconst url = new URL( ajaxUrl, window.location.origin );\n\turl.searchParams.set( 'action', 'rest-nonce' );\n\n\tconst response = await fetch( url.toString(), { credentials: 'same-origin' } );\n\n\tif ( ! response.ok ) {\n\t\tthrow new Error( `Failed to refresh audits nonce: HTTP ${ response.status }` );\n\t}\n\n\tconst nonce = await response.text();\n\n\tif ( ! nonce || '0' === nonce ) {\n\t\tthrow new SessionExpiredError( 'Session expired — received invalid nonce' );\n\t}\n\n\twindow.elementorAudits = { ...getWindowConfig(), nonce };\n\n\treturn nonce;\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 { type AuditMeta } from '../types';\n\nexport function isScoredAudit( audit: AuditMeta ): boolean {\n\treturn audit.weight > 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 { type AuditCategory, type AuditResult, type AuditRun, type PageAuditReport } from '../types';\nimport { isScoredAudit } from './is-scored-audit';\nimport { sortFailedAuditResults } from './sort-failed-audits';\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\n\t\t\t\tif ( isScoredAudit( run.audit ) ) {\n\t\t\t\t\ttotalViolations += run.result.violations.length;\n\t\t\t\t}\n\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 getPopulatedCategories(\n\tcategoryTotals: PageAuditReport[ 'categories' ],\n\tcategories: readonly AuditCategory[]\n): AuditCategory[] {\n\treturn categories.filter( ( category ) => categoryTotals[ category ].total > 0 );\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","const FETCH_TIMEOUT_MS = 10_000;\n\nexport async function fetchRenderedHtml( url: string | null ): Promise< string | null > {\n\tif ( ! url ) {\n\t\treturn null;\n\t}\n\n\tconst timeoutController = new AbortController();\n\tconst timeoutId = setTimeout( () => timeoutController.abort(), FETCH_TIMEOUT_MS );\n\n\ttry {\n\t\tconst response = await fetch( url, { credentials: 'omit', signal: timeoutController.signal } );\n\n\t\tif ( ! response.ok ) {\n\t\t\treturn null;\n\t\t}\n\n\t\treturn await response.text();\n\t} catch {\n\t\treturn null;\n\t} finally {\n\t\tclearTimeout( timeoutId );\n\t}\n}\n","import { getElementStyles } from '@elementor/editor-elements';\nimport {\n\tbackgroundImageOverlayPropTypeUtil,\n\tbackgroundOverlayPropTypeUtil,\n\tbackgroundPropTypeUtil,\n} from '@elementor/editor-props';\nimport { type StyleDefinition } from '@elementor/editor-styles';\n\nimport { type ElementSnapshotNode } from '../types';\nimport { extractAtomicImageMedia } from './atomic-image-sources';\nimport { type ImageLikeMedia } from './image-like-sources';\nimport { walkElements } from './walk';\n\nexport type AtomicBackgroundImageSourceVisit = {\n\tnode: ElementSnapshotNode;\n\tmedia: ImageLikeMedia;\n};\n\nexport function walkAtomicBackgroundImageSources(\n\ttree: ElementSnapshotNode[],\n\tvisit: ( source: AtomicBackgroundImageSourceVisit ) => void\n): void {\n\twalkElements( tree, ( node ) => {\n\t\tconst styles = getElementStyles( node.id );\n\n\t\tif ( ! styles ) {\n\t\t\treturn;\n\t\t}\n\n\t\tfor ( const media of extractBackgroundImageMedia( styles ) ) {\n\t\t\tvisit( { node, media } );\n\t\t}\n\t} );\n}\n\nfunction extractBackgroundImageMedia( styles: Record< string, StyleDefinition > ): ImageLikeMedia[] {\n\tconst sources: ImageLikeMedia[] = [];\n\n\tfor ( const style of Object.values( styles ) ) {\n\t\tfor ( const variant of style.variants ) {\n\t\t\tconst background = backgroundPropTypeUtil.extract( variant.props.background );\n\t\t\tconst overlays = backgroundOverlayPropTypeUtil.extract( background?.[ 'background-overlay' ] ) ?? [];\n\n\t\t\tfor ( const overlay of overlays ) {\n\t\t\t\tconst imageOverlay = backgroundImageOverlayPropTypeUtil.extract( overlay );\n\t\t\t\tconst media = extractAtomicImageMedia( imageOverlay?.image );\n\n\t\t\t\tif ( media ) {\n\t\t\t\t\tsources.push( media );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\treturn sources;\n}\n","import {\n\timageAttachmentIdPropType,\n\timagePropTypeUtil,\n\timageSrcPropTypeUtil,\n\tstringPropTypeUtil,\n\turlPropTypeUtil,\n} from '@elementor/editor-props';\n\nimport { type ElementSnapshotNode } from '../types';\nimport { type ImageLikeMedia } from './image-like-sources';\nimport { walkElements } from './walk';\n\nconst ATOMIC_IMAGE_PROP_KEYS = [ 'image', 'poster' ] as const;\n\nexport type AtomicImageSourceVisit = {\n\tnode: ElementSnapshotNode;\n\tmedia: ImageLikeMedia;\n};\n\nexport function walkAtomicImageSources(\n\ttree: ElementSnapshotNode[],\n\tvisit: ( source: AtomicImageSourceVisit ) => void\n): void {\n\twalkElements( tree, ( node ) => {\n\t\tif ( node.elType !== 'widget' ) {\n\t\t\treturn;\n\t\t}\n\n\t\tfor ( const key of ATOMIC_IMAGE_PROP_KEYS ) {\n\t\t\tconst media = extractAtomicImageMedia( node.settings[ key ] );\n\n\t\t\tif ( media ) {\n\t\t\t\tvisit( { node, media } );\n\t\t\t}\n\t\t}\n\t} );\n}\n\nexport function extractAtomicImageMedia( imageProp: unknown ): ImageLikeMedia | null {\n\tconst image = imagePropTypeUtil.extract( imageProp );\n\n\tif ( ! image ) {\n\t\treturn null;\n\t}\n\n\tconst src = imageSrcPropTypeUtil.extract( image.src );\n\n\tif ( ! src ) {\n\t\treturn null;\n\t}\n\n\tconst id = imageAttachmentIdPropType.extract( src.id ) ?? undefined;\n\tconst url = urlPropTypeUtil.extract( src.url ) ?? undefined;\n\n\tif ( ! id && ! url ) {\n\t\treturn null;\n\t}\n\n\tconst size = stringPropTypeUtil.extract( image.size ) ?? undefined;\n\n\treturn { id, url, size };\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 { type ImageLikeMedia } from './image-like-sources';\nimport { walkElements } from './walk';\n\nconst BACKGROUND_IMAGE_SETTING_KEYS = [\n\t'background_image',\n\t'background_hover_image',\n\t'background_overlay_image',\n\t'background_overlay_hover_image',\n\t'_background_image',\n\t'_background_hover_image',\n] as const;\n\nexport type BackgroundImageSourceVisit = {\n\tnode: ElementSnapshotNode;\n\tmedia: ImageLikeMedia;\n};\n\nexport function walkBackgroundImageSources(\n\ttree: ElementSnapshotNode[],\n\tvisit: ( source: BackgroundImageSourceVisit ) => void\n): void {\n\twalkElements( tree, ( node ) => {\n\t\tfor ( const key of BACKGROUND_IMAGE_SETTING_KEYS ) {\n\t\t\tconst media = node.settings[ key ] as ImageLikeMedia | undefined;\n\n\t\t\tif ( media?.id || media?.url ) {\n\t\t\t\tvisit( { node, media } );\n\t\t\t}\n\t\t}\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\tsize?: 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, size: node.settings.image_size as string | undefined } );\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\tconst gallerySize = node.settings.thumbnail_size as string | undefined;\n\n\t\tfor ( const item of gallery ) {\n\t\t\tif ( item?.id || item?.url ) {\n\t\t\t\tsources.push( { ...item, size: gallerySize } );\n\t\t\t}\n\t\t}\n\t}\n\n\treturn sources;\n}\n","export type ImageSizeRequest = {\n\tid: number;\n\tsize?: string;\n};\n\nexport function buildImageSizeKey( { id, size }: ImageSizeRequest ): string {\n\treturn `${ id }:${ size || 'full' }`;\n}\n","import { type ElementSnapshotNode } from '../types';\nimport { walkAtomicBackgroundImageSources } from './atomic-background-image-sources';\nimport { walkAtomicImageSources } from './atomic-image-sources';\nimport { walkBackgroundImageSources } from './background-image-sources';\nimport { type ImageLikeMedia, walkImageLikeSources } from './image-like-sources';\nimport { buildImageSizeKey } from './image-size-key';\n\nexport function extractImageSizeRequests( tree: ElementSnapshotNode[] ): string[] {\n\tconst keys = new Set< string >();\n\n\tconst collect = ( media: ImageLikeMedia ) => {\n\t\tif ( media.id ) {\n\t\t\tkeys.add( buildImageSizeKey( { id: media.id, size: media.size } ) );\n\t\t}\n\t};\n\n\twalkImageLikeSources( tree, ( { media } ) => collect( media ) );\n\twalkBackgroundImageSources( tree, ( { media } ) => collect( media ) );\n\twalkAtomicImageSources( tree, ( { media } ) => collect( media ) );\n\twalkAtomicBackgroundImageSources( tree, ( { media } ) => collect( media ) );\n\n\treturn Array.from( keys ).sort();\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 { 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 { useFloatingPanelZIndex } from '@elementor/editor-floating-panels';\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\tAUDIT_PANEL_ID,\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\tconst panelZIndex = useFloatingPanelZIndex( AUDIT_PANEL_ID );\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\" PopperProps={ { sx: { zIndex: panelZIndex } } }>\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 } from '@elementor/ui';\n\nimport { type AuditCategory, type PageAuditReport } from '../types';\nimport CategoryPage from './pages/category-page';\nimport OverviewPage from './pages/overview-page';\n\ntype ActivePage = 'overview' | { category: AuditCategory };\n\ntype Props = {\n\treport: PageAuditReport;\n};\n\nfunction isCategoryPage( page: ActivePage ): page is { 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 openCategory = ( category: AuditCategory ) => setActivePage( { category } );\n\tconst backToOverview = () => setActivePage( 'overview' );\n\n\treturn (\n\t\t<Box sx={ { flex: 1, minHeight: 0, overflowY: 'auto' } }>\n\t\t\t{ activePage === 'overview' && <OverviewPage report={ report } onCategoryClick={ openCategory } /> }\n\t\t\t{ isCategoryPage( activePage ) && (\n\t\t\t\t<CategoryPage category={ activePage.category } report={ report } onBack={ backToOverview } />\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 { CATEGORY_LABELS } from '../../constants';\nimport { useSingleExpandedCard } from '../../hooks/use-single-expanded-card';\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, skipped, totalViolations } = partitionAuditResults( report, { category } );\n\tconst { expandedId, toggle } = useSingleExpandedCard();\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\n\t\t\t\t\t\t\tkey={ r.audit.id }\n\t\t\t\t\t\t\taudit={ r.audit }\n\t\t\t\t\t\t\tviolations={ r.result.violations }\n\t\t\t\t\t\t\texpanded={ expandedId === r.audit.id }\n\t\t\t\t\t\t\tonToggleExpand={ () => toggle( r.audit.id ) }\n\t\t\t\t\t\t/>\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\n\t\t\t\t\t\t\tkey={ r.audit.id }\n\t\t\t\t\t\t\taudit={ r.audit }\n\t\t\t\t\t\t\texpanded={ expandedId === r.audit.id }\n\t\t\t\t\t\t\tonToggleExpand={ () => toggle( r.audit.id ) }\n\t\t\t\t\t\t/>\n\t\t\t\t\t) ) }\n\t\t\t\t</StatusSection>\n\t\t\t\t<StatusSection label={ __( 'Skipped audits', 'elementor' ) } count={ skipped.length } color=\"default\">\n\t\t\t\t\t{ skipped.map( ( r ) => (\n\t\t\t\t\t\t<ViolationRow\n\t\t\t\t\t\t\tkey={ r.audit.id }\n\t\t\t\t\t\t\taudit={ r.audit }\n\t\t\t\t\t\t\tskipReason={ r.result.reason }\n\t\t\t\t\t\t\texpanded={ expandedId === r.audit.id }\n\t\t\t\t\t\t\tonToggleExpand={ () => toggle( r.audit.id ) }\n\t\t\t\t\t\t/>\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 { useState } from 'react';\n\nexport function useSingleExpandedCard( initialId: string | null = null ) {\n\tconst [ expandedId, setExpandedId ] = useState< string | null >( initialId );\n\n\tconst toggle = ( id: string ) => {\n\t\tsetExpandedId( ( current ) => ( current === id ? null : id ) );\n\t};\n\n\treturn { expandedId, toggle };\n}\n","import { BoltIcon, ElementorAccessibilityIcon, FileSearchIcon, Settings2Icon, ShieldCheckIcon } 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: FileSearchIcon,\n\taccessibility: ElementorAccessibilityIcon,\n\tperformance: BoltIcon,\n\tcompliance: ShieldCheckIcon,\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 ( React.Children.count( children ) === 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 { getElementIcon, getElementTitle } from '@elementor/editor-elements';\nimport { useFloatingPanelZIndex } from '@elementor/editor-floating-panels';\nimport { CheckIcon, ChevronDownIcon, HelpIcon, InfoCircleIcon } from '@elementor/icons';\nimport { Alert, Box, Collapse, IconButton, Tooltip, Typography } from '@elementor/ui';\nimport { __ } from '@wordpress/i18n';\n\nimport { AUDIT_PANEL_ID } from '../constants';\nimport { focusViolation } from '../hooks/focus-violation';\nimport { type AuditMeta, type AuditViolation } from '../types';\nimport { buildAngiePrompt } from '../utils/build-angie-prompt';\nimport { isScoredAudit } from '../utils/is-scored-audit';\nimport { onKeyboardClick } from '../utils/keyboard-click';\nimport FixViolationWithAngie from './fix-violation-with-angie';\nimport SeverityIcon from './severity-icons';\nimport ViolationCtaButton from './violation-cta-button';\nimport ViolationIcon from './violation-icons';\n\ntype Props = {\n\taudit: AuditMeta;\n\texpanded: boolean;\n\tonToggleExpand: () => void;\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<SeverityIcon severity={ audit.severity } />\n\t\t\t\t{ isScoredAudit( audit ) && (\n\t\t\t\t\t<Typography variant=\"caption\" color=\"text.secondary\" fontWeight=\"bold\">\n\t\t\t\t\t\t{ violations.length }\n\t\t\t\t\t</Typography>\n\t\t\t\t) }\n\t\t\t</>\n\t\t);\n\t}\n\n\treturn <CheckIcon fontSize=\"small\" color=\"success\" />;\n}\n\nfunction GuidanceAction( {\n\tviolation,\n\tsharedAngiePrompt,\n\tpanelZIndex,\n}: {\n\tviolation: AuditViolation;\n\tsharedAngiePrompt?: string;\n\tpanelZIndex: number;\n} ) {\n\tconst hasPrimaryCta = !! ( violation.ctaLabel && violation.externalUrl );\n\n\tif ( ! hasPrimaryCta && ! sharedAngiePrompt ) {\n\t\treturn null;\n\t}\n\n\treturn (\n\t\t<Box display=\"flex\" alignItems=\"center\" gap={ 1 } mt={ 1 }>\n\t\t\t{ hasPrimaryCta && (\n\t\t\t\t<ViolationCtaButton\n\t\t\t\t\tctaLabel={ violation.ctaLabel as string }\n\t\t\t\t\texternalUrl={ violation.externalUrl as string }\n\t\t\t\t\twithIcon\n\t\t\t\t/>\n\t\t\t) }\n\t\t\t{ hasPrimaryCta && violation.secondaryCtaLabel && violation.secondaryCtaUrl && (\n\t\t\t\t<ViolationCtaButton\n\t\t\t\t\tctaLabel={ violation.secondaryCtaLabel }\n\t\t\t\t\texternalUrl={ violation.secondaryCtaUrl }\n\t\t\t\t\tvariant=\"text\"\n\t\t\t\t/>\n\t\t\t) }\n\t\t\t{ sharedAngiePrompt && (\n\t\t\t\t<FixViolationWithAngie prompt={ sharedAngiePrompt } panelZIndex={ panelZIndex } variant=\"button\" />\n\t\t\t) }\n\t\t</Box>\n\t);\n}\n\nfunction getSharedAngiePrompt( violations?: AuditViolation[] ): string | undefined {\n\tif ( ! violations || violations.length < 2 ) {\n\t\treturn undefined;\n\t}\n\n\tconst [ first, ...rest ] = violations;\n\n\tif ( ! first.angieFix || ! first.angiePrompt ) {\n\t\treturn undefined;\n\t}\n\n\tconst allShareTheSameFix = rest.every(\n\t\t( violation ) => violation.angieFix && violation.angiePrompt === first.angiePrompt\n\t);\n\n\treturn allShareTheSameFix ? first.angiePrompt : undefined;\n}\n\nexport default function ViolationRow( { audit, expanded, onToggleExpand, skipReason, violations }: Props ) {\n\tconst primaryViolation = violations?.[ 0 ];\n\tconst isGuidanceFocusable = !! primaryViolation;\n\tconst panelZIndex = useFloatingPanelZIndex( AUDIT_PANEL_ID );\n\tconst sharedAngiePrompt = getSharedAngiePrompt( violations );\n\n\tconst handleGuidanceClick = () => {\n\t\tif ( isGuidanceFocusable && primaryViolation ) {\n\t\t\tfocusViolation( primaryViolation );\n\t\t}\n\t};\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={ onToggleExpand }\n\t\t\t\t>\n\t\t\t\t\t<Typography variant=\"subtitle2\" color=\"text.secondary\" 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={ onToggleExpand }\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 paddingBlock={ 1 }>\n\t\t\t\t\t<Tooltip title={ audit.fixHint } placement=\"top\">\n\t\t\t\t\t\t<Alert\n\t\t\t\t\t\t\tseverity=\"secondary\"\n\t\t\t\t\t\t\tsx={ { p: 1, cursor: isGuidanceFocusable ? 'pointer' : undefined } }\n\t\t\t\t\t\t\ticon={ <InfoCircleIcon fontSize=\"small\" aria-hidden={ true } /> }\n\t\t\t\t\t\t\trole={ isGuidanceFocusable ? 'button' : undefined }\n\t\t\t\t\t\t\ttabIndex={ isGuidanceFocusable ? 0 : undefined }\n\t\t\t\t\t\t\tonClick={ isGuidanceFocusable ? handleGuidanceClick : undefined }\n\t\t\t\t\t\t\tonKeyDown={ isGuidanceFocusable ? onKeyboardClick( handleGuidanceClick ) : undefined }\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<Typography variant=\"caption\" component=\"p\" color=\"text.secondary\">\n\t\t\t\t\t\t\t\t{ audit.description }\n\t\t\t\t\t\t\t</Typography>\n\t\t\t\t\t\t\t{ primaryViolation && (\n\t\t\t\t\t\t\t\t<GuidanceAction\n\t\t\t\t\t\t\t\t\tviolation={ primaryViolation }\n\t\t\t\t\t\t\t\t\tsharedAngiePrompt={ sharedAngiePrompt }\n\t\t\t\t\t\t\t\t\tpanelZIndex={ panelZIndex }\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t) }\n\t\t\t\t\t\t</Alert>\n\t\t\t\t\t</Tooltip>\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 } }>\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 displayLabel = elementTitle ?? violation.label;\n\t\t\t\t\t\t\tconst angiePromptContext = 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\t\t\t\t\t\t\tconst showsOwnFixAction = !! violation.angieFix && ! sharedAngiePrompt;\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: 1,\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'&:hover': { bgcolor: 'action.hover' },\n\t\t\t\t\t\t\t\t\t\t'&:hover .violation-row-fix-action, &:focus-visible .violation-row-fix-action':\n\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\topacity: 1,\n\t\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\">{ displayLabel }</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{ showsOwnFixAction && (\n\t\t\t\t\t\t\t\t\t\t<Box\n\t\t\t\t\t\t\t\t\t\t\tclassName=\"violation-row-fix-action\"\n\t\t\t\t\t\t\t\t\t\t\tsx={ { opacity: 0, transition: 'opacity .15s' } }\n\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t<FixViolationWithAngie\n\t\t\t\t\t\t\t\t\t\t\t\tprompt={\n\t\t\t\t\t\t\t\t\t\t\t\t\tviolation.angiePrompt ?? buildAngiePrompt( angiePromptContext )\n\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\tpanelZIndex={ panelZIndex }\n\t\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t\t</Box>\n\t\t\t\t\t\t\t\t\t) }\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 { Button, 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\tpanelZIndex: number;\n\tvariant?: 'icon' | 'button';\n};\n\nexport default function FixViolationWithAngie( { prompt, panelZIndex, variant = 'icon' }: 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\tif ( variant === 'button' ) {\n\t\treturn (\n\t\t\t<Button\n\t\t\t\tcomponent=\"a\"\n\t\t\t\thref={ href }\n\t\t\t\tsize=\"small\"\n\t\t\t\tcolor=\"secondary\"\n\t\t\t\tvariant=\"outlined\"\n\t\t\t\tstartIcon={ <AngieIcon fontSize=\"tiny\" aria-hidden={ true } /> }\n\t\t\t\tonClick={ handleClick }\n\t\t\t>\n\t\t\t\t{ label }\n\t\t\t</Button>\n\t\t);\n\t}\n\n\treturn (\n\t\t<Tooltip title={ label } placement=\"top\" PopperProps={ { sx: { zIndex: panelZIndex } } }>\n\t\t\t<IconButton component=\"a\" href={ href } size=\"small\" aria-label={ label } onClick={ handleClick }>\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, BulbIcon } 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: BulbIcon, color: 'info' },\n};\n\ntype Props = {\n\tseverity: AuditSeverity;\n};\n\nconst INFO_ICON_VERTICAL_NUDGE = 'translateY(-2px)';\n\nexport default function SeverityIcon( { severity }: Props ) {\n\tconst { Icon, color } = SEVERITY_CONFIG[ severity ];\n\tconst sx = 'info' === severity ? { transform: INFO_ICON_VERTICAL_NUDGE } : undefined;\n\n\treturn <Icon fontSize=\"small\" color={ color } sx={ sx } />;\n}\n","import * as React from 'react';\nimport { WandIcon } from '@elementor/icons';\nimport { Button } from '@elementor/ui';\n\ntype Props = {\n\tctaLabel: string;\n\texternalUrl: string;\n\tvariant?: 'outlined' | 'text';\n\twithIcon?: boolean;\n};\n\nexport default function ViolationCtaButton( { ctaLabel, externalUrl, variant = 'outlined', withIcon = false }: Props ) {\n\tconst handleClick = ( event: React.MouseEvent< HTMLButtonElement > ) => {\n\t\tevent.stopPropagation();\n\t\tevent.preventDefault();\n\n\t\twindow.open( externalUrl, '_blank', 'noopener' );\n\t};\n\n\treturn (\n\t\t<Button\n\t\t\tvariant={ variant }\n\t\t\tcolor=\"secondary\"\n\t\t\tsize=\"small\"\n\t\t\tstartIcon={ withIcon ? <WandIcon fontSize=\"tiny\" aria-hidden={ true } /> : undefined }\n\t\t\tonClick={ handleClick }\n\t\t>\n\t\t\t{ ctaLabel }\n\t\t</Button>\n\t);\n}\n","import * as React from 'react';\nimport { FileSettingsIcon, SettingsIcon } 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 <SettingsIcon fontSize=\"inherit\" aria-hidden={ true } />;\n}\n","import * as React from 'react';\nimport { Box, 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';\nimport SeveritySummaryCards from '../severity-summary-cards';\n\ntype Props = {\n\tonCategoryClick: ( category: AuditCategory ) => void;\n\treport: PageAuditReport;\n};\n\nexport default function OverviewPage( { onCategoryClick, report }: Props ) {\n\tconst populatedCategories = getPopulatedCategories( report.categories, ALL_CATEGORIES );\n\n\tconst categoryRows = populatedCategories\n\t\t.map( ( category ) => ( { category, counts: countSeverities( report, category ) } ) )\n\t\t.filter( ( { counts } ) => Object.values( counts ).some( ( count ) => count > 0 ) );\n\n\treturn (\n\t\t<Box display=\"flex\" flexDirection=\"column\" gap={ 3 } p={ 2 }>\n\t\t\t<SeveritySummaryCards report={ report } />\n\t\t\t<Box display=\"flex\" flexDirection=\"column\" gap={ 1 }>\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\t<Box display=\"flex\" flexDirection=\"column\" gap={ 1 }>\n\t\t\t\t\t{ categoryRows.map( ( { category, counts } ) => (\n\t\t\t\t\t\t<IssuesCategoryRow\n\t\t\t\t\t\t\tkey={ category }\n\t\t\t\t\t\t\tcategory={ category }\n\t\t\t\t\t\t\tlabel={ CATEGORY_LABELS[ category ] }\n\t\t\t\t\t\t\tcounts={ counts }\n\t\t\t\t\t\t\tonClick={ () => onCategoryClick( category ) }\n\t\t\t\t\t\t/>\n\t\t\t\t\t) ) }\n\t\t\t\t</Box>\n\t\t\t</Box>\n\t\t\t<Promotions report={ report } />\n\t\t</Box>\n\t);\n}\n","import { __ } from '@wordpress/i18n';\n\nimport { type AuditCategory, type AuditSeverity, type PageAuditReport } from '../types';\nimport { isScoredAudit } from './is-scored-audit';\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\tif ( ! isScoredAudit( audit ) ) {\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 __( 'Suggestions', 'elementor' );\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, Divider, 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<Divider />\n\t\t\t<Typography variant=\"subtitle1\" fontWeight=\"bold\">\n\t\t\t\t{ __( 'Quick actions', '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/scan-for-cookies',\n\t\ticon: ElementorCookieIcon,\n\t\tctaLabel: __( 'Scan', 'elementor' ),\n\t\tformatSubtitle: ( run ) =>\n\t\t\trun.result.status === 'fail' ? __( 'Scan this page for cookies', '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, Typography } from '@elementor/ui';\n\nimport { type AuditSeverity, type PageAuditReport } from '../types';\nimport { ALL_SEVERITIES, countSeverities, severityPluralLabel } from '../utils/severity-counts';\nimport SeverityIcon from './severity-icons';\n\ntype Props = {\n\treport: PageAuditReport;\n};\n\nexport default function SeveritySummaryCards( { report }: Props ) {\n\tconst counts = countSeverities( report );\n\n\treturn (\n\t\t<Box display=\"flex\" gap={ 1.5 }>\n\t\t\t{ ALL_SEVERITIES.map( ( severity ) => (\n\t\t\t\t<SeverityCard key={ severity } severity={ severity } count={ counts[ severity ] } />\n\t\t\t) ) }\n\t\t</Box>\n\t);\n}\n\ntype SeverityCardProps = {\n\tseverity: AuditSeverity;\n\tcount: number;\n};\n\nfunction SeverityCard( { severity, count }: SeverityCardProps ) {\n\treturn (\n\t\t<Box\n\t\t\tdisplay=\"flex\"\n\t\t\tflex={ 1 }\n\t\t\tflexDirection=\"column\"\n\t\t\tgap={ 1 }\n\t\t\tbgcolor=\"action.hover\"\n\t\t\tborderRadius={ 1.5 }\n\t\t\tpx={ 1.5 }\n\t\t\tpy={ 1 }\n\t\t>\n\t\t\t<SeverityIcon severity={ severity } />\n\t\t\t<Box display=\"flex\" flexDirection=\"column\">\n\t\t\t\t<Typography variant=\"h5\" fontWeight={ 700 } component=\"span\">\n\t\t\t\t\t{ count }\n\t\t\t\t</Typography>\n\t\t\t\t<Typography variant=\"caption\" color=\"text.secondary\">\n\t\t\t\t\t{ severityPluralLabel( severity ) }\n\t\t\t\t</Typography>\n\t\t\t</Box>\n\t\t</Box>\n\t);\n}\n","import * as React from 'react';\nimport { useFloatingPanelZIndex } from '@elementor/editor-floating-panels';\nimport { ReloadIcon } from '@elementor/icons';\nimport { Badge, Button, Tooltip } from '@elementor/ui';\nimport { __ } from '@wordpress/i18n';\n\nimport { AUDIT_PANEL_ID } from '../constants';\n\ntype Props = {\n\thasScanned: boolean;\n\tisStale: boolean;\n\tdisabled: boolean;\n\tonClick: () => void;\n};\n\nexport default function RescanButton( { hasScanned, isStale, disabled, onClick }: Props ) {\n\tconst panelZIndex = useFloatingPanelZIndex( AUDIT_PANEL_ID );\n\n\treturn (\n\t\t<Tooltip\n\t\t\ttitle={ __( 'Page content changed - rescan advised', 'elementor' ) }\n\t\t\tdisableHoverListener={ ! isStale }\n\t\t\tPopperProps={ { sx: { zIndex: panelZIndex } } }\n\t\t>\n\t\t\t<Badge variant=\"dot\" color=\"warning\" invisible={ ! isStale } overlap=\"rectangular\">\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\tstartIcon={ hasScanned ? <ReloadIcon fontSize=\"small\" /> : undefined }\n\t\t\t\t\tonClick={ onClick }\n\t\t\t\t\tdisabled={ disabled }\n\t\t\t\t>\n\t\t\t\t\t{ hasScanned ? __( 'Rescan', 'elementor' ) : __( 'Run page audit', 'elementor' ) }\n\t\t\t\t</Button>\n\t\t\t</Badge>\n\t\t</Tooltip>\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/accessibility-statement',\n\ttitle: __( 'Create an accessibility statement', 'elementor' ),\n\tdescription: __(\n\t\t'An accessibility statement showcases your efforts to create an inclusive online space, highlighting helpful features and a commitment to accessibility.',\n\t\t'elementor'\n\t),\n\tfixHint: __( 'Use Ally to create and publish an accessibility statement for your site.', 'elementor' ),\n\tcategories: [ 'accessibility' ],\n\tseverity: 'info',\n\tweight: 1,\n\tevaluate: ( ctx ) => {\n\t\tconst isReady = ctx.pageContext.ally_plugin_active;\n\n\t\tif ( isReady && ctx.pageContext.ally_accessibility_statement_created ) {\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 accessibility statement has been created for this site.', 'elementor' ),\n\t\t\t\t\texternalUrl: isReady\n\t\t\t\t\t\t? ctx.pageContext.ally_accessibility_statement_url\n\t\t\t\t\t\t: ctx.pageContext.ally_plugin_url,\n\t\t\t\t\tctaLabel: __( 'Create', 'elementor' ),\n\t\t\t\t\tsecondaryCtaLabel: __( 'Learn more', 'elementor' ),\n\t\t\t\t\tsecondaryCtaUrl: 'https://elementor.com/help/start-using-ally/#statement',\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';\nimport { hasAccessibilityWidgetScript } from '../utils/scan-accessibility-widgets';\n\nexport const audit: Audit = {\n\tid: 'audits/accessibility-widget',\n\ttitle: __( 'Add an accessibility widget', 'elementor' ),\n\tdescription: __( 'Make your site more inclusive by adding an accessibility widget.', 'elementor' ),\n\tfixHint: __( 'Activate Ally’s accessibility widget to give visitors on-page accessibility tools.', 'elementor' ),\n\tcategories: [ 'accessibility' ],\n\tseverity: 'info',\n\tweight: 1,\n\tevaluate: ( ctx ) => {\n\t\tif ( ! ctx.pageContext.frontend_url ) {\n\t\t\treturn { status: 'skipped', reason: __( 'Page is not published.', 'elementor' ) };\n\t\t}\n\n\t\tif ( ! ctx.renderedHtml ) {\n\t\t\treturn { status: 'skipped', reason: __( 'Could not fetch the published page.', 'elementor' ) };\n\t\t}\n\n\t\tif ( hasAccessibilityWidgetScript( ctx.renderedHtml ) ) {\n\t\t\treturn { status: 'pass' };\n\t\t}\n\n\t\tconst isReady = ctx.pageContext.ally_plugin_active;\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 accessibility widget is active on this site.', 'elementor' ),\n\t\t\t\t\texternalUrl: isReady ? ctx.pageContext.ally_widget_settings_url : ctx.pageContext.ally_plugin_url,\n\t\t\t\t\tctaLabel: __( 'Activate', 'elementor' ),\n\t\t\t\t},\n\t\t\t],\n\t\t};\n\t},\n};\n","// Script sources of known accessibility widgets. Ally is listed first; append third-party\n// widget script sources here (UserWay, AccessiBe, EqualWeb, etc.) once confirmed.\nconst ACCESSIBILITY_WIDGET_SCRIPT_SOURCES = [ 'cdn.elementor.com/a11y/widget.js' ];\n\nexport function hasAccessibilityWidgetScript( html: string ): boolean {\n\treturn ACCESSIBILITY_WIDGET_SCRIPT_SOURCES.some( ( src ) => html.includes( src ) );\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\tctaLabel: __( 'Set up cookie consent', 'elementor' ),\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, type ElementSnapshotNode } from '../types';\nimport { walkElements } from '../utils/walk';\n\nconst MAX_NESTING_DEPTH = 6;\n\nfunction isNestingElement( node: ElementSnapshotNode, widgetsCache: ReturnType< typeof getWidgetsCache > ): boolean {\n\tif ( node.elType === 'container' ) {\n\t\treturn true;\n\t}\n\n\treturn !! widgetsCache?.[ node.elType ]?.meta?.is_container;\n}\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 widgetsCache = getWidgetsCache();\n\t\tconst violations: AuditViolation[] = [];\n\n\t\twalkElements( ctx.elements.tree, ( node, parents ) => {\n\t\t\tif ( ! isNestingElement( node, widgetsCache ) ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst depth = parents.filter( ( parent ) => isNestingElement( parent, widgetsCache ) ).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 } from '../types';\nimport { hasConsentDefaultCall, hasGoogleTracking } from '../utils/scan-consent-signals';\n\nexport const audit: Audit = {\n\tid: 'audits/google-consent-mode',\n\ttitle: __( 'Google Consent Mode', 'elementor' ),\n\tdescription: __(\n\t\t'Google Analytics, Ads, or Tag Manager are running on this site and may not receive a consent signal, which risks losing conversion/analytics data and compliance exposure.',\n\t\t'elementor'\n\t),\n\tfixHint: __(\n\t\t'Turn on Google Consent Mode in your cookie consent plugin so Google tags respect visitor consent choices.',\n\t\t'elementor'\n\t),\n\tcategories: [ 'compliance' ],\n\tseverity: 'warning',\n\tweight: 1,\n\tevaluate: ( ctx ) => {\n\t\tif ( ! ctx.pageContext.frontend_url ) {\n\t\t\treturn { status: 'skipped', reason: __( 'Page is not published.', 'elementor' ) };\n\t\t}\n\n\t\tif ( ! ctx.renderedHtml ) {\n\t\t\treturn { status: 'skipped', reason: __( 'Could not fetch the published page.', 'elementor' ) };\n\t\t}\n\n\t\tif ( ! hasGoogleTracking( ctx.renderedHtml ) ) {\n\t\t\treturn { status: 'skipped', reason: __( 'No Google tracking product detected.', 'elementor' ) };\n\t\t}\n\n\t\tif ( hasConsentDefaultCall( ctx.renderedHtml ) ) {\n\t\t\treturn { status: 'pass' };\n\t\t}\n\n\t\tconst label = __( 'No Google Consent Mode signal was found on the page.', 'elementor' );\n\t\tconst isCookiezReady = ctx.pageContext.cookiez_plugin_installed && ctx.pageContext.cookiez_plugin_active;\n\n\t\tif ( isCookiezReady ) {\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,\n\t\t\t\t\t\tctaLabel: __( 'Enable', 'elementor' ),\n\t\t\t\t\t\texternalUrl: ctx.pageContext.cookiez_consent_mode_settings_url,\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t};\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,\n\t\t\t\t\texternalUrl: ctx.pageContext.cookiez_plugin_action_url,\n\t\t\t\t},\n\t\t\t],\n\t\t};\n\t},\n};\n","const GOOGLE_TRACKING_PATTERNS = [\n\t/googletagmanager\\.com\\/gtag\\/js\\?id=(G|AW)-/,\n\t/googletagmanager\\.com\\/gtm\\.js/,\n\t/\\bGTM-[A-Z0-9]+\\b/,\n\t/gtag\\(\\s*['\"]config['\"]\\s*,\\s*['\"](G|AW)-/,\n];\n\nconst CONSENT_DEFAULT_PATTERNS = [\n\t/gtag\\(\\s*['\"]consent['\"]\\s*,\\s*['\"]default['\"]/,\n\t/dataLayer\\.push\\(\\s*\\[\\s*['\"]consent['\"]\\s*,\\s*['\"]default['\"]/,\n];\n\nexport function hasGoogleTracking( html: string ): boolean {\n\treturn GOOGLE_TRACKING_PATTERNS.some( ( pattern ) => pattern.test( html ) );\n}\n\nexport function hasConsentDefaultCall( html: string ): boolean {\n\treturn CONSENT_DEFAULT_PATTERNS.some( ( pattern ) => pattern.test( html ) );\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 isReady = ctx.pageContext.ally_plugin_active;\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: isReady ? ctx.pageContext.ally_scan_url : ctx.pageContext.ally_plugin_url,\n\t\t\t\t\tctaLabel: __( 'Fix with Ally', 'elementor' ),\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';\nimport { buildImageSizeKey } from './image-size-key';\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 key = buildImageSizeKey( { id: media.id, size: media.size } );\n\t\tconst alt = pageContext.image_sizes[ key ]?.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 { __ } from '@wordpress/i18n';\n\nimport { type Audit, type AuditViolation, type ElementSnapshotNode } from '../types';\nimport { walkAtomicBackgroundImageSources } from '../utils/atomic-background-image-sources';\nimport { walkAtomicImageSources } from '../utils/atomic-image-sources';\nimport { walkBackgroundImageSources } from '../utils/background-image-sources';\nimport { type ImageLikeMedia, walkImageLikeSources } from '../utils/image-like-sources';\nimport { buildImageSizeKey } from '../utils/image-size-key';\n\nconst LEGACY_RASTER_MIME_TYPES = new Set( [ 'image/jpeg', 'image/png', 'image/gif', 'image/bmp', 'image/tiff' ] );\n\nexport const audit: Audit = {\n\tid: 'audits/images-inefficient-format',\n\ttitle: __( 'Inefficient image format', 'elementor' ),\n\tdescription: __( \"Image isn't served in a modern, efficient format like WebP or AVIF.\", 'elementor' ),\n\tfixHint: __( 'Convert the image to a modern format like WebP or AVIF, or enable image optimization.', 'elementor' ),\n\tcategories: [ 'performance' ],\n\tseverity: 'info',\n\tweight: 1,\n\tevaluate: ( ctx ) => {\n\t\tconst isReady = ctx.pageContext.image_optimization_plugin_active;\n\t\tconst offendingElementIds = new Set< string >();\n\t\tlet hasAnyImage = false;\n\t\tlet inefficientImageFormatCount = 0;\n\n\t\tconst evaluateSource = ( node: ElementSnapshotNode, media: ImageLikeMedia ) => {\n\t\t\tif ( media.id || media.url ) {\n\t\t\t\thasAnyImage = true;\n\t\t\t}\n\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 mime = ctx.pageContext.image_sizes[ buildImageSizeKey( { id, size: media.size } ) ]?.mime;\n\n\t\t\tif ( ! mime || ! LEGACY_RASTER_MIME_TYPES.has( mime ) ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tinefficientImageFormatCount++;\n\t\t\toffendingElementIds.add( node.id );\n\t\t};\n\n\t\twalkImageLikeSources( ctx.elements.tree, ( { node, media } ) => evaluateSource( node, media ) );\n\t\twalkBackgroundImageSources( ctx.elements.tree, ( { node, media } ) => evaluateSource( node, media ) );\n\t\twalkAtomicImageSources( ctx.elements.tree, ( { node, media } ) => evaluateSource( node, media ) );\n\t\twalkAtomicBackgroundImageSources( ctx.elements.tree, ( { node, media } ) => evaluateSource( node, media ) );\n\n\t\tif ( ! hasAnyImage ) {\n\t\t\treturn { status: 'skipped', reason: __( 'No images', 'elementor' ) };\n\t\t}\n\n\t\tconst violations: AuditViolation[] = Array.from( offendingElementIds ).map( ( elementId ) => ( {\n\t\t\tauditId: audit.id,\n\t\t\telementId,\n\t\t\ttargetHint: 'element-settings' as const,\n\t\t\tlabel: __( \"Image isn't served in a modern format like WebP or AVIF.\", 'elementor' ),\n\t\t\texternalUrl: isReady\n\t\t\t\t? ctx.pageContext.image_optimization_settings_url\n\t\t\t\t: ctx.pageContext.image_optimization_plugin_url,\n\t\t\tctaLabel: __( 'Optimize all', 'elementor' ),\n\t\t} ) );\n\n\t\treturn violations.length === 0\n\t\t\t? { status: 'pass' }\n\t\t\t: { status: 'fail', violations, metadata: { inefficientImageFormatCount } };\n\t},\n};\n","import { __, sprintf } from '@wordpress/i18n';\n\nimport { type Audit, type AuditViolation, type ElementSnapshotNode } from '../types';\nimport { walkAtomicBackgroundImageSources } from '../utils/atomic-background-image-sources';\nimport { walkAtomicImageSources } from '../utils/atomic-image-sources';\nimport { walkBackgroundImageSources } from '../utils/background-image-sources';\nimport { type ImageLikeMedia, walkImageLikeSources } from '../utils/image-like-sources';\nimport { buildImageSizeKey } from '../utils/image-size-key';\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\tconst isReady = ctx.pageContext.image_optimization_plugin_active;\n\t\tconst widgetMaxKb = new Map< string, number >();\n\t\tlet oversizedImageCount = 0;\n\t\tlet hasAnyImage = false;\n\n\t\tconst evaluateSource = ( node: ElementSnapshotNode, media: ImageLikeMedia ) => {\n\t\t\tif ( media.id || media.url ) {\n\t\t\t\thasAnyImage = true;\n\t\t\t}\n\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[ buildImageSizeKey( { id, size: media.size } ) ];\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\twalkImageLikeSources( ctx.elements.tree, ( { node, media } ) => evaluateSource( node, media ) );\n\t\twalkBackgroundImageSources( ctx.elements.tree, ( { node, media } ) => evaluateSource( node, media ) );\n\t\twalkAtomicImageSources( ctx.elements.tree, ( { node, media } ) => evaluateSource( node, media ) );\n\t\twalkAtomicBackgroundImageSources( ctx.elements.tree, ( { node, media } ) => evaluateSource( node, media ) );\n\n\t\tif ( ! hasAnyImage ) {\n\t\t\treturn { status: 'skipped', reason: __( 'No images', 'elementor' ) };\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: isReady\n\t\t\t\t? ctx.pageContext.image_optimization_settings_url\n\t\t\t\t: ctx.pageContext.image_optimization_plugin_url,\n\t\t\tctaLabel: __( 'Optimize all', 'elementor' ),\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\tangieFix: true,\n\t\t\t\t\tangiePrompt: __(\n\t\t\t\t\t\t'Find containers that have nested containers. Containers can be deep-nested. Update the nested container styling so that when a parent container already uses a boxed setting, any inner container inside it is set to Full Width. Keep the first parent container boxed, remove all boxed styling from the nested inner containers, and preserve the inner container’s content, spacing, alignment, and hierarchy.',\n\t\t\t\t\t\t'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 } 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\tangiePrompt: __(\n\t\t\t\t\t\t\t\"Based on this page's contents, generate a title for this page.\",\n\t\t\t\t\t\t\t'elementor'\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}\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\tctaLabel: __( 'Create', 'elementor' ),\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 } from '../types';\n\nexport const audit: Audit = {\n\tid: 'audits/scan-for-cookies',\n\ttitle: __( 'Scan for cookies', 'elementor' ),\n\tdescription: __(\n\t\t\"Your site may be setting cookies you haven't disclosed. Some countries require a banner even without a full consent policy. Scan to see what needs disclosure.\",\n\t\t'elementor'\n\t),\n\tfixHint: __( 'Run a Cookiez scan on this page to see which cookies need disclosure.', 'elementor' ),\n\tcategories: [ 'compliance' ],\n\tseverity: 'info',\n\tweight: 0,\n\tevaluate: ( ctx ) => {\n\t\tconst isReady = ctx.pageContext.cookiez_plugin_installed && ctx.pageContext.cookiez_plugin_active;\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: __( 'This page has not been scanned for cookies yet.', 'elementor' ),\n\t\t\t\t\texternalUrl: isReady ? ctx.pageContext.cookiez_scan_url : ctx.pageContext.cookiez_plugin_action_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 * as accessibilityPolicy from './audits/accessibility-policy';\nimport * as accessibilityStatement from './audits/accessibility-statement';\nimport * as accessibilityWidget from './audits/accessibility-widget';\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 googleConsentMode from './audits/google-consent-mode';\nimport * as headingStructure from './audits/heading-structure';\nimport * as hiddenElements from './audits/hidden-elements';\nimport * as imagesAltText from './audits/images-alt-text';\nimport * as imagesInefficientFormat from './audits/images-inefficient-format';\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 scanForCookies from './audits/scan-for-cookies';\nimport * as sectionsAndColumns from './audits/sections-and-columns';\nimport * as siteIdentity from './audits/site-identity';\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\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\timagesInefficientFormat.audit,\n\n\trobotsNoindex.audit,\n\n\tprivacyPolicy.audit,\n\taccessibilityPolicy.audit,\n\taccessibilityStatement.audit,\n\taccessibilityWidget.audit,\n\tcookiePolicy.audit,\n\tscanForCookies.audit,\n\tgoogleConsentMode.audit,\n];\n\nexport function registerAllAudits(): void {\n\tfor ( const audit of AUDITS ) {\n\t\tregisterAudit( audit );\n\t}\n}\n","import { __privateListenTo as listenTo, commandEndEvent, type CommandEvent } from '@elementor/editor-v1-adapters';\nimport { __dispatch as dispatch } from '@elementor/store';\n\nimport { slice } from './store/slice';\n\nexport function syncReportStaleness() {\n\tlistenTo( commandEndEvent( 'document/save/set-is-modified' ), ( e ) => {\n\t\tconst event = e as CommandEvent< { status: boolean } >;\n\n\t\tif ( event.args?.status ) {\n\t\t\tdispatch( slice.actions.reportStale() );\n\t\t}\n\t} );\n}\n"],"mappings":"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","names":["import_editor_floating_panels","import_store","import_i18n","import_store","useSelector","import_editor_floating_panels","React","import_editor_elements","import_editor_floating_panels","import_ui","import_i18n","import_editor_elements","import_store","import_editor_elements","audit","audit","audit","import_editor_props","audit","useSelector","dispatch","useDispatch","React","import_react","import_http_client","import_icons","import_ui","import_i18n","React","import_ui","import_i18n","React","import_ui","import_i18n","React","import_ui","import_i18n","React","import_react","import_ui","React","import_ui","import_i18n","import_react","import_icons","React","import_react","import_icons","import_ui","import_i18n","React","import_icons","import_ui","import_i18n","React","import_editor_elements","import_editor_floating_panels","import_icons","import_ui","import_i18n","import_editor_elements","import_editor_v1_adapters","runCommand","openRoute","import_i18n","React","import_icons","import_ui","import_i18n","React","import_icons","React","import_icons","import_ui","React","import_icons","import_ui","audit","React","import_ui","import_i18n","import_i18n","audit","React","import_icons","import_ui","React","import_ui","import_i18n","import_icons","import_i18n","React","import_ui","React","import_ui","React","import_editor_floating_panels","import_icons","import_ui","import_i18n","import_i18n","import_i18n","audit","import_i18n","audit","import_i18n","audit","import_editor_elements","import_i18n","audit","import_i18n","audit","import_editor_elements","import_i18n","audit","import_i18n","audit","import_i18n","audit","import_i18n","audit","import_i18n","audit","import_i18n","audit","import_i18n","audit","import_i18n","audit","import_i18n","audit","import_i18n","audit","import_i18n","audit","import_i18n","audit","import_i18n","RESERVED_SETTING_KEYS","REPEATER_ROW_ID_KEY","formatPath","formatArrayPath","audit","import_i18n","audit","import_i18n","audit","import_i18n","audit","import_i18n","audit","import_i18n","audit","audit","import_editor_v1_adapters","import_store","listenTo","dispatch","registerSlice"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/init.ts","../src/editor-app-bar.tsx","../src/hooks/use-audit-toggle-props.ts","../src/components/audit-toggle-icon.tsx","../src/store/slice.ts","../src/store/selectors.ts","../src/editor-panel.tsx","../src/components/audit-panel.tsx","../src/constants.ts","../src/hooks/use-audit-report.ts","../src/runner.ts","../src/api/page-context-client.ts","../src/utils/window-config.ts","../src/utils/session-expiration.ts","../src/registry.ts","../src/utils/is-scored-audit.ts","../src/utils/sort-failed-audits.ts","../src/utils/audit-status-summary.ts","../src/utils/compute-report.ts","../src/utils/fetch-rendered-html.ts","../src/utils/atomic-background-image-sources.ts","../src/utils/atomic-image-sources.ts","../src/utils/walk.ts","../src/utils/background-image-sources.ts","../src/utils/image-like-sources.ts","../src/utils/all-image-sources.ts","../src/utils/image-size-key.ts","../src/utils/page-attachments.ts","../src/utils/read-kit-snapshot.ts","../src/utils/v1-snapshot.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/category-page.tsx","../src/hooks/use-single-expanded-card.ts","../src/components/category-icons.ts","../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-cta-button.tsx","../src/components/violation-icons.tsx","../src/components/pages/overview-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/severity-summary-cards.tsx","../src/components/rescan-button.tsx","../src/audits/accessibility-policy.ts","../src/audits/accessibility-statement.ts","../src/audits/accessibility-widget.ts","../src/utils/scan-accessibility-widgets.ts","../src/audits/cookie-policy.ts","../src/audits/deep-nesting.ts","../src/audits/default-design-system.ts","../src/audits/deprecated-widgets.ts","../src/audits/google-consent-mode.ts","../src/utils/scan-consent-signals.ts","../src/audits/heading-structure.ts","../src/audits/hidden-elements.ts","../src/audits/images-alt-text.ts","../src/utils/alt-text-image-sources.ts","../src/utils/image-alt.ts","../src/audits/images-inefficient-format.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/scan-for-cookies.ts","../src/audits/sections-and-columns.ts","../src/audits/site-identity.ts","../src/register-audits.ts","../src/sync-report-staleness.ts"],"sourcesContent":["export { init } from './init';\nexport { registerAudit } from './registry';\nexport { runPageAudit } from './runner';\nexport type {\n\tAudit,\n\tAuditCategory,\n\tAuditContext,\n\tAuditMeta,\n\tAuditResult,\n\tAuditRun,\n\tAuditSeverity,\n\tAuditViolation,\n\tPageAuditReport,\n} from './types';\n","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';\nimport { syncReportStaleness } from './sync-report-staleness';\n\nexport function init(): void {\n\tregisterSlice( slice );\n\tregisterAllAudits();\n\tregisterFloatingPanel( auditPanel.panel );\n\tregisterAppBarAuditsToggle();\n\tsyncReportStaleness();\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 { __ } from '@wordpress/i18n';\n\nimport AuditToggleIcon from '../components/audit-toggle-icon';\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: AuditToggleIcon,\n\t\tselected: isOpen,\n\t\tonClick: () => toggle(),\n\t};\n}\n","import * as React from 'react';\nimport { ShieldCheckIcon } from '@elementor/icons';\nimport { __useSelector as useSelector } from '@elementor/store';\nimport { Badge } from '@elementor/ui';\n\nimport { type GlobalState, selectIsStale } from '../store';\n\nexport default function AuditToggleIcon() {\n\tconst isStale = useSelector( ( state: GlobalState ) => selectIsStale( state ) );\n\n\treturn (\n\t\t<Badge\n\t\t\tvariant=\"dot\"\n\t\t\tcolor=\"warning\"\n\t\t\tinvisible={ ! isStale }\n\t\t\toverlap=\"circular\"\n\t\t\tslotProps={ { badge: { 'data-testid': 'audit-stale-indicator' } } }\n\t\t>\n\t\t\t<ShieldCheckIcon />\n\t\t</Badge>\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\tisStale: boolean;\n};\n\nconst initialState: SliceState = { status: 'idle', report: null, error: null, isStale: false };\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\tstate.isStale = false;\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\trunAborted( state ) {\n\t\t\tstate.status = state.report ? 'ready' : 'idle';\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\tstate.isStale = false;\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\tstate.isStale = false;\n\t\t},\n\t\treportStale( state ) {\n\t\t\tif ( state.report ) {\n\t\t\t\tstate.isStale = true;\n\t\t\t}\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\nexport function selectIsStale( state: GlobalState ) {\n\treturn state.audits.isStale;\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 { getHostDocumentId } from '@elementor/editor-elements';\nimport { FloatingPanelBody, FloatingPanelFooter, FloatingPanelHeader } from '@elementor/editor-floating-panels';\nimport { Box, Typography } from '@elementor/ui';\nimport { __ } from '@wordpress/i18n';\n\nimport { AUDIT_PANEL_ID } from '../constants';\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';\nimport RescanButton from './rescan-button';\n\nexport default function AuditPanel() {\n\tconst { status, report, error, isStale, run } = useAuditReport();\n\n\tconst hostDocumentId = getHostDocumentId() ?? 0;\n\tconst onRun = () => run( hostDocumentId );\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_ID }\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\tsx={\n\t\t\t\t\tstatus === 'ready'\n\t\t\t\t\t\t? { display: 'flex', flexDirection: 'column', overflow: 'hidden', minHeight: 0 }\n\t\t\t\t\t\t: undefined\n\t\t\t\t}\n\t\t\t>\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<RescanButton\n\t\t\t\t\thasScanned={ Boolean( lastScanLabel ) }\n\t\t\t\t\tisStale={ isStale }\n\t\t\t\t\tdisabled={ status === 'loading' || hostDocumentId === 0 }\n\t\t\t\t\tonClick={ onRun }\n\t\t\t\t/>\n\t\t\t</FloatingPanelFooter>\n\t\t</>\n\t);\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: __( 'Site compliance', 'elementor' ),\n};\n","import { useEffect } from 'react';\nimport { getHostDocumentId } from '@elementor/editor-elements';\nimport { __useDispatch as useDispatch, __useSelector as useSelector } from '@elementor/store';\n\nimport { runPageAudit } from '../runner';\nimport { type GlobalState, selectError, selectIsStale, selectReport, selectStatus, slice } from '../store';\nimport { getPersistedReport, persistReport } from '../utils/report-storage';\nimport { SessionExpiredError } from '../utils/session-expiration';\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 isStale = useSelector( ( state: GlobalState ) => selectIsStale( state ) );\n\tconst dispatch = useDispatch();\n\tconst documentId = getHostDocumentId() ?? 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\tif ( e instanceof SessionExpiredError ) {\n\t\t\t\tdispatch( slice.actions.runAborted() );\n\t\t\t\treturn;\n\t\t\t}\n\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, isStale, run };\n}\n","import { getHostDocumentElements, getHostDocumentId } 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 { fetchRenderedHtml } from './utils/fetch-rendered-html';\nimport { extractImageSizeRequests } 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\tif ( documentId !== getHostDocumentId() ) {\n\t\tthrow new Error( 'runPageAudit: documentId must match the host document.' );\n\t}\n\n\tconst tree = buildSnapshotTree( getHostDocumentElements() );\n\tconst imageSizeRequests = extractImageSizeRequests( tree );\n\tconst pageContext = await fetchPageContext( documentId, imageSizeRequests );\n\n\tconst elements: ElementsModelSnapshot = { documentId, tree };\n\tconst [ kit, renderedHtml ]: [ KitSnapshot, string | null ] = await Promise.all( [\n\t\treadKitSnapshot( pageContext.kit_id ),\n\t\tfetchRenderedHtml( pageContext.frontend_url ),\n\t] );\n\n\tconst ctx: AuditContext = { documentId, elements, pageContext, kit, renderedHtml };\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 { isNonceInvalidError, refreshAuditsNonce } from '../utils/session-expiration';\nimport { getWindowConfig } from '../utils/window-config';\n\nexport async function fetchPageContext(\n\tdocumentId: number,\n\timageSizeRequests: string[]\n): Promise< PageContextResponse > {\n\treturn requestPageContext( documentId, imageSizeRequests, true );\n}\n\nasync function requestPageContext(\n\tdocumentId: number,\n\timageSizeRequests: string[],\n\tallowNonceRetry: boolean\n): Promise< PageContextResponse > {\n\tconst { restNamespace, nonce } = getWindowConfig();\n\tconst url = `${ restNamespace }/audits/page-context`;\n\n\ttry {\n\t\tconst response = await httpService().get< PageContextResponse >( url, {\n\t\t\tparams: {\n\t\t\t\tdocument_id: documentId,\n\t\t\t\timage_size_requests: imageSizeRequests,\n\t\t\t},\n\t\t\theaders: { 'X-WP-Nonce': nonce },\n\t\t} );\n\n\t\treturn response.data;\n\t} catch ( error ) {\n\t\tif ( ! allowNonceRetry || ! isNonceInvalidError( error ) ) {\n\t\t\tthrow error;\n\t\t}\n\n\t\tawait refreshAuditsNonce();\n\n\t\treturn requestPageContext( documentId, imageSizeRequests, false );\n\t}\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 { getWindowConfig } from './window-config';\n\nconst NONCE_INVALID_CODE = 'rest_cookie_invalid_nonce';\nconst DEFAULT_AJAX_URL = '/wp-admin/admin-ajax.php';\n\ntype AjaxErrorLikeResponse = {\n\tstatus?: number;\n\tdata?: { code?: string };\n};\n\ntype AjaxErrorLike = {\n\tresponse?: AjaxErrorLikeResponse;\n};\n\ntype SessionWindow = Window & {\n\telementorCommon?: { ajax?: { config?: { url?: string } } };\n};\n\nexport class SessionExpiredError extends Error {}\n\nlet nonceRefreshPromise: Promise< string > | null = null;\n\nexport function isNonceInvalidError( error: unknown ): boolean {\n\tconst response = ( error as AjaxErrorLike | undefined )?.response;\n\n\treturn response?.status === 403 && response?.data?.code === NONCE_INVALID_CODE;\n}\n\nexport async function refreshAuditsNonce(): Promise< string > {\n\tif ( nonceRefreshPromise ) {\n\t\treturn nonceRefreshPromise;\n\t}\n\n\tnonceRefreshPromise = requestFreshNonce();\n\n\ttry {\n\t\treturn await nonceRefreshPromise;\n\t} finally {\n\t\tnonceRefreshPromise = null;\n\t}\n}\n\nasync function requestFreshNonce(): Promise< string > {\n\tconst ajaxUrl = ( window as SessionWindow ).elementorCommon?.ajax?.config?.url ?? DEFAULT_AJAX_URL;\n\tconst url = new URL( ajaxUrl, window.location.origin );\n\turl.searchParams.set( 'action', 'rest-nonce' );\n\n\tconst response = await fetch( url.toString(), { credentials: 'same-origin' } );\n\n\tif ( ! response.ok ) {\n\t\tthrow new Error( `Failed to refresh audits nonce: HTTP ${ response.status }` );\n\t}\n\n\tconst nonce = await response.text();\n\n\tif ( ! nonce || '0' === nonce ) {\n\t\tthrow new SessionExpiredError( 'Session expired — received invalid nonce' );\n\t}\n\n\twindow.elementorAudits = { ...getWindowConfig(), nonce };\n\n\treturn nonce;\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 { type AuditMeta } from '../types';\n\nexport function isScoredAudit( audit: AuditMeta ): boolean {\n\treturn audit.weight > 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 { type AuditCategory, type AuditResult, type AuditRun, type PageAuditReport } from '../types';\nimport { isScoredAudit } from './is-scored-audit';\nimport { sortFailedAuditResults } from './sort-failed-audits';\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\n\t\t\t\tif ( isScoredAudit( run.audit ) ) {\n\t\t\t\t\ttotalViolations += run.result.violations.length;\n\t\t\t\t}\n\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 getPopulatedCategories(\n\tcategoryTotals: PageAuditReport[ 'categories' ],\n\tcategories: readonly AuditCategory[]\n): AuditCategory[] {\n\treturn categories.filter( ( category ) => categoryTotals[ category ].total > 0 );\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","const FETCH_TIMEOUT_MS = 10_000;\n\nexport async function fetchRenderedHtml( url: string | null ): Promise< string | null > {\n\tif ( ! url ) {\n\t\treturn null;\n\t}\n\n\tconst timeoutController = new AbortController();\n\tconst timeoutId = setTimeout( () => timeoutController.abort(), FETCH_TIMEOUT_MS );\n\n\ttry {\n\t\tconst response = await fetch( url, { credentials: 'omit', signal: timeoutController.signal } );\n\n\t\tif ( ! response.ok ) {\n\t\t\treturn null;\n\t\t}\n\n\t\treturn await response.text();\n\t} catch {\n\t\treturn null;\n\t} finally {\n\t\tclearTimeout( timeoutId );\n\t}\n}\n","import { getElementStyles } from '@elementor/editor-elements';\nimport {\n\tbackgroundImageOverlayPropTypeUtil,\n\tbackgroundOverlayPropTypeUtil,\n\tbackgroundPropTypeUtil,\n} from '@elementor/editor-props';\nimport { type StyleDefinition } from '@elementor/editor-styles';\n\nimport { type ElementSnapshotNode } from '../types';\nimport { extractAtomicImageMedia } from './atomic-image-sources';\nimport { type ImageLikeMedia } from './image-like-sources';\nimport { walkElements } from './walk';\n\nexport type AtomicBackgroundImageSourceVisit = {\n\tnode: ElementSnapshotNode;\n\tmedia: ImageLikeMedia;\n};\n\nexport function walkAtomicBackgroundImageSources(\n\ttree: ElementSnapshotNode[],\n\tvisit: ( source: AtomicBackgroundImageSourceVisit ) => void\n): void {\n\twalkElements( tree, ( node ) => {\n\t\tconst styles = getElementStyles( node.id );\n\n\t\tif ( ! styles ) {\n\t\t\treturn;\n\t\t}\n\n\t\tfor ( const media of extractBackgroundImageMedia( styles ) ) {\n\t\t\tvisit( { node, media } );\n\t\t}\n\t} );\n}\n\nfunction extractBackgroundImageMedia( styles: Record< string, StyleDefinition > ): ImageLikeMedia[] {\n\tconst sources: ImageLikeMedia[] = [];\n\n\tfor ( const style of Object.values( styles ) ) {\n\t\tfor ( const variant of style.variants ) {\n\t\t\tconst background = backgroundPropTypeUtil.extract( variant.props.background );\n\t\t\tconst overlays = backgroundOverlayPropTypeUtil.extract( background?.[ 'background-overlay' ] ) ?? [];\n\n\t\t\tfor ( const overlay of overlays ) {\n\t\t\t\tconst imageOverlay = backgroundImageOverlayPropTypeUtil.extract( overlay );\n\t\t\t\tconst media = extractAtomicImageMedia( imageOverlay?.image );\n\n\t\t\t\tif ( media ) {\n\t\t\t\t\tsources.push( media );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\treturn sources;\n}\n","import {\n\timageAttachmentIdPropType,\n\timagePropTypeUtil,\n\timageSrcPropTypeUtil,\n\tstringPropTypeUtil,\n\turlPropTypeUtil,\n} from '@elementor/editor-props';\n\nimport { type ElementSnapshotNode } from '../types';\nimport { type ImageLikeMedia } from './image-like-sources';\nimport { walkElements } from './walk';\n\nexport const ATOMIC_CONTENT_IMAGE_PROP_KEYS = [ 'image' ] as const;\n\nconst ATOMIC_IMAGE_PROP_KEYS = [ ...ATOMIC_CONTENT_IMAGE_PROP_KEYS, 'poster' ] as const;\n\nexport type AtomicImageSourceVisit = {\n\tnode: ElementSnapshotNode;\n\tmedia: ImageLikeMedia;\n};\n\nexport function walkAtomicImageSources(\n\ttree: ElementSnapshotNode[],\n\tvisit: ( source: AtomicImageSourceVisit ) => void,\n\tpropKeys: readonly string[] = ATOMIC_IMAGE_PROP_KEYS\n): void {\n\twalkElements( tree, ( node ) => {\n\t\tif ( node.elType !== 'widget' ) {\n\t\t\treturn;\n\t\t}\n\n\t\tfor ( const key of propKeys ) {\n\t\t\tconst media = extractAtomicImageMedia( node.settings[ key ] );\n\n\t\t\tif ( media ) {\n\t\t\t\tvisit( { node, media } );\n\t\t\t}\n\t\t}\n\t} );\n}\n\nexport function extractAtomicImageMedia( imageProp: unknown ): ImageLikeMedia | null {\n\tconst image = imagePropTypeUtil.extract( imageProp );\n\n\tif ( ! image ) {\n\t\treturn null;\n\t}\n\n\tconst src = imageSrcPropTypeUtil.extract( image.src );\n\n\tif ( ! src ) {\n\t\treturn null;\n\t}\n\n\tconst id = imageAttachmentIdPropType.extract( src.id ) ?? undefined;\n\tconst url = urlPropTypeUtil.extract( src.url ) ?? undefined;\n\n\tif ( ! id && ! url ) {\n\t\treturn null;\n\t}\n\n\tconst alt = stringPropTypeUtil.extract( src.alt ) ?? undefined;\n\tconst size = stringPropTypeUtil.extract( image.size ) ?? undefined;\n\n\treturn { id, url, alt, size };\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 { type ImageLikeMedia } from './image-like-sources';\nimport { walkElements } from './walk';\n\nconst BACKGROUND_IMAGE_SETTING_KEYS = [\n\t'background_image',\n\t'background_hover_image',\n\t'background_overlay_image',\n\t'background_overlay_hover_image',\n\t'_background_image',\n\t'_background_hover_image',\n] as const;\n\nexport type BackgroundImageSourceVisit = {\n\tnode: ElementSnapshotNode;\n\tmedia: ImageLikeMedia;\n};\n\nexport function walkBackgroundImageSources(\n\ttree: ElementSnapshotNode[],\n\tvisit: ( source: BackgroundImageSourceVisit ) => void\n): void {\n\twalkElements( tree, ( node ) => {\n\t\tfor ( const key of BACKGROUND_IMAGE_SETTING_KEYS ) {\n\t\t\tconst media = node.settings[ key ] as ImageLikeMedia | undefined;\n\n\t\t\tif ( media?.id || media?.url ) {\n\t\t\t\tvisit( { node, media } );\n\t\t\t}\n\t\t}\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\tsize?: string;\n};\n\nexport type ImageLikeSourceVisit = {\n\tnode: ElementSnapshotNode;\n\tmedia: ImageLikeMedia;\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, size: node.settings.image_size as string | undefined } );\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\tconst gallerySize = node.settings.thumbnail_size as string | undefined;\n\n\t\tfor ( const item of gallery ) {\n\t\t\tif ( item?.id || item?.url ) {\n\t\t\t\tsources.push( { ...item, size: gallerySize } );\n\t\t\t}\n\t\t}\n\t}\n\n\treturn sources;\n}\n","import { type ElementSnapshotNode } from '../types';\nimport { walkAtomicBackgroundImageSources } from './atomic-background-image-sources';\nimport { walkAtomicImageSources } from './atomic-image-sources';\nimport { walkBackgroundImageSources } from './background-image-sources';\nimport { type ImageLikeMedia, walkImageLikeSources } from './image-like-sources';\n\nexport type ImageSourceVisit = {\n\tnode: ElementSnapshotNode;\n\tmedia: ImageLikeMedia;\n};\n\nexport function walkAllImageSources( tree: ElementSnapshotNode[], visit: ( source: ImageSourceVisit ) => void ): void {\n\twalkImageLikeSources( tree, visit );\n\twalkBackgroundImageSources( tree, visit );\n\twalkAtomicImageSources( tree, visit );\n\twalkAtomicBackgroundImageSources( tree, visit );\n}\n","export type ImageSizeRequest = {\n\tid: number;\n\tsize?: string;\n};\n\nexport function buildImageSizeKey( { id, size }: ImageSizeRequest ): string {\n\treturn `${ id }:${ size || 'full' }`;\n}\n","import { type ElementSnapshotNode } from '../types';\nimport { walkAllImageSources } from './all-image-sources';\nimport { buildImageSizeKey } from './image-size-key';\n\nexport function extractImageSizeRequests( tree: ElementSnapshotNode[] ): string[] {\n\tconst keys = new Set< string >();\n\n\twalkAllImageSources( tree, ( { media } ) => {\n\t\tif ( media.id ) {\n\t\t\tkeys.add( buildImageSizeKey( { id: media.id, size: media.size } ) );\n\t\t}\n\t} );\n\n\treturn Array.from( keys ).sort();\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 { 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 { useFloatingPanelZIndex } from '@elementor/editor-floating-panels';\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\tAUDIT_PANEL_ID,\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\tconst panelZIndex = useFloatingPanelZIndex( AUDIT_PANEL_ID );\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\" PopperProps={ { sx: { zIndex: panelZIndex } } }>\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 } from '@elementor/ui';\n\nimport { type AuditCategory, type PageAuditReport } from '../types';\nimport CategoryPage from './pages/category-page';\nimport OverviewPage from './pages/overview-page';\n\ntype ActivePage = 'overview' | { category: AuditCategory };\n\ntype Props = {\n\treport: PageAuditReport;\n};\n\nfunction isCategoryPage( page: ActivePage ): page is { 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 openCategory = ( category: AuditCategory ) => setActivePage( { category } );\n\tconst backToOverview = () => setActivePage( 'overview' );\n\n\treturn (\n\t\t<Box sx={ { flex: 1, minHeight: 0, overflowY: 'auto' } }>\n\t\t\t{ activePage === 'overview' && <OverviewPage report={ report } onCategoryClick={ openCategory } /> }\n\t\t\t{ isCategoryPage( activePage ) && (\n\t\t\t\t<CategoryPage category={ activePage.category } report={ report } onBack={ backToOverview } />\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 { CATEGORY_LABELS } from '../../constants';\nimport { useSingleExpandedCard } from '../../hooks/use-single-expanded-card';\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, skipped, totalViolations } = partitionAuditResults( report, { category } );\n\tconst { expandedId, toggle } = useSingleExpandedCard();\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\n\t\t\t\t\t\t\tkey={ r.audit.id }\n\t\t\t\t\t\t\taudit={ r.audit }\n\t\t\t\t\t\t\tviolations={ r.result.violations }\n\t\t\t\t\t\t\texpanded={ expandedId === r.audit.id }\n\t\t\t\t\t\t\tonToggleExpand={ () => toggle( r.audit.id ) }\n\t\t\t\t\t\t/>\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\n\t\t\t\t\t\t\tkey={ r.audit.id }\n\t\t\t\t\t\t\taudit={ r.audit }\n\t\t\t\t\t\t\texpanded={ expandedId === r.audit.id }\n\t\t\t\t\t\t\tonToggleExpand={ () => toggle( r.audit.id ) }\n\t\t\t\t\t\t/>\n\t\t\t\t\t) ) }\n\t\t\t\t</StatusSection>\n\t\t\t\t<StatusSection label={ __( 'Skipped audits', 'elementor' ) } count={ skipped.length } color=\"default\">\n\t\t\t\t\t{ skipped.map( ( r ) => (\n\t\t\t\t\t\t<ViolationRow\n\t\t\t\t\t\t\tkey={ r.audit.id }\n\t\t\t\t\t\t\taudit={ r.audit }\n\t\t\t\t\t\t\tskipReason={ r.result.reason }\n\t\t\t\t\t\t\texpanded={ expandedId === r.audit.id }\n\t\t\t\t\t\t\tonToggleExpand={ () => toggle( r.audit.id ) }\n\t\t\t\t\t\t/>\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 { useState } from 'react';\n\nexport function useSingleExpandedCard( initialId: string | null = null ) {\n\tconst [ expandedId, setExpandedId ] = useState< string | null >( initialId );\n\n\tconst toggle = ( id: string ) => {\n\t\tsetExpandedId( ( current ) => ( current === id ? null : id ) );\n\t};\n\n\treturn { expandedId, toggle };\n}\n","import { BoltIcon, ElementorAccessibilityIcon, FileSearchIcon, Settings2Icon, ShieldCheckIcon } 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: FileSearchIcon,\n\taccessibility: ElementorAccessibilityIcon,\n\tperformance: BoltIcon,\n\tcompliance: ShieldCheckIcon,\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 ( React.Children.count( children ) === 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 { getElementIcon, getElementTitle } from '@elementor/editor-elements';\nimport { useFloatingPanelZIndex } from '@elementor/editor-floating-panels';\nimport { CheckIcon, ChevronDownIcon, HelpIcon, InfoCircleIcon } from '@elementor/icons';\nimport { Alert, Box, Collapse, IconButton, Tooltip, Typography } from '@elementor/ui';\nimport { __ } from '@wordpress/i18n';\n\nimport { AUDIT_PANEL_ID } from '../constants';\nimport { focusViolation } from '../hooks/focus-violation';\nimport { type AuditMeta, type AuditViolation } from '../types';\nimport { buildAngiePrompt } from '../utils/build-angie-prompt';\nimport { isScoredAudit } from '../utils/is-scored-audit';\nimport { onKeyboardClick } from '../utils/keyboard-click';\nimport FixViolationWithAngie from './fix-violation-with-angie';\nimport SeverityIcon from './severity-icons';\nimport ViolationCtaButton from './violation-cta-button';\nimport ViolationIcon from './violation-icons';\n\ntype Props = {\n\taudit: AuditMeta;\n\texpanded: boolean;\n\tonToggleExpand: () => void;\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<SeverityIcon severity={ audit.severity } />\n\t\t\t\t{ isScoredAudit( audit ) && (\n\t\t\t\t\t<Typography variant=\"caption\" color=\"text.secondary\" fontWeight=\"bold\">\n\t\t\t\t\t\t{ violations.length }\n\t\t\t\t\t</Typography>\n\t\t\t\t) }\n\t\t\t</>\n\t\t);\n\t}\n\n\treturn <CheckIcon fontSize=\"small\" color=\"success\" />;\n}\n\nfunction GuidanceAction( {\n\tviolation,\n\tsharedAngiePrompt,\n\tpanelZIndex,\n}: {\n\tviolation: AuditViolation;\n\tsharedAngiePrompt?: string;\n\tpanelZIndex: number;\n} ) {\n\tconst hasPrimaryCta = !! ( violation.ctaLabel && violation.externalUrl );\n\n\tif ( ! hasPrimaryCta && ! sharedAngiePrompt ) {\n\t\treturn null;\n\t}\n\n\treturn (\n\t\t<Box display=\"flex\" alignItems=\"center\" gap={ 1 } mt={ 1 }>\n\t\t\t{ hasPrimaryCta && (\n\t\t\t\t<ViolationCtaButton\n\t\t\t\t\tctaLabel={ violation.ctaLabel as string }\n\t\t\t\t\texternalUrl={ violation.externalUrl as string }\n\t\t\t\t\twithIcon\n\t\t\t\t/>\n\t\t\t) }\n\t\t\t{ hasPrimaryCta && violation.secondaryCtaLabel && violation.secondaryCtaUrl && (\n\t\t\t\t<ViolationCtaButton\n\t\t\t\t\tctaLabel={ violation.secondaryCtaLabel }\n\t\t\t\t\texternalUrl={ violation.secondaryCtaUrl }\n\t\t\t\t\tvariant=\"text\"\n\t\t\t\t/>\n\t\t\t) }\n\t\t\t{ sharedAngiePrompt && (\n\t\t\t\t<FixViolationWithAngie prompt={ sharedAngiePrompt } panelZIndex={ panelZIndex } variant=\"button\" />\n\t\t\t) }\n\t\t</Box>\n\t);\n}\n\nfunction getSharedAngiePrompt( violations?: AuditViolation[] ): string | undefined {\n\tif ( ! violations || violations.length < 2 ) {\n\t\treturn undefined;\n\t}\n\n\tconst [ first, ...rest ] = violations;\n\n\tif ( ! first.angieFix || ! first.angiePrompt ) {\n\t\treturn undefined;\n\t}\n\n\tconst allShareTheSameFix = rest.every(\n\t\t( violation ) => violation.angieFix && violation.angiePrompt === first.angiePrompt\n\t);\n\n\treturn allShareTheSameFix ? first.angiePrompt : undefined;\n}\n\nexport default function ViolationRow( { audit, expanded, onToggleExpand, skipReason, violations }: Props ) {\n\tconst primaryViolation = violations?.[ 0 ];\n\tconst isGuidanceFocusable = !! primaryViolation;\n\tconst panelZIndex = useFloatingPanelZIndex( AUDIT_PANEL_ID );\n\tconst sharedAngiePrompt = getSharedAngiePrompt( violations );\n\n\tconst handleGuidanceClick = () => {\n\t\tif ( isGuidanceFocusable && primaryViolation ) {\n\t\t\tfocusViolation( primaryViolation );\n\t\t}\n\t};\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={ onToggleExpand }\n\t\t\t\t>\n\t\t\t\t\t<Typography variant=\"subtitle2\" color=\"text.secondary\" 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={ onToggleExpand }\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 paddingBlock={ 1 }>\n\t\t\t\t\t<Tooltip title={ audit.fixHint } placement=\"top\">\n\t\t\t\t\t\t<Alert\n\t\t\t\t\t\t\tseverity=\"secondary\"\n\t\t\t\t\t\t\tsx={ { p: 1, cursor: isGuidanceFocusable ? 'pointer' : undefined } }\n\t\t\t\t\t\t\ticon={ <InfoCircleIcon fontSize=\"small\" aria-hidden={ true } /> }\n\t\t\t\t\t\t\trole={ isGuidanceFocusable ? 'button' : undefined }\n\t\t\t\t\t\t\ttabIndex={ isGuidanceFocusable ? 0 : undefined }\n\t\t\t\t\t\t\tonClick={ isGuidanceFocusable ? handleGuidanceClick : undefined }\n\t\t\t\t\t\t\tonKeyDown={ isGuidanceFocusable ? onKeyboardClick( handleGuidanceClick ) : undefined }\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<Typography variant=\"caption\" component=\"p\" color=\"text.secondary\">\n\t\t\t\t\t\t\t\t{ audit.description }\n\t\t\t\t\t\t\t</Typography>\n\t\t\t\t\t\t\t{ primaryViolation && (\n\t\t\t\t\t\t\t\t<GuidanceAction\n\t\t\t\t\t\t\t\t\tviolation={ primaryViolation }\n\t\t\t\t\t\t\t\t\tsharedAngiePrompt={ sharedAngiePrompt }\n\t\t\t\t\t\t\t\t\tpanelZIndex={ panelZIndex }\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t) }\n\t\t\t\t\t\t</Alert>\n\t\t\t\t\t</Tooltip>\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 } }>\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 displayLabel = elementTitle ?? violation.label;\n\t\t\t\t\t\t\tconst angiePromptContext = 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\t\t\t\t\t\t\tconst showsOwnFixAction = !! violation.angieFix && ! sharedAngiePrompt;\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: 1,\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'&:hover': { bgcolor: 'action.hover' },\n\t\t\t\t\t\t\t\t\t\t'&:hover .violation-row-fix-action, &:focus-visible .violation-row-fix-action':\n\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\topacity: 1,\n\t\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\">{ displayLabel }</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{ showsOwnFixAction && (\n\t\t\t\t\t\t\t\t\t\t<Box\n\t\t\t\t\t\t\t\t\t\t\tclassName=\"violation-row-fix-action\"\n\t\t\t\t\t\t\t\t\t\t\tsx={ { opacity: 0, transition: 'opacity .15s' } }\n\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t<FixViolationWithAngie\n\t\t\t\t\t\t\t\t\t\t\t\tprompt={\n\t\t\t\t\t\t\t\t\t\t\t\t\tviolation.angiePrompt ?? buildAngiePrompt( angiePromptContext )\n\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\tpanelZIndex={ panelZIndex }\n\t\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t\t</Box>\n\t\t\t\t\t\t\t\t\t) }\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 { Button, 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\tpanelZIndex: number;\n\tvariant?: 'icon' | 'button';\n};\n\nexport default function FixViolationWithAngie( { prompt, panelZIndex, variant = 'icon' }: 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\tif ( variant === 'button' ) {\n\t\treturn (\n\t\t\t<Button\n\t\t\t\tcomponent=\"a\"\n\t\t\t\thref={ href }\n\t\t\t\tsize=\"small\"\n\t\t\t\tcolor=\"secondary\"\n\t\t\t\tvariant=\"outlined\"\n\t\t\t\tstartIcon={ <AngieIcon fontSize=\"tiny\" aria-hidden={ true } /> }\n\t\t\t\tonClick={ handleClick }\n\t\t\t>\n\t\t\t\t{ label }\n\t\t\t</Button>\n\t\t);\n\t}\n\n\treturn (\n\t\t<Tooltip title={ label } placement=\"top\" PopperProps={ { sx: { zIndex: panelZIndex } } }>\n\t\t\t<IconButton component=\"a\" href={ href } size=\"small\" aria-label={ label } onClick={ handleClick }>\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, BulbIcon } 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: BulbIcon, color: 'info' },\n};\n\ntype Props = {\n\tseverity: AuditSeverity;\n};\n\nconst INFO_ICON_VERTICAL_NUDGE = 'translateY(-2px)';\n\nexport default function SeverityIcon( { severity }: Props ) {\n\tconst { Icon, color } = SEVERITY_CONFIG[ severity ];\n\tconst sx = 'info' === severity ? { transform: INFO_ICON_VERTICAL_NUDGE } : undefined;\n\n\treturn <Icon fontSize=\"small\" color={ color } sx={ sx } />;\n}\n","import * as React from 'react';\nimport { WandIcon } from '@elementor/icons';\nimport { Button } from '@elementor/ui';\n\ntype Props = {\n\tctaLabel: string;\n\texternalUrl: string;\n\tvariant?: 'outlined' | 'text';\n\twithIcon?: boolean;\n};\n\nexport default function ViolationCtaButton( { ctaLabel, externalUrl, variant = 'outlined', withIcon = false }: Props ) {\n\tconst handleClick = ( event: React.MouseEvent< HTMLButtonElement > ) => {\n\t\tevent.stopPropagation();\n\t\tevent.preventDefault();\n\n\t\twindow.open( externalUrl, '_blank', 'noopener' );\n\t};\n\n\treturn (\n\t\t<Button\n\t\t\tvariant={ variant }\n\t\t\tcolor=\"secondary\"\n\t\t\tsize=\"small\"\n\t\t\tstartIcon={ withIcon ? <WandIcon fontSize=\"tiny\" aria-hidden={ true } /> : undefined }\n\t\t\tonClick={ handleClick }\n\t\t>\n\t\t\t{ ctaLabel }\n\t\t</Button>\n\t);\n}\n","import * as React from 'react';\nimport { FileSettingsIcon, SettingsIcon } 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 <SettingsIcon fontSize=\"inherit\" aria-hidden={ true } />;\n}\n","import * as React from 'react';\nimport { Box, 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';\nimport SeveritySummaryCards from '../severity-summary-cards';\n\ntype Props = {\n\tonCategoryClick: ( category: AuditCategory ) => void;\n\treport: PageAuditReport;\n};\n\nexport default function OverviewPage( { onCategoryClick, report }: Props ) {\n\tconst populatedCategories = getPopulatedCategories( report.categories, ALL_CATEGORIES );\n\n\tconst categoryRows = populatedCategories\n\t\t.map( ( category ) => ( { category, counts: countSeverities( report, category ) } ) )\n\t\t.filter( ( { counts } ) => Object.values( counts ).some( ( count ) => count > 0 ) );\n\n\treturn (\n\t\t<Box display=\"flex\" flexDirection=\"column\" gap={ 3 } p={ 2 }>\n\t\t\t<SeveritySummaryCards report={ report } />\n\t\t\t<Box display=\"flex\" flexDirection=\"column\" gap={ 1 }>\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\t<Box display=\"flex\" flexDirection=\"column\" gap={ 1 }>\n\t\t\t\t\t{ categoryRows.map( ( { category, counts } ) => (\n\t\t\t\t\t\t<IssuesCategoryRow\n\t\t\t\t\t\t\tkey={ category }\n\t\t\t\t\t\t\tcategory={ category }\n\t\t\t\t\t\t\tlabel={ CATEGORY_LABELS[ category ] }\n\t\t\t\t\t\t\tcounts={ counts }\n\t\t\t\t\t\t\tonClick={ () => onCategoryClick( category ) }\n\t\t\t\t\t\t/>\n\t\t\t\t\t) ) }\n\t\t\t\t</Box>\n\t\t\t</Box>\n\t\t\t<Promotions report={ report } />\n\t\t</Box>\n\t);\n}\n","import { __ } from '@wordpress/i18n';\n\nimport { type AuditCategory, type AuditSeverity, type PageAuditReport } from '../types';\nimport { isScoredAudit } from './is-scored-audit';\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\tif ( ! isScoredAudit( audit ) ) {\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 __( 'Suggestions', 'elementor' );\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, Divider, 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<Divider />\n\t\t\t<Typography variant=\"subtitle1\" fontWeight=\"bold\">\n\t\t\t\t{ __( 'Quick actions', '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/scan-for-cookies',\n\t\ticon: ElementorCookieIcon,\n\t\tctaLabel: __( 'Scan', 'elementor' ),\n\t\tformatSubtitle: ( run ) =>\n\t\t\trun.result.status === 'fail' ? __( 'Scan this page for cookies', '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, Typography } from '@elementor/ui';\n\nimport { type AuditSeverity, type PageAuditReport } from '../types';\nimport { ALL_SEVERITIES, countSeverities, severityPluralLabel } from '../utils/severity-counts';\nimport SeverityIcon from './severity-icons';\n\ntype Props = {\n\treport: PageAuditReport;\n};\n\nexport default function SeveritySummaryCards( { report }: Props ) {\n\tconst counts = countSeverities( report );\n\n\treturn (\n\t\t<Box display=\"flex\" gap={ 1.5 }>\n\t\t\t{ ALL_SEVERITIES.map( ( severity ) => (\n\t\t\t\t<SeverityCard key={ severity } severity={ severity } count={ counts[ severity ] } />\n\t\t\t) ) }\n\t\t</Box>\n\t);\n}\n\ntype SeverityCardProps = {\n\tseverity: AuditSeverity;\n\tcount: number;\n};\n\nfunction SeverityCard( { severity, count }: SeverityCardProps ) {\n\treturn (\n\t\t<Box\n\t\t\tdisplay=\"flex\"\n\t\t\tflex={ 1 }\n\t\t\tflexDirection=\"column\"\n\t\t\tgap={ 1 }\n\t\t\tbgcolor=\"action.hover\"\n\t\t\tborderRadius={ 1.5 }\n\t\t\tpx={ 1.5 }\n\t\t\tpy={ 1 }\n\t\t>\n\t\t\t<SeverityIcon severity={ severity } />\n\t\t\t<Box display=\"flex\" flexDirection=\"column\">\n\t\t\t\t<Typography variant=\"h5\" fontWeight={ 700 } component=\"span\">\n\t\t\t\t\t{ count }\n\t\t\t\t</Typography>\n\t\t\t\t<Typography variant=\"caption\" color=\"text.secondary\">\n\t\t\t\t\t{ severityPluralLabel( severity ) }\n\t\t\t\t</Typography>\n\t\t\t</Box>\n\t\t</Box>\n\t);\n}\n","import * as React from 'react';\nimport { useFloatingPanelZIndex } from '@elementor/editor-floating-panels';\nimport { ReloadIcon } from '@elementor/icons';\nimport { Badge, Button, Tooltip } from '@elementor/ui';\nimport { __ } from '@wordpress/i18n';\n\nimport { AUDIT_PANEL_ID } from '../constants';\n\ntype Props = {\n\thasScanned: boolean;\n\tisStale: boolean;\n\tdisabled: boolean;\n\tonClick: () => void;\n};\n\nexport default function RescanButton( { hasScanned, isStale, disabled, onClick }: Props ) {\n\tconst panelZIndex = useFloatingPanelZIndex( AUDIT_PANEL_ID );\n\n\treturn (\n\t\t<Tooltip\n\t\t\ttitle={ __( 'Page content changed - rescan advised', 'elementor' ) }\n\t\t\tdisableHoverListener={ ! isStale }\n\t\t\tPopperProps={ { sx: { zIndex: panelZIndex } } }\n\t\t>\n\t\t\t<Badge variant=\"dot\" color=\"warning\" invisible={ ! isStale } overlap=\"rectangular\">\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\tstartIcon={ hasScanned ? <ReloadIcon fontSize=\"small\" /> : undefined }\n\t\t\t\t\tonClick={ onClick }\n\t\t\t\t\tdisabled={ disabled }\n\t\t\t\t>\n\t\t\t\t\t{ hasScanned ? __( 'Rescan', 'elementor' ) : __( 'Run page audit', 'elementor' ) }\n\t\t\t\t</Button>\n\t\t\t</Badge>\n\t\t</Tooltip>\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/accessibility-statement',\n\ttitle: __( 'Create an accessibility statement', 'elementor' ),\n\tdescription: __(\n\t\t'An accessibility statement showcases your efforts to create an inclusive online space, highlighting helpful features and a commitment to accessibility.',\n\t\t'elementor'\n\t),\n\tfixHint: __( 'Use Ally to create and publish an accessibility statement for your site.', 'elementor' ),\n\tcategories: [ 'accessibility' ],\n\tseverity: 'info',\n\tweight: 1,\n\tevaluate: ( ctx ) => {\n\t\tconst isReady = ctx.pageContext.ally_plugin_active;\n\n\t\tif ( isReady && ctx.pageContext.ally_accessibility_statement_created ) {\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 accessibility statement has been created for this site.', 'elementor' ),\n\t\t\t\t\texternalUrl: isReady\n\t\t\t\t\t\t? ctx.pageContext.ally_accessibility_statement_url\n\t\t\t\t\t\t: ctx.pageContext.ally_plugin_url,\n\t\t\t\t\tctaLabel: __( 'Create', 'elementor' ),\n\t\t\t\t\tsecondaryCtaLabel: __( 'Learn more', 'elementor' ),\n\t\t\t\t\tsecondaryCtaUrl: 'https://elementor.com/help/start-using-ally/#statement',\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';\nimport { hasAccessibilityWidgetScript } from '../utils/scan-accessibility-widgets';\n\nexport const audit: Audit = {\n\tid: 'audits/accessibility-widget',\n\ttitle: __( 'Add an accessibility widget', 'elementor' ),\n\tdescription: __( 'Make your site more inclusive by adding an accessibility widget.', 'elementor' ),\n\tfixHint: __( 'Activate Ally’s accessibility widget to give visitors on-page accessibility tools.', 'elementor' ),\n\tcategories: [ 'accessibility' ],\n\tseverity: 'info',\n\tweight: 1,\n\tevaluate: ( ctx ) => {\n\t\tif ( ! ctx.pageContext.frontend_url ) {\n\t\t\treturn { status: 'skipped', reason: __( 'Page is not published.', 'elementor' ) };\n\t\t}\n\n\t\tif ( ! ctx.renderedHtml ) {\n\t\t\treturn { status: 'skipped', reason: __( 'Could not fetch the published page.', 'elementor' ) };\n\t\t}\n\n\t\tif ( hasAccessibilityWidgetScript( ctx.renderedHtml ) ) {\n\t\t\treturn { status: 'pass' };\n\t\t}\n\n\t\tconst isReady = ctx.pageContext.ally_plugin_active;\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 accessibility widget is active on this site.', 'elementor' ),\n\t\t\t\t\texternalUrl: isReady ? ctx.pageContext.ally_widget_settings_url : ctx.pageContext.ally_plugin_url,\n\t\t\t\t\tctaLabel: __( 'Activate', 'elementor' ),\n\t\t\t\t},\n\t\t\t],\n\t\t};\n\t},\n};\n","// Script sources of known accessibility widgets. Ally is listed first; append third-party\n// widget script sources here (UserWay, AccessiBe, EqualWeb, etc.) once confirmed.\nconst ACCESSIBILITY_WIDGET_SCRIPT_SOURCES = [ 'cdn.elementor.com/a11y/widget.js' ];\n\nexport function hasAccessibilityWidgetScript( html: string ): boolean {\n\treturn ACCESSIBILITY_WIDGET_SCRIPT_SOURCES.some( ( src ) => html.includes( src ) );\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\tctaLabel: __( 'Set up cookie consent', 'elementor' ),\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, type ElementSnapshotNode } from '../types';\nimport { walkElements } from '../utils/walk';\n\nconst MAX_NESTING_DEPTH = 6;\n\nfunction isNestingElement( node: ElementSnapshotNode, widgetsCache: ReturnType< typeof getWidgetsCache > ): boolean {\n\tif ( node.elType === 'container' ) {\n\t\treturn true;\n\t}\n\n\treturn !! widgetsCache?.[ node.elType ]?.meta?.is_container;\n}\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 widgetsCache = getWidgetsCache();\n\t\tconst violations: AuditViolation[] = [];\n\n\t\twalkElements( ctx.elements.tree, ( node, parents ) => {\n\t\t\tif ( ! isNestingElement( node, widgetsCache ) ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst depth = parents.filter( ( parent ) => isNestingElement( parent, widgetsCache ) ).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 } from '../types';\nimport { hasConsentDefaultCall, hasGoogleTracking } from '../utils/scan-consent-signals';\n\nexport const audit: Audit = {\n\tid: 'audits/google-consent-mode',\n\ttitle: __( 'Google Consent Mode', 'elementor' ),\n\tdescription: __(\n\t\t'Google Analytics, Ads, or Tag Manager are running on this site and may not receive a consent signal, which risks losing conversion/analytics data and compliance exposure.',\n\t\t'elementor'\n\t),\n\tfixHint: __(\n\t\t'Turn on Google Consent Mode in your cookie consent plugin so Google tags respect visitor consent choices.',\n\t\t'elementor'\n\t),\n\tcategories: [ 'compliance' ],\n\tseverity: 'warning',\n\tweight: 1,\n\tevaluate: ( ctx ) => {\n\t\tif ( ! ctx.pageContext.frontend_url ) {\n\t\t\treturn { status: 'skipped', reason: __( 'Page is not published.', 'elementor' ) };\n\t\t}\n\n\t\tif ( ! ctx.renderedHtml ) {\n\t\t\treturn { status: 'skipped', reason: __( 'Could not fetch the published page.', 'elementor' ) };\n\t\t}\n\n\t\tif ( ! hasGoogleTracking( ctx.renderedHtml ) ) {\n\t\t\treturn { status: 'skipped', reason: __( 'No Google tracking product detected.', 'elementor' ) };\n\t\t}\n\n\t\tif ( hasConsentDefaultCall( ctx.renderedHtml ) ) {\n\t\t\treturn { status: 'pass' };\n\t\t}\n\n\t\tconst label = __( 'No Google Consent Mode signal was found on the page.', 'elementor' );\n\t\tconst isCookiezReady = ctx.pageContext.cookiez_plugin_installed && ctx.pageContext.cookiez_plugin_active;\n\n\t\tif ( isCookiezReady ) {\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,\n\t\t\t\t\t\tctaLabel: __( 'Enable', 'elementor' ),\n\t\t\t\t\t\texternalUrl: ctx.pageContext.cookiez_consent_mode_settings_url,\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t};\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,\n\t\t\t\t\texternalUrl: ctx.pageContext.cookiez_plugin_action_url,\n\t\t\t\t},\n\t\t\t],\n\t\t};\n\t},\n};\n","const GOOGLE_TRACKING_PATTERNS = [\n\t/googletagmanager\\.com\\/gtag\\/js\\?id=(G|AW)-/,\n\t/googletagmanager\\.com\\/gtm\\.js/,\n\t/\\bGTM-[A-Z0-9]+\\b/,\n\t/gtag\\(\\s*['\"]config['\"]\\s*,\\s*['\"](G|AW)-/,\n];\n\nconst CONSENT_DEFAULT_PATTERNS = [\n\t/gtag\\(\\s*['\"]consent['\"]\\s*,\\s*['\"]default['\"]/,\n\t/dataLayer\\.push\\(\\s*\\[\\s*['\"]consent['\"]\\s*,\\s*['\"]default['\"]/,\n];\n\nexport function hasGoogleTracking( html: string ): boolean {\n\treturn GOOGLE_TRACKING_PATTERNS.some( ( pattern ) => pattern.test( html ) );\n}\n\nexport function hasConsentDefaultCall( html: string ): boolean {\n\treturn CONSENT_DEFAULT_PATTERNS.some( ( pattern ) => pattern.test( html ) );\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 { hasAltTextImages, walkAltTextImageSources } from '../utils/alt-text-image-sources';\nimport { hasMeaningfulAlt, isImageSourcePresent } from '../utils/image-alt';\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 ( ! hasAltTextImages( ctx.elements.tree ) ) {\n\t\t\treturn { status: 'skipped', reason: __( 'No images', 'elementor' ) };\n\t\t}\n\n\t\tconst isReady = ctx.pageContext.ally_plugin_active;\n\t\tconst violations: AuditViolation[] = [];\n\t\tconst failedWidgetIds = new Set< string >();\n\t\tlet missingAltImageCount = 0;\n\n\t\twalkAltTextImageSources( 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: isReady ? ctx.pageContext.ally_scan_url : ctx.pageContext.ally_plugin_url,\n\t\t\t\t\tctaLabel: __( 'Fix with Ally', 'elementor' ),\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 ElementSnapshotNode } from '../types';\nimport { type ImageSourceVisit } from './all-image-sources';\nimport { ATOMIC_CONTENT_IMAGE_PROP_KEYS, walkAtomicImageSources } from './atomic-image-sources';\nimport { walkImageLikeSources } from './image-like-sources';\n\nexport function walkAltTextImageSources(\n\ttree: ElementSnapshotNode[],\n\tvisit: ( source: ImageSourceVisit ) => void\n): void {\n\twalkImageLikeSources( tree, visit );\n\twalkAtomicImageSources( tree, visit, ATOMIC_CONTENT_IMAGE_PROP_KEYS );\n}\n\nexport function hasAltTextImages( tree: ElementSnapshotNode[] ): boolean {\n\tlet found = false;\n\n\twalkAltTextImageSources( 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","import { type PageContextResponse } from '../types';\nimport { type ImageLikeMedia } from './image-like-sources';\nimport { buildImageSizeKey } from './image-size-key';\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 key = buildImageSizeKey( { id: media.id, size: media.size } );\n\t\tconst alt = pageContext.image_sizes[ key ]?.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 { __ } from '@wordpress/i18n';\n\nimport { type Audit, type AuditViolation, type ElementSnapshotNode } from '../types';\nimport { walkAllImageSources } from '../utils/all-image-sources';\nimport { type ImageLikeMedia } from '../utils/image-like-sources';\nimport { buildImageSizeKey } from '../utils/image-size-key';\n\nconst LEGACY_RASTER_MIME_TYPES = new Set( [ 'image/jpeg', 'image/png', 'image/gif', 'image/bmp', 'image/tiff' ] );\n\nexport const audit: Audit = {\n\tid: 'audits/images-inefficient-format',\n\ttitle: __( 'Inefficient image format', 'elementor' ),\n\tdescription: __( \"Image isn't served in a modern, efficient format like WebP or AVIF.\", 'elementor' ),\n\tfixHint: __( 'Convert the image to a modern format like WebP or AVIF, or enable image optimization.', 'elementor' ),\n\tcategories: [ 'performance' ],\n\tseverity: 'info',\n\tweight: 1,\n\tevaluate: ( ctx ) => {\n\t\tconst isReady = ctx.pageContext.image_optimization_plugin_active;\n\t\tconst offendingElementIds = new Set< string >();\n\t\tlet hasAnyImage = false;\n\t\tlet inefficientImageFormatCount = 0;\n\n\t\tconst evaluateSource = ( node: ElementSnapshotNode, media: ImageLikeMedia ) => {\n\t\t\tif ( media.id || media.url ) {\n\t\t\t\thasAnyImage = true;\n\t\t\t}\n\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 mime = ctx.pageContext.image_sizes[ buildImageSizeKey( { id, size: media.size } ) ]?.mime;\n\n\t\t\tif ( ! mime || ! LEGACY_RASTER_MIME_TYPES.has( mime ) ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tinefficientImageFormatCount++;\n\t\t\toffendingElementIds.add( node.id );\n\t\t};\n\n\t\twalkAllImageSources( ctx.elements.tree, ( { node, media } ) => evaluateSource( node, media ) );\n\n\t\tif ( ! hasAnyImage ) {\n\t\t\treturn { status: 'skipped', reason: __( 'No images', 'elementor' ) };\n\t\t}\n\n\t\tconst violations: AuditViolation[] = Array.from( offendingElementIds ).map( ( elementId ) => ( {\n\t\t\tauditId: audit.id,\n\t\t\telementId,\n\t\t\ttargetHint: 'element-settings' as const,\n\t\t\tlabel: __( \"Image isn't served in a modern format like WebP or AVIF.\", 'elementor' ),\n\t\t\texternalUrl: isReady\n\t\t\t\t? ctx.pageContext.image_optimization_settings_url\n\t\t\t\t: ctx.pageContext.image_optimization_plugin_url,\n\t\t\tctaLabel: __( 'Optimize all', 'elementor' ),\n\t\t} ) );\n\n\t\treturn violations.length === 0\n\t\t\t? { status: 'pass' }\n\t\t\t: { status: 'fail', violations, metadata: { inefficientImageFormatCount } };\n\t},\n};\n","import { __, sprintf } from '@wordpress/i18n';\n\nimport { type Audit, type AuditViolation, type ElementSnapshotNode } from '../types';\nimport { walkAllImageSources } from '../utils/all-image-sources';\nimport { type ImageLikeMedia } from '../utils/image-like-sources';\nimport { buildImageSizeKey } from '../utils/image-size-key';\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\tconst isReady = ctx.pageContext.image_optimization_plugin_active;\n\t\tconst widgetMaxKb = new Map< string, number >();\n\t\tlet oversizedImageCount = 0;\n\t\tlet hasAnyImage = false;\n\n\t\tconst evaluateSource = ( node: ElementSnapshotNode, media: ImageLikeMedia ) => {\n\t\t\tif ( media.id || media.url ) {\n\t\t\t\thasAnyImage = true;\n\t\t\t}\n\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[ buildImageSizeKey( { id, size: media.size } ) ];\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\twalkAllImageSources( ctx.elements.tree, ( { node, media } ) => evaluateSource( node, media ) );\n\n\t\tif ( ! hasAnyImage ) {\n\t\t\treturn { status: 'skipped', reason: __( 'No images', 'elementor' ) };\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: isReady\n\t\t\t\t? ctx.pageContext.image_optimization_settings_url\n\t\t\t\t: ctx.pageContext.image_optimization_plugin_url,\n\t\t\tctaLabel: __( 'Optimize all', 'elementor' ),\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\tangieFix: true,\n\t\t\t\t\tangiePrompt: __(\n\t\t\t\t\t\t'Find containers that have nested containers. Containers can be deep-nested. Update the nested container styling so that when a parent container already uses a boxed setting, any inner container inside it is set to Full Width. Keep the first parent container boxed, remove all boxed styling from the nested inner containers, and preserve the inner container’s content, spacing, alignment, and hierarchy.',\n\t\t\t\t\t\t'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 } 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\tangiePrompt: __(\n\t\t\t\t\t\t\t\"Based on this page's contents, generate a title for this page.\",\n\t\t\t\t\t\t\t'elementor'\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}\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\tctaLabel: __( 'Create', 'elementor' ),\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 } from '../types';\n\nexport const audit: Audit = {\n\tid: 'audits/scan-for-cookies',\n\ttitle: __( 'Scan for cookies', 'elementor' ),\n\tdescription: __(\n\t\t\"Your site may be setting cookies you haven't disclosed. Some countries require a banner even without a full consent policy. Scan to see what needs disclosure.\",\n\t\t'elementor'\n\t),\n\tfixHint: __( 'Run a Cookiez scan on this page to see which cookies need disclosure.', 'elementor' ),\n\tcategories: [ 'compliance' ],\n\tseverity: 'info',\n\tweight: 0,\n\tevaluate: ( ctx ) => {\n\t\tconst isReady = ctx.pageContext.cookiez_plugin_installed && ctx.pageContext.cookiez_plugin_active;\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: __( 'This page has not been scanned for cookies yet.', 'elementor' ),\n\t\t\t\t\texternalUrl: isReady ? ctx.pageContext.cookiez_scan_url : ctx.pageContext.cookiez_plugin_action_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 * as accessibilityPolicy from './audits/accessibility-policy';\nimport * as accessibilityStatement from './audits/accessibility-statement';\nimport * as accessibilityWidget from './audits/accessibility-widget';\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 googleConsentMode from './audits/google-consent-mode';\nimport * as headingStructure from './audits/heading-structure';\nimport * as hiddenElements from './audits/hidden-elements';\nimport * as imagesAltText from './audits/images-alt-text';\nimport * as imagesInefficientFormat from './audits/images-inefficient-format';\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 scanForCookies from './audits/scan-for-cookies';\nimport * as sectionsAndColumns from './audits/sections-and-columns';\nimport * as siteIdentity from './audits/site-identity';\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\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\timagesInefficientFormat.audit,\n\n\trobotsNoindex.audit,\n\n\tprivacyPolicy.audit,\n\taccessibilityPolicy.audit,\n\taccessibilityStatement.audit,\n\taccessibilityWidget.audit,\n\tcookiePolicy.audit,\n\tscanForCookies.audit,\n\tgoogleConsentMode.audit,\n];\n\nexport function registerAllAudits(): void {\n\tfor ( const audit of AUDITS ) {\n\t\tregisterAudit( audit );\n\t}\n}\n","import { __privateListenTo as listenTo, commandEndEvent, type CommandEvent } from '@elementor/editor-v1-adapters';\nimport { __dispatch as dispatch } from '@elementor/store';\n\nimport { slice } from './store/slice';\n\nexport function syncReportStaleness() {\n\tlistenTo( commandEndEvent( 'document/save/set-is-modified' ), ( e ) => {\n\t\tconst event = e as CommandEvent< { status: boolean } >;\n\n\t\tif ( event.args?.status ) {\n\t\t\tdispatch( slice.actions.reportStale() );\n\t\t}\n\t} );\n}\n"],"mappings":"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","names":["import_editor_floating_panels","import_store","import_i18n","import_store","useSelector","import_editor_floating_panels","React","import_editor_elements","import_editor_floating_panels","import_ui","import_i18n","import_editor_elements","import_store","import_editor_elements","audit","audit","audit","import_editor_props","audit","useSelector","dispatch","useDispatch","React","import_react","import_http_client","import_icons","import_ui","import_i18n","React","import_ui","import_i18n","React","import_ui","import_i18n","React","import_ui","import_i18n","React","import_react","import_ui","React","import_ui","import_i18n","import_react","import_icons","React","import_react","import_icons","import_ui","import_i18n","React","import_icons","import_ui","import_i18n","React","import_editor_elements","import_editor_floating_panels","import_icons","import_ui","import_i18n","import_editor_elements","import_editor_v1_adapters","runCommand","openRoute","import_i18n","React","import_icons","import_ui","import_i18n","React","import_icons","React","import_icons","import_ui","React","import_icons","import_ui","audit","React","import_ui","import_i18n","import_i18n","audit","React","import_icons","import_ui","React","import_ui","import_i18n","import_icons","import_i18n","React","import_ui","React","import_ui","React","import_editor_floating_panels","import_icons","import_ui","import_i18n","import_i18n","import_i18n","audit","import_i18n","audit","import_i18n","audit","import_editor_elements","import_i18n","audit","import_i18n","audit","import_editor_elements","import_i18n","audit","import_i18n","audit","import_i18n","audit","import_i18n","audit","import_i18n","audit","import_i18n","audit","import_i18n","audit","import_i18n","audit","import_i18n","audit","import_i18n","audit","import_i18n","audit","import_i18n","audit","import_i18n","RESERVED_SETTING_KEYS","REPEATER_ROW_ID_KEY","formatPath","formatArrayPath","audit","import_i18n","audit","import_i18n","audit","import_i18n","audit","import_i18n","audit","import_i18n","audit","audit","import_editor_v1_adapters","import_store","listenTo","dispatch","registerSlice"]}
|