diff --git a/.agents/analytics.md b/.agents/analytics.md index 28cb6818b..00e896cbc 100644 --- a/.agents/analytics.md +++ b/.agents/analytics.md @@ -4,7 +4,7 @@ Reference for the TanStack.com event taxonomy in Google Analytics 4. **GA4 property:** `G-JMT1Z50SPS` **First-party proxy:** all hits route through `/_a/g/collect` on tanstack.com (see `netlify.toml`) -**Implementation:** [src/utils/analytics.ts](../src/utils/analytics.ts), [src/utils/analytics/events.ts](../src/utils/analytics/events.ts) +**Implementation:** [src/utils/analytics.ts](../src/utils/analytics.ts), [src/utils/analytics/registry.ts](../src/utils/analytics/registry.ts) ## Design principles @@ -317,7 +317,7 @@ Anything additive should not require schema migration of the existing taxonomy. **Add a new partner placement:** -1. Add the value to `PartnerPlacement` in [src/utils/analytics/events.ts](../src/utils/analytics/events.ts) +1. Add the value to `PartnerPlacement` in [src/utils/analytics/registry.ts](../src/utils/analytics/registry.ts) 2. Use it at the call site 3. (Optional) update the placement table in this doc @@ -342,7 +342,7 @@ Anything additive should not require schema migration of the existing taxonomy. | File | Purpose | | ------------------------------------------------------------------------------------- | -------------------------------------------------------------------- | | [src/utils/analytics.ts](../src/utils/analytics.ts) | `trackEvent`, `useTrackedImpression`, `trackPageView`, `getPageType` | -| [src/utils/analytics/events.ts](../src/utils/analytics/events.ts) | Typed event registry — discriminated union of all events | +| [src/utils/analytics/registry.ts](../src/utils/analytics/registry.ts) | Typed event registry — discriminated union of all events | | [src/utils/analytics/providers/google.ts](../src/utils/analytics/providers/google.ts) | gtag wrapper | | [src/utils/analytics/types.ts](../src/utils/analytics/types.ts) | Provider interface | | [src/routes/\_\_root.tsx](../src/routes/__root.tsx) | gtag bootstrap, `PageViewTracker` | diff --git a/package.json b/package.json index cf2375f88..0fa12b0fc 100644 --- a/package.json +++ b/package.json @@ -67,6 +67,10 @@ "@babel/parser": "7.29.9", "@babel/types": "7.29.8", "@base-ui/react": "^1.8.0", + "@c15t/core": "3.2.2", + "@c15t/integrations": "3.2.2", + "@c15t/react": "3.2.2", + "@c15t/tanstack-start": "3.2.2", "@cfworker/json-schema": "^4.1.1", "@codemirror/lang-css": "^6.3.1", "@codemirror/lang-html": "^6.4.12", @@ -91,9 +95,9 @@ "@radix-ui/react-tooltip": "^1.2.8", "@react-three/drei": "^10.7.7", "@react-three/fiber": "^9.5.0", - "@sentry/browser": "^10.47.0", - "@sentry/node": "^10.47.0", - "@sentry/tanstackstart-react": "^10.47.0", + "@sentry/browser": "^10.76.1", + "@sentry/node": "^10.76.1", + "@sentry/tanstackstart-react": "^10.76.1", "@shopify/hydrogen-react": "^2026.4.0", "@tailwindcss/typography": "^0.5.19", "@tailwindcss/vite": "^4.2.2", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 02e52c155..607e03ec4 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -37,6 +37,18 @@ importers: '@base-ui/react': specifier: ^1.8.0 version: 1.8.0(@types/react@19.2.14)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) + '@c15t/core': + specifier: 3.2.2 + version: 3.2.2(typescript@6.0.2) + '@c15t/integrations': + specifier: 3.2.2 + version: 3.2.2(typescript@6.0.2) + '@c15t/react': + specifier: 3.2.2 + version: 3.2.2(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(typescript@6.0.2) + '@c15t/tanstack-start': + specifier: 3.2.2 + version: 3.2.2(@tanstack/react-router@1.170.41(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(@tanstack/react-start@1.168.60(esbuild@0.27.4)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(rolldown@1.0.3)(vite@8.0.16(@types/node@25.5.0)(esbuild@0.27.4)(jiti@2.7.0)(tsx@4.21.0)(yaml@2.9.0)))(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(typescript@6.0.2) '@cfworker/json-schema': specifier: ^4.1.1 version: 4.1.1 @@ -110,14 +122,14 @@ importers: specifier: ^9.5.0 version: 9.5.0(@types/react@19.2.14)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(three@0.183.2) '@sentry/browser': - specifier: ^10.47.0 - version: 10.47.0 + specifier: ^10.76.1 + version: 10.78.0 '@sentry/node': - specifier: ^10.47.0 - version: 10.47.0 + specifier: ^10.76.1 + version: 10.78.0(@opentelemetry/core@2.12.0(@opentelemetry/api@1.9.1)) '@sentry/tanstackstart-react': - specifier: ^10.47.0 - version: 10.47.0(react@19.2.3)(rollup@4.53.3) + specifier: ^10.76.1 + version: 10.78.0(@opentelemetry/core@2.12.0(@opentelemetry/api@1.9.1))(react@19.2.3) '@shopify/hydrogen-react': specifier: ^2026.4.0 version: 2026.4.0(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(three@0.183.2)(vite@8.0.16(@types/node@25.5.0)(esbuild@0.27.4)(jiti@2.7.0)(tsx@4.21.0)(yaml@2.9.0)) @@ -201,7 +213,7 @@ importers: version: 1.167.2(@tanstack/query-core@5.102.8)(@tanstack/react-query@5.102.8(react@19.2.3))(@tanstack/react-router@1.170.41(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(@tanstack/router-core@1.171.34)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) '@tanstack/react-start': specifier: 1.168.60 - version: 1.168.60(esbuild@0.27.4)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(rolldown@1.0.3)(rollup@4.53.3)(vite@8.0.16(@types/node@25.5.0)(esbuild@0.27.4)(jiti@2.7.0)(tsx@4.21.0)(yaml@2.9.0)) + version: 1.168.60(esbuild@0.27.4)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(rolldown@1.0.3)(vite@8.0.16(@types/node@25.5.0)(esbuild@0.27.4)(jiti@2.7.0)(tsx@4.21.0)(yaml@2.9.0)) '@tanstack/react-start-client': specifier: 1.168.39 version: 1.168.39(react-dom@19.2.3(react@19.2.3))(react@19.2.3) @@ -617,18 +629,10 @@ packages: resolution: {integrity: sha512-Aup7aUOfpbAUg2ROOJN6Iw5f9DMBlzu0mIkm/malLQFN/YQgO48wCj0Kxa3sEHJvPVFg7siR+qRInwXd2qhQKw==} engines: {node: '>=6.9.0'} - '@babel/compat-data@7.29.0': - resolution: {integrity: sha512-T1NCJqT/j9+cn8fvkt7jtwbLBfLC/1y1c7NtCeXFRgzGTsafi68MRv8yzkYSapBnFA6L3U2VSc02ciDzoAJhJg==} - engines: {node: '>=6.9.0'} - '@babel/compat-data@7.29.7': resolution: {integrity: sha512-locTkQyKvwIEgBzVrn8693ebc97F2U8ZHjbXwDXJ5Fn2TCpNwTlKcaKLkdHop5c/icOFE7qt7Q9JC5hnKNa6Gg==} engines: {node: '>=6.9.0'} - '@babel/core@7.29.0': - resolution: {integrity: sha512-CGOfOJqWjg2qW/Mb6zNsDm+u5vFQ8DxXfbM09z69p5Z6+mE1ikP2jUXw+j42Pf1XTYED2Rni5f95npYeuwMDQA==} - engines: {node: '>=6.9.0'} - '@babel/core@7.29.7': resolution: {integrity: sha512-RgHBCvtjbOK2gXSNBNIkNoEc9qoVEtau3hj8gEqKQuL3HZAibKarWFEI3Lfm6EYKkLalOh8eSrj9b+ch9H/VBA==} engines: {node: '>=6.9.0'} @@ -637,36 +641,18 @@ packages: resolution: {integrity: sha512-gZbepsdh3WDtgZKWL+vTPh71LSBrm/Y4/QDZBVCcYfmeTEEuoOYwlSy+G1StfJg+/Zy550u/3TATbm7qDbbMtg==} engines: {node: '>=6.9.0'} - '@babel/helper-compilation-targets@7.28.6': - resolution: {integrity: sha512-JYtls3hqi15fcx5GaSNL7SCTJ2MNmjrkHXg4FSpOA/grxK8KwyZ5bubHsCq8FXCkua6xhuaaBit+3b7+VZRfcA==} - engines: {node: '>=6.9.0'} - '@babel/helper-compilation-targets@7.29.7': resolution: {integrity: sha512-wem6WaBj4NaVYVdNhLPPVacES6ZJ+KBBfSkTMD3YZxbP3rm3Di85tJU5ljaUNhaOynt+Aj0xruhYuzQBt8n71g==} engines: {node: '>=6.9.0'} - '@babel/helper-globals@7.28.0': - resolution: {integrity: sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==} - engines: {node: '>=6.9.0'} - '@babel/helper-globals@7.29.7': resolution: {integrity: sha512-3nQVUAtvkKH9zahfWgw96Jc/uFOmjACE1kQz82E2lqWmHBgjzbNlsC22nuQTfahmWeQtTq5nQ/4Nnd2A1wj4zA==} engines: {node: '>=6.9.0'} - '@babel/helper-module-imports@7.28.6': - resolution: {integrity: sha512-l5XkZK7r7wa9LucGw9LwZyyCUscb4x37JWTPz7swwFE/0FMQAGpiWUZn8u9DzkSBWEcK25jmvubfpw2dnAMdbw==} - engines: {node: '>=6.9.0'} - '@babel/helper-module-imports@7.29.7': resolution: {integrity: sha512-ejHwrQQYcm9xnTivShn2IDOlIzInN34AXskvq9QicvCtEzq1Vzclu/tKF8Jq1Cg8JG2GL6/EmjgsCT7lXepE3g==} engines: {node: '>=6.9.0'} - '@babel/helper-module-transforms@7.28.6': - resolution: {integrity: sha512-67oXFAYr2cDLDVGLXTEABjdBJZ6drElUSI7WKp70NrpyISso3plG9SAGEF6y7zbha/wOzUByWWTJvEDVNIUGcA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 - '@babel/helper-module-transforms@7.29.7': resolution: {integrity: sha512-UPUVSyXbOh627KiCIGQSgwWzGeBKLkaJ9PJEdrngIwMSzxLR4jS4+f1f1jb7VzBbg8nFLaYotvVPFCTqdrmTAg==} engines: {node: '>=6.9.0'} @@ -681,18 +667,10 @@ packages: resolution: {integrity: sha512-qehxGkRj55h/ff8EMaJ+cYhyaKlHIxqYDn682wQD7RNp9UujOQsHog2uS0r2vzr4pW+sXf90NeeayjcNaX3fFg==} engines: {node: '>=6.9.0'} - '@babel/helper-validator-option@7.27.1': - resolution: {integrity: sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==} - engines: {node: '>=6.9.0'} - '@babel/helper-validator-option@7.29.7': resolution: {integrity: sha512-N9ZErrD+yW5geCDtBqnOoxmR8+tNKiGuxKlDpuJxfsqpa2dFcexaziGAE/qoHLiDDreVNMupxGmSoNlyvsA3gw==} engines: {node: '>=6.9.0'} - '@babel/helpers@7.29.2': - resolution: {integrity: sha512-HoGuUs4sCZNezVEKdVcwqmZN8GoHirLUcLaYVNBK2J0DadGtdcqgr3BCbvH8+XUo4NGjNl3VOtSjEKNzqfFgKw==} - engines: {node: '>=6.9.0'} - '@babel/helpers@7.29.7': resolution: {integrity: sha512-1k2lAGRMfHTcwuNYcCNUmaUffmQv8KWMfh2iJUUeRlwlwH4FdNG7mfPI10NPfLHJFThE4Tyr4mv7kTNZOiPuBg==} engines: {node: '>=6.9.0'} @@ -715,18 +693,10 @@ packages: resolution: {integrity: sha512-Nq8OhGWiZIZGV6hLHoyAKLLcJihP/xFeBMGJoUrxTX2psI8dCifzLhZISFb+VWS3wFMRDmCGw5R+dOySCqPLhw==} engines: {node: '>=6.9.0'} - '@babel/template@7.28.6': - resolution: {integrity: sha512-YA6Ma2KsCdGb+WC6UpBVFJGXL58MDA6oyONbjyF/+5sBgxY/dwkhLogbMT2GXXyU84/IhRw/2D1Os1B/giz+BQ==} - engines: {node: '>=6.9.0'} - '@babel/template@7.29.7': resolution: {integrity: sha512-puq+Gf35oI24FeN11LkoUQFqv9uwNeWpxXZi/Ji3rRIoKAzKnxRaZ+Gkj0vKS9ZCiTESfng1N9LyOyXvo+m+Gg==} engines: {node: '>=6.9.0'} - '@babel/traverse@7.29.0': - resolution: {integrity: sha512-4HPiQr0X7+waHfyXPZpWPfWL/J7dcN1mx9gL6WdQVMbPnF3+ZhSMs8tCxN7oHddJE9fhNE7+lxdnlyemKfJRuA==} - engines: {node: '>=6.9.0'} - '@babel/traverse@7.29.8': resolution: {integrity: sha512-I5z7H3bf/41ktsNVLtpN0wAa336HkqIHQ5BuPLEhTkt1jVSyZpeNKIzTgEWmlxjdg81R0IgUCcaE+Ok3NvrfZg==} engines: {node: '>=6.9.0'} @@ -765,6 +735,55 @@ packages: '@braintree/sanitize-url@7.1.2': resolution: {integrity: sha512-jigsZK+sMF/cuiB7sERuo9V7N9jx+dhmHHnQyDSVdpZwVutaBu7WvNYqMDLSgFgfB30n452TP3vjDAvFC973mA==} + '@c15t/core@3.2.2': + resolution: {integrity: sha512-GqMuXlTUqz8CHUvuof8+boAi0o4b/Qmhuh599gB05EerWzU78TywVqEOT48ymEhzZHMiPwhZO8J29nVm91kdVA==} + + '@c15t/dev-tools@3.2.2': + resolution: {integrity: sha512-K+yO0sF77b4s8UlSMU788huSU7M1KMzWJi4LiJk0GTLU1UcJUBMH/cLA4+xSTRVP6QRCG9EW+mrQQTZfKh4qJw==} + + '@c15t/iab@3.2.2': + resolution: {integrity: sha512-67Cun+PxdJPYHMuSgZHrje88XtqokDF7s3P18r00vTPl+aoQfpr1qGanFFmGXLAP3zjt1JAJr67Nw33+RzhNnw==} + + '@c15t/integrations@3.2.2': + resolution: {integrity: sha512-XZ15go4p8uxycLaOMcXz/wYlOcBGrLn14oDNm7pF3QPBgMKAkKDrWSZUixYvU7T/NzvcIvUHBBTCc5deqjz50Q==} + + '@c15t/react@3.2.2': + resolution: {integrity: sha512-afO5v1F/N4ZGGrZhPZd3y+boQMWKKRMfbM4x5YthlP69bXL7smKRQV9YY2QOxm/9BqLUCqDWD0Y3be3n4kqJ0g==} + peerDependencies: + react: ^18.0.0 || ^19.0.0 || ^19.0.0-rc + react-dom: ^18.0.0 || ^19.0.0 || ^19.0.0-rc + peerDependenciesMeta: + react: + optional: true + react-dom: + optional: true + + '@c15t/schema@3.1.3': + resolution: {integrity: sha512-ZRa32yJgblybMF4SZQItPgRdMU+wRxu5NFYcg6vJHHhiWkutXszF8DZYmUrAzv/AtUcoxaftyVQd6s5ZksTRwg==} + + '@c15t/tanstack-start@3.2.2': + resolution: {integrity: sha512-k2qaYR+ckMxbI6y9NrZ1eZLK8KPFikyCsGxvlTtPAeAIq0WYmRIBcUMDohqtjEpUhS25kiGKY3+tWxx+lnI9TQ==} + peerDependencies: + '@tanstack/react-router': ^1.170.41 + '@tanstack/react-start': ^1.168.60 + react: ^18.0.0 || ^19.0.0 || ^19.0.0-rc + react-dom: ^18.0.0 || ^19.0.0 || ^19.0.0-rc + peerDependenciesMeta: + '@tanstack/react-router': + optional: true + '@tanstack/react-start': + optional: true + react: + optional: true + react-dom: + optional: true + + '@c15t/translations@3.2.2': + resolution: {integrity: sha512-hjtwHbyOFtbG0iEIBmgiyZH1fQpxxnKR4voQTywZD+uKd0Vb1asgzb27WcL+Dua3pBcNFw0nbH6KTxwe+d3vHg==} + + '@c15t/ui@3.1.2': + resolution: {integrity: sha512-xo758DbRhhlXAGLVRkwdgA6Ke6Zzx+C9EKt28a2WnVMXqXR+FyUy3ko4OE0CVgiBB8zYvCbJupGA2NrN7uZvsg==} + '@cfworker/json-schema@4.1.1': resolution: {integrity: sha512-gAmrUZSGtKc3AiBL71iNWxDsyUC5uMaKKGdvzYsBoTW/xi42JQHl7eKV2OYzCUqvc+D2RCcf7EXY2iCyFIk6og==} @@ -1631,11 +1650,6 @@ packages: cpu: [x64] os: [win32] - '@fastify/otel@0.18.0': - resolution: {integrity: sha512-3TASCATfw+ctICSb4ymrv7iCm0qJ0N9CarB+CZ7zIJ7KqNbwI5JjyDL1/sxoC0ccTO1Zyd1iQ+oqncPg5FJXaA==} - peerDependencies: - '@opentelemetry/api': ^1.9.0 - '@fingerprintjs/fingerprintjs-pro-react@2.7.1': resolution: {integrity: sha512-/vQtjd+P8C9OFU8Wvd4AScoNRP6RKDIvYQwwaY/b31PcRBNDqVV9xm7DDBg9uTdDv4KZM3ubEY4JyyVWkXs4EA==} @@ -1702,6 +1716,9 @@ packages: peerDependencies: hono: ^4 + '@iabtechlabtcf/core@1.5.22': + resolution: {integrity: sha512-Iaz42mXXflxLL19nU7S7RBV1hjELln32mettVVTxdzFFqxVPze6dOzgaNMHP/L9a2Anr017D7yFAcPzMgnfchw==} + '@iconify/types@2.0.0': resolution: {integrity: sha512-+wluvCrRhXrhyOmRDJ3q8mux9JkKy5SJ/v8ol2tu4FVjyYvtEzkc/3pK15ET6RKg4b4w4BmTk1+gsCUhf21Ykg==} @@ -2200,196 +2217,41 @@ packages: '@openrouter/sdk@0.13.20': resolution: {integrity: sha512-fx4o19FHgadEldfrSOgSbXAi32hCE3O708q1nxcoxYrW6fP6/WggX3o5PmnlnObzmxrqLMkZpqg188K+Twguhg==} - '@opentelemetry/api-logs@0.207.0': - resolution: {integrity: sha512-lAb0jQRVyleQQGiuuvCOTDVspc14nx6XJjP4FspJ1sNARo3Regq4ZZbrc3rN4b1TYSuUCvgH+UXUPug4SLOqEQ==} - engines: {node: '>=8.0.0'} - - '@opentelemetry/api-logs@0.212.0': - resolution: {integrity: sha512-TEEVrLbNROUkYY51sBJGk7lO/OLjuepch8+hmpM6ffMJQ2z/KVCjdHuCFX6fJj8OkJP2zckPjrJzQtXU3IAsFg==} - engines: {node: '>=8.0.0'} - - '@opentelemetry/api-logs@0.214.0': - resolution: {integrity: sha512-40lSJeqYO8Uz2Yj7u94/SJWE/wONa7rmMKjI1ZcIjgf3MHNHv1OZUCrCETGuaRF62d5pQD1wKIW+L4lmSMTzZA==} + '@opentelemetry/api-logs@0.220.0': + resolution: {integrity: sha512-CmVa4ImJ+ynfrPMNaAXHET6Bhb44SwzmfyVJFq9ni2jgXJR/l7C6gfVFddNmHP+ZOkP9cf4f9DBe68qVLTHc9w==} engines: {node: '>=8.0.0'} '@opentelemetry/api@1.9.1': resolution: {integrity: sha512-gLyJlPHPZYdAk1JENA9LeHejZe1Ti77/pTeFm/nMXmQH/HFZlcS/O2XJB+L8fkbrNSqhdtlvjBVjxwUYanNH5Q==} engines: {node: '>=8.0.0'} - '@opentelemetry/context-async-hooks@2.6.1': - resolution: {integrity: sha512-XHzhwRNkBpeP8Fs/qjGrAf9r9PRv67wkJQ/7ZPaBQQ68DYlTBBx5MF9LvPx7mhuXcDessKK2b+DcxqwpgkcivQ==} - engines: {node: ^18.19.0 || >=20.6.0} - peerDependencies: - '@opentelemetry/api': '>=1.0.0 <1.10.0' - - '@opentelemetry/core@2.6.1': - resolution: {integrity: sha512-8xHSGWpJP9wBxgBpnqGL0R3PbdWQndL1Qp50qrg71+B28zK5OQmUgcDKLJgzyAAV38t4tOyLMGDD60LneR5W8g==} + '@opentelemetry/core@2.12.0': + resolution: {integrity: sha512-1HsSAuvT4/my0QrXWsyXFdWjKaPeCHsismKZgEEIb8NK13LP6DrMRlsUbvD/0F9mDWK3xDom9AMv3IscxgOnOQ==} engines: {node: ^18.19.0 || >=20.6.0} peerDependencies: '@opentelemetry/api': '>=1.0.0 <1.10.0' - '@opentelemetry/instrumentation-amqplib@0.61.0': - resolution: {integrity: sha512-mCKoyTGfRNisge4br0NpOFSy2Z1NnEW8hbCJdUDdJFHrPqVzc4IIBPA/vX0U+LUcQqrQvJX+HMIU0dbDRe0i0Q==} - engines: {node: ^18.19.0 || >=20.6.0} - peerDependencies: - '@opentelemetry/api': ^1.3.0 - - '@opentelemetry/instrumentation-connect@0.57.0': - resolution: {integrity: sha512-FMEBChnI4FLN5TE9DHwfH7QpNir1JzXno1uz/TAucVdLCyrG0jTrKIcNHt/i30A0M2AunNBCkcd8Ei26dIPKdg==} - engines: {node: ^18.19.0 || >=20.6.0} - peerDependencies: - '@opentelemetry/api': ^1.3.0 - - '@opentelemetry/instrumentation-dataloader@0.31.0': - resolution: {integrity: sha512-f654tZFQXS5YeLDNb9KySrwtg7SnqZN119FauD7acBoTzuLduaiGTNz88ixcVSOOMGZ+EjJu/RFtx5klObC95g==} - engines: {node: ^18.19.0 || >=20.6.0} - peerDependencies: - '@opentelemetry/api': ^1.3.0 - - '@opentelemetry/instrumentation-express@0.62.0': - resolution: {integrity: sha512-Tvx+vgAZKEQxU3Rx+xWLiR0mLxHwmk69/8ya04+VsV9WYh8w6Lhx5hm5yAMvo1wy0KqWgFKBLwSeo3sHCwdOww==} - engines: {node: ^18.19.0 || >=20.6.0} - peerDependencies: - '@opentelemetry/api': ^1.3.0 - - '@opentelemetry/instrumentation-fs@0.33.0': - resolution: {integrity: sha512-sCZWXGalQ01wr3tAhSR9ucqFJ0phidpAle6/17HVjD6gN8FLmZMK/8sKxdXYHy3PbnlV1P4zeiSVFNKpbFMNLA==} - engines: {node: ^18.19.0 || >=20.6.0} - peerDependencies: - '@opentelemetry/api': ^1.3.0 - - '@opentelemetry/instrumentation-generic-pool@0.57.0': - resolution: {integrity: sha512-orhmlaK+ZIW9hKU+nHTbXrCSXZcH83AescTqmpamHRobRmYSQwRbD0a1odc0yAzuzOtxYiHiXAnpnIpaSSY7Ow==} - engines: {node: ^18.19.0 || >=20.6.0} - peerDependencies: - '@opentelemetry/api': ^1.3.0 - - '@opentelemetry/instrumentation-graphql@0.62.0': - resolution: {integrity: sha512-3YNuLVPUxafXkH1jBAbGsKNsP3XVzcFDhCDCE3OqBwCwShlqQbLMRMFh1T/d5jaVZiGVmSsfof+ICKD2iOV8xg==} - engines: {node: ^18.19.0 || >=20.6.0} - peerDependencies: - '@opentelemetry/api': ^1.3.0 - - '@opentelemetry/instrumentation-hapi@0.60.0': - resolution: {integrity: sha512-aNljZKYrEa7obLAxd1bCEDxF7kzCLGXTuTJZ8lMR9rIVEjmuKBXN1gfqpm/OB//Zc2zP4iIve1jBp7sr3mQV6w==} - engines: {node: ^18.19.0 || >=20.6.0} - peerDependencies: - '@opentelemetry/api': ^1.3.0 - - '@opentelemetry/instrumentation-http@0.214.0': - resolution: {integrity: sha512-FlkDhZDRjDJDcO2LcSCtjRpkal1NJ8y0fBqBhTvfAR3JSYY2jAIj1kSS5IjmEBt4c3aWv+u/lqLuoCDrrKCSKg==} - engines: {node: ^18.19.0 || >=20.6.0} - peerDependencies: - '@opentelemetry/api': ^1.3.0 - - '@opentelemetry/instrumentation-ioredis@0.62.0': - resolution: {integrity: sha512-ZYt//zcPve8qklaZX+5Z4MkU7UpEkFRrxsf2cnaKYBitqDnsCN69CPAuuMOX6NYdW2rG9sFy7V/QWtBlP5XiNQ==} - engines: {node: ^18.19.0 || >=20.6.0} - peerDependencies: - '@opentelemetry/api': ^1.3.0 - - '@opentelemetry/instrumentation-kafkajs@0.23.0': - resolution: {integrity: sha512-4K+nVo+zI+aDz0Z85SObwbdixIbzS9moIuKJaYsdlzcHYnKOPtB7ya8r8Ezivy/GVIBHiKJVq4tv+BEkgOMLaQ==} - engines: {node: ^18.19.0 || >=20.6.0} - peerDependencies: - '@opentelemetry/api': ^1.3.0 - - '@opentelemetry/instrumentation-knex@0.58.0': - resolution: {integrity: sha512-Hc/o8fSsaWxZ8r1Yw4rNDLwTpUopTf4X32y4W6UhlHmW8Wizz8wfhgOKIelSeqFVTKBBPIDUOsQWuIMxBmu8Bw==} - engines: {node: ^18.19.0 || >=20.6.0} - peerDependencies: - '@opentelemetry/api': ^1.3.0 - - '@opentelemetry/instrumentation-koa@0.62.0': - resolution: {integrity: sha512-uVip0VuGUQXZ+vFxkKxAUNq8qNl+VFlyHDh/U6IQ8COOEDfbEchdaHnpFrMYF3psZRUuoSIgb7xOeXj00RdwDA==} - engines: {node: ^18.19.0 || >=20.6.0} - peerDependencies: - '@opentelemetry/api': ^1.9.0 - - '@opentelemetry/instrumentation-lru-memoizer@0.58.0': - resolution: {integrity: sha512-6grM3TdMyHzlGY1cUA+mwoPueB1F3dYKgKtZIH6jOFXqfHAByyLTc+6PFjGM9tKh52CFBJaDwodNlL/Td39z7Q==} - engines: {node: ^18.19.0 || >=20.6.0} - peerDependencies: - '@opentelemetry/api': ^1.3.0 - - '@opentelemetry/instrumentation-mongodb@0.67.0': - resolution: {integrity: sha512-1WJp5N1lYfHq2IhECOTewFs5Tf2NfUOwQRqs/rZdXKTezArMlucxgzAaqcgp3A3YREXopXTpXHsxZTGHjNhMdQ==} - engines: {node: ^18.19.0 || >=20.6.0} - peerDependencies: - '@opentelemetry/api': ^1.3.0 - - '@opentelemetry/instrumentation-mongoose@0.60.0': - resolution: {integrity: sha512-8BahAZpKsOoc+lrZGb7Ofn4g3z8qtp5IxDfvAVpKXsEheQN7ONMH5djT5ihy6yf8yyeQJGS0gXFfpEAEeEHqQg==} - engines: {node: ^18.19.0 || >=20.6.0} - peerDependencies: - '@opentelemetry/api': ^1.3.0 - - '@opentelemetry/instrumentation-mysql2@0.60.0': - resolution: {integrity: sha512-m/5d3bxQALllCzezYDk/6vajh0tj5OijMMvOZGr+qN1NMXm1dzMNwyJ0gNZW7Fo3YFRyj/jJMxIw+W7d525dlw==} - engines: {node: ^18.19.0 || >=20.6.0} - peerDependencies: - '@opentelemetry/api': ^1.3.0 - - '@opentelemetry/instrumentation-mysql@0.60.0': - resolution: {integrity: sha512-08pO8GFPEIz2zquKDGteBZDNmwketdgH8hTe9rVYgW9kCJXq1Psj3wPQGx+VaX4ZJKCfPeoLMYup9+cxHvZyVQ==} - engines: {node: ^18.19.0 || >=20.6.0} - peerDependencies: - '@opentelemetry/api': ^1.3.0 - - '@opentelemetry/instrumentation-pg@0.66.0': - resolution: {integrity: sha512-KxfLGXBb7k2ueaPJfq2GXBDXBly8P+SpR/4Mj410hhNgmQF3sCqwXvUBQxZQkDAmsdBAoenM+yV1LhtsMRamcA==} - engines: {node: ^18.19.0 || >=20.6.0} - peerDependencies: - '@opentelemetry/api': ^1.3.0 - - '@opentelemetry/instrumentation-redis@0.62.0': - resolution: {integrity: sha512-y3pPpot7WzR/8JtHcYlTYsyY8g+pbFhAqbwAuG5bLPnR6v6pt1rQc0DpH0OlGP/9CZbWBP+Zhwp9yFoygf/ZXQ==} - engines: {node: ^18.19.0 || >=20.6.0} - peerDependencies: - '@opentelemetry/api': ^1.3.0 - - '@opentelemetry/instrumentation-tedious@0.33.0': - resolution: {integrity: sha512-Q6WQwAD01MMTub31GlejoiFACYNw26J426wyjvU7by7fDIr2nZXNW4vhTGs7i7F0TnXBO3xN688g1tdUgYwJ5w==} - engines: {node: ^18.19.0 || >=20.6.0} - peerDependencies: - '@opentelemetry/api': ^1.3.0 - - '@opentelemetry/instrumentation-undici@0.24.0': - resolution: {integrity: sha512-oKzZ3uvqP17sV0EsoQcJgjEfIp0kiZRbYu/eD8p13Cbahumf8lb/xpYeNr/hfAJ4owzEtIDcGIjprfLcYbIKBQ==} - engines: {node: ^18.19.0 || >=20.6.0} - peerDependencies: - '@opentelemetry/api': ^1.7.0 - - '@opentelemetry/instrumentation@0.207.0': - resolution: {integrity: sha512-y6eeli9+TLKnznrR8AZlQMSJT7wILpXH+6EYq5Vf/4Ao+huI7EedxQHwRgVUOMLFbe7VFDvHJrX9/f4lcwnJsA==} - engines: {node: ^18.19.0 || >=20.6.0} - peerDependencies: - '@opentelemetry/api': ^1.3.0 - - '@opentelemetry/instrumentation@0.212.0': - resolution: {integrity: sha512-IyXmpNnifNouMOe0I/gX7ENfv2ZCNdYTF0FpCsoBcpbIHzk81Ww9rQTYTnvghszCg7qGrIhNvWC8dhEifgX9Jg==} + '@opentelemetry/instrumentation@0.220.0': + resolution: {integrity: sha512-xQx3E2WxP1mDvKzxLxX+CTCtNLa560YJZ3087qYHerl2YmiKpv7AH+dAy7vmx+eVrZ5BwhfWUAVoKOoxCNHcpw==} engines: {node: ^18.19.0 || >=20.6.0} peerDependencies: '@opentelemetry/api': ^1.3.0 - '@opentelemetry/instrumentation@0.214.0': - resolution: {integrity: sha512-MHqEX5Dk59cqVah5LiARMACku7jXSVk9iVDWOea4x3cr7VfdByeDCURK6o1lntT1JS/Tsovw01UJrBhN3/uC5w==} + '@opentelemetry/resources@2.12.0': + resolution: {integrity: sha512-+rSRoOdln6NhXTVcBdHSlZxJDNzwxadeweK2ltZO3tVtfp6aklABc06xclDk6ovRR+EiGgIcSbh/6NgjFhnb3A==} engines: {node: ^18.19.0 || >=20.6.0} peerDependencies: - '@opentelemetry/api': ^1.3.0 - - '@opentelemetry/redis-common@0.38.2': - resolution: {integrity: sha512-1BCcU93iwSRZvDAgwUxC/DV4T/406SkMfxGqu5ojc3AvNI+I9GhV7v0J1HljsczuuhcnFLYqD5VmwVXfCGHzxA==} - engines: {node: ^18.19.0 || >=20.6.0} + '@opentelemetry/api': '>=1.3.0 <1.10.0' - '@opentelemetry/resources@2.6.1': - resolution: {integrity: sha512-lID/vxSuKWXM55XhAKNoYXu9Cutoq5hFdkbTdI/zDKQktXzcWBVhNsOkiZFTMU9UtEWuGRNe0HUgmsFldIdxVA==} + '@opentelemetry/sdk-trace-base@2.12.0': + resolution: {integrity: sha512-JOERgZCxRM06FEJ5kEWxlSRChah6MmXDx3KwCruqEv/iEyLkTokCSemf2y1w8oIHtfrr8EVTpzebq/31vn2Cpg==} engines: {node: ^18.19.0 || >=20.6.0} + deprecated: Use @opentelemetry/sdk-trace package peerDependencies: '@opentelemetry/api': '>=1.3.0 <1.10.0' - '@opentelemetry/sdk-trace-base@2.6.1': - resolution: {integrity: sha512-r86ut4T1e8vNwB35CqCcKd45yzqH6/6Wzvpk2/cZB8PsPLlZFTvrh8yfOS3CYZYcUmAx4hHTZJ8AO8Dj8nrdhw==} + '@opentelemetry/sdk-trace@2.12.0': + resolution: {integrity: sha512-ImVuRQ6faOsTi1Wna88s2avgrrf/iDgXPigIeynkUhjstMuoQUDOJXgkez2j1mlU4btjXcXBGa+q7qKFYR3GsA==} engines: {node: ^18.19.0 || >=20.6.0} peerDependencies: '@opentelemetry/api': '>=1.3.0 <1.10.0' @@ -2398,12 +2260,6 @@ packages: resolution: {integrity: sha512-cifvXDhcqMwwTlTK04GBNeIe7yyo28Mfby85QXFe1Yk8nmi36Ab/5UQwptOx84SsoGNRg+EVSjwzfSZMy6pmlw==} engines: {node: '>=14'} - '@opentelemetry/sql-common@0.41.2': - resolution: {integrity: sha512-4mhWm3Z8z+i508zQJ7r6Xi7y4mmoJpdvH0fZPFRkWrdp5fq7hhZ2HhYokEOLkfqSMgPR4Z9EyB3DBkbKGOqZiQ==} - engines: {node: ^18.19.0 || >=20.6.0} - peerDependencies: - '@opentelemetry/api': ^1.1.0 - '@oxc-parser/binding-android-arm-eabi@0.120.0': resolution: {integrity: sha512-WU3qtINx802wOl8RxAF1v0VvmC2O4D9M8Sv486nLeQ7iPHVmncYZrtBhB4SYyX+XZxj2PNnCcN+PW21jHgiOxg==} engines: {node: ^20.19.0 || >=22.12.0} @@ -2845,11 +2701,6 @@ packages: '@preact/signals-core@1.14.4': resolution: {integrity: sha512-HNB6HYeYKhQbJ1aKl+YRjrS4+QWHLKX6qKoUsfS/m0vqzsVaEBiZiaKbG/e+NKk2ch5ALQr/ihWaMHxiCuuWHA==} - '@prisma/instrumentation@7.6.0': - resolution: {integrity: sha512-ZPW2gRiwpPzEfgeZgaekhqXrbW+Y2RJKHVqUmlhZhKzRNCcvR6DykzylDrynpArKKRQtLxoZy36fK7U0p3pdgQ==} - peerDependencies: - '@opentelemetry/api': ^1.8 - '@protobufjs/aspromise@1.1.2': resolution: {integrity: sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ==} @@ -3341,276 +3192,150 @@ packages: '@rolldown/pluginutils@1.0.1': resolution: {integrity: sha512-2j9bGt5Jh8hj+vPtgzPtl72j0yRxHAyumoo6TNfAjsLB04UtpSvPbPcDcBMxz7n+9CYB0c1GxQFxYRg2jimqGw==} - '@rollup/rollup-android-arm-eabi@4.53.3': - resolution: {integrity: sha512-mRSi+4cBjrRLoaal2PnqH82Wqyb+d3HsPUN/W+WslCXsZsyHa9ZeQQX/pQsZaVIWDkPcpV6jJ+3KLbTbgnwv8w==} - cpu: [arm] - os: [android] - - '@rollup/rollup-android-arm64@4.53.3': - resolution: {integrity: sha512-CbDGaMpdE9sh7sCmTrTUyllhrg65t6SwhjlMJsLr+J8YjFuPmCEjbBSx4Z/e4SmDyH3aB5hGaJUP2ltV/vcs4w==} - cpu: [arm64] - os: [android] - - '@rollup/rollup-darwin-arm64@4.53.3': - resolution: {integrity: sha512-Nr7SlQeqIBpOV6BHHGZgYBuSdanCXuw09hon14MGOLGmXAFYjx1wNvquVPmpZnl0tLjg25dEdr4IQ6GgyToCUA==} - cpu: [arm64] - os: [darwin] - - '@rollup/rollup-darwin-x64@4.53.3': - resolution: {integrity: sha512-DZ8N4CSNfl965CmPktJ8oBnfYr3F8dTTNBQkRlffnUarJ2ohudQD17sZBa097J8xhQ26AwhHJ5mvUyQW8ddTsQ==} - cpu: [x64] - os: [darwin] - - '@rollup/rollup-freebsd-arm64@4.53.3': - resolution: {integrity: sha512-yMTrCrK92aGyi7GuDNtGn2sNW+Gdb4vErx4t3Gv/Tr+1zRb8ax4z8GWVRfr3Jw8zJWvpGHNpss3vVlbF58DZ4w==} - cpu: [arm64] - os: [freebsd] - - '@rollup/rollup-freebsd-x64@4.53.3': - resolution: {integrity: sha512-lMfF8X7QhdQzseM6XaX0vbno2m3hlyZFhwcndRMw8fbAGUGL3WFMBdK0hbUBIUYcEcMhVLr1SIamDeuLBnXS+Q==} - cpu: [x64] - os: [freebsd] - - '@rollup/rollup-linux-arm-gnueabihf@4.53.3': - resolution: {integrity: sha512-k9oD15soC/Ln6d2Wv/JOFPzZXIAIFLp6B+i14KhxAfnq76ajt0EhYc5YPeX6W1xJkAdItcVT+JhKl1QZh44/qw==} - cpu: [arm] - os: [linux] - libc: [glibc] - - '@rollup/rollup-linux-arm-musleabihf@4.53.3': - resolution: {integrity: sha512-vTNlKq+N6CK/8UktsrFuc+/7NlEYVxgaEgRXVUVK258Z5ymho29skzW1sutgYjqNnquGwVUObAaxae8rZ6YMhg==} - cpu: [arm] - os: [linux] - libc: [musl] - - '@rollup/rollup-linux-arm64-gnu@4.53.3': - resolution: {integrity: sha512-RGrFLWgMhSxRs/EWJMIFM1O5Mzuz3Xy3/mnxJp/5cVhZ2XoCAxJnmNsEyeMJtpK+wu0FJFWz+QF4mjCA7AUQ3w==} - cpu: [arm64] - os: [linux] - libc: [glibc] - - '@rollup/rollup-linux-arm64-musl@4.53.3': - resolution: {integrity: sha512-kASyvfBEWYPEwe0Qv4nfu6pNkITLTb32p4yTgzFCocHnJLAHs+9LjUu9ONIhvfT/5lv4YS5muBHyuV84epBo/A==} - cpu: [arm64] - os: [linux] - libc: [musl] - - '@rollup/rollup-linux-loong64-gnu@4.53.3': - resolution: {integrity: sha512-JiuKcp2teLJwQ7vkJ95EwESWkNRFJD7TQgYmCnrPtlu50b4XvT5MOmurWNrCj3IFdyjBQ5p9vnrX4JM6I8OE7g==} - cpu: [loong64] - os: [linux] - libc: [glibc] - - '@rollup/rollup-linux-ppc64-gnu@4.53.3': - resolution: {integrity: sha512-EoGSa8nd6d3T7zLuqdojxC20oBfNT8nexBbB/rkxgKj5T5vhpAQKKnD+h3UkoMuTyXkP5jTjK/ccNRmQrPNDuw==} - cpu: [ppc64] - os: [linux] - libc: [glibc] - - '@rollup/rollup-linux-riscv64-gnu@4.53.3': - resolution: {integrity: sha512-4s+Wped2IHXHPnAEbIB0YWBv7SDohqxobiiPA1FIWZpX+w9o2i4LezzH/NkFUl8LRci/8udci6cLq+jJQlh+0g==} - cpu: [riscv64] - os: [linux] - libc: [glibc] - - '@rollup/rollup-linux-riscv64-musl@4.53.3': - resolution: {integrity: sha512-68k2g7+0vs2u9CxDt5ktXTngsxOQkSEV/xBbwlqYcUrAVh6P9EgMZvFsnHy4SEiUl46Xf0IObWVbMvPrr2gw8A==} - cpu: [riscv64] - os: [linux] - libc: [musl] - - '@rollup/rollup-linux-s390x-gnu@4.53.3': - resolution: {integrity: sha512-VYsFMpULAz87ZW6BVYw3I6sWesGpsP9OPcyKe8ofdg9LHxSbRMd7zrVrr5xi/3kMZtpWL/wC+UIJWJYVX5uTKg==} - cpu: [s390x] - os: [linux] - libc: [glibc] - - '@rollup/rollup-linux-x64-gnu@4.53.3': - resolution: {integrity: sha512-3EhFi1FU6YL8HTUJZ51imGJWEX//ajQPfqWLI3BQq4TlvHy4X0MOr5q3D2Zof/ka0d5FNdPwZXm3Yyib/UEd+w==} - cpu: [x64] - os: [linux] - libc: [glibc] - - '@rollup/rollup-linux-x64-musl@4.53.3': - resolution: {integrity: sha512-eoROhjcc6HbZCJr+tvVT8X4fW3/5g/WkGvvmwz/88sDtSJzO7r/blvoBDgISDiCjDRZmHpwud7h+6Q9JxFwq1Q==} - cpu: [x64] - os: [linux] - libc: [musl] - - '@rollup/rollup-openharmony-arm64@4.53.3': - resolution: {integrity: sha512-OueLAWgrNSPGAdUdIjSWXw+u/02BRTcnfw9PN41D2vq/JSEPnJnVuBgw18VkN8wcd4fjUs+jFHVM4t9+kBSNLw==} - cpu: [arm64] - os: [openharmony] - - '@rollup/rollup-win32-arm64-msvc@4.53.3': - resolution: {integrity: sha512-GOFuKpsxR/whszbF/bzydebLiXIHSgsEUp6M0JI8dWvi+fFa1TD6YQa4aSZHtpmh2/uAlj/Dy+nmby3TJ3pkTw==} - cpu: [arm64] - os: [win32] - - '@rollup/rollup-win32-ia32-msvc@4.53.3': - resolution: {integrity: sha512-iah+THLcBJdpfZ1TstDFbKNznlzoxa8fmnFYK4V67HvmuNYkVdAywJSoteUszvBQ9/HqN2+9AZghbajMsFT+oA==} - cpu: [ia32] - os: [win32] - - '@rollup/rollup-win32-x64-gnu@4.53.3': - resolution: {integrity: sha512-J9QDiOIZlZLdcot5NXEepDkstocktoVjkaKUtqzgzpt2yWjGlbYiKyp05rWwk4nypbYUNoFAztEgixoLaSETkg==} - cpu: [x64] - os: [win32] - - '@rollup/rollup-win32-x64-msvc@4.53.3': - resolution: {integrity: sha512-UhTd8u31dXadv0MopwGgNOBpUVROFKWVQgAg5N1ESyCz8AuBcMqm4AuTjrwgQKGDfoFuz02EuMRHQIw/frmYKQ==} - cpu: [x64] - os: [win32] - '@sec-ant/readable-stream@0.4.1': resolution: {integrity: sha512-831qok9r2t8AlxLko40y2ebgSDhenenCatLVeW/uBtnHPyhHOvG0C7TvfgecV+wHzIm5KUICgzmVpWS+IMEAeg==} - '@sentry-internal/browser-utils@10.47.0': - resolution: {integrity: sha512-bVFRAeJWMBcBCvJKIFCMJ1/yQToL4vPGqfmlnDZeypcxkqUDKQ/Y3ziLHXoDL2sx0lagcgU2vH1QhCQ67Aujjw==} - engines: {node: '>=18'} - - '@sentry-internal/feedback@10.47.0': - resolution: {integrity: sha512-pdvMmi4dQpX5S/vAAzrhHPIw3T3HjUgDNgUiCBrlp7N9/6zGO2gNPhUnNekP+CjgI/z0rvf49RLqlDenpNrMOg==} - engines: {node: '>=18'} - - '@sentry-internal/replay-canvas@10.47.0': - resolution: {integrity: sha512-A5OY8friSe6g8WAK4L8IeOPiEd9D3Ps40DzRH5j2f6SUja0t90mKMvHRcRf8zq0d4BkdB+JM7tjOkwxpuv8heA==} + '@sentry/browser-utils@10.78.0': + resolution: {integrity: sha512-zlIrDub15KsHb0CacqDSnXevV0Z67IvfhB/5zb6I/DavIfMHJC4urvIXMkLzSktfAbLB3m7cQpMoqQBhhoB1kQ==} engines: {node: '>=18'} - '@sentry-internal/replay@10.47.0': - resolution: {integrity: sha512-ScdovxP7hJxgMt70+7hFvwT02GIaIUAxdEM/YPsayZBeCoAukPW8WiwztJfoKtsfPyKJ5A6f0H3PIxTPcA9Row==} + '@sentry/browser@10.78.0': + resolution: {integrity: sha512-azZBJHq5XxOhQAKdMpkBR7ERR0fSaTS+aQzfayicFk/xMepmFjWgAm2Vph1od2ULyY0OCadIfipCpu/cbsIJMA==} engines: {node: '>=18'} - '@sentry/babel-plugin-component-annotate@5.1.1': - resolution: {integrity: sha512-x2wEpBHwsTyTF2rWsLKJlzrRF1TTIGOfX+ngdE+Yd5DBkoS58HwQv824QOviPGQRla4/ypISqAXzjdDPL/zalg==} - engines: {node: '>= 18'} - - '@sentry/browser@10.47.0': - resolution: {integrity: sha512-rC0agZdxKA5XWfL4VwPOr/rJMogXDqZgnVzr93YWpFn9DMZT/7LzxSJVPIJwRUjx3bFEby3PcTa3YaX7pxm1AA==} - engines: {node: '>=18'} - - '@sentry/bundler-plugin-core@5.1.1': - resolution: {integrity: sha512-F+itpwR9DyQR7gEkrXd2tigREPTvtF5lC8qu6e4anxXYRTui1+dVR0fXNwjpyAZMhIesLfXRN7WY7ggdj7hi0Q==} + '@sentry/bundler-plugins@10.78.0': + resolution: {integrity: sha512-vI52/j8xjDewXfbfdL0V/wKPMUUAp6e5rf5Xww8lJB9cNhCT5nQ71c78GE48wFuDEn7PuD9e9t6gvYujrESZkA==} engines: {node: '>= 18'} + peerDependencies: + rollup: '>=3.2.0' + webpack: '>=5.0.0' + peerDependenciesMeta: + rollup: + optional: true + webpack: + optional: true - '@sentry/cli-darwin@2.58.5': - resolution: {integrity: sha512-lYrNzenZFJftfwSya7gwrHGxtE+Kob/e1sr9lmHMFOd4utDlmq0XFDllmdZAMf21fxcPRI1GL28ejZ3bId01fQ==} + '@sentry/cli-darwin@2.58.6': + resolution: {integrity: sha512-udAVvcyfNa0R+95GvPz/+43/N3TC0TYKdkQ7D7jhPSzbcMc7l2fxRNN5yB3UpCA5fWFnW4toeaqwDBhb/Wh3LA==} engines: {node: '>=10'} os: [darwin] - '@sentry/cli-linux-arm64@2.58.5': - resolution: {integrity: sha512-/4gywFeBqRB6tR/iGMRAJ3HRqY6Z7Yp4l8ZCbl0TDLAfHNxu7schEw4tSnm2/Hh9eNMiOVy4z58uzAWlZXAYBQ==} + '@sentry/cli-linux-arm64@2.58.6': + resolution: {integrity: sha512-q8mEcNNmeXMy5i+jWT30TVpH7LcP4HD21CD5XRSPAd/a912HF6EpK0ybf/1USO14WOhoXbAGi9txwaWabSe33g==} engines: {node: '>=10'} cpu: [arm64] os: [linux, freebsd, android] - '@sentry/cli-linux-arm@2.58.5': - resolution: {integrity: sha512-KtHweSIomYL4WVDrBrYSYJricKAAzxUgX86kc6OnlikbyOhoK6Fy8Vs6vwd52P6dvWPjgrMpUYjW2M5pYXQDUw==} + '@sentry/cli-linux-arm@2.58.6': + resolution: {integrity: sha512-pD0LAt5PcUzAinBwvDqc66x9+2CabHEv486yP0gRjWO7SakbaxmfVq/EXd8VLq/Tzi39LAu422UYK1lpW3MILw==} engines: {node: '>=10'} cpu: [arm] os: [linux, freebsd, android] - '@sentry/cli-linux-i686@2.58.5': - resolution: {integrity: sha512-G7261dkmyxqlMdyvyP06b+RTIVzp1gZNgglj5UksxSouSUqRd/46W/2pQeOMPhloDYo9yLtCN2YFb3Mw4aUsWw==} + '@sentry/cli-linux-i686@2.58.6': + resolution: {integrity: sha512-q8vNJi1eOV/4vxAFWBsEwLHoSYapaZHIf4j76KJGJXFKTkEbsjCOOsKbwUIBTQQhRgV4DFWh3ryfsPS/que4Kg==} engines: {node: '>=10'} cpu: [x86, ia32] os: [linux, freebsd, android] - '@sentry/cli-linux-x64@2.58.5': - resolution: {integrity: sha512-rP04494RSmt86xChkQ+ecBNRYSPbyXc4u0IA7R7N1pSLCyO74e5w5Al+LnAq35cMfVbZgz5Sm0iGLjyiUu4I1g==} + '@sentry/cli-linux-x64@2.58.6': + resolution: {integrity: sha512-DZu956Mhi3ZRjTBe1WdbGV46ldVbA8d2rgp/fh51GsI25zjBHah4wZnPTSzpc+YqxU6pJpg579B/r3jrIK530Q==} engines: {node: '>=10'} cpu: [x64] os: [linux, freebsd, android] - '@sentry/cli-win32-arm64@2.58.5': - resolution: {integrity: sha512-AOJ2nCXlQL1KBaCzv38m3i2VmSHNurUpm7xVKd6yAHX+ZoVBI8VT0EgvwmtJR2TY2N2hNCC7UrgRmdUsQ152bA==} + '@sentry/cli-win32-arm64@2.58.6': + resolution: {integrity: sha512-nj0Ff/kmAB73EPDhR8B4O9r+NUHK5GkPCkGWC+kXVemqAJWL5jcJ5KdxG0l/S0z6RoEoltID8/43/B+TaMlT7A==} engines: {node: '>=10'} cpu: [arm64] os: [win32] - '@sentry/cli-win32-i686@2.58.5': - resolution: {integrity: sha512-EsuboLSOnlrN7MMPJ1eFvfMDm+BnzOaSWl8eYhNo8W/BIrmNgpRUdBwnWn9Q2UOjJj5ZopukmsiMYtU/D7ml9g==} + '@sentry/cli-win32-i686@2.58.6': + resolution: {integrity: sha512-WNZiDzPbgsEMQWq4avsQ391v/xWKJDIWWWo9GYl+N/w5qcYKkoDW7wQG7T9FasI6ENn68phChTOAPXXxbfAdOg==} engines: {node: '>=10'} cpu: [x86, ia32] os: [win32] - '@sentry/cli-win32-x64@2.58.5': - resolution: {integrity: sha512-IZf+XIMiQwj+5NzqbOQfywlOitmCV424Vtf9c+ep61AaVScUFD1TSrQbOcJJv5xGxhlxNOMNgMeZhdexdzrKZg==} + '@sentry/cli-win32-x64@2.58.6': + resolution: {integrity: sha512-R35WJ17oF4D2eqI1DR2sQQqr0fjRTt5xoP16WrTu91XM2lndRMFsnjh+/GttbxapLCBNlrjzia99MJ0PZHZpgA==} engines: {node: '>=10'} cpu: [x64] os: [win32] - '@sentry/cli@2.58.5': - resolution: {integrity: sha512-tavJ7yGUZV+z3Ct2/ZB6mg339i08sAk6HDkgqmSRuQEu2iLS5sl9HIvuXfM6xjv8fwlgFOSy++WNABNAcGHUbg==} + '@sentry/cli@2.58.6': + resolution: {integrity: sha512-baBcNPLLfUi9WuL+Tpri9BFaAdvugZIKelC5X0tt0Zdy+K0K+PCVSrnNmwMWU/HyaF/SEv6b6UHnXIdqanBlcg==} engines: {node: '>= 10'} hasBin: true - '@sentry/core@10.47.0': - resolution: {integrity: sha512-nsYRAx3EWezDut+Zl+UwwP07thh9uY7CfSAi2whTdcJl5hu1nSp2z8bba7Vq/MGbNLnazkd3A+GITBEML924JA==} + '@sentry/conventions@0.16.0': + resolution: {integrity: sha512-fO9PLmHdVURcSPUpWCItWAtgKiMwGdJHbovoSEyLplX5sxs2ugvI4CBPTrkkgqhObnZOD0CnWBKDzSVQYBKEyQ==} + engines: {node: '>=14'} + + '@sentry/core@10.78.0': + resolution: {integrity: sha512-MMR4ME+agrjbvQ0DtTYJJypm+QlCoz9UJgWN8gjcXqlyDjYk69LwPjnaocYN1JyQMy2dx5Hk4S/Rt12gTQ5cGw==} + engines: {node: '>=18'} + + '@sentry/feedback@10.78.0': + resolution: {integrity: sha512-sFcZ/TowGAIlbijurWmtO35RtwYwtwv74yKO3x0yxlre5gsmocdbJxi/zYyuuwypCClTFb1cSBtOrRVb7e7yjA==} engines: {node: '>=18'} - '@sentry/node-core@10.47.0': - resolution: {integrity: sha512-qv6LsqHbkQmd0aQEUox/svRSz26J+l4gGjFOUNEay2armZu9XLD+Ct89jpFgZD5oIPNAj2jraodTRqydXiwS5w==} + '@sentry/node-core@10.78.0': + resolution: {integrity: sha512-HJ3k7xINBiiTzc/QaIRHdt5ugctVYtcZnjruTxFa2tXFJSJYhVtgCE+DzLSkHXbVAlVS/rilAMGcO9GUiIqWTQ==} engines: {node: '>=18'} peerDependencies: - '@opentelemetry/api': ^1.9.0 - '@opentelemetry/context-async-hooks': ^1.30.1 || ^2.1.0 + '@opentelemetry/api': '>=1.9.0 <1.10.0' '@opentelemetry/core': ^1.30.1 || ^2.1.0 - '@opentelemetry/exporter-trace-otlp-http': '>=0.57.0 <1' - '@opentelemetry/instrumentation': '>=0.57.1 <1' - '@opentelemetry/resources': ^1.30.1 || ^2.1.0 + '@opentelemetry/exporter-trace-otlp-http': '>=0.57.0 <0.300.0' + '@opentelemetry/instrumentation': '>=0.57.1 <0.300.0' '@opentelemetry/sdk-trace-base': ^1.30.1 || ^2.1.0 - '@opentelemetry/semantic-conventions': ^1.39.0 peerDependenciesMeta: '@opentelemetry/api': optional: true - '@opentelemetry/context-async-hooks': - optional: true '@opentelemetry/core': optional: true '@opentelemetry/exporter-trace-otlp-http': optional: true '@opentelemetry/instrumentation': optional: true - '@opentelemetry/resources': - optional: true '@opentelemetry/sdk-trace-base': optional: true - '@opentelemetry/semantic-conventions': - optional: true - '@sentry/node@10.47.0': - resolution: {integrity: sha512-R+btqPepv88o635G6HtVewLjqCLUedBg5HBs7Nq1qbbKvyti01uArUF2f+3DsLenk5B9LUNiRlE+frZA44Ahmw==} + '@sentry/node@10.78.0': + resolution: {integrity: sha512-AE6nyehiCK6zcktrqzzBby5OCBqIL2ZwOyOLqoenczI7ufumfmcOMSpD0IVqjeIC/Kf0N0ymujqGPzqXgu9KrA==} engines: {node: '>=18'} - '@sentry/opentelemetry@10.47.0': - resolution: {integrity: sha512-f6Hw2lrpCjlOksiosP0Z2jK/+l+21SIdoNglVeG/sttMyx8C8ywONKh0Ha50sFsvB1VaB8n94RKzzf3hkh9V3g==} + '@sentry/opentelemetry@10.78.0': + resolution: {integrity: sha512-s47uqNaHres6ijiMsaoI6/DRev80vUqTqRMk0u/DfF9xAJttK7gOGqZBESr0YD2BXA21O+sUPsPeWuHlYHiScA==} engines: {node: '>=18'} peerDependencies: - '@opentelemetry/api': ^1.9.0 - '@opentelemetry/context-async-hooks': ^1.30.1 || ^2.1.0 + '@opentelemetry/api': '>=1.9.0 <1.10.0' '@opentelemetry/core': ^1.30.1 || ^2.1.0 '@opentelemetry/sdk-trace-base': ^1.30.1 || ^2.1.0 - '@opentelemetry/semantic-conventions': ^1.39.0 - '@sentry/react@10.47.0': - resolution: {integrity: sha512-ZtJV6xxF8jUVE9e3YQUG3Do0XapG1GjniyLyqMPgN6cNvs/HaRJODf7m60By+VGqcl5XArEjEPTvx8CdPUXDfA==} + '@sentry/react@10.78.0': + resolution: {integrity: sha512-FJGxL7YSWFnxswrmm/Du0O9tgLoU1H0Bjs2DOgu2vYhn259eD0q11ARRAa653ExuwxQlMvNZhTqfTdLV9K0nqw==} engines: {node: '>=18'} peerDependencies: react: ^16.14.0 || 17.x || 18.x || 19.x - '@sentry/rollup-plugin@5.1.1': - resolution: {integrity: sha512-1d5NkdRR6aKWBP7czkY8sFFWiKnfmfRpQOj+m9bJTsyTjbMiEQJst6315w5pCVlRItPhBqpAraqAhutZFgvyVg==} - engines: {node: '>= 18'} - peerDependencies: - rollup: '>=3.2.0' + '@sentry/replay-canvas@10.78.0': + resolution: {integrity: sha512-opwqU4kZFKxIaOcpHy237bvNzcc4wSGYOv76al7iwktHlnw7h1ggf048bHF9pIPOGxMEA9N/X+vHar6z8nCAtw==} + engines: {node: '>=18'} + + '@sentry/replay@10.78.0': + resolution: {integrity: sha512-W2TEKRmoZFvEK01u9+F6GKxQsH8xYFOF+A/+OaDoYqpBAj2zJ1oosLFvwbOS74eg3rDkmkEyWCm+p7M8JNk2oA==} + engines: {node: '>=18'} + + '@sentry/server-utils@10.78.0': + resolution: {integrity: sha512-MssOiA9SansFX4E51cloHZEy4bYSZyszFNWUWeIGgQiYyTN84PbPJmyLuboj26G/ycSBW2pUERPbcfjxcs7BrA==} + engines: {node: '>=18'} - '@sentry/tanstackstart-react@10.47.0': - resolution: {integrity: sha512-DEQ8XFqZ0VuwzR2hBll0XGWHrgnbCgPCkEzGF6RtvwWxnIv0ZuoRHFEYXtq5JIij2txaU8/74zwuaGqmJmTRiQ==} + '@sentry/tanstackstart-react@10.78.0': + resolution: {integrity: sha512-ymaFsUKy3tHrET892JRlnDmESFGuwQoAUTj30iNBmrwCJ8QHPXDgEjsG0m3wXN0MdSA0EAklIywHU2Y6tzD71g==} engines: {node: '>=18'} - '@sentry/vite-plugin@5.1.1': - resolution: {integrity: sha512-i6NWUDi2SDikfSUeMJvJTRdwEKYSfTd+mvBO2Ja51S1YK+hnickBuDfD+RvPerIXLuyRu3GamgNPbNqgCGUg/Q==} + '@sentry/vite-plugin@5.4.1': + resolution: {integrity: sha512-poFfn3sQbSFaZpXH8CG27D0eNtDD64wFEniQCb853e7huko9vOl4UP3BjT3vsrnmVuRqagnbxItza10MOC7ysA==} engines: {node: '>= 18'} '@shopify/hydrogen-react@2026.4.0': @@ -4396,9 +4121,6 @@ packages: '@types/chai@5.2.3': resolution: {integrity: sha512-Mw558oeA9fFbv65/y4mHtXDs9bPnFMZAL/jxdPFUpOHHIXX91mcgEHbS5Lahr+pwZFR8A7GQleRWeI6cGFC2UA==} - '@types/connect@3.4.38': - resolution: {integrity: sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==} - '@types/d3-array@3.2.2': resolution: {integrity: sha512-hOLWVbm7uRza0BYXpIIW5pxfrKe0W+D5lrFiAEYR+pb6w3N2SwSMaJbXdUfSEv+dT4MfHBLtn5js0LAWaO6otw==} @@ -4528,8 +4250,8 @@ packages: '@types/geojson@7946.0.16': resolution: {integrity: sha512-6C8nqWur3j98U6+lXDfTUWIfgvZU+EumvpHKcYjujKH7woYyLj2sUmff0tRhrqM7BohUw7Pz3ZB1jj2gW9Fvmg==} - '@types/google.maps@3.58.1': - resolution: {integrity: sha512-X9QTSvGJ0nCfMzYOnaVs/k6/4L+7F5uCS+4iUmkLEls6J9S/Phv+m/i3mDeyc49ZBgwab3EFO1HEoBY7k98EGQ==} + '@types/google.maps@3.65.3': + resolution: {integrity: sha512-tqbbx7MUtoDk+RwpZMymPDj6Skez0FhqDZNhLhS5UDmCx4D1dgP+BJOHTebiO/rhjJLa1f8te2p6mJJeFKVFOQ==} '@types/hast@3.0.4': resolution: {integrity: sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==} @@ -4549,9 +4271,6 @@ packages: '@types/ms@2.1.0': resolution: {integrity: sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==} - '@types/mysql@2.15.27': - resolution: {integrity: sha512-YfWiV16IY0OeBfBCk8+hXKmdTKrKlwKN1MNKAPBu5JYxLwBEZl7QzeEpGnlZb3VMGJrrGmB84gXiH+ofs/TezA==} - '@types/node@24.19.0': resolution: {integrity: sha512-zY+5tKxXdhGh1PYI0ac+7juvEu4OI6vWtVVoj5i2m42jxAY1U+zHGt6QCyOFwykdP62sM3MJ9stoYYUw5aCWew==} @@ -4561,12 +4280,6 @@ packages: '@types/offscreencanvas@2019.7.3': resolution: {integrity: sha512-ieXiYmgSRXUDeOntE1InxjWyvEelZGP63M+cGuquuRLuIKKT1osnkXjxev9B7d1nXSug5vpunx+gNlbVxMlC9A==} - '@types/pg-pool@2.0.7': - resolution: {integrity: sha512-U4CwmGVQcbEuqpyju8/ptOKg6gEC+Tqsvj2xS9o1g71bUh8twxnC6ZL5rZKCsGN0iyH0CwgUyc9VR5owNQF9Ng==} - - '@types/pg@8.15.6': - resolution: {integrity: sha512-NoaMtzhxOrubeL/7UZuNTrejB4MPAJ0RpxZqXQf2qXuVlTPuG6Y8p4u9dKRaue4yjmC7ZhzVO2/Yyyn25znrPQ==} - '@types/pg@8.20.0': resolution: {integrity: sha512-bEPFOaMAHTEP1EzpvHTbmwR8UsFyHSKsRisLIHVMXnpNefSbGA1bD6CVy+qKjGSqmZqNqBDV2azOBo8TgkcVow==} @@ -4604,9 +4317,6 @@ packages: '@types/tar-stream@3.1.4': resolution: {integrity: sha512-921gW0+g29mCJX0fRvqeHzBlE/XclDaAG0Ousy1LCghsOhvaKacDeRGEVzQP9IPfKn8Vysy7FEXAIxycpc/CMg==} - '@types/tedious@4.0.14': - resolution: {integrity: sha512-KHPsfX/FoVbUGbyYvk1q9MMQHLPeRZhRJZdO45Q4YjvFkv4hMNghCWTvy7rdKessBsmtz4euWCWAB6/tVpI1Iw==} - '@types/three@0.183.1': resolution: {integrity: sha512-f2Pu5Hrepfgavttdye3PsH5RWyY/AvdZQwIVhrc4uNtvF7nOWJacQKcoVJn0S4f0yYbmAE6AR+ve7xDcuYtMGw==} @@ -4905,6 +4615,9 @@ packages: bare-url@2.4.0: resolution: {integrity: sha512-NSTU5WN+fy/L0DDenfE8SXQna4voXuW0FHM7wH8i3/q9khUSchfPbPezO4zSFMnDGIf9YE+mt/RWhZgNRKRIXA==} + base-x@5.0.1: + resolution: {integrity: sha512-M7uio8Zt++eg3jPj+rHMfCC+IuygQHHCOU+IYsVtik6FWjuYpVt/+MRKcgsAMHh8mMFAwnB+Bs+mTrFiXjMzKg==} + base64-js@1.5.1: resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} @@ -5489,6 +5202,10 @@ packages: resolution: {integrity: sha512-IO8C/dzEb6O3F9/twg6ZLXz164a2fhTnEWb95H23Dm4OuN+92NmEAlTrupP9VW6Jm3sO26tQlqyvyi4CsnY9GA==} engines: {node: '>=12'} + dotenv@17.4.2: + resolution: {integrity: sha512-nI4U3TottKAcAD9LLud4Cb7b2QztQMUEfHbvhTH09bqXTxnSie8WnjPALV/WMCrJZ6UV/qHJ6L03OqO3LcdYZw==} + engines: {node: '>=12'} + draco3d@1.5.7: resolution: {integrity: sha512-m6WCKt/erDXcw+70IJXnG7M3awwQPAsZvJGX5zY7beBqpELw6RDGkYVU0W43AFxye4pDZ5i2Lbyc/NNGqwjUVQ==} @@ -5897,9 +5614,6 @@ packages: resolution: {integrity: sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==} engines: {node: '>=12.20.0'} - forwarded-parse@2.1.2: - resolution: {integrity: sha512-alTFZZQDKMporBH77856pXgzhEzaUVmLCDk+egLgIgHst3Tpndzz8MnKe+GzRJRfvVdn69HhpW7cmXzvtLvJAw==} - forwarded@0.2.0: resolution: {integrity: sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==} engines: {node: '>= 0.6'} @@ -6186,9 +5900,6 @@ packages: immediate@3.0.6: resolution: {integrity: sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ==} - import-in-the-middle@2.0.6: - resolution: {integrity: sha512-3vZV3jX0XRFW3EJDTwzWoZa+RH1b8eTTx6YOCjglrLyPuepwoBti1k3L2dKwdCUrnVEfc5CuRuGstaC/uQJJaw==} - import-in-the-middle@3.0.0: resolution: {integrity: sha512-OnGy+eYT7wVejH2XWgLRgbmzujhhVIATQH0ztIeRilwHBjTeG3pD+XnH3PKX0r9gJ0BuJmJ68q/oh9qgXnNDQg==} engines: {node: '>=18'} @@ -7531,11 +7242,6 @@ packages: engines: {node: ^20.19.0 || >=22.12.0} hasBin: true - rollup@4.53.3: - resolution: {integrity: sha512-w8GmOxZfBmKknvdXU1sdM9NHcoQejwF/4mNgj2JuEEdRaHwwF12K7e9eXn1nLZ07ad+du76mkVsyeb2rKGllsA==} - engines: {node: '>=18.0.0', npm: '>=8.0.0'} - hasBin: true - rou3@0.8.1: resolution: {integrity: sha512-ePa+XGk00/3HuCqrEnK3LxJW7I0SdNg6EFzKUJG73hMAdDcOUC/i/aSz7LSDwLrGr33kal/rqOGydzwl6U7zBA==} @@ -8237,6 +7943,14 @@ packages: typescript: optional: true + valibot@1.4.2: + resolution: {integrity: sha512-gjdCvJ6d3RyHAneqxMYMW9QMCwYMb3jpOO0IyHZV1bnRHFBHrX3VkIILt5XYR0WhwHiH7Mty8ovuPZ/O3gamrg==} + peerDependencies: + typescript: '>=5' + peerDependenciesMeta: + typescript: + optional: true + validate-npm-package-license@3.0.4: resolution: {integrity: sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==} @@ -8711,30 +8425,8 @@ snapshots: js-tokens: 4.0.0 picocolors: 1.1.1 - '@babel/compat-data@7.29.0': {} - '@babel/compat-data@7.29.7': {} - '@babel/core@7.29.0': - dependencies: - '@babel/code-frame': 7.29.7 - '@babel/generator': 7.29.8 - '@babel/helper-compilation-targets': 7.28.6 - '@babel/helper-module-transforms': 7.28.6(@babel/core@7.29.0) - '@babel/helpers': 7.29.2 - '@babel/parser': 7.29.8 - '@babel/template': 7.28.6 - '@babel/traverse': 7.29.0 - '@babel/types': 7.29.8 - '@jridgewell/remapping': 2.3.5 - convert-source-map: 2.0.0 - debug: 4.4.3 - gensync: 1.0.0-beta.2 - json5: 2.2.3 - semver: 6.3.1 - transitivePeerDependencies: - - supports-color - '@babel/core@7.29.7': dependencies: '@babel/code-frame': 7.29.7 @@ -8763,14 +8455,6 @@ snapshots: '@jridgewell/trace-mapping': 0.3.31 jsesc: 3.1.0 - '@babel/helper-compilation-targets@7.28.6': - dependencies: - '@babel/compat-data': 7.29.0 - '@babel/helper-validator-option': 7.27.1 - browserslist: 4.28.2 - lru-cache: 5.1.1 - semver: 6.3.1 - '@babel/helper-compilation-targets@7.29.7': dependencies: '@babel/compat-data': 7.29.7 @@ -8779,17 +8463,8 @@ snapshots: lru-cache: 5.1.1 semver: 6.3.1 - '@babel/helper-globals@7.28.0': {} - '@babel/helper-globals@7.29.7': {} - '@babel/helper-module-imports@7.28.6': - dependencies: - '@babel/traverse': 7.29.8 - '@babel/types': 7.29.8 - transitivePeerDependencies: - - supports-color - '@babel/helper-module-imports@7.29.7': dependencies: '@babel/traverse': 7.29.8 @@ -8797,15 +8472,6 @@ snapshots: transitivePeerDependencies: - supports-color - '@babel/helper-module-transforms@7.28.6(@babel/core@7.29.0)': - dependencies: - '@babel/core': 7.29.0 - '@babel/helper-module-imports': 7.28.6 - '@babel/helper-validator-identifier': 7.29.7 - '@babel/traverse': 7.29.8 - transitivePeerDependencies: - - supports-color - '@babel/helper-module-transforms@7.29.7(@babel/core@7.29.7)': dependencies: '@babel/core': 7.29.7 @@ -8819,15 +8485,8 @@ snapshots: '@babel/helper-validator-identifier@7.29.7': {} - '@babel/helper-validator-option@7.27.1': {} - '@babel/helper-validator-option@7.29.7': {} - '@babel/helpers@7.29.2': - dependencies: - '@babel/template': 7.29.7 - '@babel/types': 7.29.8 - '@babel/helpers@7.29.7': dependencies: '@babel/template': 7.29.7 @@ -8845,30 +8504,12 @@ snapshots: '@babel/runtime@7.29.7': {} - '@babel/template@7.28.6': - dependencies: - '@babel/code-frame': 7.29.7 - '@babel/parser': 7.29.8 - '@babel/types': 7.29.8 - '@babel/template@7.29.7': dependencies: '@babel/code-frame': 7.29.7 '@babel/parser': 7.29.8 '@babel/types': 7.29.8 - '@babel/traverse@7.29.0': - dependencies: - '@babel/code-frame': 7.29.7 - '@babel/generator': 7.29.8 - '@babel/helper-globals': 7.28.0 - '@babel/parser': 7.29.8 - '@babel/template': 7.29.7 - '@babel/types': 7.29.8 - debug: 4.4.3 - transitivePeerDependencies: - - supports-color - '@babel/traverse@7.29.8': dependencies: '@babel/code-frame': 7.29.7 @@ -8911,6 +8552,79 @@ snapshots: '@braintree/sanitize-url@7.1.2': {} + '@c15t/core@3.2.2(typescript@6.0.2)': + dependencies: + '@c15t/schema': 3.1.3(typescript@6.0.2) + '@c15t/translations': 3.2.2 + transitivePeerDependencies: + - typescript + + '@c15t/dev-tools@3.2.2(typescript@6.0.2)': + dependencies: + '@c15t/core': 3.2.2(typescript@6.0.2) + transitivePeerDependencies: + - typescript + + '@c15t/iab@3.2.2(typescript@6.0.2)': + dependencies: + '@c15t/core': 3.2.2(typescript@6.0.2) + '@c15t/schema': 3.1.3(typescript@6.0.2) + '@iabtechlabtcf/core': 1.5.22 + transitivePeerDependencies: + - typescript + + '@c15t/integrations@3.2.2(typescript@6.0.2)': + dependencies: + '@c15t/core': 3.2.2(typescript@6.0.2) + transitivePeerDependencies: + - typescript + + '@c15t/react@3.2.2(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(typescript@6.0.2)': + dependencies: + '@c15t/core': 3.2.2(typescript@6.0.2) + '@c15t/dev-tools': 3.2.2(typescript@6.0.2) + '@c15t/iab': 3.2.2(typescript@6.0.2) + '@c15t/schema': 3.1.3(typescript@6.0.2) + '@c15t/translations': 3.2.2 + '@c15t/ui': 3.1.2(typescript@6.0.2) + '@types/google.maps': 3.65.3 + optionalDependencies: + react: 19.2.3 + react-dom: 19.2.3(react@19.2.3) + transitivePeerDependencies: + - typescript + + '@c15t/schema@3.1.3(typescript@6.0.2)': + dependencies: + '@c15t/translations': 3.2.2 + base-x: 5.0.1 + valibot: 1.4.2(typescript@6.0.2) + transitivePeerDependencies: + - typescript + + '@c15t/tanstack-start@3.2.2(@tanstack/react-router@1.170.41(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(@tanstack/react-start@1.168.60(esbuild@0.27.4)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(rolldown@1.0.3)(vite@8.0.16(@types/node@25.5.0)(esbuild@0.27.4)(jiti@2.7.0)(tsx@4.21.0)(yaml@2.9.0)))(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(typescript@6.0.2)': + dependencies: + '@c15t/core': 3.2.2(typescript@6.0.2) + '@c15t/react': 3.2.2(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(typescript@6.0.2) + '@c15t/schema': 3.1.3(typescript@6.0.2) + '@c15t/translations': 3.2.2 + optionalDependencies: + '@tanstack/react-router': 1.170.41(react-dom@19.2.3(react@19.2.3))(react@19.2.3) + '@tanstack/react-start': 1.168.60(esbuild@0.27.4)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(rolldown@1.0.3)(vite@8.0.16(@types/node@25.5.0)(esbuild@0.27.4)(jiti@2.7.0)(tsx@4.21.0)(yaml@2.9.0)) + react: 19.2.3 + react-dom: 19.2.3(react@19.2.3) + transitivePeerDependencies: + - typescript + + '@c15t/translations@3.2.2': {} + + '@c15t/ui@3.1.2(typescript@6.0.2)': + dependencies: + '@c15t/core': 3.2.2(typescript@6.0.2) + '@c15t/translations': 3.2.2 + transitivePeerDependencies: + - typescript + '@cfworker/json-schema@4.1.1': {} '@chevrotain/cst-dts-gen@11.1.2': @@ -9582,16 +9296,6 @@ snapshots: '@esbuild/win32-x64@0.28.1': optional: true - '@fastify/otel@0.18.0(@opentelemetry/api@1.9.1)': - dependencies: - '@opentelemetry/api': 1.9.1 - '@opentelemetry/core': 2.6.1(@opentelemetry/api@1.9.1) - '@opentelemetry/instrumentation': 0.212.0(@opentelemetry/api@1.9.1) - '@opentelemetry/semantic-conventions': 1.40.0 - minimatch: 10.2.5 - transitivePeerDependencies: - - supports-color - '@fingerprintjs/fingerprintjs-pro-react@2.7.1': dependencies: '@fingerprintjs/fingerprintjs-pro-spa': 1.3.3 @@ -9669,6 +9373,8 @@ snapshots: dependencies: hono: 4.12.9 + '@iabtechlabtcf/core@1.5.22': {} + '@iconify/types@2.0.0': {} '@iconify/utils@3.1.0': @@ -10010,347 +9716,127 @@ snapshots: '@msgpackr-extract/msgpackr-extract-linux-arm64@3.0.3': optional: true - '@msgpackr-extract/msgpackr-extract-linux-arm@3.0.3': - optional: true - - '@msgpackr-extract/msgpackr-extract-linux-x64@3.0.3': - optional: true - - '@msgpackr-extract/msgpackr-extract-win32-x64@3.0.3': - optional: true - - '@napi-rs/wasm-runtime@1.1.2(@emnapi/core@1.10.0)(@emnapi/runtime@1.11.3)': - dependencies: - '@emnapi/core': 1.10.0 - '@emnapi/runtime': 1.11.3 - '@tybys/wasm-util': 0.10.1 - optional: true - - '@napi-rs/wasm-runtime@1.2.2(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)': - dependencies: - '@emnapi/core': 1.10.0 - '@emnapi/runtime': 1.10.0 - '@tybys/wasm-util': 0.10.3 - optional: true - - '@noble/hashes@1.8.0': {} - - '@noble/hashes@2.3.0': {} - - '@octokit/endpoint@11.0.3': - dependencies: - '@octokit/types': 16.0.0 - universal-user-agent: 7.0.3 - - '@octokit/graphql@9.0.3': - dependencies: - '@octokit/request': 10.0.8 - '@octokit/types': 16.0.0 - universal-user-agent: 7.0.3 - - '@octokit/openapi-types@27.0.0': {} - - '@octokit/request-error@7.1.0': - dependencies: - '@octokit/types': 16.0.0 - - '@octokit/request@10.0.8': - dependencies: - '@octokit/endpoint': 11.0.3 - '@octokit/request-error': 7.1.0 - '@octokit/types': 16.0.0 - fast-content-type-parse: 3.0.0 - json-with-bigint: 3.5.8 - universal-user-agent: 7.0.3 - - '@octokit/types@16.0.0': - dependencies: - '@octokit/openapi-types': 27.0.0 - - '@oozcitak/dom@2.0.2': - dependencies: - '@oozcitak/infra': 2.0.2 - '@oozcitak/url': 3.0.0 - '@oozcitak/util': 10.0.0 - - '@oozcitak/infra@2.0.2': - dependencies: - '@oozcitak/util': 10.0.0 - - '@oozcitak/url@3.0.0': - dependencies: - '@oozcitak/infra': 2.0.2 - '@oozcitak/util': 10.0.0 - - '@oozcitak/util@10.0.0': {} - - '@openrouter/sdk@0.13.20': - dependencies: - zod: 4.4.3 - - '@opentelemetry/api-logs@0.207.0': - dependencies: - '@opentelemetry/api': 1.9.1 - - '@opentelemetry/api-logs@0.212.0': - dependencies: - '@opentelemetry/api': 1.9.1 - - '@opentelemetry/api-logs@0.214.0': - dependencies: - '@opentelemetry/api': 1.9.1 - - '@opentelemetry/api@1.9.1': {} - - '@opentelemetry/context-async-hooks@2.6.1(@opentelemetry/api@1.9.1)': - dependencies: - '@opentelemetry/api': 1.9.1 - - '@opentelemetry/core@2.6.1(@opentelemetry/api@1.9.1)': - dependencies: - '@opentelemetry/api': 1.9.1 - '@opentelemetry/semantic-conventions': 1.40.0 - - '@opentelemetry/instrumentation-amqplib@0.61.0(@opentelemetry/api@1.9.1)': - dependencies: - '@opentelemetry/api': 1.9.1 - '@opentelemetry/core': 2.6.1(@opentelemetry/api@1.9.1) - '@opentelemetry/instrumentation': 0.214.0(@opentelemetry/api@1.9.1) - '@opentelemetry/semantic-conventions': 1.40.0 - transitivePeerDependencies: - - supports-color - - '@opentelemetry/instrumentation-connect@0.57.0(@opentelemetry/api@1.9.1)': - dependencies: - '@opentelemetry/api': 1.9.1 - '@opentelemetry/core': 2.6.1(@opentelemetry/api@1.9.1) - '@opentelemetry/instrumentation': 0.214.0(@opentelemetry/api@1.9.1) - '@opentelemetry/semantic-conventions': 1.40.0 - '@types/connect': 3.4.38 - transitivePeerDependencies: - - supports-color - - '@opentelemetry/instrumentation-dataloader@0.31.0(@opentelemetry/api@1.9.1)': - dependencies: - '@opentelemetry/api': 1.9.1 - '@opentelemetry/instrumentation': 0.214.0(@opentelemetry/api@1.9.1) - transitivePeerDependencies: - - supports-color + '@msgpackr-extract/msgpackr-extract-linux-arm@3.0.3': + optional: true - '@opentelemetry/instrumentation-express@0.62.0(@opentelemetry/api@1.9.1)': - dependencies: - '@opentelemetry/api': 1.9.1 - '@opentelemetry/core': 2.6.1(@opentelemetry/api@1.9.1) - '@opentelemetry/instrumentation': 0.214.0(@opentelemetry/api@1.9.1) - '@opentelemetry/semantic-conventions': 1.40.0 - transitivePeerDependencies: - - supports-color + '@msgpackr-extract/msgpackr-extract-linux-x64@3.0.3': + optional: true - '@opentelemetry/instrumentation-fs@0.33.0(@opentelemetry/api@1.9.1)': - dependencies: - '@opentelemetry/api': 1.9.1 - '@opentelemetry/core': 2.6.1(@opentelemetry/api@1.9.1) - '@opentelemetry/instrumentation': 0.214.0(@opentelemetry/api@1.9.1) - transitivePeerDependencies: - - supports-color + '@msgpackr-extract/msgpackr-extract-win32-x64@3.0.3': + optional: true - '@opentelemetry/instrumentation-generic-pool@0.57.0(@opentelemetry/api@1.9.1)': + '@napi-rs/wasm-runtime@1.1.2(@emnapi/core@1.10.0)(@emnapi/runtime@1.11.3)': dependencies: - '@opentelemetry/api': 1.9.1 - '@opentelemetry/instrumentation': 0.214.0(@opentelemetry/api@1.9.1) - transitivePeerDependencies: - - supports-color + '@emnapi/core': 1.10.0 + '@emnapi/runtime': 1.11.3 + '@tybys/wasm-util': 0.10.1 + optional: true - '@opentelemetry/instrumentation-graphql@0.62.0(@opentelemetry/api@1.9.1)': + '@napi-rs/wasm-runtime@1.2.2(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)': dependencies: - '@opentelemetry/api': 1.9.1 - '@opentelemetry/instrumentation': 0.214.0(@opentelemetry/api@1.9.1) - transitivePeerDependencies: - - supports-color + '@emnapi/core': 1.10.0 + '@emnapi/runtime': 1.10.0 + '@tybys/wasm-util': 0.10.3 + optional: true - '@opentelemetry/instrumentation-hapi@0.60.0(@opentelemetry/api@1.9.1)': - dependencies: - '@opentelemetry/api': 1.9.1 - '@opentelemetry/core': 2.6.1(@opentelemetry/api@1.9.1) - '@opentelemetry/instrumentation': 0.214.0(@opentelemetry/api@1.9.1) - '@opentelemetry/semantic-conventions': 1.40.0 - transitivePeerDependencies: - - supports-color + '@noble/hashes@1.8.0': {} - '@opentelemetry/instrumentation-http@0.214.0(@opentelemetry/api@1.9.1)': - dependencies: - '@opentelemetry/api': 1.9.1 - '@opentelemetry/core': 2.6.1(@opentelemetry/api@1.9.1) - '@opentelemetry/instrumentation': 0.214.0(@opentelemetry/api@1.9.1) - '@opentelemetry/semantic-conventions': 1.40.0 - forwarded-parse: 2.1.2 - transitivePeerDependencies: - - supports-color + '@noble/hashes@2.3.0': {} - '@opentelemetry/instrumentation-ioredis@0.62.0(@opentelemetry/api@1.9.1)': + '@octokit/endpoint@11.0.3': dependencies: - '@opentelemetry/api': 1.9.1 - '@opentelemetry/instrumentation': 0.214.0(@opentelemetry/api@1.9.1) - '@opentelemetry/redis-common': 0.38.2 - '@opentelemetry/semantic-conventions': 1.40.0 - transitivePeerDependencies: - - supports-color + '@octokit/types': 16.0.0 + universal-user-agent: 7.0.3 - '@opentelemetry/instrumentation-kafkajs@0.23.0(@opentelemetry/api@1.9.1)': + '@octokit/graphql@9.0.3': dependencies: - '@opentelemetry/api': 1.9.1 - '@opentelemetry/instrumentation': 0.214.0(@opentelemetry/api@1.9.1) - '@opentelemetry/semantic-conventions': 1.40.0 - transitivePeerDependencies: - - supports-color + '@octokit/request': 10.0.8 + '@octokit/types': 16.0.0 + universal-user-agent: 7.0.3 - '@opentelemetry/instrumentation-knex@0.58.0(@opentelemetry/api@1.9.1)': - dependencies: - '@opentelemetry/api': 1.9.1 - '@opentelemetry/instrumentation': 0.214.0(@opentelemetry/api@1.9.1) - '@opentelemetry/semantic-conventions': 1.40.0 - transitivePeerDependencies: - - supports-color + '@octokit/openapi-types@27.0.0': {} - '@opentelemetry/instrumentation-koa@0.62.0(@opentelemetry/api@1.9.1)': + '@octokit/request-error@7.1.0': dependencies: - '@opentelemetry/api': 1.9.1 - '@opentelemetry/core': 2.6.1(@opentelemetry/api@1.9.1) - '@opentelemetry/instrumentation': 0.214.0(@opentelemetry/api@1.9.1) - '@opentelemetry/semantic-conventions': 1.40.0 - transitivePeerDependencies: - - supports-color + '@octokit/types': 16.0.0 - '@opentelemetry/instrumentation-lru-memoizer@0.58.0(@opentelemetry/api@1.9.1)': + '@octokit/request@10.0.8': dependencies: - '@opentelemetry/api': 1.9.1 - '@opentelemetry/instrumentation': 0.214.0(@opentelemetry/api@1.9.1) - transitivePeerDependencies: - - supports-color + '@octokit/endpoint': 11.0.3 + '@octokit/request-error': 7.1.0 + '@octokit/types': 16.0.0 + fast-content-type-parse: 3.0.0 + json-with-bigint: 3.5.8 + universal-user-agent: 7.0.3 - '@opentelemetry/instrumentation-mongodb@0.67.0(@opentelemetry/api@1.9.1)': + '@octokit/types@16.0.0': dependencies: - '@opentelemetry/api': 1.9.1 - '@opentelemetry/instrumentation': 0.214.0(@opentelemetry/api@1.9.1) - '@opentelemetry/semantic-conventions': 1.40.0 - transitivePeerDependencies: - - supports-color + '@octokit/openapi-types': 27.0.0 - '@opentelemetry/instrumentation-mongoose@0.60.0(@opentelemetry/api@1.9.1)': + '@oozcitak/dom@2.0.2': dependencies: - '@opentelemetry/api': 1.9.1 - '@opentelemetry/core': 2.6.1(@opentelemetry/api@1.9.1) - '@opentelemetry/instrumentation': 0.214.0(@opentelemetry/api@1.9.1) - '@opentelemetry/semantic-conventions': 1.40.0 - transitivePeerDependencies: - - supports-color + '@oozcitak/infra': 2.0.2 + '@oozcitak/url': 3.0.0 + '@oozcitak/util': 10.0.0 - '@opentelemetry/instrumentation-mysql2@0.60.0(@opentelemetry/api@1.9.1)': + '@oozcitak/infra@2.0.2': dependencies: - '@opentelemetry/api': 1.9.1 - '@opentelemetry/instrumentation': 0.214.0(@opentelemetry/api@1.9.1) - '@opentelemetry/semantic-conventions': 1.40.0 - '@opentelemetry/sql-common': 0.41.2(@opentelemetry/api@1.9.1) - transitivePeerDependencies: - - supports-color + '@oozcitak/util': 10.0.0 - '@opentelemetry/instrumentation-mysql@0.60.0(@opentelemetry/api@1.9.1)': + '@oozcitak/url@3.0.0': dependencies: - '@opentelemetry/api': 1.9.1 - '@opentelemetry/instrumentation': 0.214.0(@opentelemetry/api@1.9.1) - '@opentelemetry/semantic-conventions': 1.40.0 - '@types/mysql': 2.15.27 - transitivePeerDependencies: - - supports-color + '@oozcitak/infra': 2.0.2 + '@oozcitak/util': 10.0.0 - '@opentelemetry/instrumentation-pg@0.66.0(@opentelemetry/api@1.9.1)': - dependencies: - '@opentelemetry/api': 1.9.1 - '@opentelemetry/core': 2.6.1(@opentelemetry/api@1.9.1) - '@opentelemetry/instrumentation': 0.214.0(@opentelemetry/api@1.9.1) - '@opentelemetry/semantic-conventions': 1.40.0 - '@opentelemetry/sql-common': 0.41.2(@opentelemetry/api@1.9.1) - '@types/pg': 8.15.6 - '@types/pg-pool': 2.0.7 - transitivePeerDependencies: - - supports-color + '@oozcitak/util@10.0.0': {} - '@opentelemetry/instrumentation-redis@0.62.0(@opentelemetry/api@1.9.1)': + '@openrouter/sdk@0.13.20': dependencies: - '@opentelemetry/api': 1.9.1 - '@opentelemetry/instrumentation': 0.214.0(@opentelemetry/api@1.9.1) - '@opentelemetry/redis-common': 0.38.2 - '@opentelemetry/semantic-conventions': 1.40.0 - transitivePeerDependencies: - - supports-color + zod: 4.4.3 - '@opentelemetry/instrumentation-tedious@0.33.0(@opentelemetry/api@1.9.1)': + '@opentelemetry/api-logs@0.220.0': dependencies: '@opentelemetry/api': 1.9.1 - '@opentelemetry/instrumentation': 0.214.0(@opentelemetry/api@1.9.1) - '@opentelemetry/semantic-conventions': 1.40.0 - '@types/tedious': 4.0.14 - transitivePeerDependencies: - - supports-color - '@opentelemetry/instrumentation-undici@0.24.0(@opentelemetry/api@1.9.1)': - dependencies: - '@opentelemetry/api': 1.9.1 - '@opentelemetry/core': 2.6.1(@opentelemetry/api@1.9.1) - '@opentelemetry/instrumentation': 0.214.0(@opentelemetry/api@1.9.1) - '@opentelemetry/semantic-conventions': 1.40.0 - transitivePeerDependencies: - - supports-color + '@opentelemetry/api@1.9.1': {} - '@opentelemetry/instrumentation@0.207.0(@opentelemetry/api@1.9.1)': + '@opentelemetry/core@2.12.0(@opentelemetry/api@1.9.1)': dependencies: '@opentelemetry/api': 1.9.1 - '@opentelemetry/api-logs': 0.207.0 - import-in-the-middle: 2.0.6 - require-in-the-middle: 8.0.1 - transitivePeerDependencies: - - supports-color + '@opentelemetry/semantic-conventions': 1.40.0 - '@opentelemetry/instrumentation@0.212.0(@opentelemetry/api@1.9.1)': + '@opentelemetry/instrumentation@0.220.0(@opentelemetry/api@1.9.1)': dependencies: '@opentelemetry/api': 1.9.1 - '@opentelemetry/api-logs': 0.212.0 - import-in-the-middle: 2.0.6 + '@opentelemetry/api-logs': 0.220.0 + import-in-the-middle: 3.0.0 require-in-the-middle: 8.0.1 transitivePeerDependencies: - supports-color - '@opentelemetry/instrumentation@0.214.0(@opentelemetry/api@1.9.1)': + '@opentelemetry/resources@2.12.0(@opentelemetry/api@1.9.1)': dependencies: '@opentelemetry/api': 1.9.1 - '@opentelemetry/api-logs': 0.214.0 - import-in-the-middle: 3.0.0 - require-in-the-middle: 8.0.1 - transitivePeerDependencies: - - supports-color - - '@opentelemetry/redis-common@0.38.2': {} + '@opentelemetry/core': 2.12.0(@opentelemetry/api@1.9.1) + '@opentelemetry/semantic-conventions': 1.40.0 - '@opentelemetry/resources@2.6.1(@opentelemetry/api@1.9.1)': + '@opentelemetry/sdk-trace-base@2.12.0(@opentelemetry/api@1.9.1)': dependencies: '@opentelemetry/api': 1.9.1 - '@opentelemetry/core': 2.6.1(@opentelemetry/api@1.9.1) + '@opentelemetry/core': 2.12.0(@opentelemetry/api@1.9.1) + '@opentelemetry/resources': 2.12.0(@opentelemetry/api@1.9.1) + '@opentelemetry/sdk-trace': 2.12.0(@opentelemetry/api@1.9.1) '@opentelemetry/semantic-conventions': 1.40.0 - '@opentelemetry/sdk-trace-base@2.6.1(@opentelemetry/api@1.9.1)': + '@opentelemetry/sdk-trace@2.12.0(@opentelemetry/api@1.9.1)': dependencies: '@opentelemetry/api': 1.9.1 - '@opentelemetry/core': 2.6.1(@opentelemetry/api@1.9.1) - '@opentelemetry/resources': 2.6.1(@opentelemetry/api@1.9.1) + '@opentelemetry/core': 2.12.0(@opentelemetry/api@1.9.1) + '@opentelemetry/resources': 2.12.0(@opentelemetry/api@1.9.1) '@opentelemetry/semantic-conventions': 1.40.0 '@opentelemetry/semantic-conventions@1.40.0': {} - '@opentelemetry/sql-common@0.41.2(@opentelemetry/api@1.9.1)': - dependencies: - '@opentelemetry/api': 1.9.1 - '@opentelemetry/core': 2.6.1(@opentelemetry/api@1.9.1) - '@oxc-parser/binding-android-arm-eabi@0.120.0': optional: true @@ -10593,13 +10079,6 @@ snapshots: '@preact/signals-core@1.14.4': {} - '@prisma/instrumentation@7.6.0(@opentelemetry/api@1.9.1)': - dependencies: - '@opentelemetry/api': 1.9.1 - '@opentelemetry/instrumentation': 0.207.0(@opentelemetry/api@1.9.1) - transitivePeerDependencies: - - supports-color - '@protobufjs/aspromise@1.1.2': {} '@protobufjs/base64@1.1.2': {} @@ -11033,108 +10512,28 @@ snapshots: '@rolldown/pluginutils@1.0.1': {} - '@rollup/rollup-android-arm-eabi@4.53.3': - optional: true - - '@rollup/rollup-android-arm64@4.53.3': - optional: true - - '@rollup/rollup-darwin-arm64@4.53.3': - optional: true - - '@rollup/rollup-darwin-x64@4.53.3': - optional: true - - '@rollup/rollup-freebsd-arm64@4.53.3': - optional: true - - '@rollup/rollup-freebsd-x64@4.53.3': - optional: true - - '@rollup/rollup-linux-arm-gnueabihf@4.53.3': - optional: true - - '@rollup/rollup-linux-arm-musleabihf@4.53.3': - optional: true - - '@rollup/rollup-linux-arm64-gnu@4.53.3': - optional: true - - '@rollup/rollup-linux-arm64-musl@4.53.3': - optional: true - - '@rollup/rollup-linux-loong64-gnu@4.53.3': - optional: true - - '@rollup/rollup-linux-ppc64-gnu@4.53.3': - optional: true - - '@rollup/rollup-linux-riscv64-gnu@4.53.3': - optional: true - - '@rollup/rollup-linux-riscv64-musl@4.53.3': - optional: true - - '@rollup/rollup-linux-s390x-gnu@4.53.3': - optional: true - - '@rollup/rollup-linux-x64-gnu@4.53.3': - optional: true - - '@rollup/rollup-linux-x64-musl@4.53.3': - optional: true - - '@rollup/rollup-openharmony-arm64@4.53.3': - optional: true - - '@rollup/rollup-win32-arm64-msvc@4.53.3': - optional: true - - '@rollup/rollup-win32-ia32-msvc@4.53.3': - optional: true - - '@rollup/rollup-win32-x64-gnu@4.53.3': - optional: true - - '@rollup/rollup-win32-x64-msvc@4.53.3': - optional: true - '@sec-ant/readable-stream@0.4.1': {} - '@sentry-internal/browser-utils@10.47.0': - dependencies: - '@sentry/core': 10.47.0 - - '@sentry-internal/feedback@10.47.0': - dependencies: - '@sentry/core': 10.47.0 - - '@sentry-internal/replay-canvas@10.47.0': - dependencies: - '@sentry-internal/replay': 10.47.0 - '@sentry/core': 10.47.0 - - '@sentry-internal/replay@10.47.0': + '@sentry/browser-utils@10.78.0': dependencies: - '@sentry-internal/browser-utils': 10.47.0 - '@sentry/core': 10.47.0 - - '@sentry/babel-plugin-component-annotate@5.1.1': {} + '@sentry/conventions': 0.16.0 + '@sentry/core': 10.78.0 - '@sentry/browser@10.47.0': + '@sentry/browser@10.78.0': dependencies: - '@sentry-internal/browser-utils': 10.47.0 - '@sentry-internal/feedback': 10.47.0 - '@sentry-internal/replay': 10.47.0 - '@sentry-internal/replay-canvas': 10.47.0 - '@sentry/core': 10.47.0 + '@sentry/browser-utils': 10.78.0 + '@sentry/conventions': 0.16.0 + '@sentry/core': 10.78.0 + '@sentry/feedback': 10.78.0 + '@sentry/replay': 10.78.0 + '@sentry/replay-canvas': 10.78.0 - '@sentry/bundler-plugin-core@5.1.1': + '@sentry/bundler-plugins@10.78.0': dependencies: - '@babel/core': 7.29.0 - '@sentry/babel-plugin-component-annotate': 5.1.1 - '@sentry/cli': 2.58.5 - dotenv: 16.6.1 + '@babel/core': 7.29.7 + '@sentry/cli': 2.58.6 + '@sentry/core': 10.78.0 + dotenv: 17.4.2 find-up: 5.0.0 glob: 13.0.6 magic-string: 0.30.21 @@ -11142,31 +10541,31 @@ snapshots: - encoding - supports-color - '@sentry/cli-darwin@2.58.5': + '@sentry/cli-darwin@2.58.6': optional: true - '@sentry/cli-linux-arm64@2.58.5': + '@sentry/cli-linux-arm64@2.58.6': optional: true - '@sentry/cli-linux-arm@2.58.5': + '@sentry/cli-linux-arm@2.58.6': optional: true - '@sentry/cli-linux-i686@2.58.5': + '@sentry/cli-linux-i686@2.58.6': optional: true - '@sentry/cli-linux-x64@2.58.5': + '@sentry/cli-linux-x64@2.58.6': optional: true - '@sentry/cli-win32-arm64@2.58.5': + '@sentry/cli-win32-arm64@2.58.6': optional: true - '@sentry/cli-win32-i686@2.58.5': + '@sentry/cli-win32-i686@2.58.6': optional: true - '@sentry/cli-win32-x64@2.58.5': + '@sentry/cli-win32-x64@2.58.6': optional: true - '@sentry/cli@2.58.5': + '@sentry/cli@2.58.6': dependencies: https-proxy-agent: 5.0.1 node-fetch: 2.7.0 @@ -11174,123 +10573,112 @@ snapshots: proxy-from-env: 1.1.0 which: 2.0.2 optionalDependencies: - '@sentry/cli-darwin': 2.58.5 - '@sentry/cli-linux-arm': 2.58.5 - '@sentry/cli-linux-arm64': 2.58.5 - '@sentry/cli-linux-i686': 2.58.5 - '@sentry/cli-linux-x64': 2.58.5 - '@sentry/cli-win32-arm64': 2.58.5 - '@sentry/cli-win32-i686': 2.58.5 - '@sentry/cli-win32-x64': 2.58.5 + '@sentry/cli-darwin': 2.58.6 + '@sentry/cli-linux-arm': 2.58.6 + '@sentry/cli-linux-arm64': 2.58.6 + '@sentry/cli-linux-i686': 2.58.6 + '@sentry/cli-linux-x64': 2.58.6 + '@sentry/cli-win32-arm64': 2.58.6 + '@sentry/cli-win32-i686': 2.58.6 + '@sentry/cli-win32-x64': 2.58.6 transitivePeerDependencies: - encoding - supports-color - '@sentry/core@10.47.0': {} + '@sentry/conventions@0.16.0': {} - '@sentry/node-core@10.47.0(@opentelemetry/api@1.9.1)(@opentelemetry/context-async-hooks@2.6.1(@opentelemetry/api@1.9.1))(@opentelemetry/core@2.6.1(@opentelemetry/api@1.9.1))(@opentelemetry/instrumentation@0.214.0(@opentelemetry/api@1.9.1))(@opentelemetry/resources@2.6.1(@opentelemetry/api@1.9.1))(@opentelemetry/sdk-trace-base@2.6.1(@opentelemetry/api@1.9.1))(@opentelemetry/semantic-conventions@1.40.0)': + '@sentry/core@10.78.0': dependencies: - '@sentry/core': 10.47.0 - '@sentry/opentelemetry': 10.47.0(@opentelemetry/api@1.9.1)(@opentelemetry/context-async-hooks@2.6.1(@opentelemetry/api@1.9.1))(@opentelemetry/core@2.6.1(@opentelemetry/api@1.9.1))(@opentelemetry/sdk-trace-base@2.6.1(@opentelemetry/api@1.9.1))(@opentelemetry/semantic-conventions@1.40.0) + '@sentry/conventions': 0.16.0 + + '@sentry/feedback@10.78.0': + dependencies: + '@sentry/core': 10.78.0 + + '@sentry/node-core@10.78.0(@opentelemetry/api@1.9.1)(@opentelemetry/core@2.12.0(@opentelemetry/api@1.9.1))(@opentelemetry/instrumentation@0.220.0(@opentelemetry/api@1.9.1))(@opentelemetry/sdk-trace-base@2.12.0(@opentelemetry/api@1.9.1))': + dependencies: + '@sentry/conventions': 0.16.0 + '@sentry/core': 10.78.0 + '@sentry/opentelemetry': 10.78.0(@opentelemetry/api@1.9.1)(@opentelemetry/core@2.12.0(@opentelemetry/api@1.9.1))(@opentelemetry/sdk-trace-base@2.12.0(@opentelemetry/api@1.9.1)) import-in-the-middle: 3.0.0 optionalDependencies: '@opentelemetry/api': 1.9.1 - '@opentelemetry/context-async-hooks': 2.6.1(@opentelemetry/api@1.9.1) - '@opentelemetry/core': 2.6.1(@opentelemetry/api@1.9.1) - '@opentelemetry/instrumentation': 0.214.0(@opentelemetry/api@1.9.1) - '@opentelemetry/resources': 2.6.1(@opentelemetry/api@1.9.1) - '@opentelemetry/sdk-trace-base': 2.6.1(@opentelemetry/api@1.9.1) - '@opentelemetry/semantic-conventions': 1.40.0 + '@opentelemetry/core': 2.12.0(@opentelemetry/api@1.9.1) + '@opentelemetry/instrumentation': 0.220.0(@opentelemetry/api@1.9.1) + '@opentelemetry/sdk-trace-base': 2.12.0(@opentelemetry/api@1.9.1) - '@sentry/node@10.47.0': + '@sentry/node@10.78.0(@opentelemetry/core@2.12.0(@opentelemetry/api@1.9.1))': dependencies: - '@fastify/otel': 0.18.0(@opentelemetry/api@1.9.1) '@opentelemetry/api': 1.9.1 - '@opentelemetry/context-async-hooks': 2.6.1(@opentelemetry/api@1.9.1) - '@opentelemetry/core': 2.6.1(@opentelemetry/api@1.9.1) - '@opentelemetry/instrumentation': 0.214.0(@opentelemetry/api@1.9.1) - '@opentelemetry/instrumentation-amqplib': 0.61.0(@opentelemetry/api@1.9.1) - '@opentelemetry/instrumentation-connect': 0.57.0(@opentelemetry/api@1.9.1) - '@opentelemetry/instrumentation-dataloader': 0.31.0(@opentelemetry/api@1.9.1) - '@opentelemetry/instrumentation-express': 0.62.0(@opentelemetry/api@1.9.1) - '@opentelemetry/instrumentation-fs': 0.33.0(@opentelemetry/api@1.9.1) - '@opentelemetry/instrumentation-generic-pool': 0.57.0(@opentelemetry/api@1.9.1) - '@opentelemetry/instrumentation-graphql': 0.62.0(@opentelemetry/api@1.9.1) - '@opentelemetry/instrumentation-hapi': 0.60.0(@opentelemetry/api@1.9.1) - '@opentelemetry/instrumentation-http': 0.214.0(@opentelemetry/api@1.9.1) - '@opentelemetry/instrumentation-ioredis': 0.62.0(@opentelemetry/api@1.9.1) - '@opentelemetry/instrumentation-kafkajs': 0.23.0(@opentelemetry/api@1.9.1) - '@opentelemetry/instrumentation-knex': 0.58.0(@opentelemetry/api@1.9.1) - '@opentelemetry/instrumentation-koa': 0.62.0(@opentelemetry/api@1.9.1) - '@opentelemetry/instrumentation-lru-memoizer': 0.58.0(@opentelemetry/api@1.9.1) - '@opentelemetry/instrumentation-mongodb': 0.67.0(@opentelemetry/api@1.9.1) - '@opentelemetry/instrumentation-mongoose': 0.60.0(@opentelemetry/api@1.9.1) - '@opentelemetry/instrumentation-mysql': 0.60.0(@opentelemetry/api@1.9.1) - '@opentelemetry/instrumentation-mysql2': 0.60.0(@opentelemetry/api@1.9.1) - '@opentelemetry/instrumentation-pg': 0.66.0(@opentelemetry/api@1.9.1) - '@opentelemetry/instrumentation-redis': 0.62.0(@opentelemetry/api@1.9.1) - '@opentelemetry/instrumentation-tedious': 0.33.0(@opentelemetry/api@1.9.1) - '@opentelemetry/instrumentation-undici': 0.24.0(@opentelemetry/api@1.9.1) - '@opentelemetry/resources': 2.6.1(@opentelemetry/api@1.9.1) - '@opentelemetry/sdk-trace-base': 2.6.1(@opentelemetry/api@1.9.1) - '@opentelemetry/semantic-conventions': 1.40.0 - '@prisma/instrumentation': 7.6.0(@opentelemetry/api@1.9.1) - '@sentry/core': 10.47.0 - '@sentry/node-core': 10.47.0(@opentelemetry/api@1.9.1)(@opentelemetry/context-async-hooks@2.6.1(@opentelemetry/api@1.9.1))(@opentelemetry/core@2.6.1(@opentelemetry/api@1.9.1))(@opentelemetry/instrumentation@0.214.0(@opentelemetry/api@1.9.1))(@opentelemetry/resources@2.6.1(@opentelemetry/api@1.9.1))(@opentelemetry/sdk-trace-base@2.6.1(@opentelemetry/api@1.9.1))(@opentelemetry/semantic-conventions@1.40.0) - '@sentry/opentelemetry': 10.47.0(@opentelemetry/api@1.9.1)(@opentelemetry/context-async-hooks@2.6.1(@opentelemetry/api@1.9.1))(@opentelemetry/core@2.6.1(@opentelemetry/api@1.9.1))(@opentelemetry/sdk-trace-base@2.6.1(@opentelemetry/api@1.9.1))(@opentelemetry/semantic-conventions@1.40.0) + '@opentelemetry/instrumentation': 0.220.0(@opentelemetry/api@1.9.1) + '@opentelemetry/sdk-trace-base': 2.12.0(@opentelemetry/api@1.9.1) + '@sentry/conventions': 0.16.0 + '@sentry/core': 10.78.0 + '@sentry/node-core': 10.78.0(@opentelemetry/api@1.9.1)(@opentelemetry/core@2.12.0(@opentelemetry/api@1.9.1))(@opentelemetry/instrumentation@0.220.0(@opentelemetry/api@1.9.1))(@opentelemetry/sdk-trace-base@2.12.0(@opentelemetry/api@1.9.1)) + '@sentry/opentelemetry': 10.78.0(@opentelemetry/api@1.9.1)(@opentelemetry/core@2.12.0(@opentelemetry/api@1.9.1))(@opentelemetry/sdk-trace-base@2.12.0(@opentelemetry/api@1.9.1)) + '@sentry/server-utils': 10.78.0 import-in-the-middle: 3.0.0 transitivePeerDependencies: + - '@opentelemetry/core' - '@opentelemetry/exporter-trace-otlp-http' - supports-color - '@sentry/opentelemetry@10.47.0(@opentelemetry/api@1.9.1)(@opentelemetry/context-async-hooks@2.6.1(@opentelemetry/api@1.9.1))(@opentelemetry/core@2.6.1(@opentelemetry/api@1.9.1))(@opentelemetry/sdk-trace-base@2.6.1(@opentelemetry/api@1.9.1))(@opentelemetry/semantic-conventions@1.40.0)': + '@sentry/opentelemetry@10.78.0(@opentelemetry/api@1.9.1)(@opentelemetry/core@2.12.0(@opentelemetry/api@1.9.1))(@opentelemetry/sdk-trace-base@2.12.0(@opentelemetry/api@1.9.1))': dependencies: '@opentelemetry/api': 1.9.1 - '@opentelemetry/context-async-hooks': 2.6.1(@opentelemetry/api@1.9.1) - '@opentelemetry/core': 2.6.1(@opentelemetry/api@1.9.1) - '@opentelemetry/sdk-trace-base': 2.6.1(@opentelemetry/api@1.9.1) - '@opentelemetry/semantic-conventions': 1.40.0 - '@sentry/core': 10.47.0 + '@opentelemetry/core': 2.12.0(@opentelemetry/api@1.9.1) + '@opentelemetry/sdk-trace-base': 2.12.0(@opentelemetry/api@1.9.1) + '@sentry/conventions': 0.16.0 + '@sentry/core': 10.78.0 - '@sentry/react@10.47.0(react@19.2.3)': + '@sentry/react@10.78.0(react@19.2.3)': dependencies: - '@sentry/browser': 10.47.0 - '@sentry/core': 10.47.0 + '@sentry/browser': 10.78.0 + '@sentry/conventions': 0.16.0 + '@sentry/core': 10.78.0 react: 19.2.3 - '@sentry/rollup-plugin@5.1.1(rollup@4.53.3)': + '@sentry/replay-canvas@10.78.0': dependencies: - '@sentry/bundler-plugin-core': 5.1.1 - magic-string: 0.30.21 - rollup: 4.53.3 - transitivePeerDependencies: - - encoding - - supports-color + '@sentry/core': 10.78.0 + '@sentry/replay': 10.78.0 + + '@sentry/replay@10.78.0': + dependencies: + '@sentry/browser-utils': 10.78.0 + '@sentry/core': 10.78.0 + + '@sentry/server-utils@10.78.0': + dependencies: + '@sentry/conventions': 0.16.0 + '@sentry/core': 10.78.0 - '@sentry/tanstackstart-react@10.47.0(react@19.2.3)(rollup@4.53.3)': + '@sentry/tanstackstart-react@10.78.0(@opentelemetry/core@2.12.0(@opentelemetry/api@1.9.1))(react@19.2.3)': dependencies: '@opentelemetry/api': 1.9.1 - '@opentelemetry/semantic-conventions': 1.40.0 - '@sentry-internal/browser-utils': 10.47.0 - '@sentry/core': 10.47.0 - '@sentry/node': 10.47.0 - '@sentry/react': 10.47.0(react@19.2.3) - '@sentry/vite-plugin': 5.1.1(rollup@4.53.3) - transitivePeerDependencies: + '@sentry/browser-utils': 10.78.0 + '@sentry/conventions': 0.16.0 + '@sentry/core': 10.78.0 + '@sentry/node': 10.78.0(@opentelemetry/core@2.12.0(@opentelemetry/api@1.9.1)) + '@sentry/react': 10.78.0(react@19.2.3) + '@sentry/vite-plugin': 5.4.1 + transitivePeerDependencies: + - '@opentelemetry/core' - '@opentelemetry/exporter-trace-otlp-http' - encoding - react - rollup - supports-color + - webpack - '@sentry/vite-plugin@5.1.1(rollup@4.53.3)': + '@sentry/vite-plugin@5.4.1': dependencies: - '@sentry/bundler-plugin-core': 5.1.1 - '@sentry/rollup-plugin': 5.1.1(rollup@4.53.3) + '@sentry/bundler-plugins': 10.78.0 transitivePeerDependencies: - encoding - rollup - supports-color + - webpack '@shopify/hydrogen-react@2026.4.0(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(three@0.183.2)(vite@8.0.16(@types/node@25.5.0)(esbuild@0.27.4)(jiti@2.7.0)(tsx@4.21.0)(yaml@2.9.0))': dependencies: @@ -11905,14 +11293,14 @@ snapshots: react: 19.2.3 react-dom: 19.2.3(react@19.2.3) - '@tanstack/react-start-rsc@0.1.59(esbuild@0.27.4)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(rolldown@1.0.3)(rollup@4.53.3)(vite@8.0.16(@types/node@25.5.0)(esbuild@0.27.4)(jiti@2.7.0)(tsx@4.21.0)(yaml@2.9.0))': + '@tanstack/react-start-rsc@0.1.59(esbuild@0.27.4)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(rolldown@1.0.3)(vite@8.0.16(@types/node@25.5.0)(esbuild@0.27.4)(jiti@2.7.0)(tsx@4.21.0)(yaml@2.9.0))': dependencies: '@tanstack/react-router': 1.170.41(react-dom@19.2.3(react@19.2.3))(react@19.2.3) '@tanstack/router-core': 1.171.34 '@tanstack/router-utils': 1.162.3 '@tanstack/start-client-core': 1.170.34 '@tanstack/start-fn-stubs': 1.162.0 - '@tanstack/start-plugin-core': 1.171.49(@tanstack/react-router@1.170.41(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(esbuild@0.27.4)(rolldown@1.0.3)(rollup@4.53.3)(vite@8.0.16(@types/node@25.5.0)(esbuild@0.27.4)(jiti@2.7.0)(tsx@4.21.0)(yaml@2.9.0)) + '@tanstack/start-plugin-core': 1.171.49(@tanstack/react-router@1.170.41(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(esbuild@0.27.4)(rolldown@1.0.3)(vite@8.0.16(@types/node@25.5.0)(esbuild@0.27.4)(jiti@2.7.0)(tsx@4.21.0)(yaml@2.9.0)) '@tanstack/start-storage-context': 1.167.36 pathe: 2.0.3 react: 19.2.3 @@ -11941,15 +11329,15 @@ snapshots: transitivePeerDependencies: - crossws - '@tanstack/react-start@1.168.60(esbuild@0.27.4)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(rolldown@1.0.3)(rollup@4.53.3)(vite@8.0.16(@types/node@25.5.0)(esbuild@0.27.4)(jiti@2.7.0)(tsx@4.21.0)(yaml@2.9.0))': + '@tanstack/react-start@1.168.60(esbuild@0.27.4)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(rolldown@1.0.3)(vite@8.0.16(@types/node@25.5.0)(esbuild@0.27.4)(jiti@2.7.0)(tsx@4.21.0)(yaml@2.9.0))': dependencies: '@tanstack/react-router': 1.170.41(react-dom@19.2.3(react@19.2.3))(react@19.2.3) '@tanstack/react-start-client': 1.168.39(react-dom@19.2.3(react@19.2.3))(react@19.2.3) - '@tanstack/react-start-rsc': 0.1.59(esbuild@0.27.4)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(rolldown@1.0.3)(rollup@4.53.3)(vite@8.0.16(@types/node@25.5.0)(esbuild@0.27.4)(jiti@2.7.0)(tsx@4.21.0)(yaml@2.9.0)) + '@tanstack/react-start-rsc': 0.1.59(esbuild@0.27.4)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(rolldown@1.0.3)(vite@8.0.16(@types/node@25.5.0)(esbuild@0.27.4)(jiti@2.7.0)(tsx@4.21.0)(yaml@2.9.0)) '@tanstack/react-start-server': 1.167.46(react-dom@19.2.3(react@19.2.3))(react@19.2.3) '@tanstack/router-utils': 1.162.3 '@tanstack/start-client-core': 1.170.34 - '@tanstack/start-plugin-core': 1.171.49(@tanstack/react-router@1.170.41(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(esbuild@0.27.4)(rolldown@1.0.3)(rollup@4.53.3)(vite@8.0.16(@types/node@25.5.0)(esbuild@0.27.4)(jiti@2.7.0)(tsx@4.21.0)(yaml@2.9.0)) + '@tanstack/start-plugin-core': 1.171.49(@tanstack/react-router@1.170.41(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(esbuild@0.27.4)(rolldown@1.0.3)(vite@8.0.16(@types/node@25.5.0)(esbuild@0.27.4)(jiti@2.7.0)(tsx@4.21.0)(yaml@2.9.0)) '@tanstack/start-server-core': 1.169.39 pathe: 2.0.3 react: 19.2.3 @@ -12030,7 +11418,7 @@ snapshots: transitivePeerDependencies: - supports-color - '@tanstack/router-plugin@1.168.42(@tanstack/react-router@1.170.41(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(esbuild@0.27.4)(rolldown@1.0.3)(rollup@4.53.3)(vite@8.0.16(@types/node@25.5.0)(esbuild@0.27.4)(jiti@2.7.0)(tsx@4.21.0)(yaml@2.9.0))': + '@tanstack/router-plugin@1.168.42(@tanstack/react-router@1.170.41(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(esbuild@0.27.4)(rolldown@1.0.3)(vite@8.0.16(@types/node@25.5.0)(esbuild@0.27.4)(jiti@2.7.0)(tsx@4.21.0)(yaml@2.9.0))': dependencies: '@babel/core': 7.29.7 '@babel/template': 7.29.7 @@ -12039,7 +11427,7 @@ snapshots: '@tanstack/router-generator': 1.167.40 '@tanstack/router-utils': 1.162.3 chokidar: 5.0.0 - unplugin: 3.3.0(esbuild@0.27.4)(rolldown@1.0.3)(rollup@4.53.3)(vite@8.0.16(@types/node@25.5.0)(esbuild@0.27.4)(jiti@2.7.0)(tsx@4.21.0)(yaml@2.9.0)) + unplugin: 3.3.0(esbuild@0.27.4)(rolldown@1.0.3)(vite@8.0.16(@types/node@25.5.0)(esbuild@0.27.4)(jiti@2.7.0)(tsx@4.21.0)(yaml@2.9.0)) zod: 4.6.2 optionalDependencies: '@tanstack/react-router': 1.170.41(react-dom@19.2.3(react@19.2.3))(react@19.2.3) @@ -12081,7 +11469,7 @@ snapshots: '@tanstack/start-fn-stubs@1.162.0': {} - '@tanstack/start-plugin-core@1.171.49(@tanstack/react-router@1.170.41(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(esbuild@0.27.4)(rolldown@1.0.3)(rollup@4.53.3)(vite@8.0.16(@types/node@25.5.0)(esbuild@0.27.4)(jiti@2.7.0)(tsx@4.21.0)(yaml@2.9.0))': + '@tanstack/start-plugin-core@1.171.49(@tanstack/react-router@1.170.41(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(esbuild@0.27.4)(rolldown@1.0.3)(vite@8.0.16(@types/node@25.5.0)(esbuild@0.27.4)(jiti@2.7.0)(tsx@4.21.0)(yaml@2.9.0))': dependencies: '@babel/code-frame': 7.29.7 '@babel/core': 7.29.7 @@ -12089,7 +11477,7 @@ snapshots: '@jridgewell/remapping': 2.3.5 '@tanstack/router-core': 1.171.34 '@tanstack/router-generator': 1.167.40 - '@tanstack/router-plugin': 1.168.42(@tanstack/react-router@1.170.41(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(esbuild@0.27.4)(rolldown@1.0.3)(rollup@4.53.3)(vite@8.0.16(@types/node@25.5.0)(esbuild@0.27.4)(jiti@2.7.0)(tsx@4.21.0)(yaml@2.9.0)) + '@tanstack/router-plugin': 1.168.42(@tanstack/react-router@1.170.41(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(esbuild@0.27.4)(rolldown@1.0.3)(vite@8.0.16(@types/node@25.5.0)(esbuild@0.27.4)(jiti@2.7.0)(tsx@4.21.0)(yaml@2.9.0)) '@tanstack/router-utils': 1.162.3 '@tanstack/start-server-core': 1.169.39 exsolve: 1.1.1 @@ -12233,10 +11621,6 @@ snapshots: '@types/deep-eql': 4.0.2 assertion-error: 2.0.1 - '@types/connect@3.4.38': - dependencies: - '@types/node': 25.5.0 - '@types/d3-array@3.2.2': {} '@types/d3-axis@3.0.6': @@ -12390,7 +11774,7 @@ snapshots: '@types/geojson@7946.0.16': {} - '@types/google.maps@3.58.1': {} + '@types/google.maps@3.65.3': {} '@types/hast@3.0.4': dependencies: @@ -12408,10 +11792,6 @@ snapshots: '@types/ms@2.1.0': {} - '@types/mysql@2.15.27': - dependencies: - '@types/node': 25.5.0 - '@types/node@24.19.0': dependencies: undici-types: 7.24.6 @@ -12422,16 +11802,6 @@ snapshots: '@types/offscreencanvas@2019.7.3': {} - '@types/pg-pool@2.0.7': - dependencies: - '@types/pg': 8.20.0 - - '@types/pg@8.15.6': - dependencies: - '@types/node': 25.5.0 - pg-protocol: 1.13.0 - pg-types: 2.2.0 - '@types/pg@8.20.0': dependencies: '@types/node': 25.5.0 @@ -12470,10 +11840,6 @@ snapshots: dependencies: '@types/node': 25.5.0 - '@types/tedious@4.0.14': - dependencies: - '@types/node': 25.5.0 - '@types/three@0.183.1': dependencies: '@dimforge/rapier3d-compat': 0.12.0 @@ -12596,9 +11962,9 @@ snapshots: mime-types: 3.0.2 negotiator: 1.0.0 - acorn-import-attributes@1.9.5(acorn@8.16.0): + acorn-import-attributes@1.9.5(acorn@8.18.0): dependencies: - acorn: 8.16.0 + acorn: 8.18.0 acorn@8.16.0: {} @@ -12805,6 +12171,8 @@ snapshots: dependencies: bare-path: 3.0.0 + base-x@5.0.1: {} + base64-js@1.5.1: {} baseline-browser-mapping@2.10.13: {} @@ -13449,6 +12817,8 @@ snapshots: dotenv@17.3.1: {} + dotenv@17.4.2: {} + draco3d@1.5.7: {} drizzle-kit@0.31.10: @@ -13981,8 +13351,6 @@ snapshots: dependencies: fetch-blob: 3.2.0 - forwarded-parse@2.1.2: {} - forwarded@0.2.0: {} fractional-indexing@3.4.0: {} @@ -14298,17 +13666,10 @@ snapshots: immediate@3.0.6: {} - import-in-the-middle@2.0.6: - dependencies: - acorn: 8.16.0 - acorn-import-attributes: 1.9.5(acorn@8.16.0) - cjs-module-lexer: 2.2.0 - module-details-from-path: 1.0.4 - import-in-the-middle@3.0.0: dependencies: - acorn: 8.16.0 - acorn-import-attributes: 1.9.5(acorn@8.16.0) + acorn: 8.18.0 + acorn-import-attributes: 1.9.5(acorn@8.18.0) cjs-module-lexer: 2.2.0 module-details-from-path: 1.0.4 @@ -14328,7 +13689,7 @@ snapshots: '@algolia/events': 4.0.1 '@swc/helpers': 0.5.18 '@types/dom-speech-recognition': 0.0.1 - '@types/google.maps': 3.58.1 + '@types/google.maps': 3.65.3 '@types/hogan.js': 3.0.5 '@types/qs': 6.15.0 algoliasearch: 5.50.0 @@ -15662,34 +15023,6 @@ snapshots: '@rolldown/binding-win32-arm64-msvc': 1.0.3 '@rolldown/binding-win32-x64-msvc': 1.0.3 - rollup@4.53.3: - dependencies: - '@types/estree': 1.0.8 - optionalDependencies: - '@rollup/rollup-android-arm-eabi': 4.53.3 - '@rollup/rollup-android-arm64': 4.53.3 - '@rollup/rollup-darwin-arm64': 4.53.3 - '@rollup/rollup-darwin-x64': 4.53.3 - '@rollup/rollup-freebsd-arm64': 4.53.3 - '@rollup/rollup-freebsd-x64': 4.53.3 - '@rollup/rollup-linux-arm-gnueabihf': 4.53.3 - '@rollup/rollup-linux-arm-musleabihf': 4.53.3 - '@rollup/rollup-linux-arm64-gnu': 4.53.3 - '@rollup/rollup-linux-arm64-musl': 4.53.3 - '@rollup/rollup-linux-loong64-gnu': 4.53.3 - '@rollup/rollup-linux-ppc64-gnu': 4.53.3 - '@rollup/rollup-linux-riscv64-gnu': 4.53.3 - '@rollup/rollup-linux-riscv64-musl': 4.53.3 - '@rollup/rollup-linux-s390x-gnu': 4.53.3 - '@rollup/rollup-linux-x64-gnu': 4.53.3 - '@rollup/rollup-linux-x64-musl': 4.53.3 - '@rollup/rollup-openharmony-arm64': 4.53.3 - '@rollup/rollup-win32-arm64-msvc': 4.53.3 - '@rollup/rollup-win32-ia32-msvc': 4.53.3 - '@rollup/rollup-win32-x64-gnu': 4.53.3 - '@rollup/rollup-win32-x64-msvc': 4.53.3 - fsevents: 2.3.3 - rou3@0.8.1: {} roughjs@4.6.6: @@ -16363,7 +15696,7 @@ snapshots: unpipe@1.0.0: {} - unplugin@3.3.0(esbuild@0.27.4)(rolldown@1.0.3)(rollup@4.53.3)(vite@8.0.16(@types/node@25.5.0)(esbuild@0.27.4)(jiti@2.7.0)(tsx@4.21.0)(yaml@2.9.0)): + unplugin@3.3.0(esbuild@0.27.4)(rolldown@1.0.3)(vite@8.0.16(@types/node@25.5.0)(esbuild@0.27.4)(jiti@2.7.0)(tsx@4.21.0)(yaml@2.9.0)): dependencies: '@jridgewell/remapping': 2.3.5 picomatch: 4.0.7 @@ -16371,7 +15704,6 @@ snapshots: optionalDependencies: esbuild: 0.27.4 rolldown: 1.0.3 - rollup: 4.53.3 vite: 8.0.16(@types/node@25.5.0)(esbuild@0.27.4)(jiti@2.7.0)(tsx@4.21.0)(yaml@2.9.0) unzipper@0.12.5: @@ -16438,6 +15770,10 @@ snapshots: optionalDependencies: typescript: 6.0.2 + valibot@1.4.2(typescript@6.0.2): + optionalDependencies: + typescript: 6.0.2 + validate-npm-package-license@3.0.4: dependencies: spdx-correct: 3.2.0 diff --git a/public/_headers b/public/_headers index 7775fa046..b02618da8 100644 --- a/public/_headers +++ b/public/_headers @@ -11,3 +11,9 @@ /.well-known/security.txt Content-Type: text/plain; charset=utf-8 + +# Self-hosted fonts aren't fingerprinted. Without a long cache every page load +# revalidates them before text can switch from the fallback font. Give a font +# a new filename if its contents change. +/fonts/* + Cache-Control: public, max-age=31536000, immutable diff --git a/public/fonts/BricolageGrotesque-var-latin-ext.woff2 b/public/fonts/BricolageGrotesque-var-latin-ext.woff2 new file mode 100644 index 000000000..f1d35c157 Binary files /dev/null and b/public/fonts/BricolageGrotesque-var-latin-ext.woff2 differ diff --git a/public/fonts/BricolageGrotesque-var-latin.woff2 b/public/fonts/BricolageGrotesque-var-latin.woff2 new file mode 100644 index 000000000..b908aff81 Binary files /dev/null and b/public/fonts/BricolageGrotesque-var-latin.woff2 differ diff --git a/public/fonts/BricolageGrotesque-var-vietnamese.woff2 b/public/fonts/BricolageGrotesque-var-vietnamese.woff2 new file mode 100644 index 000000000..6d742114a Binary files /dev/null and b/public/fonts/BricolageGrotesque-var-vietnamese.woff2 differ diff --git a/public/fonts/DMSans-var-latin-ext.woff2 b/public/fonts/DMSans-var-latin-ext.woff2 new file mode 100644 index 000000000..9443ff9f4 Binary files /dev/null and b/public/fonts/DMSans-var-latin-ext.woff2 differ diff --git a/public/fonts/DMSans-var-latin.woff2 b/public/fonts/DMSans-var-latin.woff2 new file mode 100644 index 000000000..9313206b1 Binary files /dev/null and b/public/fonts/DMSans-var-latin.woff2 differ diff --git a/public/fonts/IBMPlexMono-300-cyrillic-ext.woff2 b/public/fonts/IBMPlexMono-300-cyrillic-ext.woff2 new file mode 100644 index 000000000..c24285bd7 Binary files /dev/null and b/public/fonts/IBMPlexMono-300-cyrillic-ext.woff2 differ diff --git a/public/fonts/IBMPlexMono-300-cyrillic.woff2 b/public/fonts/IBMPlexMono-300-cyrillic.woff2 new file mode 100644 index 000000000..f247f10d9 Binary files /dev/null and b/public/fonts/IBMPlexMono-300-cyrillic.woff2 differ diff --git a/public/fonts/IBMPlexMono-300-latin-ext.woff2 b/public/fonts/IBMPlexMono-300-latin-ext.woff2 new file mode 100644 index 000000000..d770f2ad7 Binary files /dev/null and b/public/fonts/IBMPlexMono-300-latin-ext.woff2 differ diff --git a/public/fonts/IBMPlexMono-300-latin.woff2 b/public/fonts/IBMPlexMono-300-latin.woff2 new file mode 100644 index 000000000..43fe2120c Binary files /dev/null and b/public/fonts/IBMPlexMono-300-latin.woff2 differ diff --git a/public/fonts/IBMPlexMono-300-vietnamese.woff2 b/public/fonts/IBMPlexMono-300-vietnamese.woff2 new file mode 100644 index 000000000..3048ec08e Binary files /dev/null and b/public/fonts/IBMPlexMono-300-vietnamese.woff2 differ diff --git a/public/fonts/IBMPlexMono-400-cyrillic-ext.woff2 b/public/fonts/IBMPlexMono-400-cyrillic-ext.woff2 new file mode 100644 index 000000000..1e104e842 Binary files /dev/null and b/public/fonts/IBMPlexMono-400-cyrillic-ext.woff2 differ diff --git a/public/fonts/IBMPlexMono-400-cyrillic.woff2 b/public/fonts/IBMPlexMono-400-cyrillic.woff2 new file mode 100644 index 000000000..900627d7a Binary files /dev/null and b/public/fonts/IBMPlexMono-400-cyrillic.woff2 differ diff --git a/public/fonts/IBMPlexMono-400-latin-ext.woff2 b/public/fonts/IBMPlexMono-400-latin-ext.woff2 new file mode 100644 index 000000000..e4f67deb6 Binary files /dev/null and b/public/fonts/IBMPlexMono-400-latin-ext.woff2 differ diff --git a/public/fonts/IBMPlexMono-400-latin.woff2 b/public/fonts/IBMPlexMono-400-latin.woff2 new file mode 100644 index 000000000..52b6c7595 Binary files /dev/null and b/public/fonts/IBMPlexMono-400-latin.woff2 differ diff --git a/public/fonts/IBMPlexMono-400-vietnamese.woff2 b/public/fonts/IBMPlexMono-400-vietnamese.woff2 new file mode 100644 index 000000000..286664385 Binary files /dev/null and b/public/fonts/IBMPlexMono-400-vietnamese.woff2 differ diff --git a/public/fonts/IBMPlexMono-500-cyrillic-ext.woff2 b/public/fonts/IBMPlexMono-500-cyrillic-ext.woff2 new file mode 100644 index 000000000..61ad17d57 Binary files /dev/null and b/public/fonts/IBMPlexMono-500-cyrillic-ext.woff2 differ diff --git a/public/fonts/IBMPlexMono-500-cyrillic.woff2 b/public/fonts/IBMPlexMono-500-cyrillic.woff2 new file mode 100644 index 000000000..a070a8216 Binary files /dev/null and b/public/fonts/IBMPlexMono-500-cyrillic.woff2 differ diff --git a/public/fonts/IBMPlexMono-500-latin-ext.woff2 b/public/fonts/IBMPlexMono-500-latin-ext.woff2 new file mode 100644 index 000000000..743dae391 Binary files /dev/null and b/public/fonts/IBMPlexMono-500-latin-ext.woff2 differ diff --git a/public/fonts/IBMPlexMono-500-latin.woff2 b/public/fonts/IBMPlexMono-500-latin.woff2 new file mode 100644 index 000000000..3308bce24 Binary files /dev/null and b/public/fonts/IBMPlexMono-500-latin.woff2 differ diff --git a/public/fonts/IBMPlexMono-500-vietnamese.woff2 b/public/fonts/IBMPlexMono-500-vietnamese.woff2 new file mode 100644 index 000000000..2a5e599e6 Binary files /dev/null and b/public/fonts/IBMPlexMono-500-vietnamese.woff2 differ diff --git a/public/fonts/IBMPlexMono-600-cyrillic-ext.woff2 b/public/fonts/IBMPlexMono-600-cyrillic-ext.woff2 new file mode 100644 index 000000000..55eeec737 Binary files /dev/null and b/public/fonts/IBMPlexMono-600-cyrillic-ext.woff2 differ diff --git a/public/fonts/IBMPlexMono-600-cyrillic.woff2 b/public/fonts/IBMPlexMono-600-cyrillic.woff2 new file mode 100644 index 000000000..cb93e4ac6 Binary files /dev/null and b/public/fonts/IBMPlexMono-600-cyrillic.woff2 differ diff --git a/public/fonts/IBMPlexMono-600-latin-ext.woff2 b/public/fonts/IBMPlexMono-600-latin-ext.woff2 new file mode 100644 index 000000000..e8f92911a Binary files /dev/null and b/public/fonts/IBMPlexMono-600-latin-ext.woff2 differ diff --git a/public/fonts/IBMPlexMono-600-latin.woff2 b/public/fonts/IBMPlexMono-600-latin.woff2 new file mode 100644 index 000000000..c6759ef37 Binary files /dev/null and b/public/fonts/IBMPlexMono-600-latin.woff2 differ diff --git a/public/fonts/IBMPlexMono-600-vietnamese.woff2 b/public/fonts/IBMPlexMono-600-vietnamese.woff2 new file mode 100644 index 000000000..d3094c4ba Binary files /dev/null and b/public/fonts/IBMPlexMono-600-vietnamese.woff2 differ diff --git a/public/fonts/IBMPlexMono-700-cyrillic-ext.woff2 b/public/fonts/IBMPlexMono-700-cyrillic-ext.woff2 new file mode 100644 index 000000000..c1c337a3a Binary files /dev/null and b/public/fonts/IBMPlexMono-700-cyrillic-ext.woff2 differ diff --git a/public/fonts/IBMPlexMono-700-cyrillic.woff2 b/public/fonts/IBMPlexMono-700-cyrillic.woff2 new file mode 100644 index 000000000..e3e34e3d1 Binary files /dev/null and b/public/fonts/IBMPlexMono-700-cyrillic.woff2 differ diff --git a/public/fonts/IBMPlexMono-700-latin-ext.woff2 b/public/fonts/IBMPlexMono-700-latin-ext.woff2 new file mode 100644 index 000000000..80407a764 Binary files /dev/null and b/public/fonts/IBMPlexMono-700-latin-ext.woff2 differ diff --git a/public/fonts/IBMPlexMono-700-latin.woff2 b/public/fonts/IBMPlexMono-700-latin.woff2 new file mode 100644 index 000000000..7e9466854 Binary files /dev/null and b/public/fonts/IBMPlexMono-700-latin.woff2 differ diff --git a/public/fonts/IBMPlexMono-700-vietnamese.woff2 b/public/fonts/IBMPlexMono-700-vietnamese.woff2 new file mode 100644 index 000000000..db91862cc Binary files /dev/null and b/public/fonts/IBMPlexMono-700-vietnamese.woff2 differ diff --git a/public/fonts/Inter-Regular-latin.woff2 b/public/fonts/Inter-Regular-latin.woff2 new file mode 100644 index 000000000..fd6553cec Binary files /dev/null and b/public/fonts/Inter-Regular-latin.woff2 differ diff --git a/public/fonts/JetBrainsMono-var-cyrillic-ext.woff2 b/public/fonts/JetBrainsMono-var-cyrillic-ext.woff2 new file mode 100644 index 000000000..024a1af5e Binary files /dev/null and b/public/fonts/JetBrainsMono-var-cyrillic-ext.woff2 differ diff --git a/public/fonts/JetBrainsMono-var-cyrillic.woff2 b/public/fonts/JetBrainsMono-var-cyrillic.woff2 new file mode 100644 index 000000000..1b61cf966 Binary files /dev/null and b/public/fonts/JetBrainsMono-var-cyrillic.woff2 differ diff --git a/public/fonts/JetBrainsMono-var-greek.woff2 b/public/fonts/JetBrainsMono-var-greek.woff2 new file mode 100644 index 000000000..06f093604 Binary files /dev/null and b/public/fonts/JetBrainsMono-var-greek.woff2 differ diff --git a/public/fonts/JetBrainsMono-var-latin-ext.woff2 b/public/fonts/JetBrainsMono-var-latin-ext.woff2 new file mode 100644 index 000000000..310faddfd Binary files /dev/null and b/public/fonts/JetBrainsMono-var-latin-ext.woff2 differ diff --git a/public/fonts/JetBrainsMono-var-latin.woff2 b/public/fonts/JetBrainsMono-var-latin.woff2 new file mode 100644 index 000000000..2ca6ac605 Binary files /dev/null and b/public/fonts/JetBrainsMono-var-latin.woff2 differ diff --git a/public/fonts/JetBrainsMono-var-vietnamese.woff2 b/public/fonts/JetBrainsMono-var-vietnamese.woff2 new file mode 100644 index 000000000..d37ea3598 Binary files /dev/null and b/public/fonts/JetBrainsMono-var-vietnamese.woff2 differ diff --git a/public/fonts/Manrope-var-cyrillic-ext.woff2 b/public/fonts/Manrope-var-cyrillic-ext.woff2 new file mode 100644 index 000000000..fc8200476 Binary files /dev/null and b/public/fonts/Manrope-var-cyrillic-ext.woff2 differ diff --git a/public/fonts/Manrope-var-cyrillic.woff2 b/public/fonts/Manrope-var-cyrillic.woff2 new file mode 100644 index 000000000..1cece61de Binary files /dev/null and b/public/fonts/Manrope-var-cyrillic.woff2 differ diff --git a/public/fonts/Manrope-var-greek.woff2 b/public/fonts/Manrope-var-greek.woff2 new file mode 100644 index 000000000..29a1a726a Binary files /dev/null and b/public/fonts/Manrope-var-greek.woff2 differ diff --git a/public/fonts/Manrope-var-latin-ext.woff2 b/public/fonts/Manrope-var-latin-ext.woff2 new file mode 100644 index 000000000..bdade6d84 Binary files /dev/null and b/public/fonts/Manrope-var-latin-ext.woff2 differ diff --git a/public/fonts/Manrope-var-latin.woff2 b/public/fonts/Manrope-var-latin.woff2 new file mode 100644 index 000000000..9d7abb17d Binary files /dev/null and b/public/fonts/Manrope-var-latin.woff2 differ diff --git a/public/fonts/Manrope-var-vietnamese.woff2 b/public/fonts/Manrope-var-vietnamese.woff2 new file mode 100644 index 000000000..3eca77aee Binary files /dev/null and b/public/fonts/Manrope-var-vietnamese.woff2 differ diff --git a/public/fonts/OFL-DM-Sans.txt b/public/fonts/OFL-DM-Sans.txt new file mode 100644 index 000000000..441171d68 --- /dev/null +++ b/public/fonts/OFL-DM-Sans.txt @@ -0,0 +1,93 @@ +Copyright 2014 The DM Sans Project Authors (https://github.com/googlefonts/dm-fonts) + +This Font Software is licensed under the SIL Open Font License, Version 1.1. +This license is copied below, and is also available with a FAQ at: +https://scripts.sil.org/OFL + + +----------------------------------------------------------- +SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 +----------------------------------------------------------- + +PREAMBLE +The goals of the Open Font License (OFL) are to stimulate worldwide +development of collaborative font projects, to support the font creation +efforts of academic and linguistic communities, and to provide a free and +open framework in which fonts may be shared and improved in partnership +with others. + +The OFL allows the licensed fonts to be used, studied, modified and +redistributed freely as long as they are not sold by themselves. The +fonts, including any derivative works, can be bundled, embedded, +redistributed and/or sold with any software provided that any reserved +names are not used by derivative works. The fonts and derivatives, +however, cannot be released under any other type of license. The +requirement for fonts to remain under this license does not apply +to any document created using the fonts or their derivatives. + +DEFINITIONS +"Font Software" refers to the set of files released by the Copyright +Holder(s) under this license and clearly marked as such. This may +include source files, build scripts and documentation. + +"Reserved Font Name" refers to any names specified as such after the +copyright statement(s). + +"Original Version" refers to the collection of Font Software components as +distributed by the Copyright Holder(s). + +"Modified Version" refers to any derivative made by adding to, deleting, +or substituting -- in part or in whole -- any of the components of the +Original Version, by changing formats or by porting the Font Software to a +new environment. + +"Author" refers to any designer, engineer, programmer, technical +writer or other person who contributed to the Font Software. + +PERMISSION & CONDITIONS +Permission is hereby granted, free of charge, to any person obtaining +a copy of the Font Software, to use, study, copy, merge, embed, modify, +redistribute, and sell modified and unmodified copies of the Font +Software, subject to the following conditions: + +1) Neither the Font Software nor any of its individual components, +in Original or Modified Versions, may be sold by itself. + +2) Original or Modified Versions of the Font Software may be bundled, +redistributed and/or sold with any software, provided that each copy +contains the above copyright notice and this license. These can be +included either as stand-alone text files, human-readable headers or +in the appropriate machine-readable metadata fields within text or +binary files as long as those fields can be easily viewed by the user. + +3) No Modified Version of the Font Software may use the Reserved Font +Name(s) unless explicit written permission is granted by the corresponding +Copyright Holder. This restriction only applies to the primary font name as +presented to the users. + +4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font +Software shall not be used to promote, endorse or advertise any +Modified Version, except to acknowledge the contribution(s) of the +Copyright Holder(s) and the Author(s) or with their explicit written +permission. + +5) The Font Software, modified or unmodified, in part or in whole, +must be distributed entirely under this license, and must not be +distributed under any other license. The requirement for fonts to +remain under this license does not apply to any document created +using the Font Software. + +TERMINATION +This license becomes null and void if any of the above conditions are +not met. + +DISCLAIMER +THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT +OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE +COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL +DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM +OTHER DEALINGS IN THE FONT SOFTWARE. diff --git a/public/fonts/OFL-IBM-Plex-Mono.txt b/public/fonts/OFL-IBM-Plex-Mono.txt new file mode 100644 index 000000000..01497cc60 --- /dev/null +++ b/public/fonts/OFL-IBM-Plex-Mono.txt @@ -0,0 +1,93 @@ +Copyright © 2017 IBM Corp. with Reserved Font Name "Plex" + +This Font Software is licensed under the SIL Open Font License, Version 1.1. + +This license is copied below, and is also available with a FAQ at: http://scripts.sil.org/OFL + + +----------------------------------------------------------- +SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 +----------------------------------------------------------- + +PREAMBLE +The goals of the Open Font License (OFL) are to stimulate worldwide +development of collaborative font projects, to support the font creation +efforts of academic and linguistic communities, and to provide a free and +open framework in which fonts may be shared and improved in partnership +with others. + +The OFL allows the licensed fonts to be used, studied, modified and +redistributed freely as long as they are not sold by themselves. The +fonts, including any derivative works, can be bundled, embedded, +redistributed and/or sold with any software provided that any reserved +names are not used by derivative works. The fonts and derivatives, +however, cannot be released under any other type of license. The +requirement for fonts to remain under this license does not apply +to any document created using the fonts or their derivatives. + +DEFINITIONS +"Font Software" refers to the set of files released by the Copyright +Holder(s) under this license and clearly marked as such. This may +include source files, build scripts and documentation. + +"Reserved Font Name" refers to any names specified as such after the +copyright statement(s). + +"Original Version" refers to the collection of Font Software components as +distributed by the Copyright Holder(s). + +"Modified Version" refers to any derivative made by adding to, deleting, +or substituting -- in part or in whole -- any of the components of the +Original Version, by changing formats or by porting the Font Software to a +new environment. + +"Author" refers to any designer, engineer, programmer, technical +writer or other person who contributed to the Font Software. + +PERMISSION & CONDITIONS +Permission is hereby granted, free of charge, to any person obtaining +a copy of the Font Software, to use, study, copy, merge, embed, modify, +redistribute, and sell modified and unmodified copies of the Font +Software, subject to the following conditions: + +1) Neither the Font Software nor any of its individual components, +in Original or Modified Versions, may be sold by itself. + +2) Original or Modified Versions of the Font Software may be bundled, +redistributed and/or sold with any software, provided that each copy +contains the above copyright notice and this license. These can be +included either as stand-alone text files, human-readable headers or +in the appropriate machine-readable metadata fields within text or +binary files as long as those fields can be easily viewed by the user. + +3) No Modified Version of the Font Software may use the Reserved Font +Name(s) unless explicit written permission is granted by the corresponding +Copyright Holder. This restriction only applies to the primary font name as +presented to the users. + +4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font +Software shall not be used to promote, endorse or advertise any +Modified Version, except to acknowledge the contribution(s) of the +Copyright Holder(s) and the Author(s) or with their explicit written +permission. + +5) The Font Software, modified or unmodified, in part or in whole, +must be distributed entirely under this license, and must not be +distributed under any other license. The requirement for fonts to +remain under this license does not apply to any document created +using the Font Software. + +TERMINATION +This license becomes null and void if any of the above conditions are +not met. + +DISCLAIMER +THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT +OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE +COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL +DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM +OTHER DEALINGS IN THE FONT SOFTWARE. diff --git a/public/fonts/OFL-JetBrains-Mono.txt b/public/fonts/OFL-JetBrains-Mono.txt new file mode 100644 index 000000000..821a3dac2 --- /dev/null +++ b/public/fonts/OFL-JetBrains-Mono.txt @@ -0,0 +1,93 @@ +Copyright 2020 The JetBrains Mono Project Authors (https://github.com/JetBrains/JetBrainsMono) + +This Font Software is licensed under the SIL Open Font License, Version 1.1. + +This license is copied below, and is also available with a FAQ at: https://scripts.sil.org/OFL + + +----------------------------------------------------------- +SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 +----------------------------------------------------------- + +PREAMBLE +The goals of the Open Font License (OFL) are to stimulate worldwide +development of collaborative font projects, to support the font creation +efforts of academic and linguistic communities, and to provide a free and +open framework in which fonts may be shared and improved in partnership +with others. + +The OFL allows the licensed fonts to be used, studied, modified and +redistributed freely as long as they are not sold by themselves. The +fonts, including any derivative works, can be bundled, embedded, +redistributed and/or sold with any software provided that any reserved +names are not used by derivative works. The fonts and derivatives, +however, cannot be released under any other type of license. The +requirement for fonts to remain under this license does not apply +to any document created using the fonts or their derivatives. + +DEFINITIONS +"Font Software" refers to the set of files released by the Copyright +Holder(s) under this license and clearly marked as such. This may +include source files, build scripts and documentation. + +"Reserved Font Name" refers to any names specified as such after the +copyright statement(s). + +"Original Version" refers to the collection of Font Software components as +distributed by the Copyright Holder(s). + +"Modified Version" refers to any derivative made by adding to, deleting, +or substituting -- in part or in whole -- any of the components of the +Original Version, by changing formats or by porting the Font Software to a +new environment. + +"Author" refers to any designer, engineer, programmer, technical +writer or other person who contributed to the Font Software. + +PERMISSION & CONDITIONS +Permission is hereby granted, free of charge, to any person obtaining +a copy of the Font Software, to use, study, copy, merge, embed, modify, +redistribute, and sell modified and unmodified copies of the Font +Software, subject to the following conditions: + +1) Neither the Font Software nor any of its individual components, +in Original or Modified Versions, may be sold by itself. + +2) Original or Modified Versions of the Font Software may be bundled, +redistributed and/or sold with any software, provided that each copy +contains the above copyright notice and this license. These can be +included either as stand-alone text files, human-readable headers or +in the appropriate machine-readable metadata fields within text or +binary files as long as those fields can be easily viewed by the user. + +3) No Modified Version of the Font Software may use the Reserved Font +Name(s) unless explicit written permission is granted by the corresponding +Copyright Holder. This restriction only applies to the primary font name as +presented to the users. + +4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font +Software shall not be used to promote, endorse or advertise any +Modified Version, except to acknowledge the contribution(s) of the +Copyright Holder(s) and the Author(s) or with their explicit written +permission. + +5) The Font Software, modified or unmodified, in part or in whole, +must be distributed entirely under this license, and must not be +distributed under any other license. The requirement for fonts to +remain under this license does not apply to any document created +using the Font Software. + +TERMINATION +This license becomes null and void if any of the above conditions are +not met. + +DISCLAIMER +THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT +OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE +COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL +DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM +OTHER DEALINGS IN THE FONT SOFTWARE. diff --git a/public/fonts/OFL-Manrope.txt b/public/fonts/OFL-Manrope.txt new file mode 100644 index 000000000..e271172a9 --- /dev/null +++ b/public/fonts/OFL-Manrope.txt @@ -0,0 +1,93 @@ +Copyright 2018 The Manrope Project Authors (https://github.com/googlefonts/manrope) + +This Font Software is licensed under the SIL Open Font License, Version 1.1. +This license is copied below, and is also available with a FAQ at: +http://scripts.sil.org/OFL + + +----------------------------------------------------------- +SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 +----------------------------------------------------------- + +PREAMBLE +The goals of the Open Font License (OFL) are to stimulate worldwide +development of collaborative font projects, to support the font creation +efforts of academic and linguistic communities, and to provide a free and +open framework in which fonts may be shared and improved in partnership +with others. + +The OFL allows the licensed fonts to be used, studied, modified and +redistributed freely as long as they are not sold by themselves. The +fonts, including any derivative works, can be bundled, embedded, +redistributed and/or sold with any software provided that any reserved +names are not used by derivative works. The fonts and derivatives, +however, cannot be released under any other type of license. The +requirement for fonts to remain under this license does not apply +to any document created using the fonts or their derivatives. + +DEFINITIONS +"Font Software" refers to the set of files released by the Copyright +Holder(s) under this license and clearly marked as such. This may +include source files, build scripts and documentation. + +"Reserved Font Name" refers to any names specified as such after the +copyright statement(s). + +"Original Version" refers to the collection of Font Software components as +distributed by the Copyright Holder(s). + +"Modified Version" refers to any derivative made by adding to, deleting, +or substituting -- in part or in whole -- any of the components of the +Original Version, by changing formats or by porting the Font Software to a +new environment. + +"Author" refers to any designer, engineer, programmer, technical +writer or other person who contributed to the Font Software. + +PERMISSION & CONDITIONS +Permission is hereby granted, free of charge, to any person obtaining +a copy of the Font Software, to use, study, copy, merge, embed, modify, +redistribute, and sell modified and unmodified copies of the Font +Software, subject to the following conditions: + +1) Neither the Font Software nor any of its individual components, +in Original or Modified Versions, may be sold by itself. + +2) Original or Modified Versions of the Font Software may be bundled, +redistributed and/or sold with any software, provided that each copy +contains the above copyright notice and this license. These can be +included either as stand-alone text files, human-readable headers or +in the appropriate machine-readable metadata fields within text or +binary files as long as those fields can be easily viewed by the user. + +3) No Modified Version of the Font Software may use the Reserved Font +Name(s) unless explicit written permission is granted by the corresponding +Copyright Holder. This restriction only applies to the primary font name as +presented to the users. + +4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font +Software shall not be used to promote, endorse or advertise any +Modified Version, except to acknowledge the contribution(s) of the +Copyright Holder(s) and the Author(s) or with their explicit written +permission. + +5) The Font Software, modified or unmodified, in part or in whole, +must be distributed entirely under this license, and must not be +distributed under any other license. The requirement for fonts to +remain under this license does not apply to any document created +using the Font Software. + +TERMINATION +This license becomes null and void if any of the above conditions are +not met. + +DISCLAIMER +THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT +OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE +COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL +DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM +OTHER DEALINGS IN THE FONT SOFTWARE. diff --git a/src/chat/styles.css b/src/chat/styles.css index b7c21e987..8f27581f9 100644 --- a/src/chat/styles.css +++ b/src/chat/styles.css @@ -1,4 +1,92 @@ -@import url('https://fonts.googleapis.com/css2?family=DM+Sans:wght@400;450;500;550;600;650;700&family=Manrope:wght@400;500;600;650;700;750&display=swap'); +/* Self-hosted from Google Fonts (OFL licences in public/fonts). */ +@font-face { + font-display: swap; + font-family: 'DM Sans'; + font-style: normal; + font-weight: 400 800; + src: url('/fonts/DMSans-var-latin-ext.woff2') format('woff2'); + unicode-range: + U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, + U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, + U+20AD-20C4, U+2113, U+2C60-2C7F, U+A720-A7FF; +} + +@font-face { + font-display: swap; + font-family: 'DM Sans'; + font-style: normal; + font-weight: 400 800; + src: url('/fonts/DMSans-var-latin.woff2') format('woff2'); + unicode-range: + U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, + U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, + U+2215, U+FEFF, U+FFFD; +} + +@font-face { + font-display: swap; + font-family: 'Manrope'; + font-style: normal; + font-weight: 400 800; + src: url('/fonts/Manrope-var-cyrillic-ext.woff2') format('woff2'); + unicode-range: + U+0460-052F, U+1C80-1C8A, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F; +} + +@font-face { + font-display: swap; + font-family: 'Manrope'; + font-style: normal; + font-weight: 400 800; + src: url('/fonts/Manrope-var-cyrillic.woff2') format('woff2'); + unicode-range: U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116; +} + +@font-face { + font-display: swap; + font-family: 'Manrope'; + font-style: normal; + font-weight: 400 800; + src: url('/fonts/Manrope-var-greek.woff2') format('woff2'); + unicode-range: + U+0370-0377, U+037A-037F, U+0384-038A, U+038C, U+038E-03A1, U+03A3-03FF; +} + +@font-face { + font-display: swap; + font-family: 'Manrope'; + font-style: normal; + font-weight: 400 800; + src: url('/fonts/Manrope-var-vietnamese.woff2') format('woff2'); + unicode-range: + U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, + U+01AF-01B0, U+0300-0301, U+0303-0304, U+0308-0309, U+0323, U+0329, + U+1EA0-1EF9, U+20AB; +} + +@font-face { + font-display: swap; + font-family: 'Manrope'; + font-style: normal; + font-weight: 400 800; + src: url('/fonts/Manrope-var-latin-ext.woff2') format('woff2'); + unicode-range: + U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, + U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, + U+20AD-20C4, U+2113, U+2C60-2C7F, U+A720-A7FF; +} + +@font-face { + font-display: swap; + font-family: 'Manrope'; + font-style: normal; + font-weight: 400 800; + src: url('/fonts/Manrope-var-latin.woff2') format('woff2'); + unicode-range: + U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, + U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, + U+2215, U+FEFF, U+FFFD; +} @scope (:root:has(.tanchat-shell)) { :scope { --motion-fast: 120ms; diff --git a/src/components/AppDevtools.tsx b/src/components/AppDevtools.tsx index 7fa587ed6..0276dcdfe 100644 --- a/src/components/AppDevtools.tsx +++ b/src/components/AppDevtools.tsx @@ -2,6 +2,7 @@ import { useRouter } from '@tanstack/react-router' import { TanStackDevtools } from '@tanstack/react-devtools' import { ReactQueryDevtoolsPanel } from '@tanstack/react-query-devtools' import { TanStackRouterDevtoolsPanel } from '@tanstack/react-router-devtools' +import { C15tTanStackDevtoolsPanel } from '@c15t/react/devtools' export function AppDevtools() { const router = useRouter() @@ -20,6 +21,15 @@ export function AppDevtools() { name: 'TanStack Router', render: , }, + // c15t's consent panel, reading the kernel from . Written + // out rather than c15tDevtools(): its fixed `id: 'c15t'` leaves the + // panel empty in @tanstack/react-devtools 0.10. + { + name: 'c15t', + render: (_element, { theme }) => ( + + ), + }, ]} /> ) diff --git a/src/components/Footer.tsx b/src/components/Footer.tsx index f50aca7d9..467fbf257 100644 --- a/src/components/Footer.tsx +++ b/src/components/Footer.tsx @@ -1,5 +1,6 @@ import type * as React from 'react' import { Link } from '@tanstack/react-router' +import { ConsentDialogLink } from '@c15t/tanstack-start/components/consent-dialog-link' import { LinkedinLogoIcon } from '@phosphor-icons/react/LinkedinLogo' import { BSkyIcon } from '~/components/icons/BSkyIcon' import { BrandXIcon } from '~/components/icons/BrandXIcon' @@ -103,22 +104,23 @@ const LEGAL_LINKS: Array = [ { label: 'Terms', to: '/terms' }, ] +const footerLinkClassName = + 'text-ds-body-sm text-text-secondary hover:text-text-primary focus-visible:rounded-sm focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-border-focus' + function FooterNavLink({ link }: { link: FooterLink }) { const external = link.to.startsWith('http') || link.to.startsWith('mailto:') - const className = - 'text-ds-body-sm text-text-secondary hover:text-text-primary focus-visible:rounded-sm focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-border-focus' return external ? ( {link.label} ) : ( - + {link.label} ) @@ -178,6 +180,13 @@ export function Footer() { ))} + + + Privacy settings + + diff --git a/src/components/Scarf.tsx b/src/components/Scarf.tsx index ba6524111..edc95576e 100644 --- a/src/components/Scarf.tsx +++ b/src/components/Scarf.tsx @@ -1,7 +1,9 @@ +import { useConsent } from '@c15t/tanstack-start' import { useRouterState } from '@tanstack/react-router' import { useEffect, useRef, useState } from 'react' export function Scarf({ id, path }: { id: string; path: string }) { + const scarfAllowed = useConsent('measurement') const visit = useRouterState({ select: (state) => { const location = state.resolvedLocation @@ -26,6 +28,7 @@ export function Scarf({ id, path }: { id: string; path: string }) { useEffect(() => { if ( import.meta.env.MODE === 'staging' || + !scarfAllowed || !visit || lastVisit.current === visit ) @@ -35,7 +38,7 @@ export function Scarf({ id, path }: { id: string; path: string }) { visit, src: `https://static.scarf.sh/a.png?x-pxid=${encodeURIComponent(id)}&key=${crypto?.randomUUID?.() ?? Math.random().toString(36).slice(2)}`, }) - }, [id, visit]) + }, [scarfAllowed, id, visit]) return pixel && pixel.visit === visit ? ( { + const id = url.pathname.match(/^\/embed\/([\w-]+)/)?.[1] + return id ? `https://www.youtube.com/watch?v=${id}` : null + }, + }, + { + name: 'Vimeo', + Icon: PlayCircleIcon, + hosts: ['player.vimeo.com'], + watchUrl: (url: URL) => { + const id = url.pathname.match(/^\/video\/(\d+)/)?.[1] + return id ? `https://vimeo.com/${id}` : null + }, + }, +] + +export function getVideoEmbed(src: string | undefined) { + if (!src) return null + + try { + const url = new URL(src) + const host = videoHosts.find((video) => + video.hosts.some( + (name) => url.hostname === name || url.hostname.endsWith(`.${name}`), + ), + ) + return host + ? { provider: host.name, Icon: host.Icon, watchUrl: host.watchUrl(url) } + : null + } catch { + return null + } +} + +const iframeBlockPattern = /^\s*\s*<\/iframe>\s*$/i +const iframeAttributePattern = + /([a-zA-Z][a-zA-Z0-9:-]*)(?:\s*=\s*(?:"([^"]*)"|'([^']*)'))?/g + +/** + * Markdown renders a raw HTML block as innerHTML, which would load a video + * iframe without consent. Turn blocks that are a single video iframe into + * `consent-video-embed` components, as mapChartsCatalogEmbeds does for charts. + */ +export function mapVideoEmbeds(document: MarkdownDocument): MarkdownDocument { + return { + ...document, + children: document.children.map((block) => + block.type === 'html' ? (videoEmbedBlock(block.value) ?? block) : block, + ), + } +} + +function videoEmbedBlock(html: string): BlockNode | undefined { + const attributeSource = html.match(iframeBlockPattern)?.[1] + if (!attributeSource) return undefined + + const attributes: Record = {} + for (const [, name, double, single] of attributeSource.matchAll( + iframeAttributePattern, + )) { + if (name) attributes[name.toLowerCase()] = double ?? single ?? '' + } + + const src = attributes.src?.replaceAll('&', '&') + if (!src || !isSafeHttpUrl(src) || !getVideoEmbed(src)) return undefined + + return { + type: 'component', + name: 'consent-video-embed', + tagName: 'consent-video-embed', + attributes: {}, + properties: { + src, + title: attributes.title ?? '', + allow: attributes.allow ?? '', + }, + children: [], + } +} + +/** + * A YouTube or Vimeo embed from markdown. The players can set advertising + * identifiers, so the iframe only mounts while marketing is allowed; until + * then the placeholder links to privacy settings and to the video itself. + */ +export function ConsentVideoEmbed({ + provider, + Icon, + watchUrl, + title, + iframeProps, +}: NonNullable> & { + title: string + iframeProps: React.IframeHTMLAttributes +}) { + return ( + + + + + {title} + + + {provider} can set marketing cookies, so this video plays here + once you allow marketing in your privacy settings. + + + + + Privacy settings + + {watchUrl ? ( + + Watch on {provider} + + + ) : null} + + + } + > + + + ) +} diff --git a/src/components/markdown/Markdown.tsx b/src/components/markdown/Markdown.tsx index b69109542..be30e4173 100644 --- a/src/components/markdown/Markdown.tsx +++ b/src/components/markdown/Markdown.tsx @@ -1,6 +1,11 @@ import { renderMarkdownReact } from '@tanstack/markdown/react' import * as React from 'react' import { InlineCode, MarkdownImg } from '~/ui' +import { + ConsentVideoEmbed, + getVideoEmbed, + mapVideoEmbeds, +} from './ConsentVideoEmbed' import { ChartsCatalogEmbed } from '~/components/charts/ChartsCatalogEmbed' import { mapChartsCatalogEmbeds, @@ -61,8 +66,8 @@ export function Markdown({ [content, document], ) const renderDocument = React.useMemo(() => { - const withHostingPartners = mapStartHostingPartnerElements( - mapMarkdownPartnerLists(parsed), + const withHostingPartners = mapVideoEmbeds( + mapStartHostingPartnerElements(mapMarkdownPartnerLists(parsed)), ) return chartEmbedSource @@ -164,6 +169,17 @@ function MarkdownIframe(props: React.IframeHTMLAttributes) { if (!isTrustedIframeSrc(props.src)) return null + const video = getVideoEmbed(props.src) + if (video) { + return ( + + ) + } + if (props.src && parseChartsCatalogEmbed(props.src)) { return ( ) { ) } +function MarkdownVideoEmbed({ + src, + title, + allow, +}: { + src?: string + title?: string + allow?: string +}) { + const video = getVideoEmbed(src) + if (!video) return null + + return ( + + ) +} + function CodeElement({ children, className, @@ -251,6 +288,7 @@ function createMarkdownComponents( return { a: LinkElement, 'chart-catalog-embed': ChartsCatalogEmbed, + 'consent-video-embed': MarkdownVideoEmbed, code: CodeElement, figcaption: CodeFigcaption, figure: CodeFigure, diff --git a/src/routes/__root.tsx b/src/routes/__root.tsx index fd1d31e1e..39454ebc8 100644 --- a/src/routes/__root.tsx +++ b/src/routes/__root.tsx @@ -16,6 +16,14 @@ import { defaultStringifySearch, } from '@tanstack/react-router' import { QueryClientProvider, type QueryClient } from '@tanstack/react-query' +import { + ConsentBanner, + ConsentDialog, + ConsentRoot, + type ConsentRootProps, + useConsent, +} from '@c15t/tanstack-start' +import { consentLoaderOptions } from '@c15t/tanstack-start/server' import { createThemeCss, type HighlightTheme } from '@tanstack/highlight/theme' import { auroraXTheme } from '@tanstack/highlight/themes/aurora-x' import { githubLightTheme } from '@tanstack/highlight/themes/github-light' @@ -61,20 +69,78 @@ import { trackScarfPageView, } from '~/utils/analytics/scarf' import { createPartnerPlacementSessionSeed } from '~/utils/partner-placement' +import { consentScripts } from '~/utils/consent' +import { getConsentState } from '~/utils/consent.functions' import { twMerge } from 'tailwind-merge' -import { TRAFFIC_QUALITY_BOOTSTRAP } from '~/utils/analytics/traffic-quality' import { DOCS_WIDTH_BOOTSTRAP } from '~/utils/docs-width' -const GOOGLE_ANALYTICS_ID = 'G-JMT1Z50SPS' -const GOOGLE_ANALYTICS_PROXY_PREFIX = '/_a' -const GOOGLE_ANALYTICS_SCRIPT_SRC = `${GOOGLE_ANALYTICS_PROXY_PREFIX}/gtag.js` const THEME_BOOTSTRAP = `(function(){try{var t=localStorage.getItem('theme')||'auto';var v=['light','dark','auto'].includes(t)?t:'auto';var r=v==='auto'?(matchMedia('(prefers-color-scheme: dark)').matches?'dark':'light'):v;if(document.documentElement){document.documentElement.classList.add(r);if(v==='auto')document.documentElement.classList.add('auto');document.documentElement.style.colorScheme=r}}catch(e){if(document.documentElement){var r=matchMedia('(prefers-color-scheme: dark)').matches?'dark':'light';document.documentElement.classList.add(r,'auto');document.documentElement.style.colorScheme=r}}})()` -// Page views are sent only by (initial load and SPA -// navigations), so the gtag config sets send_page_view: false. The guard makes -// the bootstrap idempotent: without it the head script can execute twice on a -// single load, sending a second config (and a second page_view) and injecting -// a second gtag.js loader. -const GOOGLE_ANALYTICS_BOOTSTRAP = `(function(){if(window.__tanstackGaBootstrapped)return;window.__tanstackGaBootstrapped=true;var id='${GOOGLE_ANALYTICS_ID}';var src='${GOOGLE_ANALYTICS_SCRIPT_SRC}';window.dataLayer=window.dataLayer||[];window.gtag=window.gtag||function(){window.dataLayer.push(arguments)};window.gtag('set',{traffic_quality:'unknown',traffic_quality_rule:'v1'});window.gtag('js',new Date());window.gtag('config',id,{send_page_view:false,transport_url:window.location.origin+'${GOOGLE_ANALYTICS_PROXY_PREFIX}'});${TRAFFIC_QUALITY_BOOTSTRAP}var loaded=false;var load=function(){if(loaded)return;var parent=document.head||document.documentElement;if(!parent){window.setTimeout(load,100);return}loaded=true;var script=document.createElement('script');script.async=true;script.src=src;script.setAttribute('data-ga-loader','true');parent.appendChild(script)};if(typeof window.requestIdleCallback==='function'){window.requestIdleCallback(load,{timeout:3000});return}if(document.readyState==='complete'){window.setTimeout(load,1500);return}window.addEventListener('load',function(){window.setTimeout(load,1500)},{once:true})})();` + +// The homepage renders the banner as a bar (variant="bar"); other pages get +// c15t's floating card. The bar classes key off the root's data-variant, so +// the card keeps c15t's layout. On the homepage the bar takes the hero frame's +// inset and corners. On large windows it replaces the stats strip under the +// hero and sticks below the navbar once scrolled there (see the consent block +// in app.css); elsewhere it keeps c15t's card surface, border and shadow so it +// has an edge wherever it lands. The copy and buttons sit side by side from +// lg, where c15t's bar stops stretching its button row to full width; +// switching earlier squeezes the copy into a narrow column. +const CONSENT_UI_OPTIONS = { + // Scripts declare measurement, but only in production builds. Marketing + // has no script; it covers the YouTube and Vimeo embeds. + consentCategories: ['measurement', 'marketing'], + components: { + banner: { + root: { className: 'group/banner' }, + cardShell: { + className: + 'sm:group-data-[variant=bar]/banner:mx-2 sm:group-data-[variant=bar]/banner:mb-2 sm:group-data-[variant=bar]/banner:w-auto', + }, + card: { + className: + 'group-data-[variant=bar]/banner:flex group-data-[variant=bar]/banner:flex-col group-data-[variant=bar]/banner:gap-3 group-data-[variant=bar]/banner:rounded-none group-data-[variant=bar]/banner:px-6 group-data-[variant=bar]/banner:pt-4 group-data-[variant=bar]/banner:pb-[max(1rem,env(safe-area-inset-bottom))] sm:group-data-[variant=bar]/banner:rounded-2xl sm:group-data-[variant=bar]/banner:px-10 sm:group-data-[variant=bar]/banner:py-4 lg:group-data-[variant=bar]/banner:flex-row lg:group-data-[variant=bar]/banner:items-center lg:group-data-[variant=bar]/banner:justify-between lg:group-data-[variant=bar]/banner:gap-8 xl:group-data-[variant=bar]/banner:px-16', + }, + header: { + className: + 'group-data-[variant=bar]/banner:flex-row group-data-[variant=bar]/banner:flex-wrap group-data-[variant=bar]/banner:items-baseline group-data-[variant=bar]/banner:gap-x-3 group-data-[variant=bar]/banner:gap-y-1 group-data-[variant=bar]/banner:p-0', + }, + title: { + className: + 'font-ds-display font-semibold group-data-[variant=bar]/banner:text-ds-heading-6', + }, + footer: { + className: + 'group-data-[variant=bar]/banner:shrink-0 group-data-[variant=bar]/banner:border-0 group-data-[variant=bar]/banner:bg-transparent group-data-[variant=bar]/banner:p-0', + }, + }, + description: { + banner: { className: 'group-data-[variant=bar]/banner:text-ds-body-sm' }, + dialog: { className: 'text-ds-body-sm' }, + }, + dialog: { + title: { className: 'font-ds-display font-semibold text-ds-heading-4' }, + }, + // Drop the margin c15t adds on top of the footer's own padding, which + // left a gap under the categories that looked like a missing row. + manager: { + actions: { className: 'mt-0' }, + }, + // The site's Button (src/components/ds/ui): primary is the inverse pill, + // secondary the ghost one. Secondary covers Customize in the banner and + // Reject/Accept in the dialog, where Save is the main action. + button: { + primary: { + className: + 'rounded-full corner-squircle border border-background-inverse bg-background-inverse px-4 py-2 text-sm font-medium text-text-inverse shadow-[0_1px_2px_0_rgba(0,0,0,0.12),inset_0_1px_0_0_rgba(255,255,255,0.18)] transition-[transform,box-shadow,background-color] duration-150 ease-out hover:-translate-y-px hover:bg-background-inverse/90 hover:shadow-[0_6px_16px_-4px_rgba(0,0,0,0.28),inset_0_1px_0_0_rgba(255,255,255,0.25)] active:translate-y-0 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-border-focus focus-visible:ring-offset-1 focus-visible:ring-offset-background-default', + }, + secondary: { + className: + 'rounded-full corner-squircle border border-border-default bg-transparent px-4 py-2 text-sm font-medium text-text-primary shadow-none transition-[box-shadow,background-color,border-color] duration-150 ease-out hover:border-border-strong hover:bg-background-subtle hover:shadow-sm focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-border-focus focus-visible:ring-offset-1 focus-visible:ring-offset-background-default', + }, + }, + }, +} satisfies ConsentRootProps['options'] + const DOCUMENT_CACHE_HEADERS = { 'Cache-Control': 'public, max-age=0, must-revalidate', 'Cloudflare-CDN-Cache-Control': 'no-store', @@ -202,10 +268,12 @@ async function loadLiveRuntimeConfig() { export const Route = createRootRouteWithContext<{ queryClient: QueryClient }>()({ + ...consentLoaderOptions, loader: async () => { return { live: await loadLiveRuntimeConfig(), partnerPlacementSessionSeed: createPartnerPlacementSessionSeed(), + consent: await getConsentState(), } }, head: ({ matches }) => { @@ -249,18 +317,10 @@ export const Route = createRootRouteWithContext<{ type: 'font/woff2', crossOrigin: 'anonymous', }, - // Rebrand type system: Bricolage Grotesque (display/headings) + IBM Plex - // Mono (code). Loaded globally so the new styles apply across the site. - { rel: 'preconnect', href: 'https://fonts.googleapis.com' }, - { - rel: 'preconnect', - href: 'https://fonts.gstatic.com', - crossOrigin: 'anonymous', - }, - { - rel: 'stylesheet', - href: 'https://fonts.googleapis.com/css2?family=Bricolage+Grotesque:opsz,wght@12..96,300;12..96,400;12..96,500;12..96,600;12..96,700;12..96,800&family=IBM+Plex+Mono:wght@300;400;500;600;700&display=swap', - }, + // Bricolage Grotesque (display) and IBM Plex Mono (code) are + // self-hosted in src/styles/app.css without a preload. Measured on + // throttled mobile, preloading Bricolage delayed first paint by about + // 250 ms and still arrived after it. { rel: 'apple-touch-icon', sizes: '180x180', @@ -301,10 +361,6 @@ export const Route = createRootRouteWithContext<{ }, { rel: 'icon', type: 'image/x-icon', href: '/favicon.ico' }, ], - scripts: - import.meta.env.PROD && import.meta.env.MODE !== 'staging' - ? [{ children: GOOGLE_ANALYTICS_BOOTSTRAP }] - : [], } }, headers: () => DOCUMENT_CACHE_HEADERS, @@ -317,6 +373,7 @@ export const Route = createRootRouteWithContext<{ function ShellComponent({ children }: { children: React.ReactNode }) { const router = useRouter() const { queryClient } = Route.useRouteContext() + const { consent } = Route.useLoaderData() const hasBaseParent = useMatches({ select: (matches) => matches.find((d) => d.staticData?.baseParent), }) @@ -392,14 +449,6 @@ function ShellComponent({ children }: { children: React.ReactNode }) { /> - {import.meta.env.PROD ? ( - - ) : null}
+ {title} +
+ {provider} can set marketing cookies, so this video plays here + once you allow marketing in your privacy settings. +