1 Commits

Author SHA1 Message Date
Carl-Gerhard Lindesvärd
931ae55a1c fix: iframe resize #224 2025-11-10 20:29:02 +01:00
8 changed files with 285 additions and 168 deletions

View File

@@ -9,6 +9,7 @@
"deploy": "npx wrangler deploy",
"cf-typegen": "wrangler types",
"build": "pnpm with-env vite build",
"build:embed": "vite build --config vite.embed.config.ts",
"serve": "vite preview",
"test": "vitest run",
"format": "biome format",
@@ -26,11 +27,13 @@
"@faker-js/faker": "^9.6.0",
"@hookform/resolvers": "^3.3.4",
"@hyperdx/node-opentelemetry": "^0.8.1",
"@iframe-resizer/child": "^5.0.0",
"@iframe-resizer/parent": "^5.0.0",
"@number-flow/react": "0.3.5",
"@openpanel/common": "workspace:^",
"@openpanel/constants": "workspace:^",
"@openpanel/integrations": "workspace:^",
"@openpanel/importer": "workspace:^",
"@openpanel/integrations": "workspace:^",
"@openpanel/json": "workspace:*",
"@openpanel/payments": "workspace:*",
"@openpanel/sdk-info": "workspace:^",

File diff suppressed because one or more lines are too long

View File

@@ -11,6 +11,7 @@
import { createFileRoute } from '@tanstack/react-router'
import { Route as rootRouteImport } from './routes/__root'
import { Route as IframeTestRouteImport } from './routes/iframe-test'
import { Route as StepsRouteImport } from './routes/_steps'
import { Route as PublicRouteImport } from './routes/_public'
import { Route as LoginRouteImport } from './routes/_login'
@@ -94,6 +95,11 @@ const AppOrganizationIdProjectIdProfilesProfileIdRouteImport = createFileRoute(
'/_app/$organizationId/$projectId_/profiles/$profileId',
)()
const IframeTestRoute = IframeTestRouteImport.update({
id: '/iframe-test',
path: '/iframe-test',
getParentRoute: () => rootRouteImport,
} as any)
const StepsRoute = StepsRouteImport.update({
id: '/_steps',
getParentRoute: () => rootRouteImport,
@@ -474,6 +480,7 @@ const AppOrganizationIdProjectIdProfilesProfileIdTabsEventsRoute =
export interface FileRoutesByFullPath {
'/': typeof IndexRoute
'/iframe-test': typeof IframeTestRoute
'/$organizationId': typeof AppOrganizationIdRouteWithChildren
'/login': typeof LoginLoginRoute
'/reset-password': typeof LoginResetPasswordRoute
@@ -532,6 +539,7 @@ export interface FileRoutesByFullPath {
}
export interface FileRoutesByTo {
'/': typeof IndexRoute
'/iframe-test': typeof IframeTestRoute
'/login': typeof LoginLoginRoute
'/reset-password': typeof LoginResetPasswordRoute
'/onboarding': typeof PublicOnboardingRoute
@@ -587,6 +595,7 @@ export interface FileRoutesById {
'/_login': typeof LoginRouteWithChildren
'/_public': typeof PublicRouteWithChildren
'/_steps': typeof StepsRouteWithChildren
'/iframe-test': typeof IframeTestRoute
'/_app/$organizationId': typeof AppOrganizationIdRouteWithChildren
'/_login/login': typeof LoginLoginRoute
'/_login/reset-password': typeof LoginResetPasswordRoute
@@ -654,6 +663,7 @@ export interface FileRouteTypes {
fileRoutesByFullPath: FileRoutesByFullPath
fullPaths:
| '/'
| '/iframe-test'
| '/$organizationId'
| '/login'
| '/reset-password'
@@ -712,6 +722,7 @@ export interface FileRouteTypes {
fileRoutesByTo: FileRoutesByTo
to:
| '/'
| '/iframe-test'
| '/login'
| '/reset-password'
| '/onboarding'
@@ -766,6 +777,7 @@ export interface FileRouteTypes {
| '/_login'
| '/_public'
| '/_steps'
| '/iframe-test'
| '/_app/$organizationId'
| '/_login/login'
| '/_login/reset-password'
@@ -836,6 +848,7 @@ export interface RootRouteChildren {
LoginRoute: typeof LoginRouteWithChildren
PublicRoute: typeof PublicRouteWithChildren
StepsRoute: typeof StepsRouteWithChildren
IframeTestRoute: typeof IframeTestRoute
ApiConfigRoute: typeof ApiConfigRoute
ApiHealthcheckRoute: typeof ApiHealthcheckRoute
ShareOverviewShareIdRoute: typeof ShareOverviewShareIdRoute
@@ -843,6 +856,13 @@ export interface RootRouteChildren {
declare module '@tanstack/react-router' {
interface FileRoutesByPath {
'/iframe-test': {
id: '/iframe-test'
path: '/iframe-test'
fullPath: '/iframe-test'
preLoaderRoute: typeof IframeTestRouteImport
parentRoute: typeof rootRouteImport
}
'/_steps': {
id: '/_steps'
path: ''
@@ -1694,6 +1714,7 @@ const rootRouteChildren: RootRouteChildren = {
LoginRoute: LoginRouteWithChildren,
PublicRoute: PublicRouteWithChildren,
StepsRoute: StepsRouteWithChildren,
IframeTestRoute: IframeTestRoute,
ApiConfigRoute: ApiConfigRoute,
ApiHealthcheckRoute: ApiHealthcheckRoute,
ShareOverviewShareIdRoute: ShareOverviewShareIdRoute,

View File

@@ -0,0 +1,28 @@
import { ScriptOnce, createFileRoute } from '@tanstack/react-router';
import { useEffect, useRef } from 'react';
export const Route = createFileRoute('/iframe-test')({
component: IframeTestLayout,
});
function IframeTestLayout() {
return (
<div className="w-full h-full center-center p-32">
<div className="border-8 border-border rounded-lg p-4 w-full max-w-5xl">
<iframe
data-openpanel-embed
src="http://localhost:3000/share/overview/zef2XC"
style={{
width: '100%',
height: '100%',
minHeight: '100vh',
}}
scrolling="no"
loading="lazy"
title="OpenPanel Dashboard"
/>
</div>
<script src="/openpanel-embed.js" />
</div>
);
}

View File

@@ -12,14 +12,37 @@ import OverviewTopPages from '@/components/overview/overview-top-pages';
import OverviewTopSources from '@/components/overview/overview-top-sources';
import { useTRPC } from '@/integrations/trpc/react';
import { useQuery, useSuspenseQuery } from '@tanstack/react-query';
import { createFileRoute, notFound, useSearch } from '@tanstack/react-router';
import {
ScriptOnce,
createFileRoute,
notFound,
useSearch,
} from '@tanstack/react-router';
import { EyeClosedIcon, FrownIcon } from 'lucide-react';
import { z } from 'zod';
import '@iframe-resizer/child';
const shareSearchSchema = z.object({
header: z.optional(z.number().or(z.string().or(z.boolean()))),
});
const iframeResizerScript = `
(function() {
if (typeof window !== 'undefined' && window.iFrameResizer) {
window.iFrameResizer.onMessage = function(message) {
if (message && message.type === 'load-custom-styles') {
var css = (message.opts && message.opts.styles) || '';
if (!css) return;
var style = document.createElement('style');
style.type = 'text/css';
style.appendChild(document.createTextNode(css));
document.head.appendChild(style);
}
};
}
})();
`;
export const Route = createFileRoute('/share/overview/$shareId')({
component: RouteComponent,
validateSearch: shareSearchSchema,
@@ -76,7 +99,8 @@ function RouteComponent() {
header !== '0' && header !== 0 && header !== 'false' && header !== false;
return (
<div>
<div style={{ minHeight: '100vh' }}>
<ScriptOnce>{iframeResizerScript}</ScriptOnce>
{isHeaderVisible && (
<div className="mx-auto max-w-7xl justify-between row gap-4 p-4 pb-0">
<div className="col gap-1">

View File

@@ -0,0 +1,32 @@
import iframeResize from '@iframe-resizer/parent';
(() => {
function initOpenPanelEmbeds() {
iframeResize(
{
license: 'GPLv3', // OpenPanel is AGPL-3.0, compatible with GPL-3.0
checkOrigin: true,
log: true, // Enable logging for testing
onReady(iframe) {
console.log('iframeResizer ready', iframe);
const styles = iframe.getAttribute('data-openpanel-styles');
if (styles) {
console.log('sending message to load custom styles');
console.log('styles', styles);
iframe.iFrameResizer.sendMessage({
type: 'load-custom-styles',
opts: { styles },
});
}
},
},
'iframe[data-openpanel-embed]',
);
}
if (document.readyState === 'loading') {
document.addEventListener('DOMContentLoaded', initOpenPanelEmbeds);
} else {
initOpenPanelEmbeds();
}
})();

View File

@@ -0,0 +1,17 @@
import { defineConfig } from 'vite';
export default defineConfig({
build: {
rollupOptions: {
input: './src/scripts/openpanel-embed.ts',
output: {
format: 'iife',
dir: 'public',
entryFileNames: 'openpanel-embed.js',
name: 'OpenPanelEmbed',
},
},
minify: true,
emptyOutDir: false,
},
});

249
pnpm-lock.yaml generated
View File

@@ -6,9 +6,6 @@ settings:
catalogs:
default:
'@types/node':
specifier: ^24.7.1
version: 24.7.1
'@types/react':
specifier: ^19.0.0
version: 19.1.11
@@ -364,6 +361,12 @@ importers:
'@hyperdx/node-opentelemetry':
specifier: ^0.8.1
version: 0.8.1
'@iframe-resizer/child':
specifier: ^5.0.0
version: 5.5.7
'@iframe-resizer/parent':
specifier: ^5.0.0
version: 5.5.7
'@number-flow/react':
specifier: 0.3.5
version: 0.3.5(react-dom@19.1.1(react@19.1.1))(react@19.1.1)
@@ -1364,7 +1367,7 @@ importers:
packages/sdks/astro:
dependencies:
'@openpanel/web':
specifier: workspace:1.0.1-local
specifier: workspace:1.0.2-local
version: link:../web
devDependencies:
astro:
@@ -1402,10 +1405,10 @@ importers:
packages/sdks/nextjs:
dependencies:
'@openpanel/web':
specifier: workspace:1.0.1-local
specifier: workspace:1.0.2-local
version: link:../web
next:
specifier: ^12.0.0 || ^13.0.0 || ^14.0.0 || ^15.0.0
specifier: ^12.0.0 || ^13.0.0 || ^14.0.0 || ^15.0.0 || ^16.0.0
version: 15.0.3(@opentelemetry/api@1.9.0)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)
react:
specifier: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0
@@ -1785,10 +1788,6 @@ packages:
resolution: {integrity: sha512-3lSpxGgvnmZznmBkCRnVREPUFJv2wrv9iAoFDvADJc0ypmdOxdUtcLeBgBJ6zE0PMeTKnxeQzyk0xTBq4Ep7zw==}
engines: {node: '>=6.9.0'}
'@babel/helper-annotate-as-pure@7.22.5':
resolution: {integrity: sha512-LvBTxu8bQSQkcyKOU+a1btnNFQ1dMAd0R6PyW3arXes06F6QLWLIrd681bxRPIXlrMGR3XYnW9JyML7dP3qgxg==}
engines: {node: '>=6.9.0'}
'@babel/helper-annotate-as-pure@7.27.3':
resolution: {integrity: sha512-fXSwMQqitTGeHLBC08Eq5yXz2m37E4pJX1qAU1+2cNedz/ifv/bVXft90VeSav5nFO61EcNgwr0aJxbyPaWBPg==}
engines: {node: '>=6.9.0'}
@@ -1805,12 +1804,6 @@ packages:
resolution: {integrity: sha512-2+1thGUUWWjLTYTHZWK1n8Yga0ijBz1XAhUXcKy81rd5g6yh7hGqMp45v7cadSbEHc9G3OTv45SyneRN3ps4DQ==}
engines: {node: '>=6.9.0'}
'@babel/helper-create-class-features-plugin@7.23.10':
resolution: {integrity: sha512-2XpP2XhkXzgxecPNEEK8Vz8Asj9aRxt08oKOqtiZoqV2UGZ5T+EkyP9sXQ9nwMxBIG34a7jmasVqoMop7VdPUw==}
engines: {node: '>=6.9.0'}
peerDependencies:
'@babel/core': ^7.0.0
'@babel/helper-create-class-features-plugin@7.28.3':
resolution: {integrity: sha512-V9f6ZFIYSLNEbuGA/92uOvYsGCJNsuA8ESZ4ldc09bWk/j8H8TKiPw8Mk1eG6olpnO0ALHJmYfZvF4MEE4gajg==}
engines: {node: '>=6.9.0'}
@@ -1844,10 +1837,6 @@ packages:
resolution: {integrity: sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==}
engines: {node: '>=6.9.0'}
'@babel/helper-member-expression-to-functions@7.23.0':
resolution: {integrity: sha512-6gfrPwh7OuT6gZyJZvd6WbTfrqAo7vm4xCzAXOusKqq/vWdKXphTpj5klHKNmRUU6/QRGlBsyU9mAIPaWHlqJA==}
engines: {node: '>=6.9.0'}
'@babel/helper-member-expression-to-functions@7.27.1':
resolution: {integrity: sha512-E5chM8eWjTp/aNoVpcbfM7mLxu9XGLWYise2eBKGQomAk/Mb4XoxyqXTZbuTohbsl8EKqdlMhnDI2CCLfcs9wA==}
engines: {node: '>=6.9.0'}
@@ -1872,10 +1861,6 @@ packages:
peerDependencies:
'@babel/core': ^7.0.0
'@babel/helper-optimise-call-expression@7.22.5':
resolution: {integrity: sha512-HBwaojN0xFRx4yIvpwGqxiV2tUfl7401jlok564NgB9EHS1y6QT17FmKWm4ztqjeVdXLuC4fSvHc5ePpQjoTbw==}
engines: {node: '>=6.9.0'}
'@babel/helper-optimise-call-expression@7.27.1':
resolution: {integrity: sha512-URMGH08NzYFhubNSGJrpUEphGKQwMQYBySzat5cAByY1/YgIRkULnIy3tAMeszlL/so2HbeilYloUmSpd7GdVw==}
engines: {node: '>=6.9.0'}
@@ -1890,26 +1875,12 @@ packages:
peerDependencies:
'@babel/core': ^7.0.0
'@babel/helper-replace-supers@7.22.20':
resolution: {integrity: sha512-qsW0In3dbwQUbK8kejJ4R7IHVGwHJlV6lpG6UA7a9hSa2YEiAib+N1T2kr6PEeUT+Fl7najmSOS6SmAwCHK6Tw==}
engines: {node: '>=6.9.0'}
peerDependencies:
'@babel/core': ^7.0.0
'@babel/helper-replace-supers@7.27.1':
resolution: {integrity: sha512-7EHz6qDZc8RYS5ElPoShMheWvEgERonFCs7IAonWLLUTXW59DP14bCZt89/GKyreYn8g3S83m21FelHKbeDCKA==}
engines: {node: '>=6.9.0'}
peerDependencies:
'@babel/core': ^7.0.0
'@babel/helper-simple-access@7.22.5':
resolution: {integrity: sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==}
engines: {node: '>=6.9.0'}
'@babel/helper-skip-transparent-expression-wrappers@7.22.5':
resolution: {integrity: sha512-tK14r66JZKiC43p8Ki33yLBVJKlQDFoA8GYN67lWCDCqoL6EMMSuM9b+Iff2jHaM/RRFYl7K+iiru7hbRqNx8Q==}
engines: {node: '>=6.9.0'}
'@babel/helper-skip-transparent-expression-wrappers@7.27.1':
resolution: {integrity: sha512-Tub4ZKEXqbPjXgWLl2+3JpQAYBJ8+ikpQ2Ocj/q/r0LwE3UhENh7EUabyHjz2kCEsrRY83ew2DQdHluuiDQFzg==}
engines: {node: '>=6.9.0'}
@@ -2314,12 +2285,6 @@ packages:
peerDependencies:
'@babel/core': ^7.0.0-0
'@babel/plugin-transform-modules-commonjs@7.23.3':
resolution: {integrity: sha512-aVS0F65LKsdNOtcz6FRCpE4OgsP2OFnW46qNxNIX9h3wuzaNcSQsJysuMwqSibC98HPrf2vCgtxKNwS0DAlgcA==}
engines: {node: '>=6.9.0'}
peerDependencies:
'@babel/core': ^7.0.0-0
'@babel/plugin-transform-modules-commonjs@7.27.1':
resolution: {integrity: sha512-OJguuwlTYlN0gBZFRPqwOGNWssZjfIUdS7HMYtN8c1KmwpwHFBwTeFZrg9XZa+DFTitWOW5iTAG7tyCUPsCCyw==}
engines: {node: '>=6.9.0'}
@@ -2422,24 +2387,12 @@ packages:
peerDependencies:
'@babel/core': ^7.0.0-0
'@babel/plugin-transform-react-jsx-self@7.23.3':
resolution: {integrity: sha512-qXRvbeKDSfwnlJnanVRp0SfuWE5DQhwQr5xtLBzp56Wabyo+4CMosF6Kfp+eOD/4FYpql64XVJ2W0pVLlJZxOQ==}
engines: {node: '>=6.9.0'}
peerDependencies:
'@babel/core': ^7.0.0-0
'@babel/plugin-transform-react-jsx-self@7.27.1':
resolution: {integrity: sha512-6UzkCs+ejGdZ5mFFC/OCUrv028ab2fp1znZmCZjAOBKiBK2jXD1O+BPSfX8X2qjJ75fZBMSnQn3Rq2mrBJK2mw==}
engines: {node: '>=6.9.0'}
peerDependencies:
'@babel/core': ^7.0.0-0
'@babel/plugin-transform-react-jsx-source@7.23.3':
resolution: {integrity: sha512-91RS0MDnAWDNvGC6Wio5XYkyWI39FMFO+JK9+4AlgaTH+yWwVTsw7/sn6LK0lH7c5F+TFkpv/3LfCJ1Ydwof/g==}
engines: {node: '>=6.9.0'}
peerDependencies:
'@babel/core': ^7.0.0-0
'@babel/plugin-transform-react-jsx-source@7.27.1':
resolution: {integrity: sha512-zbwoTsBruTeKB9hSq73ha66iFeJHuaFkUbwvqElnygoNbj/jHRsSeokowZFN3CZ64IvEqcmmkVe89OPXc7ldAw==}
engines: {node: '>=6.9.0'}
@@ -2506,12 +2459,6 @@ packages:
peerDependencies:
'@babel/core': ^7.0.0-0
'@babel/plugin-transform-typescript@7.23.6':
resolution: {integrity: sha512-6cBG5mBvUu4VUD04OHKnYzbuHNP8huDsD3EDqqpIpsswTDoqHCjLoHb6+QgsV1WsT2nipRqCPgxD3LXnEO7XfA==}
engines: {node: '>=6.9.0'}
peerDependencies:
'@babel/core': ^7.0.0-0
'@babel/plugin-transform-typescript@7.28.0':
resolution: {integrity: sha512-4AEiDEBPIZvLQaWlc9liCavE0xRM0dNca41WtBeM3jgFptfUOSG9z0uteLhq6+3rq+WB6jIvUwKDTpXEHPJ2Vg==}
engines: {node: '>=6.9.0'}
@@ -4220,6 +4167,15 @@ packages:
resolution: {integrity: sha512-wNw0yQf54j/9KXVWeEOu8G6C5FT5EFlrz4dcmscTkwCvo6fQOLRZa/NbGcqugt0LSFMc0/6/Q5RDWVqDpEn0LQ==}
hasBin: true
'@iframe-resizer/child@5.5.7':
resolution: {integrity: sha512-+/t5E9/wbB+sWg6xM6fRWvNZ48WcZSJXHwXt58EdsWnb1vW+N4wf0Tp6Bwq9JPN4GR64yjXAhb0bBq67ECr/lg==}
'@iframe-resizer/core@5.5.7':
resolution: {integrity: sha512-jxKF0uGS8RfJSkDoRJ697JbmuykGvEhl9nOLnBXdkaARcsFgTT1/Uvz3mxNHw3AqDgNCxCySuI5jYpYM7M4Xbw==}
'@iframe-resizer/parent@5.5.7':
resolution: {integrity: sha512-1dDlHFl7TOgu7odDcz/AQkJRcm9Ztpw2F8af/IU5ZAJhVlQkj8pjdnc5RfniGqY3AHOnryFATtrk7TDgZqPQFg==}
'@img/sharp-darwin-arm64@0.33.5':
resolution: {integrity: sha512-UT4p+iz/2H4twwAoLCqfA9UH5pI6DggwKEGuaPy7nCVQ8ZsiY5PIcrRvD1DzuY3qYL07NtIQcWnBSY/heikIFQ==}
engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
@@ -9218,6 +9174,9 @@ packages:
resolution: {integrity: sha512-kNOjDqAh7px0XWNI+4QbzoiR/nTkHAWNud2uvnJquD1/x5a7EQZMJT0AczqK0Qn67oY/TTQ1LbUKajZpp3I9tQ==}
engines: {node: '>=8.0.0'}
auto-console-group@1.2.11:
resolution: {integrity: sha512-/RFCswabfQZR4CDYser0V+AC+6+Q1ro2+RrP0AinOXDYnWsm3w14uc2MVdEaaSCDfpiTtETfahE9N7z9Yb1JiA==}
autoprefixer@10.4.20:
resolution: {integrity: sha512-XY25y5xSv/wEoqzDyXXME4AFfkZI0P23z6Fs3YgymDnKJkCGOnkL0iTxCa85UTqaSgfcqyf3UA6+c7wUvx/16g==}
engines: {node: ^10 || ^12 || >=14}
@@ -17104,10 +17063,6 @@ snapshots:
'@jridgewell/trace-mapping': 0.3.30
jsesc: 3.0.2
'@babel/helper-annotate-as-pure@7.22.5':
dependencies:
'@babel/types': 7.28.2
'@babel/helper-annotate-as-pure@7.27.3':
dependencies:
'@babel/types': 7.28.2
@@ -17132,19 +17087,6 @@ snapshots:
lru-cache: 5.1.1
semver: 6.3.1
'@babel/helper-create-class-features-plugin@7.23.10(@babel/core@7.28.3)':
dependencies:
'@babel/core': 7.28.3
'@babel/helper-annotate-as-pure': 7.22.5
'@babel/helper-environment-visitor': 7.22.20
'@babel/helper-function-name': 7.23.0
'@babel/helper-member-expression-to-functions': 7.23.0
'@babel/helper-optimise-call-expression': 7.22.5
'@babel/helper-replace-supers': 7.22.20(@babel/core@7.28.3)
'@babel/helper-skip-transparent-expression-wrappers': 7.22.5
'@babel/helper-split-export-declaration': 7.22.6
semver: 6.3.1
'@babel/helper-create-class-features-plugin@7.28.3(@babel/core@7.28.3)':
dependencies:
'@babel/core': 7.28.3
@@ -17161,7 +17103,7 @@ snapshots:
'@babel/helper-create-regexp-features-plugin@7.22.15(@babel/core@7.28.3)':
dependencies:
'@babel/core': 7.28.3
'@babel/helper-annotate-as-pure': 7.22.5
'@babel/helper-annotate-as-pure': 7.27.3
regexpu-core: 5.3.2
semver: 6.3.1
@@ -17189,10 +17131,6 @@ snapshots:
dependencies:
'@babel/types': 7.28.2
'@babel/helper-member-expression-to-functions@7.23.0':
dependencies:
'@babel/types': 7.28.2
'@babel/helper-member-expression-to-functions@7.27.1':
dependencies:
'@babel/traverse': 7.28.3
@@ -17232,10 +17170,6 @@ snapshots:
transitivePeerDependencies:
- supports-color
'@babel/helper-optimise-call-expression@7.22.5':
dependencies:
'@babel/types': 7.28.2
'@babel/helper-optimise-call-expression@7.27.1':
dependencies:
'@babel/types': 7.28.2
@@ -17245,17 +17179,10 @@ snapshots:
'@babel/helper-remap-async-to-generator@7.22.20(@babel/core@7.28.3)':
dependencies:
'@babel/core': 7.28.3
'@babel/helper-annotate-as-pure': 7.22.5
'@babel/helper-annotate-as-pure': 7.27.3
'@babel/helper-environment-visitor': 7.22.20
'@babel/helper-wrap-function': 7.22.20
'@babel/helper-replace-supers@7.22.20(@babel/core@7.28.3)':
dependencies:
'@babel/core': 7.28.3
'@babel/helper-environment-visitor': 7.22.20
'@babel/helper-member-expression-to-functions': 7.23.0
'@babel/helper-optimise-call-expression': 7.22.5
'@babel/helper-replace-supers@7.27.1(@babel/core@7.28.3)':
dependencies:
'@babel/core': 7.28.3
@@ -17265,14 +17192,6 @@ snapshots:
transitivePeerDependencies:
- supports-color
'@babel/helper-simple-access@7.22.5':
dependencies:
'@babel/types': 7.28.2
'@babel/helper-skip-transparent-expression-wrappers@7.22.5':
dependencies:
'@babel/types': 7.28.2
'@babel/helper-skip-transparent-expression-wrappers@7.27.1':
dependencies:
'@babel/traverse': 7.28.3
@@ -17357,8 +17276,10 @@ snapshots:
'@babel/plugin-proposal-class-properties@7.18.6(@babel/core@7.28.3)':
dependencies:
'@babel/core': 7.28.3
'@babel/helper-create-class-features-plugin': 7.23.10(@babel/core@7.28.3)
'@babel/helper-create-class-features-plugin': 7.28.3(@babel/core@7.28.3)
'@babel/helper-plugin-utils': 7.27.1
transitivePeerDependencies:
- supports-color
'@babel/plugin-proposal-decorators@7.23.9(@babel/core@7.28.3)':
dependencies:
@@ -17389,7 +17310,7 @@ snapshots:
'@babel/plugin-proposal-object-rest-spread@7.20.7(@babel/core@7.28.3)':
dependencies:
'@babel/compat-data': 7.23.5
'@babel/compat-data': 7.28.0
'@babel/core': 7.28.3
'@babel/helper-compilation-targets': 7.27.2
'@babel/helper-plugin-utils': 7.27.1
@@ -17406,8 +17327,10 @@ snapshots:
dependencies:
'@babel/core': 7.28.3
'@babel/helper-plugin-utils': 7.27.1
'@babel/helper-skip-transparent-expression-wrappers': 7.22.5
'@babel/helper-skip-transparent-expression-wrappers': 7.27.1
'@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.28.3)
transitivePeerDependencies:
- supports-color
'@babel/plugin-proposal-private-property-in-object@7.21.0-placeholder-for-preset-env.2(@babel/core@7.28.3)':
dependencies:
@@ -17545,7 +17468,7 @@ snapshots:
'@babel/plugin-transform-async-to-generator@7.23.3(@babel/core@7.28.3)':
dependencies:
'@babel/core': 7.28.3
'@babel/helper-module-imports': 7.25.9
'@babel/helper-module-imports': 7.27.1
'@babel/helper-plugin-utils': 7.27.1
'@babel/helper-remap-async-to-generator': 7.22.20(@babel/core@7.28.3)
transitivePeerDependencies:
@@ -17581,14 +17504,16 @@ snapshots:
'@babel/plugin-transform-classes@7.23.8(@babel/core@7.28.3)':
dependencies:
'@babel/core': 7.28.3
'@babel/helper-annotate-as-pure': 7.22.5
'@babel/helper-annotate-as-pure': 7.27.3
'@babel/helper-compilation-targets': 7.27.2
'@babel/helper-environment-visitor': 7.22.20
'@babel/helper-function-name': 7.23.0
'@babel/helper-plugin-utils': 7.27.1
'@babel/helper-replace-supers': 7.22.20(@babel/core@7.28.3)
'@babel/helper-replace-supers': 7.27.1(@babel/core@7.28.3)
'@babel/helper-split-export-declaration': 7.22.6
globals: 11.12.0
transitivePeerDependencies:
- supports-color
'@babel/plugin-transform-computed-properties@7.23.3(@babel/core@7.28.3)':
dependencies:
@@ -17681,15 +17606,6 @@ snapshots:
transitivePeerDependencies:
- supports-color
'@babel/plugin-transform-modules-commonjs@7.23.3(@babel/core@7.28.3)':
dependencies:
'@babel/core': 7.28.3
'@babel/helper-module-transforms': 7.28.3(@babel/core@7.28.3)
'@babel/helper-plugin-utils': 7.27.1
'@babel/helper-simple-access': 7.22.5
transitivePeerDependencies:
- supports-color
'@babel/plugin-transform-modules-commonjs@7.27.1(@babel/core@7.28.3)':
dependencies:
'@babel/core': 7.28.3
@@ -17779,16 +17695,20 @@ snapshots:
'@babel/plugin-transform-private-methods@7.23.3(@babel/core@7.28.3)':
dependencies:
'@babel/core': 7.28.3
'@babel/helper-create-class-features-plugin': 7.23.10(@babel/core@7.28.3)
'@babel/helper-create-class-features-plugin': 7.28.3(@babel/core@7.28.3)
'@babel/helper-plugin-utils': 7.27.1
transitivePeerDependencies:
- supports-color
'@babel/plugin-transform-private-property-in-object@7.23.4(@babel/core@7.28.3)':
dependencies:
'@babel/core': 7.28.3
'@babel/helper-annotate-as-pure': 7.22.5
'@babel/helper-create-class-features-plugin': 7.23.10(@babel/core@7.28.3)
'@babel/helper-annotate-as-pure': 7.27.3
'@babel/helper-create-class-features-plugin': 7.28.3(@babel/core@7.28.3)
'@babel/helper-plugin-utils': 7.27.1
'@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.28.3)
transitivePeerDependencies:
- supports-color
'@babel/plugin-transform-property-literals@7.23.3(@babel/core@7.28.3)':
dependencies:
@@ -17807,21 +17727,11 @@ snapshots:
transitivePeerDependencies:
- supports-color
'@babel/plugin-transform-react-jsx-self@7.23.3(@babel/core@7.28.3)':
dependencies:
'@babel/core': 7.28.3
'@babel/helper-plugin-utils': 7.27.1
'@babel/plugin-transform-react-jsx-self@7.27.1(@babel/core@7.28.3)':
dependencies:
'@babel/core': 7.28.3
'@babel/helper-plugin-utils': 7.27.1
'@babel/plugin-transform-react-jsx-source@7.23.3(@babel/core@7.28.3)':
dependencies:
'@babel/core': 7.28.3
'@babel/helper-plugin-utils': 7.27.1
'@babel/plugin-transform-react-jsx-source@7.27.1(@babel/core@7.28.3)':
dependencies:
'@babel/core': 7.28.3
@@ -17830,8 +17740,8 @@ snapshots:
'@babel/plugin-transform-react-jsx@7.23.4(@babel/core@7.28.3)':
dependencies:
'@babel/core': 7.28.3
'@babel/helper-annotate-as-pure': 7.22.5
'@babel/helper-module-imports': 7.25.9
'@babel/helper-annotate-as-pure': 7.27.3
'@babel/helper-module-imports': 7.27.1
'@babel/helper-plugin-utils': 7.27.1
'@babel/plugin-syntax-jsx': 7.27.1(@babel/core@7.28.3)
'@babel/types': 7.28.2
@@ -17858,7 +17768,7 @@ snapshots:
'@babel/plugin-transform-runtime@7.23.9(@babel/core@7.28.3)':
dependencies:
'@babel/core': 7.28.3
'@babel/helper-module-imports': 7.25.9
'@babel/helper-module-imports': 7.27.1
'@babel/helper-plugin-utils': 7.27.1
babel-plugin-polyfill-corejs2: 0.4.8(@babel/core@7.28.3)
babel-plugin-polyfill-corejs3: 0.9.0(@babel/core@7.28.3)
@@ -17876,7 +17786,9 @@ snapshots:
dependencies:
'@babel/core': 7.28.3
'@babel/helper-plugin-utils': 7.27.1
'@babel/helper-skip-transparent-expression-wrappers': 7.22.5
'@babel/helper-skip-transparent-expression-wrappers': 7.27.1
transitivePeerDependencies:
- supports-color
'@babel/plugin-transform-sticky-regex@7.23.3(@babel/core@7.28.3)':
dependencies:
@@ -17893,14 +17805,6 @@ snapshots:
'@babel/core': 7.28.3
'@babel/helper-plugin-utils': 7.27.1
'@babel/plugin-transform-typescript@7.23.6(@babel/core@7.28.3)':
dependencies:
'@babel/core': 7.28.3
'@babel/helper-annotate-as-pure': 7.22.5
'@babel/helper-create-class-features-plugin': 7.23.10(@babel/core@7.28.3)
'@babel/helper-plugin-utils': 7.27.1
'@babel/plugin-syntax-typescript': 7.27.1(@babel/core@7.28.3)
'@babel/plugin-transform-typescript@7.28.0(@babel/core@7.28.3)':
dependencies:
'@babel/core': 7.28.3
@@ -18025,7 +17929,7 @@ snapshots:
dependencies:
'@babel/core': 7.28.3
'@babel/helper-plugin-utils': 7.27.1
'@babel/helper-validator-option': 7.23.5
'@babel/helper-validator-option': 7.27.1
'@babel/plugin-transform-flow-strip-types': 7.23.3(@babel/core@7.28.3)
'@babel/preset-modules@0.1.6-no-external-plugins(@babel/core@7.28.3)':
@@ -19409,6 +19313,19 @@ snapshots:
- encoding
- supports-color
'@iframe-resizer/child@5.5.7':
dependencies:
auto-console-group: 1.2.11
'@iframe-resizer/core@5.5.7':
dependencies:
auto-console-group: 1.2.11
'@iframe-resizer/parent@5.5.7':
dependencies:
'@iframe-resizer/core': 5.5.7
auto-console-group: 1.2.11
'@img/sharp-darwin-arm64@0.33.5':
optionalDependencies:
'@img/sharp-libvips-darwin-arm64': 1.0.4
@@ -19511,14 +19428,14 @@ snapshots:
dependencies:
'@jest/fake-timers': 29.7.0
'@jest/types': 29.6.3
'@types/node': 20.14.8
'@types/node': 24.7.1
jest-mock: 29.7.0
'@jest/fake-timers@29.7.0':
dependencies:
'@jest/types': 29.6.3
'@sinonjs/fake-timers': 10.3.0
'@types/node': 20.14.8
'@types/node': 24.7.1
jest-message-util: 29.7.0
jest-mock: 29.7.0
jest-util: 29.7.0
@@ -19531,7 +19448,7 @@ snapshots:
dependencies:
'@types/istanbul-lib-coverage': 2.0.6
'@types/istanbul-reports': 3.0.4
'@types/node': 20.14.8
'@types/node': 24.7.1
'@types/yargs': 15.0.19
chalk: 4.1.2
@@ -19540,7 +19457,7 @@ snapshots:
'@jest/schemas': 29.6.3
'@types/istanbul-lib-coverage': 2.0.6
'@types/istanbul-reports': 3.0.4
'@types/node': 20.14.8
'@types/node': 24.7.1
'@types/yargs': 17.0.32
chalk: 4.1.2
@@ -22660,20 +22577,20 @@ snapshots:
'@babel/plugin-transform-flow-strip-types': 7.23.3(@babel/core@7.28.3)
'@babel/plugin-transform-function-name': 7.23.3(@babel/core@7.28.3)
'@babel/plugin-transform-literals': 7.23.3(@babel/core@7.28.3)
'@babel/plugin-transform-modules-commonjs': 7.23.3(@babel/core@7.28.3)
'@babel/plugin-transform-modules-commonjs': 7.27.1(@babel/core@7.28.3)
'@babel/plugin-transform-named-capturing-groups-regex': 7.22.5(@babel/core@7.28.3)
'@babel/plugin-transform-parameters': 7.23.3(@babel/core@7.28.3)
'@babel/plugin-transform-private-methods': 7.23.3(@babel/core@7.28.3)
'@babel/plugin-transform-private-property-in-object': 7.23.4(@babel/core@7.28.3)
'@babel/plugin-transform-react-display-name': 7.23.3(@babel/core@7.28.3)
'@babel/plugin-transform-react-jsx': 7.23.4(@babel/core@7.28.3)
'@babel/plugin-transform-react-jsx-self': 7.23.3(@babel/core@7.28.3)
'@babel/plugin-transform-react-jsx-source': 7.23.3(@babel/core@7.28.3)
'@babel/plugin-transform-react-jsx-self': 7.27.1(@babel/core@7.28.3)
'@babel/plugin-transform-react-jsx-source': 7.27.1(@babel/core@7.28.3)
'@babel/plugin-transform-runtime': 7.23.9(@babel/core@7.28.3)
'@babel/plugin-transform-shorthand-properties': 7.23.3(@babel/core@7.28.3)
'@babel/plugin-transform-spread': 7.23.3(@babel/core@7.28.3)
'@babel/plugin-transform-sticky-regex': 7.23.3(@babel/core@7.28.3)
'@babel/plugin-transform-typescript': 7.23.6(@babel/core@7.28.3)
'@babel/plugin-transform-typescript': 7.28.0(@babel/core@7.28.3)
'@babel/plugin-transform-unicode-regex': 7.23.3(@babel/core@7.28.3)
'@babel/template': 7.27.2
'@react-native/babel-plugin-codegen': 0.73.4(@babel/preset-env@7.23.9(@babel/core@7.28.3))
@@ -22685,7 +22602,7 @@ snapshots:
'@react-native/codegen@0.73.3(@babel/preset-env@7.23.9(@babel/core@7.28.3))':
dependencies:
'@babel/parser': 7.26.3
'@babel/parser': 7.28.3
'@babel/preset-env': 7.23.9(@babel/core@7.28.3)
flow-parser: 0.206.0
glob: 7.2.3
@@ -25105,6 +25022,8 @@ snapshots:
atomic-sleep@1.0.0: {}
auto-console-group@1.2.11: {}
autoprefixer@10.4.20(postcss@8.4.47):
dependencies:
browserslist: 4.24.2
@@ -25153,7 +25072,7 @@ snapshots:
babel-plugin-polyfill-corejs2@0.4.8(@babel/core@7.28.3):
dependencies:
'@babel/compat-data': 7.23.5
'@babel/compat-data': 7.28.0
'@babel/core': 7.28.3
'@babel/helper-define-polyfill-provider': 0.5.0(@babel/core@7.28.3)
semver: 6.3.1
@@ -25674,7 +25593,7 @@ snapshots:
chrome-launcher@0.15.2:
dependencies:
'@types/node': 20.14.8
'@types/node': 24.7.1
escape-string-regexp: 4.0.0
is-wsl: 2.2.0
lighthouse-logger: 1.4.2
@@ -25683,7 +25602,7 @@ snapshots:
chromium-edge-launcher@1.0.0:
dependencies:
'@types/node': 20.14.8
'@types/node': 24.7.1
escape-string-regexp: 4.0.0
is-wsl: 2.2.0
lighthouse-logger: 1.4.2
@@ -28286,7 +28205,7 @@ snapshots:
hermes-profile-transformer@0.0.6:
dependencies:
source-map: 0.7.4
source-map: 0.7.6
highlight.js@10.7.3: {}
@@ -28779,7 +28698,7 @@ snapshots:
'@jest/environment': 29.7.0
'@jest/fake-timers': 29.7.0
'@jest/types': 29.6.3
'@types/node': 20.14.8
'@types/node': 24.7.1
jest-mock: 29.7.0
jest-util: 29.7.0
@@ -28800,13 +28719,13 @@ snapshots:
jest-mock@29.7.0:
dependencies:
'@jest/types': 29.6.3
'@types/node': 20.14.8
'@types/node': 24.7.1
jest-util: 29.7.0
jest-util@29.7.0:
dependencies:
'@jest/types': 29.6.3
'@types/node': 20.14.8
'@types/node': 24.7.1
chalk: 4.1.2
ci-info: 3.9.0
graceful-fs: 4.2.11
@@ -28823,7 +28742,7 @@ snapshots:
jest-worker@29.7.0:
dependencies:
'@types/node': 20.14.8
'@types/node': 24.7.1
jest-util: 29.7.0
merge-stream: 2.0.0
supports-color: 8.1.1
@@ -28884,7 +28803,7 @@ snapshots:
'@babel/plugin-proposal-class-properties': 7.18.6(@babel/core@7.28.3)
'@babel/plugin-proposal-nullish-coalescing-operator': 7.18.6(@babel/core@7.28.3)
'@babel/plugin-proposal-optional-chaining': 7.21.0(@babel/core@7.28.3)
'@babel/plugin-transform-modules-commonjs': 7.23.3(@babel/core@7.28.3)
'@babel/plugin-transform-modules-commonjs': 7.27.1(@babel/core@7.28.3)
'@babel/preset-env': 7.23.9(@babel/core@7.28.3)
'@babel/preset-flow': 7.23.3(@babel/core@7.28.3)
'@babel/preset-typescript': 7.27.1(@babel/core@7.28.3)
@@ -30999,7 +30918,7 @@ snapshots:
postcss@8.4.31:
dependencies:
nanoid: 3.3.7
nanoid: 3.3.11
picocolors: 1.1.1
source-map-js: 1.2.1
@@ -31573,7 +31492,7 @@ snapshots:
dependencies:
object-assign: 4.1.1
react: 19.1.1
react-is: 18.2.0
react-is: 18.3.1
react-simple-maps@3.0.0(prop-types@15.8.1)(react-dom@19.1.1(react@19.1.1))(react@19.1.1):
dependencies: