From f4bc158c76852d2065499e827d2621ec93eebbee Mon Sep 17 00:00:00 2001 From: Tanner Linsley Date: Thu, 30 Jul 2026 23:09:24 -0600 Subject: [PATCH] Add React Native host proof --- .../workflows/chart-library-benchmarks.yml | 1 + API-FRICTION.md | 113 + NATIVE-PLATFORM-SUPPORT-SPIKE.md | 874 ++ REACT-NATIVE-HOST-POC.md | 343 + .../entries/charts-react-native-line.ts | 11 + benchmarks/entries/charts-react-native.ts | 1 + examples/charts-react-native/App.tsx | 66 + examples/charts-react-native/app.json | 4 + examples/charts-react-native/babel.config.cjs | 3 + examples/charts-react-native/index.blank.js | 9 + examples/charts-react-native/index.core.js | 23 + examples/charts-react-native/index.js | 5 + examples/charts-react-native/index.svg.js | 23 + examples/charts-react-native/metro.config.cjs | 14 + examples/charts-react-native/package.json | 30 + examples/charts-react-native/tsconfig.json | 9 + .../charts-react-native/tsconfig.strict.json | 6 + package.json | 3 + packages/charts-core/src/reconcile.test.ts | 2 +- packages/react-native-charts/LICENSE | 21 + packages/react-native-charts/README.md | 6 + packages/react-native-charts/package.json | 19 + .../react-native-charts/src/Chart.test.tsx | 71 + packages/react-native-charts/src/Chart.tsx | 392 + .../react-native-charts/src/FocusOverlay.tsx | 64 + .../react-native-charts/src/SvgScene.test.tsx | 165 + packages/react-native-charts/src/SvgScene.tsx | 287 + .../react-native-charts/src/Tooltip.test.ts | 82 + packages/react-native-charts/src/Tooltip.tsx | 491 ++ packages/react-native-charts/src/index.ts | 5 + .../src/interaction.test.ts | 125 + .../react-native-charts/src/interaction.ts | 205 + .../react-native-charts/src/paint.test.ts | 43 + packages/react-native-charts/src/paint.ts | 48 + packages/react-native-charts/tsconfig.json | 9 + pnpm-lock.yaml | 7222 ++++++++++++++--- scripts/check-react-native-types.mjs | 60 + scripts/measure-bundles.mjs | 69 +- scripts/measure-react-native-poc.mjs | 160 + 39 files changed, 9880 insertions(+), 1204 deletions(-) create mode 100644 NATIVE-PLATFORM-SUPPORT-SPIKE.md create mode 100644 REACT-NATIVE-HOST-POC.md create mode 100644 benchmarks/entries/charts-react-native-line.ts create mode 100644 benchmarks/entries/charts-react-native.ts create mode 100644 examples/charts-react-native/App.tsx create mode 100644 examples/charts-react-native/app.json create mode 100644 examples/charts-react-native/babel.config.cjs create mode 100644 examples/charts-react-native/index.blank.js create mode 100644 examples/charts-react-native/index.core.js create mode 100644 examples/charts-react-native/index.js create mode 100644 examples/charts-react-native/index.svg.js create mode 100644 examples/charts-react-native/metro.config.cjs create mode 100644 examples/charts-react-native/package.json create mode 100644 examples/charts-react-native/tsconfig.json create mode 100644 examples/charts-react-native/tsconfig.strict.json create mode 100644 packages/react-native-charts/LICENSE create mode 100644 packages/react-native-charts/README.md create mode 100644 packages/react-native-charts/package.json create mode 100644 packages/react-native-charts/src/Chart.test.tsx create mode 100644 packages/react-native-charts/src/Chart.tsx create mode 100644 packages/react-native-charts/src/FocusOverlay.tsx create mode 100644 packages/react-native-charts/src/SvgScene.test.tsx create mode 100644 packages/react-native-charts/src/SvgScene.tsx create mode 100644 packages/react-native-charts/src/Tooltip.test.ts create mode 100644 packages/react-native-charts/src/Tooltip.tsx create mode 100644 packages/react-native-charts/src/index.ts create mode 100644 packages/react-native-charts/src/interaction.test.ts create mode 100644 packages/react-native-charts/src/interaction.ts create mode 100644 packages/react-native-charts/src/paint.test.ts create mode 100644 packages/react-native-charts/src/paint.ts create mode 100644 packages/react-native-charts/tsconfig.json create mode 100644 scripts/check-react-native-types.mjs create mode 100644 scripts/measure-react-native-poc.mjs diff --git a/.github/workflows/chart-library-benchmarks.yml b/.github/workflows/chart-library-benchmarks.yml index e1f5f80..e85928a 100644 --- a/.github/workflows/chart-library-benchmarks.yml +++ b/.github/workflows/chart-library-benchmarks.yml @@ -44,6 +44,7 @@ jobs: - run: pnpm format:check - run: pnpm docs:check - run: pnpm typecheck + - run: pnpm react-native:poc:types - run: pnpm test - run: pnpm package:check - run: pnpm bundle:check diff --git a/API-FRICTION.md b/API-FRICTION.md index 6d3eb04..97e6695 100644 --- a/API-FRICTION.md +++ b/API-FRICTION.md @@ -177,6 +177,12 @@ Each entry records: | F-139 | Top-level entries bypassed tarball validation | Tooling/Release | resolved | | F-140 | Behavior config could erase responsive datum inference | API | monitoring | | F-141 | Root barrels crossed the browser host boundary | API/Tooling | resolved | +| F-142 | D3 declarations require a browser image global | Tooling | monitoring | +| F-143 | Native interaction copied DOM-renderer policy | API | monitoring | +| F-144 | CSS theme defaults reach the native scene compiler | API | monitoring | +| F-145 | Text measurement omits native typography | API | monitoring | +| F-146 | Packed declarations assume one platform global set | Tooling | monitoring | +| F-147 | Metro skipped the fixture-owned Babel runtime | Tooling | resolved | ## Findings @@ -3420,3 +3426,110 @@ Each entry records: export, reconciliation, renderer, and SVG surface modules. That full portable barrel measures 55.26 kB minified and 17.04 kB gzip; granular subpaths remain the bundle-sensitive option. + +### F-142 — D3 declarations require a browser image global + +- Status: monitoring +- Severity: medium +- Owner: Tooling +- Observed in: strict DOM-free React Native consumer typecheck +- Friction: after Charts' DOM types were removed from the selected declaration + graph, `skipLibCheck: false` with native libraries still failed in + `@types/d3-array`. Its `blurImage` signature references the browser global + `ImageData`, even though the chart consumer does not import or call that API. +- Current decision: keep the strict configuration as a sentinel. Do not add a + fake `ImageData` declaration, enable DOM libraries, or weaken the package's + runtime boundary to conceal an upstream declaration issue. The normal + React Native configuration passes. +- Verification: the native type gate accepts only the two known + `@types/d3-array` diagnostics or a clean result after the upstream + declaration is fixed. It rejects every other diagnostic. + +### F-143 — Native interaction copied DOM-renderer policy + +- Status: monitoring +- Severity: high +- Owner: API +- Observed in: React Native focus, selection, and tooltip proof +- Friction: focus preset resolution, stable-point restoration, navigation + order, tooltip content construction, anchor resolution, and placement math + are pure behavior but live as private functions inside `renderer.ts`. The + native proof reproduced them to exercise realistic interaction. +- Current decision: keep the duplication confined to the private proof. A + supported native package requires extracting renderer-neutral interaction + and tooltip state, with the DOM and native hosts consuming the same + implementation. +- Verification: focused native tests cover strategy selection, grouping, + restoration, navigation, supported default content, and placement. The + default native tooltip still lacks the complete `items` formatting contract. + +### F-144 — CSS theme defaults reach the native scene compiler + +- Status: monitoring +- Severity: high +- Owner: API +- Observed in: React Native paint resolution +- Friction: the shared default theme contains `currentColor`, system CSS names, + and CSS custom properties. The native proof can resolve final paint strings + and their fallbacks, but a dynamic chart builder still receives the web + default theme before the host sees the scene. +- Current decision: the private host resolves final paints explicitly and + never evaluates application CSS. Before release, runtime construction needs + an additive platform-default-theme option used both by dynamic build context + and final theme merging. Structured paint references may be warranted if + more host semantics appear. +- Verification: native paint and full-scene tests contain no unresolved CSS + variable or `currentColor` output. Device themes and dynamic native-theme + builders remain unverified. + +### F-145 — Text measurement omits native typography + +- Status: monitoring +- Severity: high +- Owner: API +- Observed in: React Native SVG labels and automatic guide layout +- Friction: `ChartTextMeasureOptions` carries size and weight but not font + family, style, stretch, letter spacing, direction, locale, or font-scale + policy. The native painter accepts a `fontFamily`, while the shared layout + cannot ask a native measurer for the same font. +- Current decision: expose the existing injected measurer in the proof and do + not claim text parity. Production work must complete the typography contract + and decide how native asynchronous measurement feeds deterministic scene + layout without hidden mounted views. +- Verification: injected-measurer core tests pass. No iOS or Android font-scale + and clipping matrix has been run. + +### F-146 — Packed declarations assume one platform global set + +- Status: monitoring +- Severity: medium +- Owner: Tooling +- Observed in: evaluating a release gate for the private React Native package +- Friction: the existing packed fixture compiles web packages under DOM + libraries. Loading React Native declarations in that same TypeScript program + introduces incompatible duplicate globals. Removing DOM libraries makes the + web contracts invalid and also exposes F-142. +- Current decision: keep the private proof out of the publishable-package + matrix. Its source package, native consumer, isolated bundle, Metro bundles, + and no-browser source-map boundary are checked separately. +- Follow-up: add a native-specific build, pack, install, declaration, Metro, + and platform-condition fixture before making the package publishable. + +### F-147 — Metro skipped the fixture-owned Babel runtime + +- Status: resolved +- Severity: medium +- Owner: Tooling +- Observed in: rebuilding the React Native POC after removing redundant root + dependencies +- Friction: the example correctly declared `@babel/runtime`, but Metro resolved + React Native from pnpm's physical store path and searched that path's + ancestors instead of the example's `node_modules`. Production bundling + failed on `@babel/runtime/helpers/interopRequireDefault` unless the dependency + was duplicated at the workspace root. +- Decision: configure Metro's `resolver.nodeModulesPaths` with the example and + workspace module roots. Keep Babel ownership in the example rather than + masking the monorepo resolution boundary with a root dependency. +- Verification: all eight blank, RNSVG, core, and full-chart production bundles + complete for iOS and Android. The full-chart source-map checks also exclude + every guarded browser implementation module. diff --git a/NATIVE-PLATFORM-SUPPORT-SPIKE.md b/NATIVE-PLATFORM-SUPPORT-SPIKE.md new file mode 100644 index 0000000..e7959c7 --- /dev/null +++ b/NATIVE-PLATFORM-SUPPORT-SPIKE.md @@ -0,0 +1,874 @@ +# Native platform support spike + +Research date: 2026-07-30 + +## Decision + +Full React Native support is feasible without replacing the chart grammar or +the D3-based compiler. It is not an adapter-only project. The reusable unit is +the keyed `ChartScene`; sizing, text, paint resolution, rendering, gestures, +tooltips, animation, accessibility, and raster export need native +implementations. + +Build in this order: + +1. Keep the compiler and existing focus algorithms DOM-free, extract the + browser-owned interaction state, and introduce a renderer-neutral + transition plan. +2. Ship `react-native-svg` as the default React Native renderer. +3. Add React Native Skia as an optional renderer for dense or frequently + updated charts, after measuring the crossover. +4. Use the same core refactor to test a NativeScript Core view backed by + `@nativescript/canvas`. +5. Treat Compose, SwiftUI, and Flutter as separate native products consuming a + portable definition or scene schema. They cannot share the live TypeScript + API. + +React Native is the highest-confidence target because its JavaScript runtime +can execute the existing definitions, accessors, imported D3 modules, scales, +and scene compiler. NativeScript is expected to reuse those layers, subject to +a bundler and runtime proof. Kotlin, Swift, and Dart cannot preserve arbitrary +JavaScript callbacks without embedding a JavaScript runtime. + +## What “everything” should mean + +Parity should be measured by outcome, not by reproducing browser mechanics. + +| Contract | Native parity | +| ---------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| Data-to-scene behavior | The same definition and data produce equal normalized domains, mark keys, topology, and focus order; numeric geometry and runtime-formatted labels meet explicit tolerances. | +| Visual behavior | Every current scene primitive, mark family, coordinate system, guide, legend, gradient, and clip renders within documented tolerances. | +| Interaction behavior | Library-owned focus, grouped focus, activation, and pinning match. App-owned brush, zoom, scrub, range selection, and editing use documented native integration patterns. | +| Motion behavior | Stable-key enter/update/exit, interruption, reduced motion, and incompatible-path fallback retain the same semantics. | +| Accessibility behavior | A user can discover the chart, traverse or adjust the current datum, hear values, activate selections, and reach an application-provided complete data representation. | +| Export behavior | JavaScript targets retain deterministic resource-aware SVG. Native renderers add platform bitmap snapshots and file/share integration. | +| Web-only behavior | SSR, hydration, DOM callbacks, CSS selectors, and mouse-specific input remain supported by the web renderer; they are not native device requirements. | + +Pixel-identical text across browser engines, Core Text, Android text, and Skia +is not a useful acceptance criterion. Geometry can be exact when renderers +consume the same scene; independently ported compilers need numeric tolerances +for geometry too. + +## Current repository boundary + +The repository already has most of the right compiler boundary: + +- `createChartRuntime` and `createChartScene` take definitions and logical + dimensions and produce a scene. +- Marks emit seven portable node types: group, rule, polyline, area, dot, + rectangle, and label. +- Cartesian, facet, polar, and geographic marks all end at those primitives. + Polar and geographic shapes carry path strings instead of requiring a DOM. +- Focusable `ChartPoint` records are separate from painted nodes. This permits + renderer batching without losing datum identity or hit testing. +- Resource-aware static SVG serialization through + `renderChartSvgWithResources` is already independent of a mounted browser + surface. The lower-level `renderChartSvg` does not emit gradient and clip + resources by itself. +- The conformance corpus contains 100 cases, including 16 executable + interaction cases and 51 interaction scenarios. It supplies coverage, but + many cases combine definition, DOM mount, controls, selectors, and + DOM-specific gesture code. Native conformance first requires extracting + platform-neutral data and definition factories, then replacing mounts, + application controllers, and drivers. + +The public renderer and host boundary is browser-shaped: + +| Evidence | Native consequence | +| --------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------- | +| `ChartSurface.element` is `Element`; `ChartRenderer.mount` accepts `HTMLElement`; render callbacks expose `HTMLElement` and `SVGSVGElement`. | A native renderer cannot implement the current public contract honestly. | +| `renderer.ts` owns `ResizeObserver`, pointer and keyboard events, animation frames, DOM tooltips, focus, and reduced-motion queries. | Reusable interaction state is mixed with browser services. | +| `canvas.ts` creates HTML canvases and reads `devicePixelRatio` and media queries. | Its painter can be extracted, but the current Canvas renderer cannot run in NativeScript or React Native. | +| `dom-text.ts` reads computed CSS and measures through browser Canvas 2D. | Native layout needs a different font-resolution and measurement service. | +| `RendererChart.tsx` imports `react-dom`, mounts `
` elements, injects HTML, and portals tooltips into DOM elements. | The React adapter is a web adapter, not a portable React component. | +| Default theme colors use `currentColor` and CSS custom properties. | Native renderers need concrete colors or platform-resolved semantic tokens. | +| Gradient references are emitted as SVG/CSS `url(#id)` strings; scene nodes also carry `className` and `ariaHidden`. | Structured paint references and semantic metadata should be separated from web serialization. | +| `SceneLabel` and `ChartTextMeasureOptions` expose size and weight, but not family, style, stretch, direction, letter spacing, or locale. | Native guide layout cannot reproduce the font that will paint the label. | +| `ResolvedScale.map` is a function and `ChartPoint.datum` can contain any live value. | The in-process scene is portable between JavaScript renderers, but is not a language-neutral serialized schema. | +| The root remains browser-inclusive; `@tanstack/charts/portable` and `@tanstack/charts/types` select the DOM-free value and declaration graph. | Native code has a supported boundary, while strict dependency checking still exposes the upstream `ImageData` declaration issue. | + +Directional code inventory: + +- The browser-heavy renderer, Canvas host, DOM export, DOM text measurement, + and reconciliation files remain a substantial but isolated implementation + layer. +- Most mark, scale, layout, polar, geographic, and scene construction code is + renderer-independent. + +Source counts change too quickly to serve as a credible reuse guarantee. +`types.ts` is now DOM-free, while `renderer.ts` and `canvas.ts` still mix +portable behavior with browser services. The React web adapter remains a +rewrite target because its UI is HTML plus `react-dom`. + +## Required architecture + +```mermaid +flowchart TD + Definition["Live TypeScript chart definition"] --> Runtime["Shared runtime
marks · D3 · scales · guides · layout"] + CompileInputs["Compiler inputs
logical size · text metrics · theme input"] --> Runtime + Runtime --> Scene["In-process ChartScene
geometry · keys · points · scale metadata"] + Scene --> State["Shared controller
focus restoration · activation · pinning · transition plan · semantics"] + Host["Host capabilities
frame clock · input · overlays · accessibility · snapshots"] --> State + State --> Web["Web
SVG · Canvas · DOM overlays"] + State --> RNSVG["React Native
react-native-svg · RN overlays"] + State --> Skia["React Native
Skia · RN semantic overlays"] + State --> NS["NativeScript
Canvas · native overlays"] + Portable["Portable definition / scene DTO"] --> Compose["Compose"] + Portable --> Flutter["Flutter"] + Portable --> Apple["SwiftUI / Core Graphics"] +``` + +Use narrow capabilities, not DOM-shaped polyfills. + +Compiler inputs: + +- `measureText(request)`: resolved font properties in; advance width and line + metrics out, with optional ink bounds. +- `resolvePaint(token)`: semantic or CSS-like theme input to renderer-usable + paint. +- `layoutSize`: logical dimensions supplied by the host. + +Host, controller, and surface capabilities: + +- `requestFrame`, `cancelFrame`, and reduced-motion state. +- Platform coordinates to logical scene coordinates. +- Tooltip and application-owned overlay presentation. +- Focus-indicator geometry, style, visibility, and paint. +- Accessible summary, active-datum controls, actions, and announcements. +- Optional renderer-specific bitmap snapshots. + +The compiler must remain a normal JavaScript operation. React Native worklets +should only own frame-critical numeric state, such as gesture coordinates, +crosshair position, preview transforms, paint interpolation, and a +worklet-safe nearest-point index. Arbitrary accessors, D3 modules, tooltip +formatters, and custom marks should not be serialized into the UI runtime. +[Reanimated worklets](https://docs.swmansion.com/react-native-reanimated/docs/guides/worklets/) +are a separate JavaScript context with serialization constraints. + +### Two scene contracts + +Do not freeze the current `ChartScene` as a cross-language wire format. + +1. **In-process scene:** retains live data references, scale mapping functions, + extension objects, and efficient indexes. React Native and NativeScript can + consume this directly. +2. **Portable scene DTO:** versioned JSON-compatible geometry, resolved paints, + scale metadata, datum IDs, semantic descriptions, and interaction policies. + Compose, SwiftUI, and Flutter can consume this, but live callbacks stay in + their host language. + +The proposed [`PORTABLE-CHART-SPEC.md`](./PORTABLE-CHART-SPEC.md) registry +model is the right definition-level companion. `$call` and `$data` can describe +a supported portable subset. It should never claim to serialize arbitrary +JavaScript accessors, custom tooltip components, or renderer plugins. + +### Core refactor + +1. Keep the completed portable/DOM declaration split. Further separate shared + renderer, focus, semantic, and transition contracts from browser host + implementations. +2. Keep the existing focus strategies, grouping, and spatial contracts. Move + focus restoration/order, pinned state, host input orchestration, default + tooltip content, and render-reason policy out of `renderer.ts` into a + renderer-neutral controller. +3. Introduce keyed scene diffing, interpolation instructions, and interruption + state as a transition planner. Current SVG motion is DOM attribute + reconciliation; current Canvas motion is a whole-frame crossfade. +4. Extract the Canvas 2D painter behind a structural drawing-context + interface. Keep HTML canvas creation, pixel ratio, media queries, and export + in the web host. +5. Resolve theme colors before painting. Keep CSS variables and + `currentColor` as web-adapter inputs, not scene paints. +6. Expand typography to include family, size, weight, style, stretch, letter + spacing, direction, locale, and font-scale policy. Measurement cache keys + must include all of them. +7. Preserve the resolved F-106 ownership rule: dynamic builders receive the + default theme; application and platform overrides enter through typed + inputs or the returned definition and merge during scene creation. Do not + pass a builder the theme that it is itself responsible for returning. +8. Keep deterministic, resource-aware SVG serialization in the shared + JavaScript package. +9. Define capability fallbacks for unsupported paint, path, filter, snapshot, + and semantic features. +10. Give gradients and other resources structured scene references; serialize + `url(#id)` only in the SVG renderer. +11. Treat typography and structured paints as public API migrations. Add + backward-compatible unions and normalization first, or version the change; + update migration docs and conformance before removing string paints or + existing text-measure options. + +This can remain additive for web consumers: add new internal contracts and +make the DOM host implement them. The browser-oriented root remains compatible; +portable consumers opt into `@tanstack/charts/portable` and +`@tanstack/charts/types`. + +## React Native + +As of this research, React Native 0.86 is current stable. React Native 0.82 +made the New Architecture mandatory. Set the initial support floor to React +Native 0.85 and test Expo SDK 56 / React Native 0.85 plus bare React Native +0.86. Supporting 0.82–0.84 later requires adding those CI lanes; a nominal +floor without tests is not support. Version-one product scope is iOS and +Android. Renderer dependencies may also run on macOS, Windows, web, or TV, but +those platforms need their own input, accessibility, packaging, and +conformance gates. +[React Native versions](https://reactnative.dev/versions.html) · +[React Native 0.82](https://reactnative.dev/blog/2025/10/08/react-native-0.82) · +[Expo SDK 56](https://docs.expo.dev/versions/v56.0.0/) + +The two supported dependency lanes differ: + +| Dependency | Expo SDK 56 / RN 0.85 | Bare RN 0.86 | +| ------------------ | -------------------------------------------- | ----------------------------------------------------- | +| `react-native-svg` | Expo-pinned 15.15.4 | current compatible 15.15.x | +| Skia | Expo-pinned 2.6.2 | current compatible 2.x | +| Reanimated | Expo-pinned 4.3.1 | 4.4+ line that declares RN 0.86 support | +| Worklets | managed with the Expo/Reanimated combination | matching line from the Reanimated compatibility table | +| Gesture Handler | Expo-pinned ~2.31.1 | current RN 0.86-compatible line | + +Reanimated 4 is New-Architecture-only. Expo configures its supported plugin +combination; bare apps must install the matching Worklets package and plugin. +Gesture Handler also requires `GestureHandlerRootView`. +[Expo Reanimated](https://docs.expo.dev/versions/v56.0.0/sdk/reanimated/) · +[Expo Gesture Handler](https://docs.expo.dev/versions/v56.0.0/sdk/gesture-handler/) · +[Expo SVG](https://docs.expo.dev/versions/v56.0.0/sdk/svg/) · +[Expo Skia](https://docs.expo.dev/versions/v56.0.0/sdk/skia/) · +[Reanimated compatibility](https://docs.swmansion.com/react-native-reanimated/docs/guides/compatibility/) + +D3 is not expected to be the blocker. The imported `d3-array`, `d3-scale`, +`d3-shape`, and `d3-geo` code paths should be audited and executed under +Hermes rather than relying on a blanket package-family claim. `d3-shape` +explicitly supports path-string or Canvas-context output. +[d3-shape](https://d3js.org/d3-shape) + +### Default renderer: `react-native-svg` + +The scene maps directly: + +| Scene primitive | React Native SVG | +| ---------------------- | -------------------------------- | +| group, translate, clip | `G`, `ClipPath`, `Rect` | +| rule | `Line` or `Path` | +| polyline and area | `Path` | +| dot | `Circle` | +| rectangle | `Rect` | +| label | `Text` | +| linear gradient | `Defs`, `LinearGradient`, `Stop` | + +`react-native-svg` supports Fabric and the relevant primitives on iOS, +Android, macOS, Windows, and web. Its 15.13+ compatibility line requires React +Native 0.78+, below the proposed floor. This is dependency support, not a +promise that the chart package supports every one of those platforms. +[react-native-svg repository](https://github.com/software-mansion/react-native-svg) · +[usage reference](https://github.com/software-mansion/react-native-svg/blob/main/USAGE.md) + +Why it should ship first: + +- The current scene is already SVG-shaped. +- D3-generated polar and geographic path strings transfer directly. +- A retained node tree makes initial keyed updates and visual inspection + straightforward. +- It avoids a required Skia binary for ordinary charts. +- It keeps the public renderer replaceable. + +Known limits: + +- The package Codegen configuration creates native component types for SVG + primitives. A large tree may make React construction and Fabric commits + expensive, but that is a benchmark hypothesis rather than a pre-measured + limit. +- Native text metrics and baseline behavior differ from DOM SVG. +- The documented filter set is incomplete, and Android cannot apply a radial + gradient focal point. +- `getBBox`, `isPointInFill`, and related synchronous shape methods are marked + experimental; core layout and hit testing must not depend on them. + [Shape implementation](https://github.com/software-mansion/react-native-svg/blob/main/src/elements/Shape.tsx) +- RNSVG can parse stylesheet classes through `SvgCss`, but the typed production + renderer should resolve styles to props instead of depending on reparsed CSS. +- `strokeDasharray` and uncommon line joins need normalization and + compatibility tests. + +Parsing the existing SVG string through `SvgXml` is useful as a one-day visual +probe, not a production architecture. `SvgXml` and `SvgCss` reparse markup, +lose scene identities and transition keys, and cannot preserve the current DOM +interaction and accessibility model. +[RNSVG package Codegen configuration](https://github.com/software-mansion/react-native-svg/blob/main/package.json) · +[RNSVG filter support](https://github.com/software-mansion/react-native-svg/blob/main/USAGE.md#filters) · +[RNSVG CSS support](https://github.com/software-mansion/react-native-svg/blob/main/USAGE.md#css-support) + +### Optional renderer: React Native Skia + +Skia should consume the same scene and host controller. It is the likely +choice for dense scatterplots, heatmaps, streaming data, gesture-heavy charts, +and animation, but the renderer crossover must be measured. + +React Native Skia 2.x currently requires React Native 0.79+, React 19+, iOS +14+, and Android API 21+. Its documented binary contribution is roughly 6 MB +on iOS and 4 MB on Android, so it should remain an isolated optional entry. +[Skia installation](https://shopify.github.io/react-native-skia/docs/getting-started/installation/) + +Skia provides paths, clipping, gradients, synchronous font metrics, snapshots, +and direct Reanimated shared-value integration. +[Canvas](https://shopify.github.io/react-native-skia/docs/canvas/overview/) · +[text](https://shopify.github.io/react-native-skia/docs/text/text/) · +[gradients](https://shopify.github.io/react-native-skia/docs/shaders/gradients/) · +[animation](https://shopify.github.io/react-native-skia/docs/animations/animations/) + +Do not replace the current web renderer with Skia. Its web target loads +CanvasKit, adds roughly 2.9 MB compressed, and has different WebGL and API +constraints. +[Skia web support](https://shopify.github.io/react-native-skia/docs/getting-started/web/) + +Do not begin with a custom Fabric surface. If profiling proves that SVG and +Skia both fail a required workload, a single Codegen-backed native chart +surface could accept a compact scene buffer. That decision would add iOS, +Android, Codegen, serialization, and React Native version maintenance. +[React Native Codegen](https://reactnative.dev/docs/the-new-architecture/what-is-codegen) + +### Layout and text + +Text is the largest visual-parity risk. + +The current synchronous `ChartTextMeasurer` is a useful compiler seam, but a +React Native `Text` measurement may arrive after layout. The native host should +use this protocol: + +1. Resolve the complete font descriptor and issue keyed measurement requests. +2. Return cached metrics synchronously when present. +3. Use deterministic estimates for cache misses. +4. Batch native measurement of misses. +5. Rebuild the scene once when real measurements materially change guide + bounds. + +For the SVG renderer, test an offscreen native `Text` measurement surface and +`onTextLayout`; do not depend on experimental SVG bounding-box calls. For +Skia, `Font` can synchronously measure a resolved font, while complex scripts, +fallback, wrapping, and bidirectional text require Paragraph shaping. An +offscreen React Native `Text` result may not match RNSVG `Text`; measured and +painted output must agree closely enough to keep guide layout stable. +[Skia font interface](https://github.com/Shopify/react-native-skia/blob/main/packages/skia/src/skia/types/Font/Font.ts) · +[Skia Paragraph](https://shopify.github.io/react-native-skia/docs/text/paragraph/) + +The test matrix must include: + +- system and bundled fonts; +- unavailable weight fallback; +- emoji and mixed scripts; +- RTL; +- locale-specific shaping and number formatting; +- timezone, daylight-saving transitions, and non-Gregorian calendar settings; +- letter spacing and rotated labels; +- dynamic font scale; +- font loading after first render. + +The public API needs an explicit choice for chart text scaling. Blindly +applying unbounded system font scale can make a chart unreadable, while +ignoring it harms accessibility. The likely contract is a host-level +font-scaling policy plus an accessible nonvisual data representation. + +### Sizing and paint + +- The React Native root `View` supplies logical width and height through + `onLayout`. +- Scene coordinates should use density-independent logical units. Each + renderer handles physical pixel density at paint or snapshot time. +- Orientation and container changes schedule a new scene build; they do not + require a `ResizeObserver`. +- `PlatformColor` and `DynamicColorIOS` are opaque platform values, not + portable strings. Each renderer resolves them, subscribes to appearance and + accessibility changes, and uses `processColor` where native or animated + props require it. Deterministic SVG export requires an explicit color + scheme. +- High-contrast capabilities differ across iOS and Android; the adapter maps + the available accessibility state to semantic theme input rather than + promising one cross-platform flag. +- `currentColor`, CSS variables, inherited `font-family`, and CSS class styles + remain web-only resolution mechanisms. + +[React Native Appearance](https://reactnative.dev/docs/appearance) · +[React Native AccessibilityInfo](https://reactnative.dev/docs/accessibilityinfo) + +### Gestures, focus, and application interactions + +Use one chart-level gesture detector, not one responder per mark: + +1. Convert touch, pointer, or hover coordinates to logical scene coordinates. +2. Query the shared focus strategy and spatial index. +3. Update the visual focus overlay at frame cadence. +4. Commit semantic focus and pinned state at a coalesced cadence or gesture + end, and emit application activation or domain-change events through typed + integration points. + +Simple tap and activation can use React Native responders. Scrubbing, pinch, +pan, long press, and composed gestures should use Gesture Handler where +available. For app-owned brush, zoom, scrubber, and editor behavior, the +package supplies coordinates, focus primitives, integration contracts, and +examples; it does not take ownership of application domain or range state. +Gesture Handler recognizes gestures using native platform facilities and +integrates with Reanimated. +[Gesture Handler](https://docs.swmansion.com/react-native-gesture-handler/) + +Input parity is capability-based: + +| Web input | Native behavior | +| -------------------- | -------------------------------------------------------------------- | +| hover / pointer move | touch scrub, stylus/trackpad hover where available | +| click | tap | +| pinned click tooltip | tap or long press, with explicit dismiss | +| wheel zoom | pinch; trackpad/wheel where the platform reports it | +| drag brush | pan gesture with visible handles and minimum touch targets | +| arrow-key focus | adjustable screen-reader actions; hardware keys on supported targets | +| Escape | dismiss action, back action, or hardware key | + +The 16 interaction conformance cases should call semantic drivers such as +`focusAt`, `activate`, `pan`, `zoom`, `setBrush`, and `adjustDatum`. Each +platform harness translates those operations to real input separately. Cases +whose controller is application-owned must extract and port that controller; +they are integration conformance, not new core behavior. + +Launch gates include: + +- arbitration with nested `ScrollView`, navigation, and parent gestures; +- axis locking, cancellation, and responder loss; +- coordinate conversion under view and chart transforms; +- Android back behavior for pinned state; +- the copy and memory cost of moving any spatial index into a worklet; +- minimum touch targets and handles near safe areas. + +### Accessibility + +Painted geometry and accessibility must be separate outputs of the controller. +Skia explicitly requires overlaid React Native views to make inner canvas +elements accessible, and an SVG node per datum is not a scalable semantic +tree. +[Skia canvas accessibility](https://shopify.github.io/react-native-skia/docs/canvas/overview/) · +[React Native accessibility](https://reactnative.dev/docs/accessibility) + +Recommended native model: + +- A non-accessible layout container with sibling semantic elements. React + Native warns that VoiceOver can suppress nested accessible elements. +- One accessible summary element with label, description, and concise chart + summary. +- One sibling adjustable active-datum controller with increment, decrement, + and activate actions. +- `accessibilityValue.text` containing series, category or time, value, and + relevant interval. +- Platform-appropriate announcement or live status when the active value + changes; live-region behavior differs between iOS and Android. +- A visible focus marker and tooltip rendered through ordinary React Native + views. +- Semantics and data hooks that let the application supply a virtualized list + or table for complete inspection. Shipping that table is a new feature, not + current package parity. +- Reduced-motion behavior driven by `AccessibilityInfo`. +- Visual renderer descendants hidden with the platform-appropriate + `importantForAccessibility`, `accessibilityElementsHidden`, or equivalent + props to prevent duplicate or unusably large traversal. + +VoiceOver and TalkBack testing on physical devices is an exit criterion. +Thousands of transparent focusable views are not an acceptable implementation. + +The shared semantic model can supply series and datum descriptions for +Apple’s `AXChartDescriptor` and audio graphs. React Native core, RNSVG, and +Skia do not expose that API; using it would require a custom iOS native +accessibility component and is not part of the first renderer. +[Apple chart accessibility](https://developer.apple.com/documentation/swiftui/view/accessibilitychartdescriptor%28_%3A%29) + +### Motion + +The shared transition planner should produce stable-key enter, update, and +exit operations from the currently painted state, not only previous and next +scenes. Renderers then execute: + +- numeric geometry and opacity interpolation; +- color interpolation; +- path interpolation when topology is compatible; +- a documented resampling or crossfade fallback when it is not; +- cancellation and restart from the current visual value; +- zero-duration output under reduced motion. + +Skia’s path interpolation requires compatible path commands, so arbitrary +path morphing cannot be delegated without normalization. +[Skia path interpolation](https://shopify.github.io/react-native-skia/docs/animations/hooks/) + +Per-frame React/RNSVG prop commits are safe only as a small-scene proof, not +the assumed production default. The motion spike must compare animated props +and UI-thread execution early, including path normalization, color processing, +and interruption from the value actually painted on the UI thread. +[Reanimated `useAnimatedProps`](https://docs.swmansion.com/react-native-reanimated/docs/core/useAnimatedProps/) + +Transition state must live outside React render side effects. It must discard +stale concurrent scene builds, rebase after font/theme/size invalidation, and +pause or rebase when `AppState` moves between background and foreground. + +### Export and web + +- Keep resource-aware SVG string export in the shared JavaScript core. It does + not require a mounted native surface. +- Define whether a PNG captures only chart paint or also React Native tooltip, + legend, and focus overlays. Add explicit scale, background, color-scheme, + and font-readiness options. +- Skia’s asynchronous snapshot runs on the UI thread and is required when + textures are present. Generic view capture has separate native-surface and + view-collapsing constraints; both paths need device proof. +- Add file and share helpers only in platform integration packages. +- Keep browser consumers on the existing root and DOM/SVG React adapter. React + Native Web can render native components, but the current web implementation + already has better SSR, hydration, CSS, text measurement, and semantic SVG + behavior. +- Keep native callbacks typed to native surface and layout data; do not expose + fake `HTMLElement` or `SVGSVGElement` values. + +[Skia canvas snapshots](https://shopify.github.io/react-native-skia/docs/canvas/overview/) · +[Skia view snapshots](https://shopify.github.io/react-native-skia/docs/snapshotviews/) + +A WebView can demonstrate visual reuse, but it is not native support. Expo DOM +components use a separate JavaScript engine, JSON-serialized asynchronous +props, whole-tree rerenders, and no SSR/SSG or native children. +[Expo DOM components](https://docs.expo.dev/guides/dom-components/) + +### Package shape + +```text +@tanstack/charts + browser-compatible root + ./portable + DOM-free definitions, marks, D3 integration, scene, focus, semantics + ./types + DOM-free public contracts + +@tanstack/react-charts + existing web React adapter + +@tanstack/react-native-charts + native React adapter and react-native-svg renderer + ./skia + optional Skia renderer subpath +``` + +The base native entry should peer-depend on React, React Native, and +`react-native-svg`. Skia, Reanimated, Worklets, and Gesture Handler should be +optional peers, declared through `peerDependenciesMeta.optional`, so a static +SVG chart does not acquire or autolink unrelated native modules. Do not use +`optionalDependencies`. The base implementation and declaration graph must +have no static reference to optional peers. + +Package exports need explicit `browser`, `react-native`, and `default` +conditions, with `browser` before `react-native`, plus matching type +declarations. Once an export matches, Metro does not append `.native` or `.web` +to that target. Test resolution through Metro/Expo, Vite or Webpack, Jest, and +TypeScript. An export target cannot point into another package, so a browser +re-export needs a local shim and declared dependency or peer. +[Metro package exports](https://metrobundler.dev/docs/package-exports/) + +## NativeScript + +NativeScript is the second-best reuse target because its runtime can execute +the JavaScript built from the TypeScript core and expose native platform APIs +directly. NativeScript Core supports custom native views, gestures, animation, +and accessibility. Its Canvas project provides native-backed Canvas 2D, WebGL, +and WebGPU packages. Ordinary JavaScript runs on the UI thread; Workers are +isolated and communicate through JSON-serializable messages. Large scene +compilation plus Canvas painting is therefore a first-order benchmark, not +assumed reuse. +[NativeScript documentation](https://docs.nativescript.org/) · +[native APIs](https://docs.nativescript.org/guide/adding-native-code) · +[custom native views](https://docs.nativescript.org/guide/create-custom-native-elements) · +[gestures](https://docs.nativescript.org/guide/gestures) · +[accessibility](https://docs.nativescript.org/guide/accessibility) · +[multithreading](https://docs.nativescript.org/guide/multithreading) · +[NativeScript Canvas](https://github.com/NativeScript/canvas) + +Recommended implementation: + +1. Extract the current Canvas painter from HTML canvas creation and DOM host + behavior. +2. Implement a NativeScript Core chart view that supplies size, pixel ratio, + a Canvas context, frame scheduling, and gestures. +3. Prove that the same definition and in-process scene compiler run unchanged + through NativeScript’s bundler and runtime. +4. Add Angular, Vue, Solid, Svelte, or React wrappers only after the Core view + is stable. + +React NativeScript is a React renderer over NativeScript views, not React +Native compatibility. React Native components and ecosystem packages do not +transfer. It should be a thin wrapper around a NativeScript Core chart view +rather than the foundation. +[NativeScript React tutorial](https://docs.nativescript.org/tutorials/build-a-master-detail-app-with-react) · +[React NativeScript repository](https://github.com/shirakaba/react-nativescript) + +NativeScript proof requirements: + +- correct text metrics, baselines, font fallback, and pixel ratio; +- `Path2D`, clipping, gradients, dash arrays, joins, and transforms; +- image snapshot/export; +- touch coordinate conversion and gesture composition; +- an accessible root and active-datum control implemented either with a small + number of real NativeScript views or custom iOS/Android accessibility + containers; NativeScript documents accessibility for `View` objects but no + Canvas virtual-child semantic tree; +- long-running animation and streaming stability; +- scene build and paint time at 1k, 10k, and 50k primitives; +- memory and UI-thread responsiveness on low-end Android. + +If its Canvas implementation cannot meet these gates without platform-specific +patches, stop rather than maintain a browser API imitation with divergent +behavior. + +## Other native UI stacks + +| Target | Source reuse | Technical fit | Recommendation | +| ----------------------------------------- | ----------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------- | +| Compose Multiplatform | No executable TypeScript reuse; definitions, scene DTOs, fixtures, and semantics can transfer. | Shared Kotlin API; Android uses Jetpack Compose and iOS Compose is canvas-rendered through Skiko. Custom Canvas semantics must be authored. | Best candidate for a shared Kotlin/Compose product after the portable contract is proven. | +| Flutter | No TypeScript reuse on native; requires a Dart port of the compiler/runtime or a Dart scene consumer. | `CustomPainter` maps cleanly to the scene and supports hit testing and virtual semantics; Flutter paints through its own engine/Impeller. | Build only as a first-class Flutter product with dedicated ownership and add-to-app cost. | +| SwiftUI `Canvas` | Schema and fixtures only. | Uses `GraphicsContext`; Apple excludes per-element interaction and accessibility, so synthetic children/representations are required. | Apple-only product or accessibility reference, not the cross-platform starting point. | +| UIKit / Core Graphics | Schema and fixtures only. | Separate lower-level custom-view path with maximum Apple control and no Android implementation. | Use only if SwiftUI Canvas cannot meet required fidelity or integration. | +| Swift Charts | Semantic mapping, not scene parity. | Supplies native marks, axes, legends, and chart accessibility, but owns layout and styling. | Optional native-style backend, not feature-for-feature TanStack rendering. | +| Lynx / ReactLynx | Pure TypeScript compiler may transfer after DOM removal. React Native components do not. | Lynx 4 exposes static-oriented SVG as one native view and no public Canvas element; per-mark input and semantics need overlays or custom native elements. | Watchlist until its graphics layer can support interactive dynamic scenes. | +| Separate UIKit and Android View renderers | Schema and fixtures only unless a JavaScript runtime is embedded. | Maximum control and maximum duplicated implementation. | Avoid unless profiling and commercial demand justify two permanent native engines. | + +Primary references: + +- [Compose Multiplatform](https://kotlinlang.org/docs/multiplatform/compose-multiplatform-and-jetpack-compose.html), + [iOS renderer explanation](https://blog.jetbrains.com/kotlin/2023/05/compose-multiplatform-for-ios-is-in-alpha/), + [iOS stable announcement](https://blog.jetbrains.com/kotlin/2025/05/compose-multiplatform-1-8-0-released-compose-multiplatform-for-ios-is-stable-and-production-ready/), + [Compose custom graphics](https://developer.android.com/develop/ui/compose/graphics/draw/overview), + [Compose semantics](https://developer.android.com/develop/ui/compose/accessibility/semantics), + and [Compose iOS accessibility](https://kotlinlang.org/docs/multiplatform/compose-ios-accessibility.html) +- [Flutter `CustomPainter`](https://api.flutter.dev/flutter/rendering/CustomPainter-class.html), + [Flutter architecture](https://docs.flutter.dev/resources/architectural-overview), + [add-to-app](https://docs.flutter.dev/add-to-app), and + [Flutter semantics](https://api.flutter.dev/flutter/widgets/Semantics-class.html) +- [SwiftUI `Canvas`](https://developer.apple.com/documentation/swiftui/canvas), + [accessibility representations](https://developer.apple.com/documentation/swiftui/view/accessibilityrepresentation%28representation%3A%29), + [AXChart](https://developer.apple.com/documentation/accessibility/axchart), + and [Swift Charts](https://developer.apple.com/documentation/charts) +- [Lynx 4 elements](https://lynxjs.org/4.0/api/), + [SVG element](https://lynxjs.org/4.0/api/elements/built-in/svg.html), and + [custom native components](https://lynxjs.org/4.0/guide/custom-native-component) + +For non-JavaScript targets, “same API” can mean equivalent chart concepts and +conformance, not source compatibility. Accessors, formatters, custom scales, +tooltip bodies, callbacks, and plugins must be declared as one of: + +- portable declarative input; +- a named registry function; +- a host-language callback; +- JavaScript-only. + +Sending a complete scene across a JavaScript-to-native or host-language +boundary on every frame is not a durable dynamic-chart design. A portable +scene DTO is appropriate for static charts, fixtures, export, and an initial +renderer proof. A production native-language library eventually needs local +layout, interaction, and animation logic. + +## Feature parity matrix + +| Capability | Shared work | React Native | NativeScript | Non-JS native | +| --------------------------------------------- | --------------------------------------------- | ------------------------------- | ------------------------------------------------- | -------------------------------------------- | +| Definitions, accessors, transforms, D3 scales | Existing compiler through portable entries | Direct reuse after Hermes proof | Expected reuse after runtime proof | Declarative subset or reimplementation | +| Cartesian marks and guides | Existing scene | Render primitives | Canvas painter | Render DTO or reimplement | +| Facets and layered charts | Existing layout and groups | Direct reuse | Expected after runtime proof | Scene-compatible | +| Polar, pie, radar, gauge | Existing path-producing marks | SVG/Skia paths | Canvas paths | Scene-compatible | +| Geography and projections | Existing D3-generated paths | SVG/Skia paths | Canvas paths | Scene-compatible | +| Gradients and clipping | Existing scene data plus capability rules | New mapping, platform tests | New mapping, platform tests | New mapping | +| Text, axes, legend margins | Shared request/cache protocol | New native measurement | New native measurement | New native measurement | +| Theme and color | Shared semantic theme | New RN resolution | New NativeScript resolution | New platform resolution | +| Focus and grouped tooltip logic | Extract from web renderer | Reuse controller; new overlay | Reuse controller; new overlay | Port controller | +| Activation / `onSelect` | Shared callback contract | Tap and accessibility actions | Tap and accessibility actions | Platform input | +| Brush, zoom, scrubber, editor | Application-owned state plus semantic drivers | Native integration examples | Native integration examples | Platform implementations | +| Keyed animation | New shared transition planner | SVG and Skia execution | Canvas execution | Port planner | +| Focus indicator | New shared overlay contract | RN overlay or renderer layer | Canvas/native overlay | Platform overlay | +| Accessibility | New shared semantic model | RN sibling semantic controls | Feasibility gate: real views or native containers | Native semantics | +| Custom marks using scene primitives | Existing extension model | Reuse | Reuse | Equivalent host-language API | +| Renderer-specific custom output | None | Native renderer callback | Canvas/native callback | Platform-specific | +| Pure SVG export | Resource-aware JavaScript serializer | Reuse | Reuse if runtime proof passes | Native serializer or externally supplied SVG | +| Mounted PNG export | Platform capability | Snapshot/view capture | Canvas or platform capture, pending proof | Platform snapshot | +| SSR and hydration | Existing browser root and React host | Not applicable on device | Web target only | Not applicable on device | + +## Validation program + +### Stage 1: portability proof + +Run the compiler under Hermes and NativeScript without DOM globals. + +Pass conditions: + +- Representative definitions import through Metro and NativeScript bundling. +- With locale, calendar, and timezone fixed, web, Hermes, and NativeScript + produce exact normalized domains, keys, topology, and explicitly formatted + labels. Compare numeric coordinates and normalized path data with a defined + epsilon. +- DOM types are absent from the Charts declaration graph; strict dependency + checking reaches only the known upstream `ImageData` declaration. +- Theme and text services are injected. +- No browser polyfill is required. +- Conditional exports and optional-peer isolation resolve through Expo/Metro, + bare Metro, TypeScript, Jest, and a browser bundler. + +### Stage 2: renderer sentinels + +Render a deliberately small set before porting all 100 cases: + +1. multi-line chart with gaps, rotated ticks, and a legend; +2. stacked area with stable-key update; +3. grouped and stacked bars; +4. 10k-point scatter; +5. labeled heatmap with clipping and gradients; +6. faceted chart; +7. pie/donut plus radar or gauge; +8. geographic projection; +9. grouped tooltip with touch scrub and pinning; +10. zoom/pan or brush interaction; +11. streaming update with interruption; +12. custom scene mark. + +Pass conditions: + +- iOS and Android screenshots meet geometry and visual tolerances. +- Every sentinel has a usable VoiceOver and TalkBack path. +- Visible focus-indicator geometry, style, and visibility match the semantic + focus state. +- Custom fonts, RTL, dark mode, high contrast, reduced motion, and orientation + changes work. +- SVG and Skia consume the same scene and interaction controller. + +### Stage 3: performance crossover + +Use release or `debugOptimized` builds on a low-end Android device and a +representative iPhone. Standard Android debug builds are not valid evidence. + +Test 100, 1k, 10k, and 50k painted primitives, with an optional 100k stress +case. Record: + +- scene preparation and layout time; +- first paint; +- single-datum update; +- full data replacement; +- streaming update cadence; +- orientation and resize; +- touch scrub, pan, and zoom latency; +- nested-scroll arbitration, cancellation, and transformed hit coordinates; +- JS and UI frame time; +- memory; +- Fabric node count; +- native binary and application bundle delta; +- snapshot time and size. + +The measured SVG/Skia crossover becomes documentation. Do not choose a point +count from intuition. + +### Stage 4: conformance + +- Run all 100 visual cases on iOS and Android for the default renderer. +- Run the performance and renderer-sensitive subset on Skia and NativeScript. +- Extract platform-neutral definition/data factories from all 100 cases. +- Translate all 16 interaction cases to semantic platform drivers, with + application controllers remaining application-owned integration fixtures. +- Compare normalized domains, keys, and topology exactly; compare numeric + geometry and normalized paths with the agreed tolerance before screenshot + tolerances. +- Keep the DOM-free TypeScript compile and Metro import smoke alongside the + current jsdom-oriented unit suite; add Hermes execution coverage. +- Test current web SSR, hydration, SVG, Canvas, and export to catch refactor + regressions. +- Test stale-scene cancellation, concurrent updates, mid-flight interruption, + font/theme/size invalidation, and app background/foreground rebasing. +- Use React Native Testing Library for adapter state and semantics, but require + device tests for native drawing, gestures, and accessibility. Its own + guidance notes that native behavior needs simulator or device validation. + [React Native Testing Library boundary](https://callstack.github.io/react-native-testing-library/12.x/docs/guides/faq) + +### Stop conditions + +Pause a public native package if any of these remain unresolved after the +proof: + +- text measurement causes repeated layout oscillation or materially wrong + guides, or the measuring and painting stacks disagree on shaped text; +- the default renderer misses interaction frame budgets on ordinary charts; +- the semantic model cannot provide useful VoiceOver and TalkBack navigation; +- Metro requires DOM declarations or browser polyfills; +- SVG and Skia require divergent public chart definitions; +- native output depends on reparsing SVG strings; +- NativeScript requires project-local patches to its graphics runtime. + +## Estimated effort + +An engineer-week means one experienced library engineer working full time. +Ranges include implementation, tests, examples, and documentation, but not +unrelated chart features or store release work. + +| Deliverable | Estimate | Confidence | +| ----------------------------------------------------------------------------------------------------------------------------------------------------------- | -----------------------------------------: | ----------------------- | +| Shared controller extraction, transition design, platform theme/typography contracts, and device harness | 2–4 engineer-weeks | Medium | +| React Native SVG proof productionization: gestures, complete tooltips, packaging, and release gates | 3–5 engineer-weeks | Medium | +| React Native full applicable parity: text, themes, keyed motion, gestures, tooltips, accessibility, export, API migration, 100-case hardening, Expo/bare CI | 5–8 engineer-weeks | Low–medium | +| Production React Native SVG package total | 10–16 engineer-weeks | Low–medium | +| Optional Skia execution/optimization of the shared motion contract, snapshots, and crossover benchmarks | +4–7 engineer-weeks | Low–medium | +| NativeScript Core Canvas package after shared refactor | +6–10 engineer-weeks | Low | +| Portable scene DTO plus one Compose or Flutter rendering proof | +3–6 engineer-weeks | Low | +| Production Compose, Flutter, or Swift implementation | Separate multi-month product per ecosystem | Low until the DTO proof | + +Directional implementation size is 5–8k production lines plus 3–6k lines of +tests and fixtures for first-class React Native parity. A NativeScript +framework/view wrapper could remain near 1k lines only after a portable painter +and backend exist. The renderer/backend itself is likely another 2–4k lines; +device testing, accessibility feasibility, performance work, and hardening +explain the 6–10 week estimate. + +Two experienced engineers could overlap core/controller work, React Native +rendering, and device harness work. A realistic calendar range for a +production React Native package with both SVG and Skia is roughly 8–12 weeks, +assuming the text and accessibility proofs pass early. NativeScript should not +be scheduled as a committed package until its Canvas proof passes. + +Ongoing maintenance is material: + +- React Native, Expo, Metro, `react-native-svg`, Skia, Reanimated, and Gesture + Handler compatibility; +- physical-device screenshot, performance, VoiceOver, and TalkBack coverage; +- renderer-specific bug triage; +- font and graphics differences across iOS and Android; +- conformance updates whenever the scene grammar grows. + +## Recommended first commitment + +Fund a two-week, two-engineer device and shared-behavior proof rather than +announce the private package. + +Engineer A: + +- extract the shared interaction and tooltip controller; +- define platform theme and typography ownership; +- replace the responder proof with scroll-safe gesture arbitration; +- exercise representative definitions under Hermes and on devices. + +Engineer B: + +- build the iOS/Android visual, performance, and binary-size harness; +- define semantic output and VoiceOver/TalkBack flows; +- test the existing SVG host across density and gesture sentinels; +- scope the later Canvas/NativeScript proof from measured bottlenecks. + +At the end of the proof, decide from evidence: + +1. whether `react-native-svg` is a viable default; +2. whether Skia is required for the first release or can follow; +3. whether the typography contract is stable enough for public API; +4. whether NativeScript meets the bar without runtime patches; +5. whether to stabilize a portable scene DTO for non-JavaScript targets. + +## Explicit non-goals + +- No DOM emulation layer on native. +- No WebView marketed as native support. +- No D3 or arbitrary user callbacks in UI-thread worklets. +- No Skia dependency in the base package. +- No point-count threshold before device benchmarks. +- No thousands of invisible accessible views. +- No pixel-perfect cross-engine promise. +- No claim that a JSON subset preserves the complete live TypeScript API. +- No custom Fabric, UIKit, or Android renderer before the shared renderers are + measured. diff --git a/REACT-NATIVE-HOST-POC.md b/REACT-NATIVE-HOST-POC.md new file mode 100644 index 0000000..5c45900 --- /dev/null +++ b/REACT-NATIVE-HOST-POC.md @@ -0,0 +1,343 @@ +# React Native host proof of concept + +Research and implementation date: 2026-07-30 + +## Decision + +A React Native SVG host is viable. The chart grammar, D3 scales, marks, +responsive scene compiler, gradients, clips, polar and geographic paths, point +identity, and most focus algorithms can run unchanged. The current web +`ChartRenderer` cannot be the native abstraction: its public contract requires +DOM elements, string prerendering, client coordinates, and browser-owned +surface lifecycle. + +The proof should advance only as a separate package and host: + +```text +definition + D3 scales + marks + │ + ▼ + shared @tanstack/charts runtime + │ + ▼ + ChartScene + │ + ▼ + React Native interaction + react-native-svg +``` + +This can remain additive for current consumers. Do not generalize +`ChartRenderer` or remove DOM types from the root API to make native fit. + +The POC establishes technical feasibility, package isolation, approximate +JavaScript cost, and the main API boundaries. It does not establish device +visual parity, application binary cost, Hermes runtime performance, or +production support. + +## Implemented proof + +The private `@tanstack/react-native-charts` package includes: + +- a generic React Native `Chart` component that owns `createChartRuntime`; +- responsive sizing from explicit dimensions, aspect ratio, or `onLayout`; +- a direct keyed `ChartScene` visitor using `react-native-svg`; +- groups, rules, polylines, areas, dots, rectangles, labels, linear gradients, + nested translation, and rectangular clips; +- current-color and CSS-variable-fallback paint resolution; +- nearest, axis-nearest, and grouped focus; +- tap selection, sticky pinning, focus restoration, and accessibility actions; +- a separate SVG focus overlay; +- a native in-tree tooltip with point, pointer, group-center, and custom + anchors, collision-aware placement, custom content, and a custom React body; +- an optional injected text measurer; +- a Metro fixture using React Native 0.86.0 and `react-native-svg` 15.15.5; +- source-map checks that reject browser renderer code in iOS and Android + bundles. + +The host imports runtime values from narrow core subpaths. It does not import +the root barrel, `react-dom`, a browser adapter, the DOM renderer, the Canvas +host, or the SVG string/reconciliation pipeline. The narrow imports keep this +measurement bundle-sensitive; application definitions can instead use the +environment-safe `@tanstack/charts/portable` barrel. + +That distinction matters to shared application source. A Metro probe using +`defineChart` and `lineY` from the browser-oriented root +`@tanstack/charts` barrel traversed the DOM renderer, DOM text, reconciliation, +SVG surface, and adapters. The prerequisite portable-barrels PR adds +`@tanstack/charts/portable` for normal environment-neutral authoring while +retaining granular entries for tighter bundles. + +That prerequisite also adds `@tanstack/charts/types` and moves DOM host types +to an internal `dom-types.ts` module while preserving their root re-exports. +This POC branch adds no further core public API. + +## Bundle measurements + +### Isolated esbuild entries + +Production, minified ESM; React, React Native, and `react-native-svg` are +external in the native entries. + +| Entry | Minified | Gzip | +| -------------------------------- | -------: | -------: | +| React Native SVG host | 28.70 kB | 10.75 kB | +| React Native line consumer | 50.67 kB | 19.44 kB | +| Shared line scene | 35.46 kB | 13.79 kB | +| Existing React web adapter | 45.25 kB | 16.51 kB | +| Existing React web line consumer | 67.05 kB | 25.11 kB | + +The native host entry includes the host plus every shared runtime and D3 module +reachable from exporting `Chart`; it is not isolated adapter-only overhead. +The native line consumer additionally includes the line mark and D3 scale code +while leaving platform peers external. It is the closest comparison to the +existing React line entry, but the two platforms do not have identical runtime +baselines. Both native entries are informational measurements, not locked +budgets. + +### Metro application deltas + +React Native production bundles were minified for both platforms. Each row is +measured against a blank React Native application built with the same Metro +configuration. + +| Platform | Full chart minified JS delta | `react-native-svg` gzip delta | Core line gzip delta | Full chart gzip delta | Full chart module delta | +| -------- | ---------------------------: | ----------------------------: | -------------------: | --------------------: | ----------------------: | +| iOS | 308.63 KiB | 27.75 KiB | 37.80 KiB | 72.29 KiB | 280 | +| Android | 308.77 KiB | 27.69 KiB | 37.82 KiB | 72.34 KiB | 280 | + +The full iOS bundle was 1,200,113 bytes and 288,404 bytes gzip, versus 884,080 +and 214,381 for blank. Android was 1,205,629 and 289,473, versus 889,448 and +215,395 for blank. + +These are JavaScript bundle measurements, not Hermes bytecode or installed +application sizes. They exclude the native iOS and Android code linked by +`react-native-svg`. A clean release-binary before/after comparison is still +required. + +The full-chart source maps include the native host and exclude every guarded +browser module: adapters, DOM host, DOM text measurement, renderer, Canvas, +reconciliation, SVG serialization/surface code, `react-dom`, React web charts, +and Octane charts. + +## Parity and boundaries + +| Capability | POC result | Production boundary | +| -------------------------------------- | ------------------------------------------ | ------------------------------------------------------------------------------ | +| Definitions, D3 scales, marks, layout | Shared unchanged | High confidence | +| Cartesian, facet, polar, geo geometry | Shared scene paths | Needs device conformance | +| All seven scene node kinds | Implemented | Needs iOS/Android visual tests | +| Linear gradients and rectangular clips | Implemented | Device and nested-clip tests remain | +| Responsive sizing | `onLayout`, explicit size, aspect ratio | Scroll/layout integration remains | +| Paint | `currentColor` and CSS fallback resolution | Dynamic definitions still see the web default theme | +| Text | SVG text plus injected core measurer | Exact native typography and async measurement are unresolved | +| Nearest and grouped focus | Implemented | Logic is duplicated from the DOM renderer | +| Tap, selection, sticky tooltip | Implemented | Responder ownership may conflict with scrolling and gestures | +| Tooltip | Native in-tree overlay | Web `className`, portal semantics, and full item formatting are not equivalent | +| Accessibility | Labeled adjustable root and actions | No per-point native accessibility tree or data-table escape | +| Motion | Not implemented | Requires a renderer-neutral transition model | +| SVG/PNG export | Not implemented | Needs native snapshot/share APIs | +| Large-data renderer | Not measured | SVG node pressure may require an optional Skia host | +| SSR and hydration | Intentionally absent | Web-only behavior | + +### Rendering details that are not exact + +- SVG `arcs` and `miter-clip` joins are explicitly normalized to `round` and + `miter`, respectively, because the React Native SVG type surface does not + expose them. +- The native paint resolver can consume CSS variable fallbacks, but it cannot + evaluate application CSS. A production host needs concrete native theme + values before scene compilation. +- The current text-measure contract does not carry font family, font style, + letter spacing, direction, or locale. Passing `fontFamily` to the painter + cannot make guide layout measure the same font. +- `react-native-svg` supports the required primitive family and Fabric, but + SVG compatibility must be verified on real iOS and Android renderers rather + than inferred from server-rendered component markup. + +### Interaction details that are not exact + +- Focus preset resolution, point restoration, navigation order, tooltip + content, anchor, and placement are private functions inside the DOM renderer. + The POC had to reproduce those policies. A supported package must extract + the pure behavior and make both hosts consume it. +- The POC does not implement the complete `tooltip.items` channel, datum, and + derived-row contract. Custom `content`, `format`, `formatGroup`, and a custom + React body work, but default structured content is only partial. +- The root `View` currently claims touch responder ownership on press. + `ScrollView`, pan, brush, zoom, and application gestures require an explicit + arbitration model, likely through Pressability or Gesture Handler rather + than more responder callbacks. +- Native accessibility cannot reuse DOM focus and ARIA. The adjustable-root + behavior proves a useful minimum, not parity with keyboard traversal or a + complete accessible data representation. +- The chart is one accessible root. Nested controls in a custom pinned tooltip + may be hidden by platform accessibility grouping, and + `accessibilityLiveRegion` is Android-specific. This needs VoiceOver and + TalkBack design rather than prop translation. +- A local absolute tooltip cannot escape clipped native ancestors. Native + portal/modal behavior needs a separate definition from the browser top-layer + implementation. + +## API and compatibility impact + +No existing public call needs to break for an SVG-native release. + +Prerequisite changes delivered by the portable-barrels PR: + +- additive `@tanstack/charts/portable` export; +- additive `@tanstack/charts/types` export; +- mechanical split between portable and DOM host types, with root re-exports + preserved. + +This proof adds a separate private React Native package and component contract. + +Additive changes likely required before release: + +- a shared, renderer-neutral interaction state module; +- a shared tooltip content/anchor/placement model; +- a runtime option for platform default themes; +- a complete typography and text-measurement contract; +- structured paint references or a host paint-resolution contract; +- native-specific tooltip overlay and gesture integration points. + +Changes to avoid: + +- making the current `ChartRenderer` union over DOM and native surfaces; +- making string prerendering optional inside that renderer contract; +- importing React Native from the core package; +- shipping CSS tokens to native and silently substituting arbitrary colors; +- claiming compatibility outside the tested React Native 0.86.0 and + `react-native-svg` 15.15.5 pair; +- adding Skia before an on-device density/performance crossover is measured. + +The root type API remains compatible. Consumers that want a DOM-free +declaration graph can opt into `@tanstack/charts/types`. Shared definitions can +replace browser-root imports with `@tanstack/charts/portable`; granular entries +remain the bundle-sensitive option. Neither path changes existing published +web behavior. + +The private package is not publishable as it stands. Metro resolves its +workspace source, and the package has no production build or published export +map. A native-specific build, declaration, tarball, install, +conditional-export, and Metro-consumer gate is part of productionization. + +## Pros and cons + +### Advantages + +- Most data-to-geometry behavior remains one implementation. +- Existing definitions, accessors, D3 scales, custom marks, polar charts, and + geographic paths remain usable. +- The direct scene visitor is small and avoids an SVG XML parse/reconcile step. +- `react-native-svg` provides one renderer across iOS and Android and supports + the current React Native architecture. +- Native callbacks receive the original datum objects because the scene and + interaction model stay in one JavaScript runtime. +- The separate package keeps native dependencies and platform assumptions out + of web bundles. + +### Costs + +- Rendering parity is only the easy half; text, input, tooltips, animation, + accessibility, and export are host products. +- `react-native-svg` adds both JavaScript and native binary code. +- Many SVG nodes can become expensive before the shared scene compiler does. +- Native support needs devices, release builds, TalkBack/VoiceOver testing, + and two platform-specific failure surfaces. +- Current interaction and tooltip ownership must be refactored out of a mature + DOM renderer without regressing web behavior. +- A publishable native package needs a separate packed-declaration gate because + React Native and DOM global declarations conflict in the current web fixture. + +## Verification performed + +- 13 focused POC tests cover every scene primitive, gradients, clips, paint + resolution, focus modes, point restoration, placement, chart compilation, + and no-speculative-size behavior. Component mapping tests use React DOM + server rendering with native modules mocked; they are structural tests, not + native renderer tests. +- The native package and the normal React Native application configuration + typecheck. +- The repository-wide typecheck passes with the native dependency graph. +- The prerequisite PR's packed gate validates both portable entries without + changing the browser root. +- Existing locked web bundle baselines remain unchanged. +- Production Metro bundles complete for iOS and Android. +- Source-map gates prove the full native entries do not include guarded browser + implementation files. + +A strict native consumer with `skipLibCheck: false` now gets past the Charts +DOM boundary and stops in `@types/d3-array`, whose `blurImage` declaration +references the browser global `ImageData`. An automated diagnostic accepts +only those two known errors, or a clean result after the upstream declaration +is fixed. The POC does not add a fake global or pull DOM libraries into native +to hide the upstream declaration problem. + +The native declaration check and isolated esbuild boundary run in the normal +validation workflow. The eight-build iOS/Android Metro measurement remains a +local spike command rather than a mandatory CI gate. + +Not performed: + +- simulator or physical-device rendering; +- native component interaction tests; +- visual comparison against the conformance corpus; +- Hermes execution or profiling; +- 1k/10k-point interaction and memory tests; +- release application binary comparison; +- VoiceOver and TalkBack validation; +- Expo managed-workflow validation; +- motion, export, or Skia implementation. + +## Production path + +### Phase 1: shared behavior and a releasable SVG host + +Extract interaction and tooltip policy, add native theme ownership, complete +the typography contract, replace the proof's responder policy, and add a +native-specific package gate. Keep the package scoped to the tested RN/RNSVG +pair. + +Estimated effort: 3–5 engineering weeks. + +### Phase 2: device confidence + +Add bare and Expo fixtures, iOS and Android release builds, a platform-neutral +definition corpus, screenshot/geometry comparison, VoiceOver/TalkBack flows, +binary-size measurement, and sustained interaction benchmarks. + +Estimated effort: 3–5 engineering weeks. + +### Phase 3: broader parity + +Add renderer-neutral motion, native export/share, advanced gesture recipes, +and a Skia renderer only if measured SVG node pressure justifies it. Expand the +supported version matrix from evidence. + +Estimated effort: 4–10 engineering weeks, strongly dependent on motion, +accessibility, and dense-data requirements. + +An honest SVG-native MVP is therefore roughly 6–10 weeks. Broad parity with +the current web product is closer to 10–20 weeks. These are engineering ranges, +not schedule commitments. + +## Recommendation + +Proceed to Phase 1 if a real React Native product is planned. The architecture +is sound and the JavaScript cost is reasonable for a charting package. Keep the +package private if the immediate goal is only optional ecosystem coverage. + +Do not start a NativeScript adapter in parallel. The earlier +[native platform support spike](./NATIVE-PLATFORM-SUPPORT-SPIKE.md) remains the +architecture comparison; this proof increases confidence specifically for +React Native because its runtime, Metro pipeline, SVG implementation, and +interaction surface were exercised. + +## Primary platform references + +- [React Native 0.86 release](https://reactnative.dev/blog/2026/06/11/react-native-0.86) +- [React Native version support status](https://reactnative.dev/versions.html) +- [React Native layout events](https://reactnative.dev/docs/layoutevent) +- [React Native accessibility](https://reactnative.dev/docs/accessibility) +- [`react-native-svg` support and compatibility](https://github.com/software-mansion/react-native-svg) +- [Metro package exports and the `react-native` condition](https://metrobundler.dev/docs/package-exports/) diff --git a/benchmarks/entries/charts-react-native-line.ts b/benchmarks/entries/charts-react-native-line.ts new file mode 100644 index 0000000..88ab0a3 --- /dev/null +++ b/benchmarks/entries/charts-react-native-line.ts @@ -0,0 +1,11 @@ +import { scaleLinear } from 'd3-scale' +import { lineY } from '@tanstack/charts/line' +import { defineChart } from '@tanstack/charts/scene' + +export { Chart } from '@tanstack/react-native-charts' + +export const definition = defineChart({ + marks: [lineY([4, 9, 7])], + x: { scale: scaleLinear().domain([0, 2]) }, + y: { scale: scaleLinear().domain([0, 10]) }, +}) diff --git a/benchmarks/entries/charts-react-native.ts b/benchmarks/entries/charts-react-native.ts new file mode 100644 index 0000000..c7629dd --- /dev/null +++ b/benchmarks/entries/charts-react-native.ts @@ -0,0 +1 @@ +export { Chart } from '@tanstack/react-native-charts' diff --git a/examples/charts-react-native/App.tsx b/examples/charts-react-native/App.tsx new file mode 100644 index 0000000..77dcaef --- /dev/null +++ b/examples/charts-react-native/App.tsx @@ -0,0 +1,66 @@ +import * as React from 'react' +import { SafeAreaView, Text, View } from 'react-native' +import { scaleLinear } from 'd3-scale' +import { lineY } from '@tanstack/charts/line' +import { defineChart } from '@tanstack/charts/scene' +import { Chart } from '@tanstack/react-native-charts' + +const data = [ + { month: 1, revenue: 12 }, + { month: 2, revenue: 18 }, + { month: 3, revenue: 15 }, + { month: 4, revenue: 26 }, + { month: 5, revenue: 31 }, +] + +const definition = defineChart( + { + marks: [ + lineY(data, { + x: 'month', + y: 'revenue', + stroke: 'var(--revenue, #2563eb)', + strokeWidth: 3, + points: true, + }), + ], + x: { + label: 'Month', + scale: scaleLinear().domain([1, 5]), + }, + y: { + label: 'Revenue', + grid: true, + scale: scaleLinear().domain([0, 35]), + }, + }, + { + focus: 'nearest-x', + tooltip: { sticky: true }, + }, +) + +export default function App() { + return ( + + + ( + + {defaultBody} + {pinned ? ( + + Pinned + + ) : null} + + )} + /> + + + ) +} diff --git a/examples/charts-react-native/app.json b/examples/charts-react-native/app.json new file mode 100644 index 0000000..af4d3ea --- /dev/null +++ b/examples/charts-react-native/app.json @@ -0,0 +1,4 @@ +{ + "name": "ChartsNativePoc", + "displayName": "Charts Native POC" +} diff --git a/examples/charts-react-native/babel.config.cjs b/examples/charts-react-native/babel.config.cjs new file mode 100644 index 0000000..3e0218e --- /dev/null +++ b/examples/charts-react-native/babel.config.cjs @@ -0,0 +1,3 @@ +module.exports = { + presets: ['module:@react-native/babel-preset'], +} diff --git a/examples/charts-react-native/index.blank.js b/examples/charts-react-native/index.blank.js new file mode 100644 index 0000000..d5f656f --- /dev/null +++ b/examples/charts-react-native/index.blank.js @@ -0,0 +1,9 @@ +import * as React from 'react' +import { AppRegistry, View } from 'react-native' +import { name as appName } from './app.json' + +function BlankApp() { + return React.createElement(View) +} + +AppRegistry.registerComponent(appName, () => BlankApp) diff --git a/examples/charts-react-native/index.core.js b/examples/charts-react-native/index.core.js new file mode 100644 index 0000000..98759e7 --- /dev/null +++ b/examples/charts-react-native/index.core.js @@ -0,0 +1,23 @@ +import * as React from 'react' +import { AppRegistry, View } from 'react-native' +import { scaleLinear } from 'd3-scale' +import { lineY } from '@tanstack/charts/line' +import { createChartRuntime } from '@tanstack/charts/runtime' +import { defineChart } from '@tanstack/charts/scene' +import { name as appName } from './app.json' + +const definition = defineChart({ + marks: [lineY([4, 9, 7])], + x: { scale: scaleLinear().domain([0, 2]) }, + y: { scale: scaleLinear().domain([0, 10]) }, +}) +const runtime = createChartRuntime() +const scene = runtime.render(definition, { width: 320, height: 240 }) + +function CoreApp() { + return React.createElement(View, { + accessibilityLabel: `${scene.points.length} chart points`, + }) +} + +AppRegistry.registerComponent(appName, () => CoreApp) diff --git a/examples/charts-react-native/index.js b/examples/charts-react-native/index.js new file mode 100644 index 0000000..33fbb36 --- /dev/null +++ b/examples/charts-react-native/index.js @@ -0,0 +1,5 @@ +import { AppRegistry } from 'react-native' +import App from './App' +import { name as appName } from './app.json' + +AppRegistry.registerComponent(appName, () => App) diff --git a/examples/charts-react-native/index.svg.js b/examples/charts-react-native/index.svg.js new file mode 100644 index 0000000..0e7e94f --- /dev/null +++ b/examples/charts-react-native/index.svg.js @@ -0,0 +1,23 @@ +import * as React from 'react' +import { AppRegistry, View } from 'react-native' +import { Circle, Svg } from 'react-native-svg' +import { name as appName } from './app.json' + +function SvgApp() { + return React.createElement( + View, + null, + React.createElement( + Svg, + { width: 100, height: 100 }, + React.createElement(Circle, { + cx: 50, + cy: 50, + r: 20, + fill: '#2563eb', + }), + ), + ) +} + +AppRegistry.registerComponent(appName, () => SvgApp) diff --git a/examples/charts-react-native/metro.config.cjs b/examples/charts-react-native/metro.config.cjs new file mode 100644 index 0000000..51160f8 --- /dev/null +++ b/examples/charts-react-native/metro.config.cjs @@ -0,0 +1,14 @@ +const path = require('node:path') +const { getDefaultConfig, mergeConfig } = require('@react-native/metro-config') + +const workspaceRoot = path.resolve(__dirname, '../..') + +module.exports = mergeConfig(getDefaultConfig(__dirname), { + watchFolders: [workspaceRoot], + resolver: { + nodeModulesPaths: [ + path.resolve(__dirname, 'node_modules'), + path.resolve(workspaceRoot, 'node_modules'), + ], + }, +}) diff --git a/examples/charts-react-native/package.json b/examples/charts-react-native/package.json new file mode 100644 index 0000000..e2ad3e6 --- /dev/null +++ b/examples/charts-react-native/package.json @@ -0,0 +1,30 @@ +{ + "name": "@charts-poc/react-native-example", + "version": "0.0.0", + "private": true, + "license": "MIT", + "scripts": { + "bundle:android": "react-native bundle --entry-file index.js --platform android --dev false --minify true --bundle-output ../../.bundle-output/react-native-chart.android.js --sourcemap-output ../../.bundle-output/react-native-chart.android.map", + "bundle:ios": "react-native bundle --entry-file index.js --platform ios --dev false --minify true --bundle-output ../../.bundle-output/react-native-chart.ios.js --sourcemap-output ../../.bundle-output/react-native-chart.ios.map", + "start": "react-native start" + }, + "dependencies": { + "@tanstack/charts": "workspace:*", + "@tanstack/react-native-charts": "workspace:*", + "d3-scale": "4.0.2", + "react": "19.2.3", + "react-native": "0.86.0", + "react-native-svg": "15.15.5" + }, + "devDependencies": { + "@babel/core": "^7.25.2", + "@babel/runtime": "^7.25.0", + "@react-native-community/cli": "20.1.0", + "@react-native/babel-preset": "0.86.0", + "@react-native/metro-config": "0.86.0", + "@react-native/typescript-config": "0.86.0" + }, + "engines": { + "node": ">=22.11.0" + } +} diff --git a/examples/charts-react-native/tsconfig.json b/examples/charts-react-native/tsconfig.json new file mode 100644 index 0000000..e441498 --- /dev/null +++ b/examples/charts-react-native/tsconfig.json @@ -0,0 +1,9 @@ +{ + "extends": "@react-native/typescript-config", + "compilerOptions": { + "lib": ["es2022"], + "types": ["react", "react-native"] + }, + "include": ["App.tsx"], + "exclude": ["node_modules"] +} diff --git a/examples/charts-react-native/tsconfig.strict.json b/examples/charts-react-native/tsconfig.strict.json new file mode 100644 index 0000000..8c174d9 --- /dev/null +++ b/examples/charts-react-native/tsconfig.strict.json @@ -0,0 +1,6 @@ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "skipLibCheck": false + } +} diff --git a/package.json b/package.json index 7db1474..ba2696d 100644 --- a/package.json +++ b/package.json @@ -46,6 +46,8 @@ "conformance:quick": "node scripts/compare-plot-catalog.mjs --profile=quick", "conformance:size": "node scripts/compare-plot-catalog.mjs --size-only", "performance": "node scripts/measure-rendering.mjs", + "react-native:poc:bundle": "node scripts/measure-react-native-poc.mjs", + "react-native:poc:types": "node scripts/check-react-native-types.mjs", "package:check": "node scripts/check-packed-consumers.mjs && pnpm adapters:check", "release:artifacts": "node scripts/build-release-artifacts.mjs", "release:check": "node scripts/publish-release.mjs --check", @@ -65,6 +67,7 @@ "@tanstack/charts": "workspace:*", "@tanstack/charts-d3": "workspace:*", "@tanstack/octane-charts": "workspace:*", + "@tanstack/react-native-charts": "workspace:*", "@tanstack/react-charts": "workspace:*", "@types/d3-array": "^3.2.2", "@types/d3-brush": "^3.0.6", diff --git a/packages/charts-core/src/reconcile.test.ts b/packages/charts-core/src/reconcile.test.ts index 9fe0fc2..a17e1ce 100644 --- a/packages/charts-core/src/reconcile.test.ts +++ b/packages/charts-core/src/reconcile.test.ts @@ -142,7 +142,7 @@ describe('keyed SVG reconciliation', () => { const cancelFrame = vi .spyOn(window, 'cancelAnimationFrame') .mockImplementation((handle) => { - callbacks.delete(handle) + if (typeof handle === 'number') callbacks.delete(handle) }) reconcileChartSvg( container, diff --git a/packages/react-native-charts/LICENSE b/packages/react-native-charts/LICENSE new file mode 100644 index 0000000..cce7e25 --- /dev/null +++ b/packages/react-native-charts/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2026 TanStack + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/packages/react-native-charts/README.md b/packages/react-native-charts/README.md new file mode 100644 index 0000000..fbbb30e --- /dev/null +++ b/packages/react-native-charts/README.md @@ -0,0 +1,6 @@ +# React Native Charts host spike + +Experimental React Native host for the shared `@tanstack/charts` definition, +runtime, and scene graph. It renders with `react-native-svg`. + +This package is a proof of concept, not a supported release. diff --git a/packages/react-native-charts/package.json b/packages/react-native-charts/package.json new file mode 100644 index 0000000..5d29c34 --- /dev/null +++ b/packages/react-native-charts/package.json @@ -0,0 +1,19 @@ +{ + "name": "@tanstack/react-native-charts", + "version": "0.0.0", + "private": true, + "license": "MIT", + "type": "module", + "sideEffects": false, + "exports": { + ".": "./src/index.ts" + }, + "dependencies": { + "@tanstack/charts": "workspace:*" + }, + "peerDependencies": { + "react": "^19.2.3", + "react-native": "^0.86.0", + "react-native-svg": "^15.15.5" + } +} diff --git a/packages/react-native-charts/src/Chart.test.tsx b/packages/react-native-charts/src/Chart.test.tsx new file mode 100644 index 0000000..ee89018 --- /dev/null +++ b/packages/react-native-charts/src/Chart.test.tsx @@ -0,0 +1,71 @@ +import * as React from 'react' +import { renderToStaticMarkup } from 'react-dom/server' +import { scaleLinear } from 'd3-scale' +import { describe, expect, it, vi } from 'vitest' +import { lineY } from '@tanstack/charts/line' +import { defineChart } from '@tanstack/charts/scene' +import { Chart } from './Chart' + +vi.mock('react-native', () => ({ + Text: 'span', + View: 'div', +})) + +vi.mock('react-native-svg', () => ({ + Circle: 'circle', + ClipPath: 'clipPath', + Defs: 'defs', + G: 'g', + Line: 'line', + LinearGradient: 'linearGradient', + Path: 'path', + Rect: 'rect', + Stop: 'stop', + Svg: 'svg', + Text: 'text', +})) + +const data = [ + { month: 1, value: 8 }, + { month: 2, value: 12 }, +] +const definition = defineChart({ + marks: [ + lineY(data, { + x: 'month', + y: 'value', + stroke: 'var(--series, #2563eb)', + points: true, + }), + ], + x: { scale: scaleLinear().domain([1, 2]) }, + y: { scale: scaleLinear().domain([8, 12]) }, +}) + +describe('React Native Chart', () => { + it('compiles a shared definition directly into native SVG components', () => { + const markup = renderToStaticMarkup( + , + ) + + expect(markup).toContain(' { + const markup = renderToStaticMarkup( + , + ) + + expect(markup).not.toContain(' { + scene: ChartScene +} + +export interface ChartProps< + TDatum = unknown, + TXValue extends ChartValue = ChartValue, + TYValue extends ChartValue = ChartValue, +> { + definition: ChartDefinition + accessibilityLabel: string + accessibilityHint?: string + width?: number + height?: number + aspectRatio?: number + style?: StyleProp + color?: ColorValue + focusFill?: ColorValue + fontFamily?: string + idPrefix?: string + testID?: string + measureText?: ChartTextMeasurer + resolvePaint?: NativePaintResolver + onFocusChange?: (point: ChartPoint | null) => void + onFocusGroupChange?: ( + points: readonly ChartPoint[], + ) => void + onSelect?: (point: ChartPoint | null) => void + onRender?: ( + context: NativeChartRenderContext, + ) => void + renderTooltip?: ( + context: NativeChartTooltipRenderContext, + ) => React.ReactNode +} + +export function Chart< + TDatum, + TXValue extends ChartValue = ChartValue, + TYValue extends ChartValue = ChartValue, +>({ + definition, + accessibilityLabel, + accessibilityHint, + width, + height, + aspectRatio, + style, + color = '#111827', + focusFill = '#ffffff', + fontFamily, + idPrefix: idPrefixOption, + testID, + measureText, + resolvePaint = resolveNativePaint, + onFocusChange, + onFocusGroupChange, + onSelect, + onRender, + renderTooltip, +}: ChartProps) { + const generatedId = React.useId() + const idPrefix = + idPrefixOption ?? + `ts-chart-${generatedId.replaceAll(/[^a-zA-Z0-9_-]/g, '')}` + const runtime = React.useMemo( + () => createChartRuntime(), + [], + ) + const [layout, setLayout] = React.useState<{ + width: number + height: number + } | null>(null) + const resolvedAspectRatio = positiveFinite(aspectRatio) + const explicitWidth = positiveFinite(width) + const explicitHeight = positiveFinite(height) + const sceneSize = resolveSceneSize( + explicitWidth, + explicitHeight, + resolvedAspectRatio, + layout, + ) + const scene = React.useMemo( + () => + sceneSize ? runtime.render(definition, sceneSize, { measureText }) : null, + [definition, measureText, runtime, sceneSize?.height, sceneSize?.width], + ) + const focusModel = React.useMemo( + () => (scene ? createNativeChartFocusModel(scene, definition) : null), + [definition, scene], + ) + const [focusedPoints, setFocusedPoints] = React.useState< + readonly ChartPoint[] + >([]) + const focusedPointsRef = React.useRef(focusedPoints) + const [pinnedKey, setPinnedKey] = React.useState(null) + const [pointer, setPointer] = React.useState( + null, + ) + const tooltipOptions = + definition.tooltip && typeof definition.tooltip === 'object' + ? (definition.tooltip as ChartTooltipOptions) + : undefined + const sticky = Boolean(definition.tooltip) && tooltipOptions?.sticky !== false + const interactive = Boolean(scene?.points.length) + + const commitFocus = React.useCallback( + (points: readonly ChartPoint[]) => { + if (samePointList(points, focusedPointsRef.current)) return + focusedPointsRef.current = points + setFocusedPoints(points) + onFocusChange?.(points[0] ?? null) + onFocusGroupChange?.(points) + }, + [onFocusChange, onFocusGroupChange], + ) + + React.useEffect(() => () => runtime.destroy(), [runtime]) + React.useEffect(() => { + if (scene) onRender?.({ scene }) + }, [onRender, scene]) + React.useEffect(() => { + const previous = focusedPointsRef.current[0] + if (!focusModel || !previous) return + const restored = focusModel.restore(previous) + if (restored) { + commitFocus(focusModel.group(restored)) + } else { + setPinnedKey(null) + commitFocus([]) + } + }, [commitFocus, focusModel]) + React.useEffect(() => { + if (!sticky) setPinnedKey(null) + }, [sticky]) + + const dismiss = React.useCallback(() => { + setPinnedKey(null) + setPointer(null) + commitFocus([]) + }, [commitFocus]) + + const pointAtEvent = React.useCallback( + (event: GestureResponderEvent) => { + if (!scene || !focusModel) return [] + const measuredWidth = layout?.width ?? scene.width + const measuredHeight = layout?.height ?? scene.height + if (measuredWidth <= 0 || measuredHeight <= 0) return [] + const position = { + x: (event.nativeEvent.locationX / measuredWidth) * scene.width, + y: (event.nativeEvent.locationY / measuredHeight) * scene.height, + } + setPointer(position) + return focusModel.resolve(position.x, position.y) + }, + [focusModel, layout?.height, layout?.width, scene], + ) + + const handleResponderGrant = (event: GestureResponderEvent) => { + if (pinnedKey) return + commitFocus(pointAtEvent(event)) + } + const handleResponderMove = (event: GestureResponderEvent) => { + if (pinnedKey) return + commitFocus(pointAtEvent(event)) + } + const handleResponderRelease = (event: GestureResponderEvent) => { + const points = pointAtEvent(event) + const point = points[0] ?? null + if (sticky) setPinnedKey(pinnedKey ? null : (point?.key ?? null)) + commitFocus(points) + onSelect?.(point) + } + const handleResponderTerminate = () => { + if (pinnedKey) return + setPointer(null) + commitFocus([]) + } + const handleLayout = (event: LayoutChangeEvent) => { + const next = event.nativeEvent.layout + if (!positiveFinite(next.width) || !positiveFinite(next.height)) return + setLayout((current) => + current?.width === next.width && current.height === next.height + ? current + : { width: next.width, height: next.height }, + ) + } + + const navigate = (direction: -1 | 1) => { + if (!focusModel) return + const point = adjacentFocusPoint( + focusModel, + focusedPointsRef.current[0] ?? null, + direction, + ) + setPointer(null) + commitFocus(point ? focusModel.group(point) : []) + } + const activate = () => { + const point = focusedPointsRef.current[0] ?? null + if (!point) return + if (sticky) setPinnedKey((current) => (current ? null : point.key)) + onSelect?.(point) + } + const handleAccessibilityAction = (event: AccessibilityActionEvent) => { + switch (event.nativeEvent.actionName) { + case 'increment': + navigate(1) + break + case 'decrement': + navigate(-1) + break + case 'activate': + activate() + break + case 'escape': + dismiss() + break + } + } + const handleFocus = () => { + if (definition.keyboard === false || focusedPointsRef.current.length) return + navigate(1) + } + const focusedPoint = focusedPoints[0] ?? null + + return ( + false} + onResponderGrant={handleResponderGrant} + onResponderMove={handleResponderMove} + onResponderRelease={handleResponderRelease} + onResponderTerminate={handleResponderTerminate} + onResponderTerminationRequest={() => true} + onStartShouldSetResponder={() => interactive} + style={[ + { + position: 'relative', + overflow: 'visible', + width: explicitWidth ?? '100%', + height: + explicitHeight ?? + (resolvedAspectRatio === undefined ? 320 : undefined), + aspectRatio: + explicitHeight === undefined ? resolvedAspectRatio : undefined, + }, + style, + ]} + testID={testID} + > + {scene ? ( + <> + + + {definition.tooltip && focusedPoints.length ? ( + + ) : null} + + ) : null} + + ) +} + +function resolveSceneSize( + width: number | undefined, + height: number | undefined, + aspectRatio: number | undefined, + layout: { width: number; height: number } | null, +) { + const resolvedWidth = width ?? layout?.width + if (!resolvedWidth) return null + const resolvedHeight = + height ?? + (aspectRatio === undefined + ? (layout?.height ?? (width === undefined ? undefined : 320)) + : resolvedWidth / aspectRatio) + return resolvedHeight + ? { width: resolvedWidth, height: resolvedHeight } + : null +} + +function positiveFinite(value: number | undefined) { + return value !== undefined && Number.isFinite(value) && value > 0 + ? value + : undefined +} + +function describePoint(point: ChartPoint) { + return [ + point.groupLabel, + formatValue(point.xValue), + formatValue(point.yValue), + ] + .filter(Boolean) + .join(', ') +} + +function formatValue(value: ChartValue) { + return value instanceof Date + ? Number.isNaN(+value) + ? 'Invalid Date' + : value.toISOString().replace('T00:00:00.000Z', '') + : typeof value === 'number' + ? value.toLocaleString() + : String(value) +} diff --git a/packages/react-native-charts/src/FocusOverlay.tsx b/packages/react-native-charts/src/FocusOverlay.tsx new file mode 100644 index 0000000..1e2e386 --- /dev/null +++ b/packages/react-native-charts/src/FocusOverlay.tsx @@ -0,0 +1,64 @@ +import * as React from 'react' +import type { ColorValue } from 'react-native' +import { Circle, Svg } from 'react-native-svg' +import type { ChartPoint, ChartValue } from '@tanstack/charts/types' +import { resolveNativeSolidPaint, type NativePaintResolver } from './paint' + +export interface NativeChartFocusOverlayProps< + TDatum, + TXValue extends ChartValue, + TYValue extends ChartValue, +> { + width: number + height: number + points: readonly ChartPoint[] + color: ColorValue + fill: ColorValue + resolvePaint: NativePaintResolver +} + +export function NativeChartFocusOverlay< + TDatum, + TXValue extends ChartValue, + TYValue extends ChartValue, +>({ + width, + height, + points, + color, + fill, + resolvePaint, +}: NativeChartFocusOverlayProps) { + if (!points.length) return null + return ( + + {points.map((point, index) => ( + + ))} + + ) +} + +const absoluteFill = { + position: 'absolute', + left: 0, + top: 0, + right: 0, + bottom: 0, +} as const diff --git a/packages/react-native-charts/src/SvgScene.test.tsx b/packages/react-native-charts/src/SvgScene.test.tsx new file mode 100644 index 0000000..fbed133 --- /dev/null +++ b/packages/react-native-charts/src/SvgScene.test.tsx @@ -0,0 +1,165 @@ +import * as React from 'react' +import { renderToStaticMarkup } from 'react-dom/server' +import { describe, expect, it, vi } from 'vitest' +import type { ChartScene, SceneNode } from '@tanstack/charts/types' +import { resolveNativePaint } from './paint' +import { NativeChartScene, resolveNativeLineJoin } from './SvgScene' + +vi.mock('react-native-svg', () => ({ + Circle: 'circle', + ClipPath: 'clipPath', + Defs: 'defs', + G: 'g', + Line: 'line', + LinearGradient: 'linearGradient', + Path: 'path', + Rect: 'rect', + Stop: 'stop', + Svg: 'svg', + Text: 'text', +})) + +describe('React Native SVG scene renderer', () => { + it('maps every scene primitive, gradients, clipping, and authored paths', () => { + const markup = renderToStaticMarkup( + , + ) + + expect(markup).toContain(' { + expect(resolveNativeLineJoin('arcs')).toBe('round') + expect(resolveNativeLineJoin('miter-clip')).toBe('miter') + expect(resolveNativeLineJoin('round')).toBe('round') + }) +}) + +function scene(): ChartScene { + const nodes: SceneNode[] = [ + { + kind: 'group', + key: 'translated-grid', + translateX: 10, + translateY: 12, + clip: { x: 0, y: 0, width: 80, height: 60 }, + style: { + stroke: 'currentColor', + strokeOpacity: 0.4, + strokeWidth: 3, + strokeDasharray: '2 4', + }, + children: [{ kind: 'rule', key: 'rule', x1: 0, y1: 0, x2: 30, y2: 30 }], + }, + { + kind: 'polyline', + key: 'line', + points: [ + [2, 4], + [20, 30], + ], + style: { fill: 'none', stroke: '#abcdef', lineJoin: 'arcs' }, + }, + { + kind: 'polyline', + key: 'curved-line', + points: [], + path: 'M0,0C10,20,20,20,30,0', + style: { + fill: 'none', + stroke: '#334455', + lineJoin: 'miter-clip', + }, + }, + { + kind: 'area', + key: 'area', + points: [ + [0, 20], + [20, 0], + [40, 20], + ], + style: { fill: 'url(#fill)' }, + }, + { + kind: 'dot', + key: 'dot', + x: 50, + y: 30, + radius: 5, + style: { fill: 'var(--dot, #ff0000)' }, + }, + { + kind: 'rect', + key: 'rect', + x: 60, + y: 10, + width: 20, + height: 30, + radius: 4, + style: { fill: '#00ff00' }, + }, + { + kind: 'label', + key: 'label', + x: 40, + y: 50, + text: 'Native', + anchor: 'middle', + baseline: 'middle', + rotate: -30, + fontSize: 12, + fontWeight: 600, + style: { fill: '#111111' }, + }, + ] + return { + width: 100, + height: 60, + margin: { top: 0, right: 0, bottom: 0, left: 0 }, + chart: { x: 0, y: 0, width: 100, height: 60 }, + nodes, + points: [], + scales: {}, + colors: { + type: 'ordinal', + domain: [], + range: [], + map: () => '#2563eb', + }, + gradients: [ + { + id: 'fill', + stops: [ + { offset: 0, color: '#2563eb', opacity: 0.2 }, + { offset: 1, color: '#2563eb' }, + ], + }, + ], + theme: { + foreground: '#111111', + muted: '#666666', + grid: '#999999', + background: '#f8fafc', + palette: ['#2563eb'], + }, + } +} diff --git a/packages/react-native-charts/src/SvgScene.tsx b/packages/react-native-charts/src/SvgScene.tsx new file mode 100644 index 0000000..e0a4f34 --- /dev/null +++ b/packages/react-native-charts/src/SvgScene.tsx @@ -0,0 +1,287 @@ +import * as React from 'react' +import type { ColorValue } from 'react-native' +import { + Circle, + ClipPath, + Defs, + G, + Line, + LinearGradient, + Path, + Rect, + Stop, + Svg, + Text, +} from 'react-native-svg' +import type { CommonPathProps, Linejoin } from 'react-native-svg' +import type { + ChartScene, + SceneGroup, + SceneNode, + SceneStyle, +} from '@tanstack/charts/types' +import type { NativePaintResolver } from './paint' + +export interface NativeChartSceneProps { + scene: ChartScene + color: ColorValue + fontFamily?: string + idPrefix: string + resolvePaint: NativePaintResolver +} + +export const NativeChartScene = React.memo(function NativeChartScene({ + scene, + color, + fontFamily, + idPrefix, + resolvePaint, +}: NativeChartSceneProps) { + const gradientIds = React.useMemo( + () => new Set(scene.gradients.map((gradient) => gradient.id)), + [scene.gradients], + ) + const paint = React.useCallback( + (value: string) => + resolveScenePaint(value, gradientIds, idPrefix, resolvePaint, color), + [color, gradientIds, idPrefix, resolvePaint], + ) + + return ( + + {scene.gradients.length ? ( + + {scene.gradients.map((gradient) => ( + + {gradient.stops.map((stop, index) => ( + + ))} + + ))} + + ) : null} + {scene.theme.background === 'transparent' ? null : ( + + )} + {scene.nodes.map((node) => renderSceneNode(node, idPrefix, paint))} + + ) +}) + +function renderSceneNode( + node: SceneNode, + idPrefix: string, + paint: (value: string) => ColorValue, +): React.ReactNode { + const style = nativeSceneStyle(node.style, paint) + + switch (node.kind) { + case 'group': + return renderGroup(node, idPrefix, paint, style) + case 'rule': + return ( + + ) + case 'polyline': + return ( + + ) + case 'area': + return ( + + ) + case 'dot': + return ( + + ) + case 'rect': + return ( + + ) + case 'label': + return ( + + {node.text} + + ) + } +} + +function renderGroup( + node: SceneGroup, + idPrefix: string, + paint: (value: string) => ColorValue, + style: ReturnType, +) { + const clipId = node.clip + ? scopedId(idPrefix, `clip-${stableId(node.key)}`) + : undefined + const transform = + node.translateX === undefined && node.translateY === undefined + ? undefined + : `translate(${node.translateX ?? 0} ${node.translateY ?? 0})` + + return ( + + {node.clip && clipId ? ( + + + + + + ) : null} + {node.children.map((child) => renderSceneNode(child, idPrefix, paint))} + + ) +} + +function nativeSceneStyle( + style: SceneStyle | undefined, + paint: (value: string) => ColorValue, +): CommonPathProps & { opacity?: number } { + if (!style) return {} + return { + fill: style.fill === undefined ? undefined : paint(style.fill), + fillOpacity: style.fillOpacity, + stroke: style.stroke === undefined ? undefined : paint(style.stroke), + strokeOpacity: style.strokeOpacity, + strokeWidth: style.strokeWidth, + opacity: style.opacity, + strokeLinecap: style.lineCap, + strokeLinejoin: resolveNativeLineJoin(style.lineJoin), + strokeDasharray: style.strokeDasharray, + } +} + +export function resolveNativeLineJoin( + lineJoin: SceneStyle['lineJoin'], +): Linejoin | undefined { + if (lineJoin === 'arcs') return 'round' + if (lineJoin === 'miter-clip') return 'miter' + return lineJoin +} + +function resolveScenePaint( + value: string, + gradientIds: ReadonlySet, + idPrefix: string, + resolvePaint: NativePaintResolver, + color: ColorValue, +) { + const match = /^url\(#([^)]+)\)$/.exec(value) + const id = match?.[1] + if (id && gradientIds.has(id)) return `url(#${scopedId(idPrefix, id)})` + return resolvePaint(value, { color }) +} + +function pointsPath( + points: readonly (readonly [number, number])[], + close: boolean, +) { + return `${points + .map(([x, y], index) => `${index === 0 ? 'M' : 'L'}${x},${y}`) + .join('')}${close ? 'Z' : ''}` +} + +function scopedId(prefix: string, id: string) { + return prefix ? `${prefix}-${sanitizeId(id)}` : sanitizeId(id) +} + +function sanitizeId(value: string) { + return value.replaceAll(/[^a-zA-Z0-9_-]/g, '') +} + +function stableId(value: string) { + let hash = 2166136261 + for (let index = 0; index < value.length; index += 1) { + hash = Math.imul(hash ^ value.charCodeAt(index), 16777619) + } + return (hash >>> 0).toString(36) +} + +function percent(value: number) { + return `${Math.max(0, Math.min(1, value)) * 100}%` +} diff --git a/packages/react-native-charts/src/Tooltip.test.ts b/packages/react-native-charts/src/Tooltip.test.ts new file mode 100644 index 0000000..a3f5316 --- /dev/null +++ b/packages/react-native-charts/src/Tooltip.test.ts @@ -0,0 +1,82 @@ +import { describe, expect, it, vi } from 'vitest' +import type { ChartPoint, ChartScene } from '@tanstack/charts/types' +import { createNativeTooltipContent, placeNativeTooltip } from './Tooltip' + +vi.mock('react-native', () => ({ + Text: 'span', + View: 'div', +})) + +describe('native tooltip model', () => { + it('builds the supported shared-axis default content', () => { + const points = [point('alpha', 'Alpha', 3), point('beta', 'Beta', 7)] + + expect(createNativeTooltipContent(points, scene(points))).toEqual({ + title: 'x: 1', + rows: [ + { label: 'Alpha', value: '3', color: '#2563eb' }, + { label: 'Beta', value: '7', color: '#f97316' }, + ], + }) + }) + + it('chooses and clamps a placement inside the native layout boundary', () => { + expect( + placeNativeTooltip( + { x: 4, y: 4 }, + { width: 20, height: 10 }, + { width: 100, height: 60 }, + 'top', + 10, + ), + ).toEqual({ left: 8, top: 8, placement: 'top' }) + }) +}) + +function point( + key: string, + groupLabel: string, + yValue: number, +): ChartPoint { + return { + key, + markId: 'series', + group: key, + groupLabel, + datum: null, + datumIndex: 0, + xValue: 1, + yValue, + x: 20, + y: yValue * 4, + color: key === 'alpha' ? '#2563eb' : '#f97316', + } +} + +function scene( + points: readonly ChartPoint[], +): ChartScene { + return { + width: 100, + height: 60, + margin: { top: 0, right: 0, bottom: 0, left: 0 }, + chart: { x: 0, y: 0, width: 100, height: 60 }, + nodes: [], + points, + scales: {}, + colors: { + type: 'ordinal', + domain: ['alpha', 'beta'], + range: ['#2563eb', '#f97316'], + map: (value) => (value === 'beta' ? '#f97316' : '#2563eb'), + }, + gradients: [], + theme: { + foreground: '#111827', + muted: '#6b7280', + grid: '#d1d5db', + background: 'transparent', + palette: ['#2563eb', '#f97316'], + }, + } +} diff --git a/packages/react-native-charts/src/Tooltip.tsx b/packages/react-native-charts/src/Tooltip.tsx new file mode 100644 index 0000000..7fb615b --- /dev/null +++ b/packages/react-native-charts/src/Tooltip.tsx @@ -0,0 +1,491 @@ +import * as React from 'react' +import type { + ColorValue, + LayoutChangeEvent, + TextStyle, + ViewStyle, +} from 'react-native' +import { Text, View } from 'react-native' +import type { + ChartPoint, + ChartScene, + ChartTooltipContent, + ChartTooltipContentContext, + ChartTooltipOptions, + ChartTooltipPlacement, + ChartTooltipPosition, + ChartValue, +} from '@tanstack/charts/types' +import { resolveNativeSolidPaint, type NativePaintResolver } from './paint' + +export interface NativeChartTooltipRenderContext< + TDatum, + TXValue extends ChartValue, + TYValue extends ChartValue, +> { + points: readonly ChartPoint[] + content: ChartTooltipContent | string + pinned: boolean + dismiss: () => void + defaultBody: React.ReactNode +} + +export interface NativeChartTooltipProps< + TDatum, + TXValue extends ChartValue, + TYValue extends ChartValue, +> { + scene: ChartScene + width: number + height: number + points: readonly ChartPoint[] + pointer: ChartTooltipPosition | null + options?: ChartTooltipOptions + pinned: boolean + color: ColorValue + resolvePaint: NativePaintResolver + dismiss: () => void + render?: ( + context: NativeChartTooltipRenderContext, + ) => React.ReactNode +} + +export function NativeChartTooltip< + TDatum, + TXValue extends ChartValue, + TYValue extends ChartValue, +>({ + scene, + width, + height, + points: unorderedPoints, + pointer, + options, + pinned, + color, + resolvePaint, + dismiss, + render, +}: NativeChartTooltipProps) { + const [size, setSize] = React.useState({ width: 0, height: 0 }) + const points = React.useMemo( + () => orderTooltipPoints(unorderedPoints, scene, options?.sort), + [options?.sort, scene, unorderedPoints], + ) + const point = points[0] + if (!point) return null + const content = createNativeTooltipContent(points, scene, options) + const sceneAnchor = resolveTooltipAnchor( + point, + points, + scene, + pointer, + options, + ) + const anchor = { + x: (sceneAnchor.x / scene.width) * width, + y: (sceneAnchor.y / scene.height) * height, + } + const position = placeNativeTooltip( + anchor, + size, + { width, height }, + options?.placement, + options?.offset, + ) + const defaultBody = ( + + ) + const body = + render?.({ points, content, pinned, dismiss, defaultBody }) ?? defaultBody + const accessibilityLabel = tooltipAccessibilityLabel(content) + const handleLayout = (event: LayoutChangeEvent) => { + const next = event.nativeEvent.layout + if (next.width !== size.width || next.height !== size.height) { + setSize({ width: next.width, height: next.height }) + } + } + + return ( + pinned} + pointerEvents={pinned ? 'auto' : 'none'} + style={[tooltipStyle, { left: position.left, top: position.top }]} + > + {body} + + ) +} + +function DefaultNativeTooltipBody({ + content, + color, + resolvePaint, +}: { + content: ChartTooltipContent | string + color: ColorValue + resolvePaint: NativePaintResolver +}) { + if (typeof content === 'string') { + return {content} + } + return ( + + {content.title ? ( + + {content.color ? ( + + ) : null} + {content.title} + + ) : null} + {content.rows.map((row, index) => ( + + + + {row.label} + + + {row.value} + + + ))} + + ) +} + +export function createNativeTooltipContent< + TDatum, + TXValue extends ChartValue, + TYValue extends ChartValue, +>( + points: readonly ChartPoint[], + scene: ChartScene, + options?: ChartTooltipOptions, +): ChartTooltipContent | string { + const point = points[0] + if (!point) return { rows: [] } + const context = createTooltipContentContext(scene) + const content = options?.content?.(points, context) + if (content !== undefined) return content + const formatted = options?.formatGroup?.(points) ?? options?.format?.(point) + if (formatted !== undefined) return formatted + + const sharedX = + points.length > 1 && + points.every((candidate) => chartValueEqual(candidate.xValue, point.xValue)) + if (sharedX) { + return { + title: `${context.xLabel}: ${context.formatX(point.xValue)}`, + rows: points.map((candidate) => ({ + label: candidate.groupLabel, + value: context.formatY(candidate.yValue), + color: candidate.color, + })), + } + } + + return { + title: point.group == null ? undefined : point.groupLabel, + color: point.group == null ? undefined : point.color, + rows: [ + { label: context.xLabel, value: context.formatX(point.xValue) }, + { label: context.yLabel, value: context.formatY(point.yValue) }, + ], + } +} + +function createTooltipContentContext( + scene: ChartScene, +): ChartTooltipContentContext { + return { + xLabel: findSceneLabel(scene, 'x-label') ?? 'x', + yLabel: findSceneLabel(scene, 'y-label') ?? 'y', + formatX: formatValue, + formatY: formatValue, + } +} + +function orderTooltipPoints< + TDatum, + TXValue extends ChartValue, + TYValue extends ChartValue, +>( + points: readonly ChartPoint[], + scene: ChartScene, + sort: ChartTooltipOptions['sort'], +) { + if (sort === 'focus') return [...points] + if (typeof sort === 'function') return [...points].sort(sort) + return [...points].sort( + (left, right) => + colorOrder(scene, left.group) - colorOrder(scene, right.group), + ) +} + +function colorOrder(scene: ChartScene, group: ChartPoint['group']) { + const index = group == null ? -1 : scene.colors.domain.indexOf(group) + return index < 0 ? Number.MAX_SAFE_INTEGER : index +} + +function findSceneLabel(scene: ChartScene, key: string) { + const axes = scene.nodes.find( + (node) => node.kind === 'group' && node.key === 'axes', + ) + if (axes?.kind !== 'group') return undefined + const label = axes.children.find((node) => node.key === key) + return label?.kind === 'label' ? label.text : undefined +} + +function resolveTooltipAnchor< + TDatum, + TXValue extends ChartValue, + TYValue extends ChartValue, +>( + point: ChartPoint, + points: readonly ChartPoint[], + scene: ChartScene, + pointer: ChartTooltipPosition | null, + options?: ChartTooltipOptions, +): ChartTooltipPosition { + const fallback = { x: point.x, y: point.y } + const anchor = options?.anchor ?? 'point' + if (anchor === 'point') return fallback + if (anchor === 'pointer') return pointer ?? fallback + if (anchor === 'group-center') { + const x = points.map((candidate) => candidate.x) + const y = points.map((candidate) => candidate.y) + return { + x: (Math.min(...x) + Math.max(...x)) / 2, + y: (Math.min(...y) + Math.max(...y)) / 2, + } + } + const resolved = anchor(points, { + pointer, + chart: scene.chart, + width: scene.width, + height: scene.height, + }) + return resolved && Number.isFinite(resolved.x) && Number.isFinite(resolved.y) + ? resolved + : fallback +} + +export function placeNativeTooltip( + anchor: ChartTooltipPosition, + tooltip: { width: number; height: number }, + boundary: { width: number; height: number }, + placement: + | 'auto' + | ChartTooltipPlacement + | readonly ChartTooltipPlacement[] + | undefined, + offset: number | undefined, +) { + const edge = 8 + const gap = + offset !== undefined && Number.isFinite(offset) ? Math.max(0, offset) : 10 + const placements = + placement === undefined || placement === 'auto' + ? defaultTooltipPlacements + : Array.isArray(placement) + ? placement.length + ? placement + : defaultTooltipPlacements + : [placement as ChartTooltipPlacement] + const candidates = placements.map((candidate) => + tooltipPlacement(candidate, anchor, tooltip, gap), + ) + let selected = candidates[0]! + let selectedOverflow = overflow(selected, tooltip, boundary, edge) + for (const candidate of candidates) { + const candidateOverflow = overflow(candidate, tooltip, boundary, edge) + if (candidateOverflow === 0) { + selected = candidate + break + } + if (candidateOverflow < selectedOverflow) { + selected = candidate + selectedOverflow = candidateOverflow + } + } + return { + left: clamp( + selected.left, + edge, + Math.max(edge, boundary.width - edge - tooltip.width), + ), + top: clamp( + selected.top, + edge, + Math.max(edge, boundary.height - edge - tooltip.height), + ), + placement: selected.placement, + } +} + +const defaultTooltipPlacements: readonly ChartTooltipPlacement[] = [ + 'top', + 'bottom', + 'right', + 'left', +] + +function tooltipPlacement( + placement: ChartTooltipPlacement, + anchor: ChartTooltipPosition, + tooltip: { width: number; height: number }, + gap: number, +) { + const xDirection = + placement.endsWith('right') || placement === 'right' + ? 1 + : placement.endsWith('left') || placement === 'left' + ? -1 + : 0 + const yDirection = + placement.startsWith('bottom') || placement === 'bottom' + ? 1 + : placement.startsWith('top') || placement === 'top' + ? -1 + : 0 + return { + placement, + left: anchor.x + ((xDirection - 1) * tooltip.width) / 2 + xDirection * gap, + top: anchor.y + ((yDirection - 1) * tooltip.height) / 2 + yDirection * gap, + } +} + +function overflow( + position: { left: number; top: number }, + tooltip: { width: number; height: number }, + boundary: { width: number; height: number }, + edge: number, +) { + return ( + Math.max(0, edge - position.left) + + Math.max(0, position.left + tooltip.width + edge - boundary.width) + + Math.max(0, edge - position.top) + + Math.max(0, position.top + tooltip.height + edge - boundary.height) + ) +} + +function tooltipAccessibilityLabel(content: ChartTooltipContent | string) { + return typeof content === 'string' + ? content + : [ + content.title, + ...content.rows.map((row) => `${row.label}: ${row.value}`), + ] + .filter(Boolean) + .join('\n') +} + +function formatValue(value: ChartValue) { + return value instanceof Date + ? Number.isNaN(+value) + ? 'Invalid Date' + : value.toISOString().replace('T00:00:00.000Z', '') + : typeof value === 'number' + ? value.toLocaleString() + : String(value) +} + +function chartValueEqual(left: ChartValue, right: ChartValue) { + return left instanceof Date && right instanceof Date + ? left.getTime() === right.getTime() + : Object.is(left, right) +} + +function clamp(value: number, minimum: number, maximum: number) { + return Math.max(minimum, Math.min(maximum, value)) +} + +const tooltipStyle: ViewStyle = { + position: 'absolute', + zIndex: 1, + maxWidth: '80%', + paddingHorizontal: 9, + paddingVertical: 7, + borderWidth: 1, + borderColor: 'rgba(17, 24, 39, 0.16)', + borderRadius: 7, + backgroundColor: '#ffffff', + shadowColor: '#000000', + shadowOffset: { width: 0, height: 6 }, + shadowOpacity: 0.14, + shadowRadius: 12, + elevation: 4, +} + +const tooltipTextStyle = { + color: '#111827', + fontSize: 12, + fontWeight: '500', +} as const + +const titleStyle = { + flexDirection: 'row', + alignItems: 'center', + gap: 6, + marginBottom: 4, +} as const + +const titleTextStyle = { + color: '#111827', + fontSize: 12, + fontWeight: '700', +} as const + +const rowStyle = { + flexDirection: 'row', + alignItems: 'center', + gap: 6, +} as const + +const swatchStyle = { + width: 9, + height: 9, + borderRadius: 2, +} as const + +const rowLabelStyle = { + flexGrow: 1, + flexShrink: 1, + color: '#374151', + fontSize: 12, +} as const + +const rowValueStyle: TextStyle = { + color: '#111827', + fontSize: 12, + fontVariant: ['tabular-nums'], +} diff --git a/packages/react-native-charts/src/index.ts b/packages/react-native-charts/src/index.ts new file mode 100644 index 0000000..0d15583 --- /dev/null +++ b/packages/react-native-charts/src/index.ts @@ -0,0 +1,5 @@ +export { Chart } from './Chart' +export type { ChartProps, NativeChartRenderContext } from './Chart' +export type { NativeChartTooltipRenderContext } from './Tooltip' +export type { NativePaintContext, NativePaintResolver } from './paint' +export { resolveNativePaint } from './paint' diff --git a/packages/react-native-charts/src/interaction.test.ts b/packages/react-native-charts/src/interaction.test.ts new file mode 100644 index 0000000..0710d8a --- /dev/null +++ b/packages/react-native-charts/src/interaction.test.ts @@ -0,0 +1,125 @@ +import { describe, expect, it } from 'vitest' +import type { + ChartDefinition, + ChartPoint, + ChartScene, +} from '@tanstack/charts/types' +import { adjacentFocusPoint, createNativeChartFocusModel } from './interaction' + +interface Datum { + id: string +} + +describe('native focus model', () => { + it('reuses grouped focus semantics and native accessibility order', () => { + const points = [ + point('alpha-1', 'alpha', 0, 10, 10, 1, 2), + point('beta-1', 'beta', 1, 10, 30, 1, 3), + point('alpha-2', 'alpha', 2, 40, 20, 2, 4), + ] + const model = createNativeChartFocusModel( + chartScene(points), + definition({ focus: 'group-x', maxFocusDistance: 20 }), + ) + + expect(model.resolve(11, 29).map((candidate) => candidate.key)).toEqual([ + 'beta-1', + 'alpha-1', + ]) + expect(adjacentFocusPoint(model, null, 1)?.key).toBe('alpha-1') + expect(adjacentFocusPoint(model, model.navigation[0] ?? null, 1)?.key).toBe( + 'alpha-2', + ) + }) + + it('honors a supplied spatial index for nearest focus', () => { + const points = [point('alpha', 'alpha', 0, 10, 10, 1, 2)] + let calls = 0 + const model = createNativeChartFocusModel( + chartScene(points), + definition({ + spatialIndex: (indexedPoints) => ({ + findNearest() { + calls += 1 + return indexedPoints[0] ?? null + }, + }), + }), + ) + + expect(model.resolve(500, 500)[0]?.key).toBe('alpha') + expect(calls).toBe(1) + }) + + it('restores duplicate keys by datum identity after a scene update', () => { + const datum = { id: 'same' } + const previous = point('duplicate', 'alpha', 0, 10, 10, 1, 2, datum) + const other = point('duplicate', 'alpha', 0, 20, 20, 2, 3, { id: 'same' }) + const restored = point('duplicate', 'alpha', 1, 30, 30, 3, 4, datum) + const model = createNativeChartFocusModel( + chartScene([other, restored]), + definition({}), + ) + + expect(model.restore(previous)).toBe(restored) + }) +}) + +function definition( + options: Partial>, +): ChartDefinition { + return { marks: [], ...options } +} + +function point( + key: string, + group: string, + datumIndex: number, + x: number, + y: number, + xValue: number, + yValue: number, + datum: Datum = { id: key }, +): ChartPoint { + return { + key, + markId: 'series', + group, + groupLabel: group, + datum, + datumIndex, + xValue, + yValue, + x, + y, + color: '#2563eb', + } +} + +function chartScene( + points: readonly ChartPoint[], +): ChartScene { + return { + width: 100, + height: 60, + margin: { top: 0, right: 0, bottom: 0, left: 0 }, + chart: { x: 0, y: 0, width: 100, height: 60 }, + nodes: [], + points, + scales: {}, + colors: { + type: 'ordinal', + domain: ['alpha', 'beta'], + range: ['#2563eb', '#f97316'], + map: (value) => (value === 'beta' ? '#f97316' : '#2563eb'), + }, + gradients: [], + theme: { + foreground: '#111827', + muted: '#6b7280', + grid: '#d1d5db', + background: 'transparent', + palette: ['#2563eb', '#f97316'], + }, + } +} diff --git a/packages/react-native-charts/src/interaction.ts b/packages/react-native-charts/src/interaction.ts new file mode 100644 index 0000000..d432ef7 --- /dev/null +++ b/packages/react-native-charts/src/interaction.ts @@ -0,0 +1,205 @@ +import { + focusNearestX, + focusNearestY, + focusX, + focusY, +} from '@tanstack/charts/focus' +import { findNearestPoint } from '@tanstack/charts/scene' +import type { + ChartDefinition, + ChartFocusMode, + ChartFocusStrategy, + ChartPoint, + ChartScene, + ChartValue, +} from '@tanstack/charts/types' + +export interface NativeChartFocusModel< + TDatum, + TXValue extends ChartValue, + TYValue extends ChartValue, +> { + resolve: ( + x: number, + y: number, + ) => readonly ChartPoint[] + group: ( + point: ChartPoint, + ) => readonly ChartPoint[] + navigation: readonly ChartPoint[] + restore: ( + point: ChartPoint, + ) => ChartPoint | null +} + +export function createNativeChartFocusModel< + TDatum, + TXValue extends ChartValue, + TYValue extends ChartValue, +>( + scene: ChartScene, + definition: ChartDefinition, +): NativeChartFocusModel { + const strategy = resolveFocusStrategy(definition.focus) + const spatialIndex = definition.spatialIndex?.(scene.points) + const maxDistance = definition.maxFocusDistance ?? 48 + const navigation = + strategy?.navigation(scene.points) ?? sceneOrder(scene.points) + + return { + resolve(x, y) { + if (strategy) { + return strategy.resolve(scene.points, x, y, maxDistance) + } + const point = spatialIndex + ? spatialIndex.findNearest(x, y, maxDistance) + : findNearestPoint(scene, x, y, maxDistance) + return point ? [point] : [] + }, + group(point) { + return strategy?.group(scene.points, point) ?? [point] + }, + navigation, + restore(point) { + return restoreFocusedPoint(scene.points, point) + }, + } +} + +export function adjacentFocusPoint< + TDatum, + TXValue extends ChartValue, + TYValue extends ChartValue, +>( + model: NativeChartFocusModel, + current: ChartPoint | null, + direction: -1 | 1, +) { + const currentIndex = current + ? model.navigation.findIndex((point) => samePointIdentity(point, current)) + : -1 + const nextIndex = + currentIndex < 0 + ? direction > 0 + ? 0 + : model.navigation.length - 1 + : Math.max( + 0, + Math.min(model.navigation.length - 1, currentIndex + direction), + ) + return model.navigation[nextIndex] ?? null +} + +export function samePointIdentity< + TDatum, + TXValue extends ChartValue, + TYValue extends ChartValue, +>( + left: ChartPoint | null, + right: ChartPoint | null, +) { + return ( + left === right || + (left !== null && + right !== null && + left.key === right.key && + left.markId === right.markId && + left.datumIndex === right.datumIndex) + ) +} + +export function samePointList< + TDatum, + TXValue extends ChartValue, + TYValue extends ChartValue, +>( + left: readonly ChartPoint[], + right: readonly ChartPoint[], +) { + return ( + left.length === right.length && + left.every((point, index) => samePointIdentity(point, right[index] ?? null)) + ) +} + +function resolveFocusStrategy< + TDatum, + TXValue extends ChartValue, + TYValue extends ChartValue, +>( + focus: ChartFocusMode | undefined, +): ChartFocusStrategy | undefined { + if (typeof focus !== 'string') return focus + switch (focus) { + case 'nearest-x': + return focusNearestX + case 'nearest-y': + return focusNearestY + case 'group-x': + return focusX + case 'group-y': + return focusY + case 'nearest': + return undefined + } +} + +function sceneOrder< + TDatum, + TXValue extends ChartValue, + TYValue extends ChartValue, +>(points: readonly ChartPoint[]) { + return points + .map((point, index) => ({ point, index })) + .sort( + (left, right) => + left.point.x - right.point.x || + left.point.y - right.point.y || + left.index - right.index, + ) + .map(({ point }) => point) +} + +function restoreFocusedPoint< + TDatum, + TXValue extends ChartValue, + TYValue extends ChartValue, +>( + points: readonly ChartPoint[], + previous: ChartPoint, +) { + const matches = points.filter((point) => point.key === previous.key) + if (matches.length < 2) return matches[0] ?? null + + const datumType = typeof previous.datum + const hasReferenceIdentity = + previous.datum !== null && + (datumType === 'object' || datumType === 'function') + if (hasReferenceIdentity) { + const sameDatum = matches.find((point) => point.datum === previous.datum) + if (sameDatum) return sameDatum + } + + return ( + matches.find( + (point) => + point.markId === previous.markId && + Object.is(point.group, previous.group) && + chartValueEqual(point.xValue, previous.xValue) && + chartValueEqual(point.yValue, previous.yValue), + ) ?? + matches.find( + (point) => + point.markId === previous.markId && + point.datumIndex === previous.datumIndex, + ) ?? + matches[0] ?? + null + ) +} + +function chartValueEqual(left: ChartValue, right: ChartValue) { + return left instanceof Date && right instanceof Date + ? left.getTime() === right.getTime() + : Object.is(left, right) +} diff --git a/packages/react-native-charts/src/paint.test.ts b/packages/react-native-charts/src/paint.test.ts new file mode 100644 index 0000000..6cce370 --- /dev/null +++ b/packages/react-native-charts/src/paint.test.ts @@ -0,0 +1,43 @@ +import { describe, expect, it } from 'vitest' +import { resolveNativePaint, resolveNativeSolidPaint } from './paint' + +describe('native paint resolution', () => { + it('resolves the browser-backed default theme tokens', () => { + const context = { color: '#102030' } + + expect(resolveNativePaint('currentColor', context)).toBe('#102030') + expect(resolveNativePaint('CanvasText', context)).toBe('#102030') + expect(resolveNativePaint('var(--ts-chart-1, #2563eb)', context)).toBe( + '#2563eb', + ) + expect( + resolveNativePaint( + 'var(--app-chart, var(--ts-chart-2, rgb(10, 20, 30)))', + context, + ), + ).toBe('rgb(10, 20, 30)') + }) + + it('uses the host color when an authored CSS variable has no fallback', () => { + expect(resolveNativePaint('var(--app-chart)', { color: '#abcdef' })).toBe( + '#abcdef', + ) + }) + + it('preserves concrete native paints and resource references', () => { + const context = { color: '#102030' } + + expect(resolveNativePaint('transparent', context)).toBe('transparent') + expect(resolveNativePaint('#fff', context)).toBe('#fff') + expect(resolveNativePaint('url(#gradient)', context)).toBe('url(#gradient)') + }) + + it('falls back to the host color where native views cannot use SVG resources', () => { + expect( + resolveNativeSolidPaint('url(#gradient)', { color: '#102030' }), + ).toBe('#102030') + expect(resolveNativeSolidPaint('#abcdef', { color: '#102030' })).toBe( + '#abcdef', + ) + }) +}) diff --git a/packages/react-native-charts/src/paint.ts b/packages/react-native-charts/src/paint.ts new file mode 100644 index 0000000..e382df8 --- /dev/null +++ b/packages/react-native-charts/src/paint.ts @@ -0,0 +1,48 @@ +import type { ColorValue } from 'react-native' + +export interface NativePaintContext { + color: ColorValue +} + +export type NativePaintResolver = ( + paint: string, + context: NativePaintContext, +) => ColorValue + +export function resolveNativePaint( + paint: string, + { color }: NativePaintContext, +): ColorValue { + const value = paint.trim() + if (value === 'currentColor' || value === 'CanvasText') return color + if (!value.startsWith('var(') || !value.endsWith(')')) return value + + const fallback = cssVariableFallback(value) + return fallback ? resolveNativePaint(fallback, { color }) : color +} + +export function resolveNativeSolidPaint( + paint: string, + context: NativePaintContext, + resolvePaint: NativePaintResolver = resolveNativePaint, +): ColorValue { + const resolved = resolvePaint(paint, context) + return typeof resolved === 'string' && + resolved.trim().startsWith('url(') && + resolved.trim().endsWith(')') + ? context.color + : resolved +} + +function cssVariableFallback(value: string) { + let depth = 0 + for (let index = 4; index < value.length - 1; index += 1) { + const character = value[index] + if (character === '(') depth += 1 + if (character === ')') depth -= 1 + if (character === ',' && depth === 0) { + return value.slice(index + 1, -1).trim() + } + } + return undefined +} diff --git a/packages/react-native-charts/tsconfig.json b/packages/react-native-charts/tsconfig.json new file mode 100644 index 0000000..136f244 --- /dev/null +++ b/packages/react-native-charts/tsconfig.json @@ -0,0 +1,9 @@ +{ + "extends": "../../tsconfig.json", + "compilerOptions": { + "lib": ["ES2022"], + "types": ["react", "react-native"] + }, + "include": ["src/**/*.ts", "src/**/*.tsx"], + "exclude": ["src/**/*.test.ts", "src/**/*.test.tsx"] +} diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 7da4a9b..b5800ba 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -30,7 +30,7 @@ importers: version: link:packages/react '@sveltejs/vite-plugin-svelte': specifier: ^7.1.2 - version: 7.2.0(svelte@5.56.8)(vite@8.1.5(@types/node@25.9.5)(esbuild@0.27.7)(less@4.8.1(supports-color@10.2.2))(sass@1.102.0)) + version: 7.2.0(svelte@5.56.8)(vite@8.1.5(@types/node@25.9.5)(esbuild@0.27.7)(less@4.8.1(supports-color@10.2.2))(sass@1.102.0)(terser@5.49.0)(yaml@2.9.0)) '@tanstack/charts': specifier: workspace:* version: link:packages/charts-core @@ -43,6 +43,9 @@ importers: '@tanstack/react-charts': specifier: workspace:* version: link:packages/react-charts + '@tanstack/react-native-charts': + specifier: workspace:* + version: link:packages/react-native-charts '@types/d3-array': specifier: ^3.2.2 version: 3.2.2 @@ -117,7 +120,7 @@ importers: version: 1.0.5 '@vitejs/plugin-react': specifier: ^6.0.1 - version: 6.0.4(vite@8.1.5(@types/node@25.9.5)(esbuild@0.27.7)(less@4.8.1(supports-color@10.2.2))(sass@1.102.0)) + version: 6.0.4(vite@8.1.5(@types/node@25.9.5)(esbuild@0.27.7)(less@4.8.1(supports-color@10.2.2))(sass@1.102.0)(terser@5.49.0)(yaml@2.9.0)) chart.js: specifier: 4.5.1 version: 4.5.1 @@ -189,7 +192,7 @@ importers: version: 29.1.1(@noble/hashes@2.2.0) octane: specifier: 0.1.13 - version: 0.1.13(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(vite@8.1.5(@types/node@25.9.5)(esbuild@0.27.7)(less@4.8.1(supports-color@10.2.2))(sass@1.102.0)) + version: 0.1.13(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(vite@8.1.5(@types/node@25.9.5)(esbuild@0.27.7)(less@4.8.1(supports-color@10.2.2))(sass@1.102.0)(terser@5.49.0)(yaml@2.9.0)) playwright: specifier: 1.62.0 version: 1.62.0 @@ -225,13 +228,13 @@ importers: version: 3.0.1 vite: specifier: ^8.0.16 - version: 8.1.5(@types/node@25.9.5)(esbuild@0.27.7)(less@4.8.1(supports-color@10.2.2))(sass@1.102.0) + version: 8.1.5(@types/node@25.9.5)(esbuild@0.27.7)(less@4.8.1(supports-color@10.2.2))(sass@1.102.0)(terser@5.49.0)(yaml@2.9.0) vite-plugin-solid: specifier: ^2.11.12 - version: 2.11.14(solid-js@1.9.14)(supports-color@10.2.2)(vite@8.1.5(@types/node@25.9.5)(esbuild@0.27.7)(less@4.8.1(supports-color@10.2.2))(sass@1.102.0)) + version: 2.11.14(solid-js@1.9.14)(supports-color@10.2.2)(vite@8.1.5(@types/node@25.9.5)(esbuild@0.27.7)(less@4.8.1(supports-color@10.2.2))(sass@1.102.0)(terser@5.49.0)(yaml@2.9.0)) vitest: specifier: ^4.1.9 - version: 4.1.10(@types/node@25.9.5)(jsdom@29.1.1(@noble/hashes@2.2.0))(vite@8.1.5(@types/node@25.9.5)(esbuild@0.27.7)(less@4.8.1(supports-color@10.2.2))(sass@1.102.0)) + version: 4.1.10(@types/node@25.9.5)(jsdom@29.1.1(@noble/hashes@2.2.0))(vite@8.1.5(@types/node@25.9.5)(esbuild@0.27.7)(less@4.8.1(supports-color@10.2.2))(sass@1.102.0)(terser@5.49.0)(yaml@2.9.0)) world-atlas: specifier: 2.0.2 version: 2.0.2 @@ -261,7 +264,7 @@ importers: version: 3.2.0 octane: specifier: 0.1.13 - version: 0.1.13(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(vite@8.1.5(@types/node@25.9.5)(esbuild@0.27.7)(less@4.8.1(supports-color@10.2.2))(sass@1.102.0)) + version: 0.1.13(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(vite@8.1.5(@types/node@25.9.5)(esbuild@0.27.7)(less@4.8.1(supports-color@10.2.2))(sass@1.102.0)(terser@5.49.0)(yaml@2.9.0)) devDependencies: '@types/d3-array': specifier: ^3.2.2 @@ -274,7 +277,7 @@ importers: version: 3.1.8 vite: specifier: ^8.0.16 - version: 8.1.5(@types/node@25.9.5)(esbuild@0.27.7)(less@4.8.1(supports-color@10.2.2))(sass@1.102.0) + version: 8.1.5(@types/node@25.9.5)(esbuild@0.27.7)(less@4.8.1(supports-color@10.2.2))(sass@1.102.0)(terser@5.49.0)(yaml@2.9.0) examples/charts-react: dependencies: @@ -314,10 +317,50 @@ importers: version: 3.1.8 '@vitejs/plugin-react': specifier: ^6.0.1 - version: 6.0.4(vite@8.1.5(@types/node@25.9.5)(esbuild@0.27.7)(less@4.8.1(supports-color@10.2.2))(sass@1.102.0)) + version: 6.0.4(vite@8.1.5(@types/node@25.9.5)(esbuild@0.27.7)(less@4.8.1(supports-color@10.2.2))(sass@1.102.0)(terser@5.49.0)(yaml@2.9.0)) vite: specifier: ^8.0.16 - version: 8.1.5(@types/node@25.9.5)(esbuild@0.27.7)(less@4.8.1(supports-color@10.2.2))(sass@1.102.0) + version: 8.1.5(@types/node@25.9.5)(esbuild@0.27.7)(less@4.8.1(supports-color@10.2.2))(sass@1.102.0)(terser@5.49.0)(yaml@2.9.0) + + examples/charts-react-native: + dependencies: + '@tanstack/charts': + specifier: workspace:* + version: link:../../packages/charts-core + '@tanstack/react-native-charts': + specifier: workspace:* + version: link:../../packages/react-native-charts + d3-scale: + specifier: 4.0.2 + version: 4.0.2 + react: + specifier: 19.2.3 + version: 19.2.3 + react-native: + specifier: 0.86.0 + version: 0.86.0(@babel/core@7.29.7(supports-color@10.2.2))(@react-native-community/cli@20.1.0(supports-color@10.2.2)(typescript@6.0.3))(@react-native/metro-config@0.86.0(@babel/core@7.29.7(supports-color@10.2.2))(supports-color@10.2.2))(@types/react@19.2.17)(react@19.2.3)(supports-color@10.2.2) + react-native-svg: + specifier: 15.15.5 + version: 15.15.5(react-native@0.86.0(@babel/core@7.29.7(supports-color@10.2.2))(@react-native-community/cli@20.1.0(supports-color@10.2.2)(typescript@6.0.3))(@react-native/metro-config@0.86.0(@babel/core@7.29.7(supports-color@10.2.2))(supports-color@10.2.2))(@types/react@19.2.17)(react@19.2.3)(supports-color@10.2.2))(react@19.2.3) + devDependencies: + '@babel/core': + specifier: ^7.25.2 + version: 7.29.7(supports-color@10.2.2) + '@babel/runtime': + specifier: ^7.25.0 + version: 7.29.7 + '@react-native-community/cli': + specifier: 20.1.0 + version: 20.1.0(supports-color@10.2.2)(typescript@6.0.3) + '@react-native/babel-preset': + specifier: 0.86.0 + version: 0.86.0(@babel/core@7.29.7(supports-color@10.2.2))(supports-color@10.2.2) + '@react-native/metro-config': + specifier: 0.86.0 + version: 0.86.0(@babel/core@7.29.7(supports-color@10.2.2))(supports-color@10.2.2) + '@react-native/typescript-config': + specifier: 0.86.0 + version: 0.86.0 examples/conformance: dependencies: @@ -351,7 +394,7 @@ importers: version: 3.1.8 vite: specifier: ^8.0.16 - version: 8.1.5(@types/node@25.9.5)(esbuild@0.27.7)(less@4.8.1(supports-color@10.2.2))(sass@1.102.0) + version: 8.1.5(@types/node@25.9.5)(esbuild@0.27.7)(less@4.8.1(supports-color@10.2.2))(sass@1.102.0)(terser@5.49.0)(yaml@2.9.0) examples/octane: dependencies: @@ -366,11 +409,11 @@ importers: version: link:../../packages/octane octane: specifier: 0.1.13 - version: 0.1.13(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(vite@8.1.5(@types/node@25.9.5)(esbuild@0.27.7)(less@4.8.1(supports-color@10.2.2))(sass@1.102.0)) + version: 0.1.13(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(vite@8.1.5(@types/node@25.9.5)(esbuild@0.27.7)(less@4.8.1(supports-color@10.2.2))(sass@1.102.0)(terser@5.49.0)(yaml@2.9.0)) devDependencies: vite: specifier: ^8.0.16 - version: 8.1.5(@types/node@25.9.5)(esbuild@0.27.7)(less@4.8.1(supports-color@10.2.2))(sass@1.102.0) + version: 8.1.5(@types/node@25.9.5)(esbuild@0.27.7)(less@4.8.1(supports-color@10.2.2))(sass@1.102.0)(terser@5.49.0)(yaml@2.9.0) examples/react: dependencies: @@ -392,10 +435,10 @@ importers: devDependencies: '@vitejs/plugin-react': specifier: ^6.0.1 - version: 6.0.4(vite@8.1.5(@types/node@25.9.5)(esbuild@0.27.7)(less@4.8.1(supports-color@10.2.2))(sass@1.102.0)) + version: 6.0.4(vite@8.1.5(@types/node@25.9.5)(esbuild@0.27.7)(less@4.8.1(supports-color@10.2.2))(sass@1.102.0)(terser@5.49.0)(yaml@2.9.0)) vite: specifier: ^8.0.16 - version: 8.1.5(@types/node@25.9.5)(esbuild@0.27.7)(less@4.8.1(supports-color@10.2.2))(sass@1.102.0) + version: 8.1.5(@types/node@25.9.5)(esbuild@0.27.7)(less@4.8.1(supports-color@10.2.2))(sass@1.102.0)(terser@5.49.0)(yaml@2.9.0) examples/sandbox: dependencies: @@ -435,10 +478,10 @@ importers: version: 3.1.8 '@vitejs/plugin-react': specifier: ^6.0.1 - version: 6.0.4(vite@8.1.5(@types/node@25.9.5)(esbuild@0.27.7)(less@4.8.1(supports-color@10.2.2))(sass@1.102.0)) + version: 6.0.4(vite@8.1.5(@types/node@25.9.5)(esbuild@0.27.7)(less@4.8.1(supports-color@10.2.2))(sass@1.102.0)(terser@5.49.0)(yaml@2.9.0)) vite: specifier: ^8.0.16 - version: 8.1.5(@types/node@25.9.5)(esbuild@0.27.7)(less@4.8.1(supports-color@10.2.2))(sass@1.102.0) + version: 8.1.5(@types/node@25.9.5)(esbuild@0.27.7)(less@4.8.1(supports-color@10.2.2))(sass@1.102.0)(terser@5.49.0)(yaml@2.9.0) packages/alpine-charts: dependencies: @@ -599,7 +642,7 @@ importers: version: link:../plot octane: specifier: ^0.1.13 - version: 0.1.13(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(vite@8.1.5(@types/node@25.9.5)(esbuild@0.28.1)(less@4.8.1(supports-color@10.2.2))(sass@1.102.0)) + version: 0.1.13(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(vite@8.1.5(@types/node@25.9.5)(esbuild@0.28.1)(less@4.8.1(supports-color@10.2.2))(sass@1.102.0)(terser@5.49.0)(yaml@2.9.0)) packages/octane-charts: dependencies: @@ -608,7 +651,7 @@ importers: version: link:../charts-core octane: specifier: ^0.1.13 - version: 0.1.13(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(vite@8.1.5(@types/node@25.9.5)(esbuild@0.28.1)(less@4.8.1(supports-color@10.2.2))(sass@1.102.0)) + version: 0.1.13(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(vite@8.1.5(@types/node@25.9.5)(esbuild@0.28.1)(less@4.8.1(supports-color@10.2.2))(sass@1.102.0)(terser@5.49.0)(yaml@2.9.0)) devDependencies: '@types/d3-scale': specifier: ^4.0.9 @@ -670,6 +713,21 @@ importers: specifier: 4.0.2 version: 4.0.2 + packages/react-native-charts: + dependencies: + '@tanstack/charts': + specifier: workspace:* + version: link:../charts-core + react: + specifier: ^19.2.3 + version: 19.2.3 + react-native: + specifier: ^0.86.0 + version: 0.86.0(@babel/core@7.29.7(supports-color@10.2.2))(@react-native-community/cli@20.1.0(supports-color@10.2.2)(typescript@6.0.3))(@react-native/metro-config@0.86.0(@babel/core@7.29.7(supports-color@10.2.2))(supports-color@10.2.2))(@types/react@19.2.17)(react@19.2.3)(supports-color@10.2.2) + react-native-svg: + specifier: ^15.15.5 + version: 15.15.5(react-native@0.86.0(@babel/core@7.29.7(supports-color@10.2.2))(@react-native-community/cli@20.1.0(supports-color@10.2.2)(typescript@6.0.3))(@react-native/metro-config@0.86.0(@babel/core@7.29.7(supports-color@10.2.2))(supports-color@10.2.2))(@types/react@19.2.17)(react@19.2.3)(supports-color@10.2.2))(react@19.2.3) + packages/solid-charts: dependencies: '@tanstack/charts': @@ -681,7 +739,7 @@ importers: version: 1.9.14 vite-plugin-solid: specifier: ^2.11.12 - version: 2.11.14(solid-js@1.9.14)(supports-color@10.2.2)(vite@8.1.5(@types/node@25.9.5)(esbuild@0.28.1)(less@4.8.1(supports-color@10.2.2))(sass@1.102.0)) + version: 2.11.14(solid-js@1.9.14)(supports-color@10.2.2)(vite@8.1.5(@types/node@25.9.5)(esbuild@0.28.1)(less@4.8.1(supports-color@10.2.2))(sass@1.102.0)(terser@5.49.0)(yaml@2.9.0)) packages/svelte-charts: dependencies: @@ -694,7 +752,7 @@ importers: version: 2.5.8(svelte@5.56.8)(typescript@6.0.3) '@sveltejs/vite-plugin-svelte': specifier: ^7.1.2 - version: 7.2.0(svelte@5.56.8)(vite@8.1.5(@types/node@25.9.5)(esbuild@0.28.1)(less@4.8.1(supports-color@10.2.2))(sass@1.102.0)) + version: 7.2.0(svelte@5.56.8)(vite@8.1.5(@types/node@25.9.5)(esbuild@0.28.1)(less@4.8.1(supports-color@10.2.2))(sass@1.102.0)(terser@5.49.0)(yaml@2.9.0)) svelte: specifier: ^5.56.2 version: 5.56.8 @@ -852,6 +910,13 @@ packages: } engines: { node: '>=6.9.0' } + '@babel/helper-annotate-as-pure@7.29.7': + resolution: + { + integrity: sha512-OoK6239jHPuSQOoS0kfTVKn0b/rVTk0seKq4Gd2UMLtmOVLjDC0ki3e+c90Trqv2gMfvJFqkiljrr568+qddiw==, + } + engines: { node: '>=6.9.0' } + '@babel/helper-compilation-targets@7.29.7': resolution: { @@ -859,6 +924,32 @@ packages: } engines: { node: '>=6.9.0' } + '@babel/helper-create-class-features-plugin@7.29.7': + resolution: + { + integrity: sha512-IY3ZD9Tmooqr3TUhc3DUWxiuo8xx1DWLhd5M7hQ+ZWJamqM2BbalrBJb2MisSLoYorOj75U03qULCxQTY9r3hg==, + } + engines: { node: '>=6.9.0' } + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/helper-create-regexp-features-plugin@7.29.7': + resolution: + { + integrity: sha512-907Uymvqgg1dwUA+7IGwFAOSYzQOuzPXKNJ1yxzwPffzkYFg2q2eHi1fIOs6sXkG9NbIUMunnUlkYsfRFNvomg==, + } + engines: { node: '>=6.9.0' } + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/helper-define-polyfill-provider@0.6.8': + resolution: + { + integrity: sha512-47UwBLPpQi1NoWzLuHNjRoHlYXMwIJoBf7MFou6viC/sIHWYygpvr0B6IAyh5sBdA2nr2LPIRww8lfaUVQINBA==, + } + peerDependencies: + '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 + '@babel/helper-globals@7.29.7': resolution: { @@ -866,6 +957,13 @@ packages: } engines: { node: '>=6.9.0' } + '@babel/helper-member-expression-to-functions@7.29.7': + resolution: + { + integrity: sha512-j+7JYmk1JYDtACIGj0QJqqWZjoUpMoEikQGADMaHgCMCSDqd2+P32rfcibUNrGOMWrlzK1WJBdxrB3JJQZwWtg==, + } + engines: { node: '>=6.9.0' } + '@babel/helper-module-imports@7.18.6': resolution: { @@ -889,6 +987,13 @@ packages: peerDependencies: '@babel/core': ^7.0.0 + '@babel/helper-optimise-call-expression@7.29.7': + resolution: + { + integrity: sha512-+kmGVjcT9RGYzoDwdwEqEvGgKe3BYq+O1iGzjFubaNgZHwYHP6lsF2Yghf4kEuv9BV7tYDZ913aBW9am6YKong==, + } + engines: { node: '>=6.9.0' } + '@babel/helper-plugin-utils@7.29.7': resolution: { @@ -896,6 +1001,31 @@ packages: } engines: { node: '>=6.9.0' } + '@babel/helper-remap-async-to-generator@7.29.7': + resolution: + { + integrity: sha512-16AMiW26DbXWBbr3B8wNozKM0ydMLB892vaOaJW/fPJdnT8vJk5sdkQcU/isqUxyCE0cEoa8wZOcbgDuC4b6Og==, + } + engines: { node: '>=6.9.0' } + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/helper-replace-supers@7.29.7': + resolution: + { + integrity: sha512-atfGXWSeCiF4DnKZIfmJfQRkSw9b9gNNXR1kqKjbhG4pGYCOnkp8OcTB8E3NXjBu8NpheSnOeNKz8KT7UNFTmQ==, + } + engines: { node: '>=6.9.0' } + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/helper-skip-transparent-expression-wrappers@7.29.7': + resolution: + { + integrity: sha512-brcMGQaVzIeUb+6/bs1Av0f8YuNNjKY2JyvfRCsFuFsdKccEQ5Ges2y74D74NZ1Rz8lKJ9ksJkfqwQFJ/iNEyQ==, + } + engines: { node: '>=6.9.0' } + '@babel/helper-string-parser@7.29.7': resolution: { @@ -917,6 +1047,13 @@ packages: } engines: { node: '>=6.9.0' } + '@babel/helper-wrap-function@7.29.7': + resolution: + { + integrity: sha512-iES0Skag9ERIF68aXadpO6dbXa03mNWK3sEqJaMnLNs/eC3l0lkImdfoy6Y09/SfkpawdAB4RjQ7PVA7TcVGdw==, + } + engines: { node: '>=6.9.0' } + '@babel/helpers@7.29.7': resolution: { @@ -932,230 +1069,504 @@ packages: engines: { node: '>=6.0.0' } hasBin: true - '@babel/plugin-syntax-jsx@7.29.7': + '@babel/plugin-proposal-export-default-from@7.29.7': resolution: { - integrity: sha512-TSu8+mHCoEaaCDEZ0I3+6mvTBYR4PCxQwf2z9/r5Tbztv6NaLR3B9thGTTxX2WGuGHJqRiAbKPeGTJ5XWXVg6A==, + integrity: sha512-p+G5BNXDcy3bOXplhY4HybQ1GxH3i2Tppmdm/3epyRu2VgJJZuUlZ61MqRTg582Q7ZLBdP7fePYvsumSEkMxcQ==, } engines: { node: '>=6.9.0' } peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/template@7.29.7': + '@babel/plugin-syntax-dynamic-import@7.8.3': resolution: { - integrity: sha512-puq+Gf35oI24FeN11LkoUQFqv9uwNeWpxXZi/Ji3rRIoKAzKnxRaZ+Gkj0vKS9ZCiTESfng1N9LyOyXvo+m+Gg==, + integrity: sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==, } - engines: { node: '>=6.9.0' } + peerDependencies: + '@babel/core': ^7.0.0-0 - '@babel/traverse@7.29.7': + '@babel/plugin-syntax-export-default-from@7.29.7': resolution: { - integrity: sha512-EhlfNQtZ+NK22w5BM61ciuiq1m58ed33Wr1Xan//ZRTy6hgjnwyCffRYwzsGXdASJSUJ1guZILsErh1eQcl+zw==, + integrity: sha512-foag0BB37ROhdeIX9O8G0jX7hw0UekJc04cHMrYLOnrErsnBKqJGHJ8eDRpoCFZBvEPPygmmtw4qyU97qa4oOw==, } engines: { node: '>=6.9.0' } + peerDependencies: + '@babel/core': ^7.0.0-0 - '@babel/types@7.29.7': + '@babel/plugin-syntax-flow@7.29.7': resolution: { - integrity: sha512-4zBIxpPzowiZpusoFkyGVwakdRJUyuH5PxQ/PrqghfdFWWasvnCdPfQXHrenDai+gyLARulZjZowCOj6fjT4pA==, + integrity: sha512-ajMX6QPcyomotqwpzhkYGxcK2i/us0rs1Qo9QvUpa+Fca0FTmqrzKrctoIYLMxcOhGZldGT/BAVkRGTWBiR8gQ==, } engines: { node: '>=6.9.0' } + peerDependencies: + '@babel/core': ^7.0.0-0 - '@bramus/specificity@2.4.2': + '@babel/plugin-syntax-jsx@7.29.7': resolution: { - integrity: sha512-ctxtJ/eA+t+6q2++vj5j7FYX3nRu311q1wfYH3xjlLOsczhlhxAg2FWNUXhpGvAw3BWo1xBcvOV6/YLc2r5FJw==, + integrity: sha512-TSu8+mHCoEaaCDEZ0I3+6mvTBYR4PCxQwf2z9/r5Tbztv6NaLR3B9thGTTxX2WGuGHJqRiAbKPeGTJ5XWXVg6A==, } - hasBin: true + engines: { node: '>=6.9.0' } + peerDependencies: + '@babel/core': ^7.0.0-0 - '@cloudflare/kv-asset-handler@0.5.0': + '@babel/plugin-syntax-nullish-coalescing-operator@7.8.3': resolution: { - integrity: sha512-jxQYkj8dSIzc0cD6cMMNdOc1UVjqSqu8BZdor5s8cGjW2I8BjODt/kWPVdY+u9zj3ms75Q5qaZgnxUad83+eAg==, + integrity: sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==, } - engines: { node: '>=22.0.0' } + peerDependencies: + '@babel/core': ^7.0.0-0 - '@cloudflare/unenv-preset@2.16.1': + '@babel/plugin-syntax-optional-chaining@7.8.3': resolution: { - integrity: sha512-ECxObrMfyTl5bhQf/lZCXwo5G6xX9IAUo+nDMKK4SZ8m4Jvvxp52vilxyySSWh2YTZz8+HQ07qGH/2rEom1vDw==, + integrity: sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==, } peerDependencies: - unenv: 2.0.0-rc.24 - workerd: '>1.20260305.0 <2.0.0-0' - peerDependenciesMeta: - workerd: - optional: true + '@babel/core': ^7.0.0-0 - '@cloudflare/workerd-darwin-64@1.20260617.1': + '@babel/plugin-syntax-typescript@7.29.7': resolution: { - integrity: sha512-jWwmgEVVWbsHNrLSNXzwjJaH90VzRxq1cWkQFUidxyeUPnMxemeNE8I9qFAfrpzGgE11e9sKDcE3ettJW08swQ==, + integrity: sha512-ngr+82Sh0xMz25TPCZi+nC2iTzjfCdWS2ONXTp/PtSCHCgaCNBpdMqgvJ2ccdLlClVZ7sisIgB914j/JFe+RZA==, } - engines: { node: '>=16' } - cpu: [x64] - os: [darwin] + engines: { node: '>=6.9.0' } + peerDependencies: + '@babel/core': ^7.0.0-0 - '@cloudflare/workerd-darwin-arm64@1.20260617.1': + '@babel/plugin-transform-async-generator-functions@7.29.7': resolution: { - integrity: sha512-LHH7b565g9znfCUOkwbec6FG2rmRbsgCy6aJiU9KN662mNheWl5sw/iKleiFSiljPKQQP3HkjnC/NSkdgi/aSA==, + integrity: sha512-d98gXZkgswvkyohMBABkhm3GeXhYj8psWfwQ2C7gtfrKGTykQa/iOIi+JJhwMjPlZ6Vm2XN+DCf3Es1EoG4ZLA==, } - engines: { node: '>=16' } - cpu: [arm64] - os: [darwin] + engines: { node: '>=6.9.0' } + peerDependencies: + '@babel/core': ^7.0.0-0 - '@cloudflare/workerd-linux-64@1.20260617.1': + '@babel/plugin-transform-async-to-generator@7.29.7': resolution: { - integrity: sha512-FMnaAKXe4Cfd8TQurCVd9fs2XQVBFRCsP+Id/SRdUv89MlwYu9zXfoyx6BxM+brPTIUK38SHbo8iaxiwzLi9JQ==, + integrity: sha512-pcUb2SS+RMo9TWVBwKGI5ShtoG7R+zBsFmCKDa6fe8c+hPr3XJlZgoE5j6i8W7gDjhyvy+85vmYexanvXh3d1w==, } - engines: { node: '>=16' } - cpu: [x64] - os: [linux] + engines: { node: '>=6.9.0' } + peerDependencies: + '@babel/core': ^7.0.0-0 - '@cloudflare/workerd-linux-arm64@1.20260617.1': + '@babel/plugin-transform-block-scoping@7.29.7': resolution: { - integrity: sha512-MRoifFYcqbxxIIQy7PqO5tFY/qPFSnjXzakWl0sO93l+HLyG35jRAgOi6jfqa4kBxc7gKKtH861DcewjxUfkjA==, + integrity: sha512-ONyr4+AZhKh8yKWInVxU9AXA9EbsyeLcL6V0dJy6M2/62vuvpGm29zzuymbTpdc451GEpDIdAyPLP3r+P61yKQ==, } - engines: { node: '>=16' } - cpu: [arm64] - os: [linux] + engines: { node: '>=6.9.0' } + peerDependencies: + '@babel/core': ^7.0.0-0 - '@cloudflare/workerd-windows-64@1.20260617.1': + '@babel/plugin-transform-class-properties@7.29.7': resolution: { - integrity: sha512-rgBV9wQrv0OSKgCTTbhFUFY3sLGNANZ88aqaLvtmEn2gmbFVb1J4PDGochVUdB7NSEp4D/ghHva6/8SZmbONpw==, + integrity: sha512-GtcpjFvanPfzNQi3eTitsCqtRRmmqzpy/A+yhTR1HaZo1Ly3EA8ZXxlPyHdR8/IuRMYc3E4wdGBewB2QKQjAaA==, } - engines: { node: '>=16' } - cpu: [x64] - os: [win32] + engines: { node: '>=6.9.0' } + peerDependencies: + '@babel/core': ^7.0.0-0 - '@cspotcode/source-map-support@0.8.1': + '@babel/plugin-transform-classes@7.29.7': resolution: { - integrity: sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==, + integrity: sha512-qV0OGGBVacduzQHE649JyCneOFI/maT+YKsO+K4Yi3xv2wTPNjM/W2o2gdzMwEAZz7fXNTHAe0NcSg30bIN69g==, } - engines: { node: '>=12' } + engines: { node: '>=6.9.0' } + peerDependencies: + '@babel/core': ^7.0.0-0 - '@csstools/color-helpers@6.1.0': + '@babel/plugin-transform-destructuring@7.29.7': resolution: { - integrity: sha512-064IFJdjTfUqnjpCVpMOdbr8FLQBhinbZj6yRv2An2E41O/pLEXqfFRWqGq/SxlE5PEUYTlvWsG2r8MswAVvkg==, + integrity: sha512-iPX8aD6H9zV5s7ZsqTdNocPN/MGQ5sSMnElKrktxjJRMnB2jN/1p2+R7GkfD6CAYoVFqy5A4XnSIUeGgJzIWpg==, } - engines: { node: '>=20.19.0' } + engines: { node: '>=6.9.0' } + peerDependencies: + '@babel/core': ^7.0.0-0 - '@csstools/css-calc@3.3.0': + '@babel/plugin-transform-flow-strip-types@7.29.7': resolution: { - integrity: sha512-c5ihYsPkdG6JCkU2zTMm4+k6r7RXuGxtWYhu5DHMIiF1FHzrfmHL5so11AoFpUv/tu61xfcmT4AmKoFfMPoqdQ==, + integrity: sha512-wRHeUjUjCZnMHmiO5bRgjFLcoEh7JyTdByOW11ahhwNa4V0bmeGEaIvt51yq0zQp2yWIpqfxXXPyUP6GFJZHOQ==, } - engines: { node: '>=20.19.0' } + engines: { node: '>=6.9.0' } peerDependencies: - '@csstools/css-parser-algorithms': ^4.0.0 - '@csstools/css-tokenizer': ^4.0.0 + '@babel/core': ^7.0.0-0 - '@csstools/css-color-parser@4.1.10': + '@babel/plugin-transform-for-of@7.29.7': resolution: { - integrity: sha512-UZhQLIUyJaaMepqehrCODwCg2KW25vFvLWBmqYFaPclYvvxzj/sG8LBOhBFCp11i9uE7t1EyS+RAoV9tztPFyw==, + integrity: sha512-zeSIHh0+E1Um1WJRXCFlHQYu2ieJNdivLLjlBEp+dIBu3S51n+SZZmIXjxnItw6pz56Cn+KvK68BIBVsxq2JiQ==, } - engines: { node: '>=20.19.0' } + engines: { node: '>=6.9.0' } peerDependencies: - '@csstools/css-parser-algorithms': ^4.0.0 - '@csstools/css-tokenizer': ^4.0.0 + '@babel/core': ^7.0.0-0 - '@csstools/css-parser-algorithms@4.0.0': + '@babel/plugin-transform-modules-commonjs@7.29.7': resolution: { - integrity: sha512-+B87qS7fIG3L5h3qwJ/IFbjoVoOe/bpOdh9hAjXbvx0o8ImEmUsGXN0inFOnk2ChCFgqkkGFQ+TpM5rbhkKe4w==, + integrity: sha512-j0vCldybPC5b5dwCQOJ21uKtHzt7hxLygJTg9eF1ScfaikEDNfzn94XoW5Fi+seBR0nCyL23xaBFFkq7dTM8XQ==, } - engines: { node: '>=20.19.0' } + engines: { node: '>=6.9.0' } peerDependencies: - '@csstools/css-tokenizer': ^4.0.0 + '@babel/core': ^7.0.0-0 - '@csstools/css-syntax-patches-for-csstree@1.1.7': + '@babel/plugin-transform-named-capturing-groups-regex@7.29.7': resolution: { - integrity: sha512-fQ+05118eQS1cofO3aJpB5efgpBZMvIzwr/sbC8kDLVA5XLG8q1kJV5yzrUAI1f7lvhPnm8fgIjzFB8/O/5Dig==, + integrity: sha512-vuFoLwr4qnv2xbZ16SQd6uPcH5FNrLHhk/Jzo++0XJFcaDsr4gjJVg6j398oMHiC+83k/GiBzviwF5KBJkPUtQ==, } + engines: { node: '>=6.9.0' } peerDependencies: - css-tree: ^3.2.1 - peerDependenciesMeta: - css-tree: - optional: true + '@babel/core': ^7.0.0 - '@csstools/css-tokenizer@4.0.0': + '@babel/plugin-transform-nullish-coalescing-operator@7.29.7': resolution: { - integrity: sha512-QxULHAm7cNu72w97JUNCBFODFaXpbDg+dP8b/oWFAZ2MTRppA3U00Y2L1HqaS4J6yBqxwa/Y3nMBaxVKbB/NsA==, + integrity: sha512-idmp1dFaekP9GbcMvG24Kvw2BfhFZjHnNJCkV4WuIY4PskJzwI3f1N5OdgYke38T7rftO6ERulFRn2cFeZwRkg==, } - engines: { node: '>=20.19.0' } + engines: { node: '>=6.9.0' } + peerDependencies: + '@babel/core': ^7.0.0-0 - '@emnapi/core@1.11.1': + '@babel/plugin-transform-optional-catch-binding@7.29.7': resolution: { - integrity: sha512-RSvbQmHzdKzNsLYa/wHrbc3KN4sYLKAdPZxqiM2HATqv/SBk2/ENSHpvXGaLOMcsAyz0poEGqkmmKYG3OWiJEQ==, + integrity: sha512-sLsyndxK2VwX6yNUOakMb7Sh553ZTe/vVM1XJ+9Z5aW1ytsc8xOIwmyk05NNjN60vkc5/KqoTH6hB4V41LJhng==, } + engines: { node: '>=6.9.0' } + peerDependencies: + '@babel/core': ^7.0.0-0 - '@emnapi/runtime@1.11.1': + '@babel/plugin-transform-optional-chaining@7.29.7': resolution: { - integrity: sha512-vgj7R3y3Wgx24IQaGPA/R6YFXLHVMOZ0uVEyIQPaWs+rd1AzfEMXlAC22FYwO1XkKR6NPsq7mUandH8oIRdZFw==, + integrity: sha512-6GM1dhvK3gNODkXcEcMCOLEDCLSoZ/sBbro2Ax8HURyasQ4NshagQixkRFdh5niI6E4gmA/jYI/4aT7rRos3ZQ==, } + engines: { node: '>=6.9.0' } + peerDependencies: + '@babel/core': ^7.0.0-0 - '@emnapi/wasi-threads@1.2.2': + '@babel/plugin-transform-private-methods@7.29.7': resolution: { - integrity: sha512-c95qOXkHdydNKhscBTebqEC1CVAZpyqOfVfBzQ1qgzyl3gfeldUjIggDbIZgDKsHLgnsM+igH7TJ/eAasaVuMA==, + integrity: sha512-/6Rz4DK1ETDEM/bWHsPHcaEe7ZaT1EqSXjtSP/L0DijOYuaUhiRiOKcwpZ8P7zR4xXEHc2ITdiCgBm9Tpyv9ug==, } + engines: { node: '>=6.9.0' } + peerDependencies: + '@babel/core': ^7.0.0-0 - '@esbuild/aix-ppc64@0.27.7': + '@babel/plugin-transform-private-property-in-object@7.29.7': resolution: { - integrity: sha512-EKX3Qwmhz1eMdEJokhALr0YiD0lhQNwDqkPYyPhiSwKrh7/4KRjQc04sZ8db+5DVVnZ1LmbNDI1uAMPEUBnQPg==, + integrity: sha512-+BNo06dnrzdNNqCm1X6YUaVv0DKk8Q+JYcoZfOkLhYWNCXzlwTSRq8zGWayT1csjcpNXV9CQTBRRbmTLZac5cA==, } - engines: { node: '>=18' } - cpu: [ppc64] - os: [aix] + engines: { node: '>=6.9.0' } + peerDependencies: + '@babel/core': ^7.0.0-0 - '@esbuild/aix-ppc64@0.28.1': + '@babel/plugin-transform-react-display-name@7.29.7': resolution: { - integrity: sha512-Svl7tq8k/08+p6CXPpRjQ1fKX+1odH/BQbb48fV6fj3CWHhsoIOoY87w1oHXm0qEpkIK3ZfVgp0hed3XBXzXMQ==, + integrity: sha512-+1wdDMGNb4UPeY3Q4L5yLiYe6TXPXubs4NjrgRFw13hPRLJfEMw2Q5OXkee6/IfdqePIeW4Jjwe3aBh7SdKz4Q==, } - engines: { node: '>=18' } - cpu: [ppc64] - os: [aix] + engines: { node: '>=6.9.0' } + peerDependencies: + '@babel/core': ^7.0.0-0 - '@esbuild/android-arm64@0.27.7': + '@babel/plugin-transform-react-jsx-self@7.29.7': resolution: { - integrity: sha512-62dPZHpIXzvChfvfLJow3q5dDtiNMkwiRzPylSCfriLvZeq0a1bWChrGx/BbUbPwOrsWKMn8idSllklzBy+dgQ==, + integrity: sha512-TL0hMc9xzy86VD31nUiwzd5otRAcyEPcsegCxolO0PvcXuH1v0kECe/UIznYFihpkvU5wg/jk4v0TTEFfm53fw==, } - engines: { node: '>=18' } - cpu: [arm64] - os: [android] + engines: { node: '>=6.9.0' } + peerDependencies: + '@babel/core': ^7.0.0-0 - '@esbuild/android-arm64@0.28.1': + '@babel/plugin-transform-react-jsx-source@7.29.7': resolution: { - integrity: sha512-34EGEbCIAgosYz6goLcopX6Mo7NyGv9tfwEM2/7Ce2VcVRk568iSvniGWcUXIy7wEDR1wzolcxcriFVrWYcwBg==, + integrity: sha512-06IyK09H3wi4cGbhDBwp5gUGo0IKtnYa8tyTiephirPCK6fbobVGiXMMI5zLQ4aKEYP3wZ3ArU44o+8KMrSG/Q==, } - engines: { node: '>=18' } - cpu: [arm64] - os: [android] + engines: { node: '>=6.9.0' } + peerDependencies: + '@babel/core': ^7.0.0-0 - '@esbuild/android-arm@0.27.7': + '@babel/plugin-transform-react-jsx@7.29.7': resolution: { - integrity: sha512-jbPXvB4Yj2yBV7HUfE2KHe4GJX51QplCN1pGbYjvsyCZbQmies29EoJbkEc+vYuU5o45AfQn37vZlyXy4YJ8RQ==, + integrity: sha512-WsZulLVBUHXVj2cUcPVx6UE21TpalB6bHbSFErKT0Ib++ax24jjXe73FqlWvdylFOjiuPHYi6VCcgRad1ItN+A==, } - engines: { node: '>=18' } - cpu: [arm] - os: [android] + engines: { node: '>=6.9.0' } + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-regenerator@7.29.7': + resolution: + { + integrity: sha512-rNNFV0DBAJp988xW2DOntfDoYn1eR8GGF5AT5vYc+rjyfaQkM242c9tZUHHPe7KYaiJizXPWhQTzzdbXySyhBw==, + } + engines: { node: '>=6.9.0' } + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-runtime@7.29.7': + resolution: + { + integrity: sha512-xmAscdE/AsqRW7vutbPNoUmu/nF5SrLKPs7aoJgEjo35lLKA/Bc0i2rMv/hr1+Y0o1bQCiVtith3u2vdgRL39Q==, + } + engines: { node: '>=6.9.0' } + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-typescript@7.29.7': + resolution: + { + integrity: sha512-jK52h8LaLc7JarhQV2ofeFMts4H7vnOXnqZNA6fYglBTZewRBE51KWt3BUltW1P+KoPsYkHoJeXePuz4zo2LMw==, + } + engines: { node: '>=6.9.0' } + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-unicode-regex@7.29.7': + resolution: + { + integrity: sha512-7D/x/23/d/3VqZ0QA+LGbZMlGwZjztBygSWWWsfTPoQ1oQ6Q1P6Mr3d0kk42XabyUVw+fha3LqdRsFqeKqvCyA==, + } + engines: { node: '>=6.9.0' } + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/runtime@7.29.7': + resolution: + { + integrity: sha512-Nq8OhGWiZIZGV6hLHoyAKLLcJihP/xFeBMGJoUrxTX2psI8dCifzLhZISFb+VWS3wFMRDmCGw5R+dOySCqPLhw==, + } + 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.7': + resolution: + { + integrity: sha512-EhlfNQtZ+NK22w5BM61ciuiq1m58ed33Wr1Xan//ZRTy6hgjnwyCffRYwzsGXdASJSUJ1guZILsErh1eQcl+zw==, + } + engines: { node: '>=6.9.0' } + + '@babel/types@7.29.7': + resolution: + { + integrity: sha512-4zBIxpPzowiZpusoFkyGVwakdRJUyuH5PxQ/PrqghfdFWWasvnCdPfQXHrenDai+gyLARulZjZowCOj6fjT4pA==, + } + engines: { node: '>=6.9.0' } + + '@bramus/specificity@2.4.2': + resolution: + { + integrity: sha512-ctxtJ/eA+t+6q2++vj5j7FYX3nRu311q1wfYH3xjlLOsczhlhxAg2FWNUXhpGvAw3BWo1xBcvOV6/YLc2r5FJw==, + } + hasBin: true + + '@cloudflare/kv-asset-handler@0.5.0': + resolution: + { + integrity: sha512-jxQYkj8dSIzc0cD6cMMNdOc1UVjqSqu8BZdor5s8cGjW2I8BjODt/kWPVdY+u9zj3ms75Q5qaZgnxUad83+eAg==, + } + engines: { node: '>=22.0.0' } + + '@cloudflare/unenv-preset@2.16.1': + resolution: + { + integrity: sha512-ECxObrMfyTl5bhQf/lZCXwo5G6xX9IAUo+nDMKK4SZ8m4Jvvxp52vilxyySSWh2YTZz8+HQ07qGH/2rEom1vDw==, + } + peerDependencies: + unenv: 2.0.0-rc.24 + workerd: '>1.20260305.0 <2.0.0-0' + peerDependenciesMeta: + workerd: + optional: true + + '@cloudflare/workerd-darwin-64@1.20260617.1': + resolution: + { + integrity: sha512-jWwmgEVVWbsHNrLSNXzwjJaH90VzRxq1cWkQFUidxyeUPnMxemeNE8I9qFAfrpzGgE11e9sKDcE3ettJW08swQ==, + } + engines: { node: '>=16' } + cpu: [x64] + os: [darwin] + + '@cloudflare/workerd-darwin-arm64@1.20260617.1': + resolution: + { + integrity: sha512-LHH7b565g9znfCUOkwbec6FG2rmRbsgCy6aJiU9KN662mNheWl5sw/iKleiFSiljPKQQP3HkjnC/NSkdgi/aSA==, + } + engines: { node: '>=16' } + cpu: [arm64] + os: [darwin] + + '@cloudflare/workerd-linux-64@1.20260617.1': + resolution: + { + integrity: sha512-FMnaAKXe4Cfd8TQurCVd9fs2XQVBFRCsP+Id/SRdUv89MlwYu9zXfoyx6BxM+brPTIUK38SHbo8iaxiwzLi9JQ==, + } + engines: { node: '>=16' } + cpu: [x64] + os: [linux] + + '@cloudflare/workerd-linux-arm64@1.20260617.1': + resolution: + { + integrity: sha512-MRoifFYcqbxxIIQy7PqO5tFY/qPFSnjXzakWl0sO93l+HLyG35jRAgOi6jfqa4kBxc7gKKtH861DcewjxUfkjA==, + } + engines: { node: '>=16' } + cpu: [arm64] + os: [linux] + + '@cloudflare/workerd-windows-64@1.20260617.1': + resolution: + { + integrity: sha512-rgBV9wQrv0OSKgCTTbhFUFY3sLGNANZ88aqaLvtmEn2gmbFVb1J4PDGochVUdB7NSEp4D/ghHva6/8SZmbONpw==, + } + engines: { node: '>=16' } + cpu: [x64] + os: [win32] + + '@cspotcode/source-map-support@0.8.1': + resolution: + { + integrity: sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==, + } + engines: { node: '>=12' } + + '@csstools/color-helpers@6.1.0': + resolution: + { + integrity: sha512-064IFJdjTfUqnjpCVpMOdbr8FLQBhinbZj6yRv2An2E41O/pLEXqfFRWqGq/SxlE5PEUYTlvWsG2r8MswAVvkg==, + } + engines: { node: '>=20.19.0' } + + '@csstools/css-calc@3.3.0': + resolution: + { + integrity: sha512-c5ihYsPkdG6JCkU2zTMm4+k6r7RXuGxtWYhu5DHMIiF1FHzrfmHL5so11AoFpUv/tu61xfcmT4AmKoFfMPoqdQ==, + } + engines: { node: '>=20.19.0' } + peerDependencies: + '@csstools/css-parser-algorithms': ^4.0.0 + '@csstools/css-tokenizer': ^4.0.0 + + '@csstools/css-color-parser@4.1.10': + resolution: + { + integrity: sha512-UZhQLIUyJaaMepqehrCODwCg2KW25vFvLWBmqYFaPclYvvxzj/sG8LBOhBFCp11i9uE7t1EyS+RAoV9tztPFyw==, + } + engines: { node: '>=20.19.0' } + peerDependencies: + '@csstools/css-parser-algorithms': ^4.0.0 + '@csstools/css-tokenizer': ^4.0.0 + + '@csstools/css-parser-algorithms@4.0.0': + resolution: + { + integrity: sha512-+B87qS7fIG3L5h3qwJ/IFbjoVoOe/bpOdh9hAjXbvx0o8ImEmUsGXN0inFOnk2ChCFgqkkGFQ+TpM5rbhkKe4w==, + } + engines: { node: '>=20.19.0' } + peerDependencies: + '@csstools/css-tokenizer': ^4.0.0 + + '@csstools/css-syntax-patches-for-csstree@1.1.7': + resolution: + { + integrity: sha512-fQ+05118eQS1cofO3aJpB5efgpBZMvIzwr/sbC8kDLVA5XLG8q1kJV5yzrUAI1f7lvhPnm8fgIjzFB8/O/5Dig==, + } + peerDependencies: + css-tree: ^3.2.1 + peerDependenciesMeta: + css-tree: + optional: true + + '@csstools/css-tokenizer@4.0.0': + resolution: + { + integrity: sha512-QxULHAm7cNu72w97JUNCBFODFaXpbDg+dP8b/oWFAZ2MTRppA3U00Y2L1HqaS4J6yBqxwa/Y3nMBaxVKbB/NsA==, + } + engines: { node: '>=20.19.0' } + + '@emnapi/core@1.11.1': + resolution: + { + integrity: sha512-RSvbQmHzdKzNsLYa/wHrbc3KN4sYLKAdPZxqiM2HATqv/SBk2/ENSHpvXGaLOMcsAyz0poEGqkmmKYG3OWiJEQ==, + } + + '@emnapi/runtime@1.11.1': + resolution: + { + integrity: sha512-vgj7R3y3Wgx24IQaGPA/R6YFXLHVMOZ0uVEyIQPaWs+rd1AzfEMXlAC22FYwO1XkKR6NPsq7mUandH8oIRdZFw==, + } + + '@emnapi/wasi-threads@1.2.2': + resolution: + { + integrity: sha512-c95qOXkHdydNKhscBTebqEC1CVAZpyqOfVfBzQ1qgzyl3gfeldUjIggDbIZgDKsHLgnsM+igH7TJ/eAasaVuMA==, + } + + '@esbuild/aix-ppc64@0.27.7': + resolution: + { + integrity: sha512-EKX3Qwmhz1eMdEJokhALr0YiD0lhQNwDqkPYyPhiSwKrh7/4KRjQc04sZ8db+5DVVnZ1LmbNDI1uAMPEUBnQPg==, + } + engines: { node: '>=18' } + cpu: [ppc64] + os: [aix] + + '@esbuild/aix-ppc64@0.28.1': + resolution: + { + integrity: sha512-Svl7tq8k/08+p6CXPpRjQ1fKX+1odH/BQbb48fV6fj3CWHhsoIOoY87w1oHXm0qEpkIK3ZfVgp0hed3XBXzXMQ==, + } + engines: { node: '>=18' } + cpu: [ppc64] + os: [aix] + + '@esbuild/android-arm64@0.27.7': + resolution: + { + integrity: sha512-62dPZHpIXzvChfvfLJow3q5dDtiNMkwiRzPylSCfriLvZeq0a1bWChrGx/BbUbPwOrsWKMn8idSllklzBy+dgQ==, + } + engines: { node: '>=18' } + cpu: [arm64] + os: [android] + + '@esbuild/android-arm64@0.28.1': + resolution: + { + integrity: sha512-34EGEbCIAgosYz6goLcopX6Mo7NyGv9tfwEM2/7Ce2VcVRk568iSvniGWcUXIy7wEDR1wzolcxcriFVrWYcwBg==, + } + engines: { node: '>=18' } + cpu: [arm64] + os: [android] + + '@esbuild/android-arm@0.27.7': + resolution: + { + integrity: sha512-jbPXvB4Yj2yBV7HUfE2KHe4GJX51QplCN1pGbYjvsyCZbQmies29EoJbkEc+vYuU5o45AfQn37vZlyXy4YJ8RQ==, + } + engines: { node: '>=18' } + cpu: [arm] + os: [android] '@esbuild/android-arm@0.28.1': resolution: @@ -1592,20 +2003,32 @@ packages: '@noble/hashes': optional: true - '@img/colour@1.1.0': + '@hapi/hoek@9.3.0': resolution: { - integrity: sha512-Td76q7j57o/tLVdgS746cYARfSyxk8iEfRxewL9h4OMzYhbW4TAcppl0mT4eyqXddh6L/jwoM75mo7ixa/pCeQ==, + integrity: sha512-/c6rf4UJlmHlC9b5BaNvzAcFv7HZ2QHaV0D4/HNlBdvFnvQq8RI4kYdhyPCl7Xj+oWvTWQ8ujhqS53LIgAe6KQ==, } - engines: { node: '>=18' } - '@img/sharp-darwin-arm64@0.34.5': + '@hapi/topo@5.1.0': resolution: { - integrity: sha512-imtQ3WMJXbMY4fxb/Ndp6HBTNVtWCUI0WdobyheGf5+ad6xX8VIDO8u2xE4qc/fr08CKG/7dDseFtn6M6g/r3w==, + integrity: sha512-foQZKJig7Ob0BMAYBfcJk8d77QtOe7Wo4ox7ff1lQYoNNAb6jwcY1ncdoy2e9wQZzvNy7ODZCYJkK8kzmcAnAg==, } - engines: { node: ^18.17.0 || ^20.3.0 || >=21.0.0 } - cpu: [arm64] + + '@img/colour@1.1.0': + resolution: + { + integrity: sha512-Td76q7j57o/tLVdgS746cYARfSyxk8iEfRxewL9h4OMzYhbW4TAcppl0mT4eyqXddh6L/jwoM75mo7ixa/pCeQ==, + } + engines: { node: '>=18' } + + '@img/sharp-darwin-arm64@0.34.5': + resolution: + { + integrity: sha512-imtQ3WMJXbMY4fxb/Ndp6HBTNVtWCUI0WdobyheGf5+ad6xX8VIDO8u2xE4qc/fr08CKG/7dDseFtn6M6g/r3w==, + } + engines: { node: ^18.17.0 || ^20.3.0 || >=21.0.0 } + cpu: [arm64] os: [darwin] '@img/sharp-darwin-x64@0.34.5': @@ -1820,6 +2243,27 @@ packages: cpu: [x64] os: [win32] + '@isaacs/ttlcache@1.4.1': + resolution: + { + integrity: sha512-RQgQ4uQ+pLbqXfOmieB91ejmLwvSgv9nLx6sT6sD83s7umBypgg+OIBOBbEUiJXrfpnp9j0mRhYYdzp9uqq3lA==, + } + engines: { node: '>=12' } + + '@jest/schemas@29.6.3': + resolution: + { + integrity: sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==, + } + engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } + + '@jest/types@29.6.3': + resolution: + { + integrity: sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==, + } + engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } + '@jridgewell/gen-mapping@0.3.13': resolution: { @@ -1839,6 +2283,12 @@ packages: } engines: { node: '>=6.0.0' } + '@jridgewell/source-map@0.3.11': + resolution: + { + integrity: sha512-ZMp1V8ZFcPG5dIWnQLr3NSI1MiCU7UETdS/A0G8V/XWHvJv3ZsFqutJn1Y5RPmAPX6F3BiE397OqveU/9NCuIA==, + } + '@jridgewell/sourcemap-codec@1.5.5': resolution: { @@ -2058,6 +2508,27 @@ packages: } engines: { node: '>= 20.19.0' } + '@nodelib/fs.scandir@2.1.5': + resolution: + { + integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==, + } + engines: { node: '>= 8' } + + '@nodelib/fs.stat@2.0.5': + resolution: + { + integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==, + } + engines: { node: '>= 8' } + + '@nodelib/fs.walk@1.2.8': + resolution: + { + integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==, + } + engines: { node: '>= 8' } + '@observablehq/plot@0.6.17': resolution: { @@ -2216,6 +2687,204 @@ packages: integrity: sha512-dCED+QRChTVatE9ibtoaxc+WkdzOSjYTKi/+uacHWIsfodVfpsueo3+DKpgU5Px8qXjgmXkSvhXvSCz3fnP9lw==, } + '@react-native-community/cli-clean@20.1.0': + resolution: + { + integrity: sha512-77L4DifWfxAT8ByHnkypge7GBMYpbJAjBGV+toowt5FQSGaTBDcBHCX+FFqFRukD5fH6i8sZ41Gtw+nbfCTTIA==, + } + + '@react-native-community/cli-config-android@20.1.0': + resolution: + { + integrity: sha512-3A01ZDyFeCALzzPcwP/fleHoP3sGNq1UX7FzxkTrOFX8RRL9ntXNXQd27E56VU4BBxGAjAJT4Utw8pcOjJceIA==, + } + + '@react-native-community/cli-config-apple@20.1.0': + resolution: + { + integrity: sha512-n6JVs8Q3yxRbtZQOy05ofeb1kGtspGN3SgwPmuaqvURF9fsuS7c4/9up2Kp9C+1D2J1remPJXiZLNGOcJvfpOA==, + } + + '@react-native-community/cli-config@20.1.0': + resolution: + { + integrity: sha512-1x9rhLLR/dKKb92Lb5O0l0EmUG08FHf+ZVyVEf9M+tX+p5QIm52MRiy43R0UAZ2jJnFApxRk+N3sxoYK4Dtnag==, + } + + '@react-native-community/cli-doctor@20.1.0': + resolution: + { + integrity: sha512-QfJF1GVjA4PBrIT3SJ0vFFIu0km1vwOmLDlOYVqfojajZJ+Dnvl0f94GN1il/jT7fITAxom///XH3/URvi7YTQ==, + } + + '@react-native-community/cli-platform-android@20.1.0': + resolution: + { + integrity: sha512-TeHPDThOwDppQRpndm9kCdRCBI8AMy3HSIQ+iy7VYQXL5BtZ5LfmGdusoj7nVN/ZGn0Lc6Gwts5qowyupXdeKg==, + } + + '@react-native-community/cli-platform-apple@20.1.0': + resolution: + { + integrity: sha512-0ih1hrYezSM2cuOlVnwBEFtMwtd8YgpTLmZauDJCv50rIumtkI1cQoOgLoS4tbPCj9U/Vn2a9BFH0DLFOOIacg==, + } + + '@react-native-community/cli-platform-ios@20.1.0': + resolution: + { + integrity: sha512-XN7Da9z4WsJxtqVtEzY8q2bv22OsvzaFP5zy5+phMWNoJlU4lf7IvBSxqGYMpQ9XhYP7arDw5vmW4W34s06rnA==, + } + + '@react-native-community/cli-server-api@20.1.0': + resolution: + { + integrity: sha512-Tb415Oh8syXNT2zOzLzFkBXznzGaqKCiaichxKzGCDKg6JGHp3jSuCmcTcaPeYC7oc32n/S3Psw7798r4Q/7lA==, + } + + '@react-native-community/cli-tools@20.1.0': + resolution: + { + integrity: sha512-/YmzHGOkY6Bgrv4OaA1L8rFqsBlQd1EB2/ipAoKPiieV0EcB5PUamUSuNeFU3sBZZTYQCUENwX4wgOHgFUlDnQ==, + } + + '@react-native-community/cli-types@20.1.0': + resolution: + { + integrity: sha512-D0kDspcwgbVXyNjwicT7Bb1JgXjijTw1JJd+qxyF/a9+sHv7TU4IchV+gN38QegeXqVyM4Ym7YZIvXMFBmyJqA==, + } + + '@react-native-community/cli@20.1.0': + resolution: + { + integrity: sha512-441WsVtRe4nGJ9OzA+QMU1+22lA6Q2hRWqqIMKD0wjEMLqcSfOZyu2UL9a/yRpL/dRpyUsU4n7AxqKfTKO/Csg==, + } + engines: { node: '>=20.19.4' } + hasBin: true + + '@react-native/assets-registry@0.86.0': + resolution: + { + integrity: sha512-nIaXbm2jX1OTYp0qbviJ3O6KZivoE8z3BnhUQ2LsqfZSWRoOK/n1qsiAr6oALiNKWnXY3j2KPwtYORnZzp8xew==, + } + engines: { node: ^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0 } + + '@react-native/babel-plugin-codegen@0.86.0': + resolution: + { + integrity: sha512-qdsABWNW7uTll90l4Vh03gjeyu3WVDi2CyiiyvYGMRDcoYbjbQi6df3BMAm9lQI2yslZ1T14LlDDAsgTwNxplA==, + } + engines: { node: ^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0 } + + '@react-native/babel-preset@0.86.0': + resolution: + { + integrity: sha512-bYQcWiPySNvF4dns9Ls9gMmwgq66ohvM9Fwc/Kn8r85t66UNHxch3p1QwPiSorDelFauZwJbgo9+ReibTgvpbA==, + } + engines: { node: ^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0 } + peerDependencies: + '@babel/core': '*' + + '@react-native/codegen@0.86.0': + resolution: + { + integrity: sha512-uTs9DBo3+/lUqinsGZK0FKJRBVClrwMXoZToaDxE1Q2SL2e55vs2GwyZfIKzPl5uJnbu4PfFMIp0/mLXLWUMuA==, + } + engines: { node: ^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0 } + peerDependencies: + '@babel/core': '*' + + '@react-native/community-cli-plugin@0.86.0': + resolution: + { + integrity: sha512-Jv8p1ebEPfTzs8gmrjsdT2XMXFfeAg45Pman+XPLFGaSeGAZkutRFRyX9Cs9aGTSOyIA9YPJ6vDNb1ayTf1FKQ==, + } + engines: { node: ^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0 } + peerDependencies: + '@react-native-community/cli': '*' + '@react-native/metro-config': 0.86.0 + peerDependenciesMeta: + '@react-native-community/cli': + optional: true + '@react-native/metro-config': + optional: true + + '@react-native/debugger-frontend@0.86.0': + resolution: + { + integrity: sha512-7Mb3nDfyJeys+ELF75Ageu7VKERlnIMoO+aNPoXqTXvz+b41L6l2CqMyLpDHxkBSlenij6gEepPNgaIyWHbJZw==, + } + engines: { node: ^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0 } + + '@react-native/debugger-shell@0.86.0': + resolution: + { + integrity: sha512-Y0zEkZzLz8ou6o/VLml1A31X/rMgc6DRjwxwzPMa94qRTMY070WeBCNTITQo4kKTBAUgbxh07oXPQqp0Tpja8w==, + } + engines: { node: ^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0 } + + '@react-native/dev-middleware@0.86.0': + resolution: + { + integrity: sha512-20pTO6yTybmvXvro520H6C7jydIQnLKOl5qFtVEcHSdFrY63r3OGei+Rx9bILgSRmH6jgnfEcijcMx7pwWuQtw==, + } + engines: { node: ^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0 } + + '@react-native/gradle-plugin@0.86.0': + resolution: + { + integrity: sha512-a1RcfaEDqWExCGfCwadIxt4l8FvKYgFqeMf2uzeKyAOnb+vTGNIeCvifFL2MqvgaeYxlER437HbMIajGcuJ1pQ==, + } + engines: { node: ^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0 } + + '@react-native/js-polyfills@0.86.0': + resolution: + { + integrity: sha512-zYy/Cjd1VTnZ2iCNaG9bDF9C3l2ntESiPRscjIlI5FKugu6aeTwsDSv1aI8Bc4Kp3vEdoVg+UQhLAhE4svREaQ==, + } + engines: { node: ^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0 } + + '@react-native/metro-babel-transformer@0.86.0': + resolution: + { + integrity: sha512-SjKej3E5qIahqo/G+rSOrmJUQM44RyKtWtO+VfmKAAMoJWkBFomM22hTLKCIS5cdbIAJ9COAmU+KAi2wVSO0wQ==, + } + engines: { node: ^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0 } + peerDependencies: + '@babel/core': '*' + + '@react-native/metro-config@0.86.0': + resolution: + { + integrity: sha512-7v+xbTeEci9ZcQ/Z1OqI4RXcqN69wSMDYL5BAMvOReZ7U04+aDQ0/SQhClYPn6x2/RxM4WzMKSAuNyLKqvYVtw==, + } + engines: { node: ^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0 } + + '@react-native/normalize-colors@0.86.0': + resolution: + { + integrity: sha512-kG0wfCGghUKlfxkJyyHCDVutWVYWK7/DG58ojA/4v9EfulgF+osuSQmlbNb3rcKX58qutm7JcldSeVLgGFha9g==, + } + + '@react-native/typescript-config@0.86.0': + resolution: + { + integrity: sha512-oSuFIEMVAVEXdIvDnrdXsWmIF4fYdgtvAEr2ofn8OY534m7XWm9QAqHHpGUzoK0iwDPlPZ5n2Rb25gqF1SZ0rg==, + } + + '@react-native/virtualized-lists@0.86.0': + resolution: + { + integrity: sha512-4/ZLXdf/OSpPDVO0AsQ1SJdRIzt5t9BNQ46QwGgxvX7/cirYR5k8KXctNGGgW8lQo2gZChEfY2zFCZg9nM/jiw==, + } + engines: { node: ^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0 } + peerDependencies: + '@types/react': ^19.2.0 + react: '*' + react-native: 0.86.0 + peerDependenciesMeta: + '@types/react': + optional: true + '@reduxjs/toolkit@2.12.0': resolution: { @@ -2621,6 +3290,30 @@ packages: engines: { node: '>=18.0.0', npm: '>=8.0.0' } hasBin: true + '@sideway/address@4.1.5': + resolution: + { + integrity: sha512-IqO/DUQHUkPeixNQ8n0JA6102hT9CmaljNTPmQ1u8MEhBo/R4Q8eKLN/vGZxuebwOroDB4cbpjheD4+/sKFK4Q==, + } + + '@sideway/formula@3.0.1': + resolution: + { + integrity: sha512-/poHZJJVjx3L+zVD6g9KgHfYnb443oi7wLu/XKojDviHy6HOEOA6z1Trk5aR1dGcmPenJEgb2sK2I80LeS3MIg==, + } + + '@sideway/pinpoint@2.0.0': + resolution: + { + integrity: sha512-RNiOoTPkptFtSVzQevY/yWtZwf/RxyVnPy/OcA9HBM3MlGDnBEYL5B41H0MTn0Uec8Hi+2qUtTfG2WWZBmMejQ==, + } + + '@sinclair/typebox@0.27.12': + resolution: + { + integrity: sha512-hhyNJ+nbR6ZR7pToHvllEFun9TL0sbL+tk/ON75lo+Xas054uez98qRbsuNt7MBCyZKK4+8Yli/OAGZhmfBZ/g==, + } + '@sindresorhus/is@7.2.0': resolution: { @@ -2873,6 +3566,24 @@ packages: integrity: sha512-6C8nqWur3j98U6+lXDfTUWIfgvZU+EumvpHKcYjujKH7woYyLj2sUmff0tRhrqM7BohUw7Pz3ZB1jj2gW9Fvmg==, } + '@types/istanbul-lib-coverage@2.0.6': + resolution: + { + integrity: sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==, + } + + '@types/istanbul-lib-report@3.0.3': + resolution: + { + integrity: sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA==, + } + + '@types/istanbul-reports@3.0.4': + resolution: + { + integrity: sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==, + } + '@types/jsdom@27.0.0': resolution: { @@ -2929,6 +3640,18 @@ packages: integrity: sha512-zFDAD+tlpf2r4asuHEj0XH6pY6i0g5NeAHPn+15wk3BV6JA69eERFXC1gyGThDkVa1zCyKr5jox1+2LbV/AMLg==, } + '@types/yargs-parser@21.0.3': + resolution: + { + integrity: sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==, + } + + '@types/yargs@17.0.35': + resolution: + { + integrity: sha512-qUHkeCyQFxMXg79wQfTtfndEC+N9ZZg76HJftDJp+qH2tV7Gj4OJi7l+PiWwJ+pWtW8GwSmqsDj/oymhrTWXjg==, + } + '@vitejs/plugin-react@6.0.4': resolution: { @@ -2995,6 +3718,12 @@ packages: integrity: sha512-fy9am/HWxbaGt/Sawrp90vt6Y6jQwf1RX77cz3uwoJwJVMli/e1IEwRPnMNJ7vKfPTwo0diXifkpPvwH9v7nGA==, } + '@vscode/sudo-prompt@9.3.2': + resolution: + { + integrity: sha512-gcXoCN00METUNFeQOFJ+C9xUI0DKB+0EGMVg7wbVYRHBw2Eq3fKisDZOkRdOz3kqXRKOENMfShPOmypw1/8nOw==, + } + '@vue/compiler-core@3.5.40': resolution: { @@ -3061,6 +3790,27 @@ packages: integrity: sha512-WxnBtruIqOoV3rA4jeKDWzrYI5h7Cp4+pjwDi8kWGHz+IslhiN+wguLVVhtv2l8VoU02rzDCVfDjgCl1lNpZVg==, } + abort-controller@3.0.0: + resolution: + { + integrity: sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==, + } + engines: { node: '>=6.5' } + + accepts@1.3.8: + resolution: + { + integrity: sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==, + } + engines: { node: '>= 0.6' } + + accepts@2.0.0: + resolution: + { + integrity: sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng==, + } + engines: { node: '>= 0.6' } + acorn@8.17.0: resolution: { @@ -3069,6 +3819,13 @@ packages: engines: { node: '>=0.4.0' } hasBin: true + agent-base@7.1.4: + resolution: + { + integrity: sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==, + } + engines: { node: '>= 14' } + ajv@8.20.0: resolution: { @@ -3081,1955 +3838,3920 @@ packages: integrity: sha512-nJvPAQVNPdZZ0NrExJ/kzQco3ijR8LwvCOadQecllESiqT4NyZ/57sN9V2XyvhlBGAbmlKYgeWZvYdKq99ij/Q==, } - ansi-regex@6.2.2: + anser@1.4.10: resolution: { - integrity: sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==, + integrity: sha512-hCv9AqTQ8ycjpSd3upOJd7vFwW1JaoYQ7tpham03GJ1ca8/65rqn0RpaWpItOAd6ylW9wAw6luXYPJIyPFVOww==, } - engines: { node: '>=12' } - ansi-styles@6.2.3: + ansi-fragments@0.2.1: resolution: { - integrity: sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==, + integrity: sha512-DykbNHxuXQwUDRv5ibc2b0x7uw7wmwOGLBUd5RmaQ5z8Lhx19vwvKV+FAsM5rEA6dEcHxX+/Ad5s9eF2k2bB+w==, } - engines: { node: '>=12' } - aria-query@5.3.1: + ansi-regex@4.1.1: resolution: { - integrity: sha512-Z/ZeOgVl7bcSYZ/u/rh0fOpvEpq//LZmdbkXyc7syVzjPAhfOa9ebsdTSjEBDU4vs5nC98Kfduj1uFo0qyET3g==, + integrity: sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==, } - engines: { node: '>= 0.4' } + engines: { node: '>=6' } - assertion-error@2.0.1: + ansi-regex@5.0.1: resolution: { - integrity: sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==, + integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==, } - engines: { node: '>=12' } + engines: { node: '>=8' } - axobject-query@4.1.0: + ansi-regex@6.2.2: resolution: { - integrity: sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ==, + integrity: sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==, } - engines: { node: '>= 0.4' } + engines: { node: '>=12' } - babel-plugin-jsx-dom-expressions@0.40.7: + ansi-styles@3.2.1: resolution: { - integrity: sha512-/O6JWUmjv03OI9lL2ry9bUjpD5S3PclM55RRJEyCdcFZ5W2SEA/59d+l2hNsk3gI6kiWRdRPdOtqZmsQzFN1pQ==, + integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==, } - peerDependencies: - '@babel/core': ^7.20.12 + engines: { node: '>=4' } - babel-preset-solid@1.9.12: + ansi-styles@4.3.0: resolution: { - integrity: sha512-LLqnuKVDlKpyBlMPcH6qEvs/wmS9a+NczppxJ3ryS/c0O5IiSFOIBQi9GzyiGDSbcJpx4Gr87jyFTos1MyEuWg==, + integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==, } - peerDependencies: - '@babel/core': ^7.0.0 - solid-js: ^1.9.12 - peerDependenciesMeta: - solid-js: - optional: true + engines: { node: '>=8' } - baseline-browser-mapping@2.11.5: + ansi-styles@5.2.0: resolution: { - integrity: sha512-xJo6a6YZnwZfnyGmQKWMbVOcii7XRibjOskRh+WJ9UHQoX16xrQrcIgAMQOzfvs8XiLMx6ih/fsLPF73iY2D1A==, + integrity: sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==, } - engines: { node: '>=6.0.0' } - hasBin: true + engines: { node: '>=10' } - bidi-js@1.0.3: + ansi-styles@6.2.3: resolution: { - integrity: sha512-RKshQI1R3YQ+n9YJz2QQ147P66ELpa1FQEg20Dk8oW9t2KgLbpDLLp9aGZ7y8WHSshDknG0bknqGw5/tyCs5tw==, + integrity: sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==, } + engines: { node: '>=12' } - binary-search-bounds@2.0.5: + appdirsjs@1.2.8: resolution: { - integrity: sha512-H0ea4Fd3lS1+sTEB2TgcLoK21lLhwEJzlQv3IN47pJS976Gx4zoWe0ak3q+uYh60ppQxg9F16Ri4tS1sfD4+jA==, + integrity: sha512-8zl1xlxeS4a0/36CT6LOaVioPOL8TeLT1b9OHk0j9xSbzmPBuM7lUgWMSTh6SbuF8fbwjcP1rr30OCLpd1fl+A==, } - blake3-wasm@2.1.5: + argparse@2.0.1: resolution: { - integrity: sha512-F1+K8EbfOZE49dtoPtmxUQrpXaBIl3ICvasLh+nJta0xkz+9kF/7uet9fLnwKqhDrmj6g+6K3Tw9yQPUg2ka5g==, + integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==, } - browserslist@4.28.7: + aria-query@5.3.1: resolution: { - integrity: sha512-JxV13hNrFxqjOc8alRbq9dK1MM79NEXYpma2B2J4wAtpWS5zIEIKqWPGCl7N4o7Uc7B7itylh7SuDujATRyyTw==, + integrity: sha512-Z/ZeOgVl7bcSYZ/u/rh0fOpvEpq//LZmdbkXyc7syVzjPAhfOa9ebsdTSjEBDU4vs5nC98Kfduj1uFo0qyET3g==, } - engines: { node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7 } - hasBin: true + engines: { node: '>= 0.4' } - caniuse-lite@1.0.30001806: + asap@2.0.6: resolution: { - integrity: sha512-72Cuvd95zbSYPKq6Fhg8eDJRlzgWDf7/mtoZv6Qe/DYNCEBdNxoA3+rZAU2ZhGCpZlns3EssFavaZomckT5Uuw==, + integrity: sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==, } - chai@6.2.2: + assertion-error@2.0.1: resolution: { - integrity: sha512-NUPRluOfOiTKBKvWPtSD4PhFvWCqOi0BGStNWs57X9js7XGTprSmFoz5F0tWhR4WPjNeR9jXqdC7/UpSJTnlRg==, + integrity: sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==, } - engines: { node: '>=18' } + engines: { node: '>=12' } - chalk@5.6.2: + astral-regex@1.0.0: resolution: { - integrity: sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==, + integrity: sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg==, } - engines: { node: ^12.17.0 || ^14.13 || >=16.0.0 } + engines: { node: '>=4' } - chart.js@4.5.1: + async-limiter@1.0.1: resolution: { - integrity: sha512-GIjfiT9dbmHRiYi6Nl2yFCq7kkwdkp1W/lp2J99rX0yo9tgJGn3lKQATztIjb5tVtevcBtIdICNWqlq5+E8/Pw==, + integrity: sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==, } - engines: { pnpm: '>=8' } - chokidar@4.0.3: + axobject-query@4.1.0: resolution: { - integrity: sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==, + integrity: sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ==, } - engines: { node: '>= 14.16.0' } + engines: { node: '>= 0.4' } - chokidar@5.0.0: + babel-plugin-jsx-dom-expressions@0.40.7: resolution: { - integrity: sha512-TQMmc3w+5AxjpL8iIiwebF73dRDF4fBIieAqGn9RGCWaEVwQ6Fb2cGe31Yns0RRIzii5goJ1Y7xbMwo1TxMplw==, + integrity: sha512-/O6JWUmjv03OI9lL2ry9bUjpD5S3PclM55RRJEyCdcFZ5W2SEA/59d+l2hNsk3gI6kiWRdRPdOtqZmsQzFN1pQ==, } - engines: { node: '>= 20.19.0' } + peerDependencies: + '@babel/core': ^7.20.12 - cli-cursor@5.0.0: + babel-plugin-polyfill-corejs2@0.4.17: resolution: { - integrity: sha512-aCj4O5wKyszjMmDT4tZj93kxyydN/K5zPWSCe6/0AV/AA1pqe5ZBIw0a2ZfPQV7lL5/yb5HsUreJ6UFAF1tEQw==, + integrity: sha512-aTyf30K/rqAsNwN76zYrdtx8obu0E4KoUME29B1xj+B3WxgvWkp943vYQ+z8Mv3lw9xHXMHpvSPOBxzAkIa94w==, } - engines: { node: '>=18' } + peerDependencies: + '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 - cli-spinners@3.4.0: + babel-plugin-polyfill-corejs3@0.13.0: resolution: { - integrity: sha512-bXfOC4QcT1tKXGorxL3wbJm6XJPDqEnij2gQ2m7ESQuE+/z9YFIWnl/5RpTiKWbMq3EVKR4fRLJGn6DVfu0mpw==, + integrity: sha512-U+GNwMdSFgzVmfhNm8GJUX88AadB3uo9KpJqS3FaqNIPKgySuvMb+bHPsOmmuWyIcuqZj/pzt1RUIUZns4y2+A==, } - engines: { node: '>=18.20' } + peerDependencies: + '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 - cliui@9.0.1: + babel-plugin-polyfill-regenerator@0.6.8: resolution: { - integrity: sha512-k7ndgKhwoQveBL+/1tqGJYNz097I7WOvwbmmU2AR5+magtbjPWQTS1C5vzGkBC8Ym8UWRzfKUzUUqFLypY4Q+w==, + integrity: sha512-M762rNHfSF1EV3SLtnCJXFoQbbIIz0OyRwnCmV0KPC7qosSfCO0QLTSuJX3ayAebubhE6oYBAYPrBA5ljowaZg==, } - engines: { node: '>=20' } + peerDependencies: + '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 - clsx@2.1.1: + babel-plugin-syntax-hermes-parser@0.36.0: resolution: { - integrity: sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==, + integrity: sha512-LhD0xdoedDw7ansQgXbB2DADLZIK/LRXuWNBPuVzMc5S2WK5GyT89tCM+cQzxFGO0mGyLK6D5TrVOJJzAoDy8Q==, } - engines: { node: '>=6' } - commander@14.0.3: + babel-plugin-transform-flow-enums@0.0.2: resolution: { - integrity: sha512-H+y0Jo/T1RZ9qPP4Eh1pkcQcLRglraJaSLoyOtHxu6AapkjWVCy2Sit1QQ4x3Dng8qDlSsZEet7g5Pq06MvTgw==, + integrity: sha512-g4aaCrDDOsWjbm0PUUeVnkcVd6AKJsVc/MbnPhEotEpkeJQP6b8nzewohQi7+QS8UyPehOhGWn0nOwjvWpmMvQ==, } - engines: { node: '>=20' } - commander@2.20.3: + babel-preset-solid@1.9.12: resolution: { - integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==, + integrity: sha512-LLqnuKVDlKpyBlMPcH6qEvs/wmS9a+NczppxJ3ryS/c0O5IiSFOIBQi9GzyiGDSbcJpx4Gr87jyFTos1MyEuWg==, } + peerDependencies: + '@babel/core': ^7.0.0 + solid-js: ^1.9.12 + peerDependenciesMeta: + solid-js: + optional: true - commander@7.2.0: + base64-js@1.5.1: resolution: { - integrity: sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==, + integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==, } - engines: { node: '>= 10' } - common-path-prefix@3.0.0: + baseline-browser-mapping@2.11.5: resolution: { - integrity: sha512-QE33hToZseCH3jS0qN96O/bSh3kaw/h+Tq7ngyY9eWDUnTlTNUyqfqvCXioLe5Na5jFsL78ra/wuBU4iuEgd4w==, + integrity: sha512-xJo6a6YZnwZfnyGmQKWMbVOcii7XRibjOskRh+WJ9UHQoX16xrQrcIgAMQOzfvs8XiLMx6ih/fsLPF73iY2D1A==, } + engines: { node: '>=6.0.0' } + hasBin: true - convert-source-map@1.9.0: + bidi-js@1.0.3: resolution: { - integrity: sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==, + integrity: sha512-RKshQI1R3YQ+n9YJz2QQ147P66ELpa1FQEg20Dk8oW9t2KgLbpDLLp9aGZ7y8WHSshDknG0bknqGw5/tyCs5tw==, } - convert-source-map@2.0.0: + binary-search-bounds@2.0.5: resolution: { - integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==, + integrity: sha512-H0ea4Fd3lS1+sTEB2TgcLoK21lLhwEJzlQv3IN47pJS976Gx4zoWe0ak3q+uYh60ppQxg9F16Ri4tS1sfD4+jA==, } - cookie@1.1.1: + bl@4.1.0: resolution: { - integrity: sha512-ei8Aos7ja0weRpFzJnEA9UHJ/7XQmqglbRwnf2ATjcB9Wq874VKH9kfjjirM6UhU2/E5fFYadylyhFldcqSidQ==, + integrity: sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==, } - engines: { node: '>=18' } - copy-anything@3.0.5: + blake3-wasm@2.1.5: resolution: { - integrity: sha512-yCEafptTtb4bk7GLEQoM8KVJpxAfdBJYaXyzQEgQQQgYrZiDp8SJmGKlYza6CYjEDNstAdNdKA3UuoULlEbS6w==, + integrity: sha512-F1+K8EbfOZE49dtoPtmxUQrpXaBIl3ICvasLh+nJta0xkz+9kF/7uet9fLnwKqhDrmj6g+6K3Tw9yQPUg2ka5g==, } - engines: { node: '>=12.13' } - css-tree@3.2.1: + body-parser@1.20.6: resolution: { - integrity: sha512-X7sjQzceUhu1u7Y/ylrRZFU2FS6LRiFVp6rKLPg23y3x3c3DOKAwuXGDp+PAGjh6CSnCjYeAul8pcT8bAl+lSA==, + integrity: sha512-p5tAzS57i5MV9fZFDj9LeIiTZEufbSe2eDozP+ElheSUq1m74CRq1jI4mYNDdVs9vQztXFLuk/Gd6BWTdwRJ5g==, } - engines: { node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0 } + engines: { node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16 } - csstype@3.2.3: + boolbase@1.0.0: resolution: { - integrity: sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==, + integrity: sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==, } - d3-array@3.2.4: + braces@3.0.3: resolution: { - integrity: sha512-tdQAmyA18i4J7wprpYq8ClcxZy3SC31QMeByyCFyRt7BVHdREQZ5lpzoe5mFEYZUWe+oq8HBvk9JjpibyEV4Jg==, + integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==, } - engines: { node: '>=12' } + engines: { node: '>=8' } - d3-axis@3.0.0: + browserslist@4.28.7: resolution: { - integrity: sha512-IH5tgjV4jE/GhHkRV0HiVYPDtvfjHQlQfJHs0usq7M30XcSBvOotpmH1IgkcXsO/5gEQZD43B//fc7SRT5S+xw==, + integrity: sha512-JxV13hNrFxqjOc8alRbq9dK1MM79NEXYpma2B2J4wAtpWS5zIEIKqWPGCl7N4o7Uc7B7itylh7SuDujATRyyTw==, } - engines: { node: '>=12' } + engines: { node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7 } + hasBin: true - d3-brush@3.0.0: + bser@2.1.1: resolution: { - integrity: sha512-ALnjWlVYkXsVIGlOsuWH1+3udkYFI48Ljihfnh8FZPF2QS9o+PzGLBslO0PjzVoHLZ2KCVgAM8NVkXPJB2aNnQ==, + integrity: sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==, } - engines: { node: '>=12' } - d3-chord@3.0.1: + buffer-from@1.1.2: resolution: { - integrity: sha512-VE5S6TNa+j8msksl7HwjxMHDM2yNK3XCkusIlpX5kwauBfXuyLAtNg9jCp/iHH61tgI4sb6R/EIMWCqEIdjT/g==, + integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==, } - engines: { node: '>=12' } - d3-color@3.1.0: + buffer@5.7.1: resolution: { - integrity: sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA==, + integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==, } - engines: { node: '>=12' } - d3-contour@4.0.2: + bytes@3.1.2: resolution: { - integrity: sha512-4EzFTRIikzs47RGmdxbeUvLWtGedDUNkTcmzoeyg4sP/dvCexO47AaQL7VKy/gul85TOxw+IBgA8US2xwbToNA==, + integrity: sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==, } - engines: { node: '>=12' } + engines: { node: '>= 0.8' } - d3-delaunay@6.0.4: + call-bind-apply-helpers@1.0.2: resolution: { - integrity: sha512-mdjtIZ1XLAM8bm/hx3WwjfHt6Sggek7qH043O8KEjDXN40xi3vx/6pYSVTwLjEgiXQTbvaouWKynLBiUZ6SK6A==, + integrity: sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==, } - engines: { node: '>=12' } + engines: { node: '>= 0.4' } - d3-dispatch@3.0.1: + call-bound@1.0.4: resolution: { - integrity: sha512-rzUyPU/S7rwUflMyLc1ETDeBj0NRuHKKAcvukozwhshr6g6c5d8zh4c2gQjY2bZ0dXeGLWc1PF174P2tVvKhfg==, + integrity: sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==, } - engines: { node: '>=12' } + engines: { node: '>= 0.4' } - d3-drag@3.0.0: + callsites@3.1.0: resolution: { - integrity: sha512-pWbUJLdETVA8lQNJecMxoXfH6x+mO2UQo8rSmZ+QqxcbyA3hfeprFgIT//HW2nlHChWeIIMwS2Fq+gEARkhTkg==, + integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==, } - engines: { node: '>=12' } + engines: { node: '>=6' } - d3-dsv@3.0.1: + camelcase@5.3.1: resolution: { - integrity: sha512-UG6OvdI5afDIFP9w4G0mNq50dSOsXHJaRE8arAS5o9ApWnIElp8GZw1Dun8vP8OyHOZ/QJUKUJwxiiCCnUwm+Q==, + integrity: sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==, } - engines: { node: '>=12' } - hasBin: true + engines: { node: '>=6' } - d3-ease@3.0.1: + camelcase@6.3.0: resolution: { - integrity: sha512-wR/XK3D3XcLIZwpbvQwQ5fK+8Ykds1ip7A2Txe0yxncXSdq1L9skcG7blcedkOX+ZcgxGAmLX1FrRGbADwzi0w==, + integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==, } - engines: { node: '>=12' } + engines: { node: '>=10' } - d3-fetch@3.0.1: + caniuse-lite@1.0.30001806: resolution: { - integrity: sha512-kpkQIM20n3oLVBKGg6oHrUchHM3xODkTzjMoj7aWQFq5QEM+R6E4WkzT5+tojDY7yjez8KgCBRoj4aEr99Fdqw==, + integrity: sha512-72Cuvd95zbSYPKq6Fhg8eDJRlzgWDf7/mtoZv6Qe/DYNCEBdNxoA3+rZAU2ZhGCpZlns3EssFavaZomckT5Uuw==, } - engines: { node: '>=12' } - d3-force@3.0.0: + chai@6.2.2: resolution: { - integrity: sha512-zxV/SsA+U4yte8051P4ECydjD/S+qeYtnaIyAs9tgHCqfguma/aAQDjo85A9Z6EKhBirHRJHXIgJUlffT4wdLg==, + integrity: sha512-NUPRluOfOiTKBKvWPtSD4PhFvWCqOi0BGStNWs57X9js7XGTprSmFoz5F0tWhR4WPjNeR9jXqdC7/UpSJTnlRg==, } - engines: { node: '>=12' } + engines: { node: '>=18' } - d3-format@3.1.2: + chalk@4.1.2: resolution: { - integrity: sha512-AJDdYOdnyRDV5b6ArilzCPPwc1ejkHcoyFarqlPqT7zRYjhavcT3uSrqcMvsgh2CgoPbK3RCwyHaVyxYcP2Arg==, + integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==, } - engines: { node: '>=12' } + engines: { node: '>=10' } - d3-geo@3.1.1: + chalk@5.6.2: resolution: { - integrity: sha512-637ln3gXKXOwhalDzinUgY83KzNWZRKbYubaG+fGVuc/dxO64RRljtCTnf5ecMyE1RIdtqpkVcq0IbtU2S8j2Q==, + integrity: sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==, } - engines: { node: '>=12' } + engines: { node: ^12.17.0 || ^14.13 || >=16.0.0 } - d3-hexbin@0.2.2: + chart.js@4.5.1: resolution: { - integrity: sha512-KS3fUT2ReD4RlGCjvCEm1RgMtp2NFZumdMu4DBzQK8AZv3fXRM6Xm8I4fSU07UXvH4xxg03NwWKWdvxfS/yc4w==, + integrity: sha512-GIjfiT9dbmHRiYi6Nl2yFCq7kkwdkp1W/lp2J99rX0yo9tgJGn3lKQATztIjb5tVtevcBtIdICNWqlq5+E8/Pw==, } + engines: { pnpm: '>=8' } - d3-hierarchy@3.1.2: + chokidar@4.0.3: resolution: { - integrity: sha512-FX/9frcub54beBdugHjDCdikxThEqjnR93Qt7PvQTOHxyiNCAlvMrHhclk3cD5VeAaq9fxmfRp+CnWw9rEMBuA==, + integrity: sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==, } - engines: { node: '>=12' } + engines: { node: '>= 14.16.0' } - d3-interpolate@3.0.1: + chokidar@5.0.0: resolution: { - integrity: sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g==, + integrity: sha512-TQMmc3w+5AxjpL8iIiwebF73dRDF4fBIieAqGn9RGCWaEVwQ6Fb2cGe31Yns0RRIzii5goJ1Y7xbMwo1TxMplw==, } - engines: { node: '>=12' } + engines: { node: '>= 20.19.0' } - d3-path@3.1.0: + chrome-launcher@0.15.2: resolution: { - integrity: sha512-p3KP5HCf/bvjBSSKuXid6Zqijx7wIfNW+J/maPs+iwR35at5JCbLUT0LzF1cnjbCHWhqzQTIN2Jpe8pRebIEFQ==, + integrity: sha512-zdLEwNo3aUVzIhKhTtXfxhdvZhUghrnmkvcAq2NoDd+LeOHKf03H5jwZ8T/STsAlzyALkBVK552iaG1fGf1xVQ==, } - engines: { node: '>=12' } + engines: { node: '>=12.13.0' } + hasBin: true - d3-polygon@3.0.1: + chromium-edge-launcher@0.3.0: resolution: { - integrity: sha512-3vbA7vXYwfe1SYhED++fPUQlWSYTTGmFmQiany/gdbiWgU/iEyQzyymwL9SkJjFFuCS4902BSzewVGsHHmHtXg==, + integrity: sha512-p03azHlGjtyRvFEee3cyvtsRYdniSkwjkzmM/KmVnqT5d7QkkwpJBhis/zCLMYdQMVJ5tt140TBNqqrZPaWeFA==, } - engines: { node: '>=12' } - d3-quadtree@3.0.1: + ci-info@2.0.0: resolution: { - integrity: sha512-04xDrxQTDTCFwP5H6hRhsRcb9xxv2RzkcsygFzmkSIOJy3PeRJP7sNk3VRIbKXcog561P9oU0/rVH6vDROAgUw==, + integrity: sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==, } - engines: { node: '>=12' } - d3-random@3.0.1: + ci-info@3.9.0: resolution: { - integrity: sha512-FXMe9GfxTxqd5D6jFsQ+DJ8BJS4E/fT5mqqdjovykEB2oFbTMDVdg1MGFxfQW+FBOGoB++k8swBrgwSHT1cUXQ==, + integrity: sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==, } - engines: { node: '>=12' } + engines: { node: '>=8' } - d3-scale-chromatic@3.1.0: + cli-cursor@3.1.0: resolution: { - integrity: sha512-A3s5PWiZ9YCXFye1o246KoscMWqf8BsD9eRiJ3He7C9OBaxKhAd5TFCdEx/7VbKtxxTsu//1mMJFrEt572cEyQ==, + integrity: sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==, } - engines: { node: '>=12' } + engines: { node: '>=8' } - d3-scale@4.0.2: + cli-cursor@5.0.0: resolution: { - integrity: sha512-GZW464g1SH7ag3Y7hXjf8RoUuAFIqklOAq3MRl4OaWabTFJY9PN/E1YklhXLh+OQ3fM9yS2nOkCoS+WLZ6kvxQ==, + integrity: sha512-aCj4O5wKyszjMmDT4tZj93kxyydN/K5zPWSCe6/0AV/AA1pqe5ZBIw0a2ZfPQV7lL5/yb5HsUreJ6UFAF1tEQw==, } - engines: { node: '>=12' } + engines: { node: '>=18' } - d3-selection@3.0.0: + cli-spinners@2.9.2: resolution: { - integrity: sha512-fmTRWbNMmsmWq6xJV8D19U/gw/bwrHfNXxrIN+HfZgnzqTHp9jOmKMhsTUjXOJnZOdZY9Q28y4yebKzqDKlxlQ==, + integrity: sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==, } - engines: { node: '>=12' } + engines: { node: '>=6' } - d3-shape@3.2.0: + cli-spinners@3.4.0: resolution: { - integrity: sha512-SaLBuwGm3MOViRq2ABk3eLoxwZELpH6zhl3FbAoJ7Vm1gofKx6El1Ib5z23NUEhF9AsGl7y+dzLe5Cw2AArGTA==, + integrity: sha512-bXfOC4QcT1tKXGorxL3wbJm6XJPDqEnij2gQ2m7ESQuE+/z9YFIWnl/5RpTiKWbMq3EVKR4fRLJGn6DVfu0mpw==, } - engines: { node: '>=12' } + engines: { node: '>=18.20' } - d3-time-format@4.1.0: + cliui@6.0.0: resolution: { - integrity: sha512-dJxPBlzC7NugB2PDLwo9Q8JiTR3M3e4/XANkreKSUxF8vvXKqm1Yfq4Q5dl8budlunRVlUUaDUgFt7eA8D6NLg==, + integrity: sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==, } - engines: { node: '>=12' } - d3-time@3.1.0: + cliui@8.0.1: resolution: { - integrity: sha512-VqKjzBLejbSMT4IgbmVgDjpkYrNWUYJnbCGo874u7MMKIWsILRX+OpX/gTk8MqjpT1A/c6HY2dCA77ZN0lkQ2Q==, + integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==, } engines: { node: '>=12' } - d3-timer@3.0.1: + cliui@9.0.1: resolution: { - integrity: sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA==, + integrity: sha512-k7ndgKhwoQveBL+/1tqGJYNz097I7WOvwbmmU2AR5+magtbjPWQTS1C5vzGkBC8Ym8UWRzfKUzUUqFLypY4Q+w==, } - engines: { node: '>=12' } + engines: { node: '>=20' } - d3-transition@3.0.1: + clone@1.0.4: resolution: { - integrity: sha512-ApKvfjsSR6tg06xrL434C0WydLr7JewBB3V+/39RMHsaXTOG0zmt/OAXeng5M5LBm0ojmxJrpomQVZ1aPvBL4w==, + integrity: sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==, } - engines: { node: '>=12' } - peerDependencies: - d3-selection: 2 - 3 + engines: { node: '>=0.8' } - d3-zoom@3.0.0: + clsx@2.1.1: resolution: { - integrity: sha512-b8AmV3kfQaqWAuacbPuNbL6vahnOJflOhexLzMMNLga62+/nh0JzvJ0aO/5a5MVgUFGS7Hu1P9P03o3fJkDCyw==, + integrity: sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==, } - engines: { node: '>=12' } + engines: { node: '>=6' } - d3@7.9.0: + color-convert@1.9.3: resolution: { - integrity: sha512-e1U46jVP+w7Iut8Jt8ri1YsPOvFpg46k+K8TpCb0P+zjCkjkPnV7WzfDJzMHy1LnA+wj5pLT1wjO901gLXeEhA==, + integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==, } - engines: { node: '>=12' } - data-urls@7.0.0: + color-convert@2.0.1: resolution: { - integrity: sha512-23XHcCF+coGYevirZceTVD7NdJOqVn+49IHyxgszm+JIiHLoB2TkmPtsYkNWT1pvRSGkc35L6NHs0yHkN2SumA==, + integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==, } - engines: { node: ^20.19.0 || ^22.12.0 || >=24.0.0 } + engines: { node: '>=7.0.0' } - debug@2.6.9: + color-name@1.1.3: resolution: { - integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==, + integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==, } - peerDependencies: - supports-color: '*' - peerDependenciesMeta: - supports-color: - optional: true - debug@3.2.7: + color-name@1.1.4: resolution: { - integrity: sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==, + integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==, } - peerDependencies: - supports-color: '*' - peerDependenciesMeta: - supports-color: - optional: true - debug@4.4.3: + colorette@1.4.0: resolution: { - integrity: sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==, + integrity: sha512-Y2oEozpomLn7Q3HFP7dpww7AtMJplbM9lGZP6RDfHqmbeRjiwRg4n6VM6j4KLmRke85uWEI7JqF17f3pqdRA0g==, } - engines: { node: '>=6.0' } - peerDependencies: - supports-color: '*' - peerDependenciesMeta: - supports-color: - optional: true - decimal.js-light@2.5.1: + command-exists@1.2.9: resolution: { - integrity: sha512-qIMFpTMZmny+MMIitAB6D7iVPEorVw6YQRWkvarTkT4tBeSLLiHzcwj6q0MmYSFCiVpiqPJTJEYIrpcPzVEIvg==, + integrity: sha512-LTQ/SGc+s0Xc0Fu5WaKnR0YiygZkm9eKFvyS+fRsU7/ZWFF8ykFM6Pc9aCVf1+xasOOZpO3BAVgVrKvsqKHV7w==, } - decimal.js@10.6.0: + commander@12.1.0: resolution: { - integrity: sha512-YpgQiITW3JXGntzdUmyUR1V812Hn8T1YVXhCu+wO3OpS4eU9l4YdD3qjyiKdV6mvV29zapkMeD390UVEf2lkUg==, + integrity: sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==, } + engines: { node: '>=18' } - dedent-js@1.0.1: + commander@14.0.3: resolution: { - integrity: sha512-OUepMozQULMLUmhxS95Vudo0jb0UchLimi3+pQ2plj61Fcy8axbP9hbiD4Sz6DPqn6XG3kfmziVfQ1rSys5AJQ==, + integrity: sha512-H+y0Jo/T1RZ9qPP4Eh1pkcQcLRglraJaSLoyOtHxu6AapkjWVCy2Sit1QQ4x3Dng8qDlSsZEet7g5Pq06MvTgw==, } + engines: { node: '>=20' } - deepmerge@4.3.1: + commander@2.20.3: resolution: { - integrity: sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==, + integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==, } - engines: { node: '>=0.10.0' } - delaunator@5.1.0: + commander@7.2.0: resolution: { - integrity: sha512-AGrQ4QSgssa1NGmWmLPqN5NY2KajF5MqxetNEO+o0n3ZwZZeTmt7bBnvzHWrmkZFxGgr4HdyFgelzgi06otLuQ==, + integrity: sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==, } + engines: { node: '>= 10' } - dependency-graph@1.0.0: + commander@9.5.0: resolution: { - integrity: sha512-cW3gggJ28HZ/LExwxP2B++aiKxhJXMSIt9K48FOXQkm+vuG5gyatXnLsONRJdzO/7VfjDIiaOOa/bs4l464Lwg==, + integrity: sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ==, } - engines: { node: '>=4' } + engines: { node: ^12.20.0 || >=14 } - detect-libc@2.1.2: + common-path-prefix@3.0.0: resolution: { - integrity: sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==, + integrity: sha512-QE33hToZseCH3jS0qN96O/bSh3kaw/h+Tq7ngyY9eWDUnTlTNUyqfqvCXioLe5Na5jFsL78ra/wuBU4iuEgd4w==, } - engines: { node: '>=8' } - devalue@5.8.2: + compressible@2.0.18: resolution: { - integrity: sha512-DObPPAfdtFbXjxLqK8s2Xk9ZuWz5+ZoFEhC7J76es4GU/rEiXwHTmbImoCdyoCOcBH1UF3+Cz6Z2sYD4hyl5TA==, + integrity: sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==, } + engines: { node: '>= 0.6' } - echarts@6.1.0: + compression@1.8.1: resolution: { - integrity: sha512-q0yaFPggC9FUdsWH4blavRWFmxdrIodbkoKNAjJudAI6CA9gNPxHtV2RcZNEepZVlk4yvBYkOkbk6HIVpIyHZA==, + integrity: sha512-9mAqGPHLakhCLeNyxPkK4xVo746zQ/czLH1Ky+vkitMnWfWZps8r0qXuwhwizagCRttsL4lfG4pIOvaWLpAP0w==, } + engines: { node: '>= 0.8.0' } - electron-to-chromium@1.5.397: + connect@3.7.0: resolution: { - integrity: sha512-khGTy9U9x02KEtsKM8vx5A62BsRmcOsIgDpWr1ImE32Ax8GxHGPHZf+Eu9H8zOOyHJnB0jTbseyTHbq2XCT8yw==, + integrity: sha512-ZqRXc+tZukToSNmh5C2iWMSoV3X1YUcPbqEM4DkEG5tNQXrQUZCNVGGv3IuicnkMtPfGf3Xtp8WCXs295iQ1pQ==, } + engines: { node: '>= 0.10.0' } - emoji-regex@10.6.0: + content-type@1.0.5: resolution: { - integrity: sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A==, + integrity: sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==, } + engines: { node: '>= 0.6' } - entities@6.0.1: + convert-source-map@1.9.0: resolution: { - integrity: sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==, + integrity: sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==, } - engines: { node: '>=0.12' } - entities@7.0.1: + convert-source-map@2.0.0: resolution: { - integrity: sha512-TWrgLOFUQTH994YUyl1yT4uyavY5nNB5muff+RtWaqNVCAK408b5ZnnbNAUEWLTCpum9w6arT70i1XdQ4UeOPA==, + integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==, } - engines: { node: '>=0.12' } - entities@8.0.0: + cookie@1.1.1: resolution: { - integrity: sha512-zwfzJecQ/Uej6tusMqwAqU/6KL2XaB2VZ2Jg54Je6ahNBGNH6Ek6g3jjNCF0fG9EWQKGZNddNjU5F1ZQn/sBnA==, + integrity: sha512-ei8Aos7ja0weRpFzJnEA9UHJ/7XQmqglbRwnf2ATjcB9Wq874VKH9kfjjirM6UhU2/E5fFYadylyhFldcqSidQ==, } - engines: { node: '>=20.19.0' } + engines: { node: '>=18' } - errno@0.1.8: + copy-anything@3.0.5: resolution: { - integrity: sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A==, + integrity: sha512-yCEafptTtb4bk7GLEQoM8KVJpxAfdBJYaXyzQEgQQQgYrZiDp8SJmGKlYza6CYjEDNstAdNdKA3UuoULlEbS6w==, } - hasBin: true + engines: { node: '>=12.13' } - error-stack-parser-es@1.0.5: + core-js-compat@3.49.0: resolution: { - integrity: sha512-5qucVt2XcuGMcEGgWI7i+yZpmpByQ8J1lHhcL7PwqCwu9FPP3VUXzT4ltHe5i2z9dePwEHcDVOAfSnHsOlCXRA==, + integrity: sha512-VQXt1jr9cBz03b331DFDCCP90b3fanciLkgiOoy8SBHy06gNf+vQ1A3WFLqG7I8TipYIKeYK9wxd0tUrvHcOZA==, } - es-module-lexer@2.3.1: + cosmiconfig@9.0.2: resolution: { - integrity: sha512-shc1dbU90Yl/xq1QrC7QRtfcwURZuVRfPhZbDoldJ1cn1gzDvBaBWlv0eFolj5+0znnPJz5TXLxsN77X/12KTA==, + integrity: sha512-gtTZxTDau1wL7Y7zifc2dd8jHSK/k6BTx/2Xp/BpdlAdnlYWFVt7qhJqgwi7637yRwRQ3qL4ZidbB4I8tA5VOg==, } + engines: { node: '>=14' } + peerDependencies: + typescript: '>=4.9.5' + peerDependenciesMeta: + typescript: + optional: true - es-toolkit@1.50.0: + cross-spawn@7.0.6: resolution: { - integrity: sha512-OyZKhUVvEep9ITEiwHn8GKnMRQIVqoSIX7WnRbkWgJkllCujilqP2rD0u979tkl8wqyc8ICwlc1UBVv/Sl1G6w==, + integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==, } + engines: { node: '>= 8' } - esbuild@0.27.7: + css-select@5.2.2: resolution: { - integrity: sha512-IxpibTjyVnmrIQo5aqNpCgoACA/dTKLTlhMHihVHhdkxKyPO1uBBthumT0rdHmcsk9uMonIWS0m4FljWzILh3w==, + integrity: sha512-TizTzUddG/xYLA3NXodFM0fSbNizXjOKhqiQQwvhlspadZokn1KDy0NZFS0wuEubIYAV5/c1/lAr0TaaFXEXzw==, } - engines: { node: '>=18' } - hasBin: true - esbuild@0.28.1: + css-tree@1.1.3: resolution: { - integrity: sha512-HrJrvZv5ayxBzPfwphOoNzkzOIIlifzk0KJrGK2c8R4+LKpMtpYLQeUdjnwjWv/LZlkH2laZk+4w78pi99D4Vw==, + integrity: sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q==, } - engines: { node: '>=18' } - hasBin: true + engines: { node: '>=8.0.0' } - escalade@3.2.0: + css-tree@3.2.1: resolution: { - integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==, + integrity: sha512-X7sjQzceUhu1u7Y/ylrRZFU2FS6LRiFVp6rKLPg23y3x3c3DOKAwuXGDp+PAGjh6CSnCjYeAul8pcT8bAl+lSA==, } - engines: { node: '>=6' } + engines: { node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0 } - esm-env@1.2.2: + css-what@6.2.2: resolution: { - integrity: sha512-Epxrv+Nr/CaL4ZcFGPJIYLWFom+YeV1DqMLHJoEd9SYRxNbaFruBwfEX/kkHUJf55j2+TUbmDcmuilbP1TmXHA==, + integrity: sha512-u/O3vwbptzhMs3L1fQE82ZSLHQQfto5gyZzwteVIEyeaY5Fc7R4dapF/BvRoSYFeqfBk4m0V1Vafq5Pjv25wvA==, } + engines: { node: '>= 6' } - esrap@2.3.0: + csstype@3.2.3: resolution: { - integrity: sha512-GQ/7RN8uOtEfNpzZzBMTzW9JBcX42oaSVtPzdF+6cEL8pqIL094iUpr9jzYGn4O4P/1S60dJ6izyT8F4LYARng==, + integrity: sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==, } - peerDependencies: - '@typescript-eslint/types': ^8.2.0 - peerDependenciesMeta: - '@typescript-eslint/types': - optional: true - estree-walker@2.0.2: + d3-array@3.2.4: resolution: { - integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==, + integrity: sha512-tdQAmyA18i4J7wprpYq8ClcxZy3SC31QMeByyCFyRt7BVHdREQZ5lpzoe5mFEYZUWe+oq8HBvk9JjpibyEV4Jg==, } + engines: { node: '>=12' } - estree-walker@3.0.3: + d3-axis@3.0.0: resolution: { - integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==, + integrity: sha512-IH5tgjV4jE/GhHkRV0HiVYPDtvfjHQlQfJHs0usq7M30XcSBvOotpmH1IgkcXsO/5gEQZD43B//fc7SRT5S+xw==, } + engines: { node: '>=12' } - eventemitter3@5.0.4: + d3-brush@3.0.0: resolution: { - integrity: sha512-mlsTRyGaPBjPedk6Bvw+aqbsXDtoAyAzm5MO7JgU+yVRyMQ5O8bD4Kcci7BS85f93veegeCPkL8R4GLClnjLFw==, + integrity: sha512-ALnjWlVYkXsVIGlOsuWH1+3udkYFI48Ljihfnh8FZPF2QS9o+PzGLBslO0PjzVoHLZ2KCVgAM8NVkXPJB2aNnQ==, } + engines: { node: '>=12' } - expect-type@1.4.0: + d3-chord@3.0.1: resolution: { - integrity: sha512-KfYbmpRm0VbLjEvVa9yGwCi9GI34xvi7A/HXYWQO65CSD2u3MczUJSuwXKFIxlGsgBQizV9q5J9NHj4VG0n+pA==, + integrity: sha512-VE5S6TNa+j8msksl7HwjxMHDM2yNK3XCkusIlpX5kwauBfXuyLAtNg9jCp/iHH61tgI4sb6R/EIMWCqEIdjT/g==, } - engines: { node: '>=12.0.0' } + engines: { node: '>=12' } - fast-deep-equal@3.1.3: + d3-color@3.1.0: resolution: { - integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==, + integrity: sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA==, } + engines: { node: '>=12' } - fast-uri@3.1.4: + d3-contour@4.0.2: resolution: { - integrity: sha512-8JnbkQ4juDyvYs4mgFGQqg4yCYtFDtUtmp2QIQq11ZZe5CFQ5wcqm1rqDgAh/QdMySuBnPzMUiJUNZG5N/AiQw==, + integrity: sha512-4EzFTRIikzs47RGmdxbeUvLWtGedDUNkTcmzoeyg4sP/dvCexO47AaQL7VKy/gul85TOxw+IBgA8US2xwbToNA==, } + engines: { node: '>=12' } - fdir@6.5.0: + d3-delaunay@6.0.4: resolution: { - integrity: sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==, + integrity: sha512-mdjtIZ1XLAM8bm/hx3WwjfHt6Sggek7qH043O8KEjDXN40xi3vx/6pYSVTwLjEgiXQTbvaouWKynLBiUZ6SK6A==, } - engines: { node: '>=12.0.0' } - peerDependencies: - picomatch: ^3 || ^4 - peerDependenciesMeta: - picomatch: - optional: true + engines: { node: '>=12' } - find-cache-directory@6.0.0: + d3-dispatch@3.0.1: resolution: { - integrity: sha512-CvFd5ivA6HcSHbD+59P7CyzINHXzwhuQK8RY7CxJZtgDSAtRlHiCaQpZQ2lMR/WRyUIEmzUvL6G2AGurMfegZA==, + integrity: sha512-rzUyPU/S7rwUflMyLc1ETDeBj0NRuHKKAcvukozwhshr6g6c5d8zh4c2gQjY2bZ0dXeGLWc1PF174P2tVvKhfg==, } - engines: { node: '>=20' } + engines: { node: '>=12' } - find-up-simple@1.0.1: + d3-drag@3.0.0: resolution: { - integrity: sha512-afd4O7zpqHeRyg4PfDQsXmlDe2PfdHtJt6Akt8jOWaApLOZk5JXs6VMR29lz03pRe9mpykrRCYIYxaJYcfpncQ==, + integrity: sha512-pWbUJLdETVA8lQNJecMxoXfH6x+mO2UQo8rSmZ+QqxcbyA3hfeprFgIT//HW2nlHChWeIIMwS2Fq+gEARkhTkg==, } - engines: { node: '>=18' } + engines: { node: '>=12' } - fsevents@2.3.2: + d3-dsv@3.0.1: resolution: { - integrity: sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==, + integrity: sha512-UG6OvdI5afDIFP9w4G0mNq50dSOsXHJaRE8arAS5o9ApWnIElp8GZw1Dun8vP8OyHOZ/QJUKUJwxiiCCnUwm+Q==, } - engines: { node: ^8.16.0 || ^10.6.0 || >=11.0.0 } - os: [darwin] + engines: { node: '>=12' } + hasBin: true - fsevents@2.3.3: + d3-ease@3.0.1: resolution: { - integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==, + integrity: sha512-wR/XK3D3XcLIZwpbvQwQ5fK+8Ykds1ip7A2Txe0yxncXSdq1L9skcG7blcedkOX+ZcgxGAmLX1FrRGbADwzi0w==, } - engines: { node: ^8.16.0 || ^10.6.0 || >=11.0.0 } - os: [darwin] + engines: { node: '>=12' } - gensync@1.0.0-beta.2: + d3-fetch@3.0.1: resolution: { - integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==, + integrity: sha512-kpkQIM20n3oLVBKGg6oHrUchHM3xODkTzjMoj7aWQFq5QEM+R6E4WkzT5+tojDY7yjez8KgCBRoj4aEr99Fdqw==, } - engines: { node: '>=6.9.0' } + engines: { node: '>=12' } - get-caller-file@2.0.5: + d3-force@3.0.0: resolution: { - integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==, + integrity: sha512-zxV/SsA+U4yte8051P4ECydjD/S+qeYtnaIyAs9tgHCqfguma/aAQDjo85A9Z6EKhBirHRJHXIgJUlffT4wdLg==, } - engines: { node: 6.* || 8.* || >= 10.* } + engines: { node: '>=12' } - get-east-asian-width@1.6.0: + d3-format@3.1.2: resolution: { - integrity: sha512-QRbvDIbx6YklUe6RxeTeleMR0yv3cYH6PsPZHcnVn7xv7zO1BHN8r0XETu8n6Ye3Q+ahtSarc3WgtNWmehIBfA==, + integrity: sha512-AJDdYOdnyRDV5b6ArilzCPPwc1ejkHcoyFarqlPqT7zRYjhavcT3uSrqcMvsgh2CgoPbK3RCwyHaVyxYcP2Arg==, } - engines: { node: '>=18' } + engines: { node: '>=12' } - graceful-fs@4.2.11: + d3-geo@3.1.1: resolution: { - integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==, + integrity: sha512-637ln3gXKXOwhalDzinUgY83KzNWZRKbYubaG+fGVuc/dxO64RRljtCTnf5ecMyE1RIdtqpkVcq0IbtU2S8j2Q==, } + engines: { node: '>=12' } - html-encoding-sniffer@6.0.0: + d3-hexbin@0.2.2: resolution: { - integrity: sha512-CV9TW3Y3f8/wT0BRFc1/KAVQ3TUHiXmaAb6VW9vtiMFf7SLoMd1PdAc4W3KFOFETBJUb90KatHqlsZMWV+R9Gg==, + integrity: sha512-KS3fUT2ReD4RlGCjvCEm1RgMtp2NFZumdMu4DBzQK8AZv3fXRM6Xm8I4fSU07UXvH4xxg03NwWKWdvxfS/yc4w==, } - engines: { node: ^20.19.0 || ^22.12.0 || >=24.0.0 } - html-entities@2.3.3: + d3-hierarchy@3.1.2: resolution: { - integrity: sha512-DV5Ln36z34NNTDgnz0EWGBLZENelNAtkiFA4kyNOG2tDI6Mz1uSWiq1wAKdyjnJwyDiDO7Fa2SO1CTxPXL8VxA==, + integrity: sha512-FX/9frcub54beBdugHjDCdikxThEqjnR93Qt7PvQTOHxyiNCAlvMrHhclk3cD5VeAaq9fxmfRp+CnWw9rEMBuA==, } + engines: { node: '>=12' } - iconv-lite@0.4.24: + d3-interpolate@3.0.1: resolution: { - integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==, + integrity: sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g==, } - engines: { node: '>=0.10.0' } + engines: { node: '>=12' } - iconv-lite@0.6.3: + d3-path@3.1.0: resolution: { - integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==, + integrity: sha512-p3KP5HCf/bvjBSSKuXid6Zqijx7wIfNW+J/maPs+iwR35at5JCbLUT0LzF1cnjbCHWhqzQTIN2Jpe8pRebIEFQ==, } - engines: { node: '>=0.10.0' } + engines: { node: '>=12' } - immer@11.1.15: + d3-polygon@3.0.1: resolution: { - integrity: sha512-VrNANlmnWQnh5COXIIOQXM9oOJw7naGKlBT74ZOOR6lpVXc3gFEu9FJLDFcpCJ2j+NWr8TIwtWD//T6ZX6TKiQ==, + integrity: sha512-3vbA7vXYwfe1SYhED++fPUQlWSYTTGmFmQiany/gdbiWgU/iEyQzyymwL9SkJjFFuCS4902BSzewVGsHHmHtXg==, } + engines: { node: '>=12' } - immutable@5.1.9: + d3-quadtree@3.0.1: resolution: { - integrity: sha512-m8nVez3rwrgmWxtLMt1ZYXB2Lv7OKYn/disyxAlSDYAlKSlFoPPfIAmAM/M5xqL4m4C/wAPw7S2/CNaUii1Hxg==, + integrity: sha512-04xDrxQTDTCFwP5H6hRhsRcb9xxv2RzkcsygFzmkSIOJy3PeRJP7sNk3VRIbKXcog561P9oU0/rVH6vDROAgUw==, } + engines: { node: '>=12' } - injection-js@2.6.1: + d3-random@3.0.1: resolution: { - integrity: sha512-dbR5bdhi7TWDoCye9cByZqeg/gAfamm8Vu3G1KZOTYkOif8WkuM8CD0oeDPtZYMzT5YH76JAFB7bkmyY9OJi2A==, + integrity: sha512-FXMe9GfxTxqd5D6jFsQ+DJ8BJS4E/fT5mqqdjovykEB2oFbTMDVdg1MGFxfQW+FBOGoB++k8swBrgwSHT1cUXQ==, } + engines: { node: '>=12' } - internmap@2.0.3: + d3-scale-chromatic@3.1.0: resolution: { - integrity: sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg==, + integrity: sha512-A3s5PWiZ9YCXFye1o246KoscMWqf8BsD9eRiJ3He7C9OBaxKhAd5TFCdEx/7VbKtxxTsu//1mMJFrEt572cEyQ==, } engines: { node: '>=12' } - interval-tree-1d@1.0.4: + d3-scale@4.0.2: resolution: { - integrity: sha512-wY8QJH+6wNI0uh4pDQzMvl+478Qh7Rl4qLmqiluxALlNvl+I+o5x38Pw3/z7mDPTPS1dQalZJXsmbvxx5gclhQ==, + integrity: sha512-GZW464g1SH7ag3Y7hXjf8RoUuAFIqklOAq3MRl4OaWabTFJY9PN/E1YklhXLh+OQ3fM9yS2nOkCoS+WLZ6kvxQ==, } + engines: { node: '>=12' } - is-extglob@2.1.1: + d3-selection@3.0.0: resolution: { - integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==, + integrity: sha512-fmTRWbNMmsmWq6xJV8D19U/gw/bwrHfNXxrIN+HfZgnzqTHp9jOmKMhsTUjXOJnZOdZY9Q28y4yebKzqDKlxlQ==, } - engines: { node: '>=0.10.0' } + engines: { node: '>=12' } - is-glob@4.0.3: + d3-shape@3.2.0: resolution: { - integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==, + integrity: sha512-SaLBuwGm3MOViRq2ABk3eLoxwZELpH6zhl3FbAoJ7Vm1gofKx6El1Ib5z23NUEhF9AsGl7y+dzLe5Cw2AArGTA==, } - engines: { node: '>=0.10.0' } + engines: { node: '>=12' } - is-interactive@2.0.0: + d3-time-format@4.1.0: resolution: { - integrity: sha512-qP1vozQRI+BMOPcjFzrjXuQvdak2pHNUMZoeG2eRbiSqyvbEf/wQtEOTOX1guk6E3t36RkaqiSt8A/6YElNxLQ==, + integrity: sha512-dJxPBlzC7NugB2PDLwo9Q8JiTR3M3e4/XANkreKSUxF8vvXKqm1Yfq4Q5dl8budlunRVlUUaDUgFt7eA8D6NLg==, } engines: { node: '>=12' } - is-potential-custom-element-name@1.0.1: + d3-time@3.1.0: resolution: { - integrity: sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==, + integrity: sha512-VqKjzBLejbSMT4IgbmVgDjpkYrNWUYJnbCGo874u7MMKIWsILRX+OpX/gTk8MqjpT1A/c6HY2dCA77ZN0lkQ2Q==, } + engines: { node: '>=12' } - is-reference@3.0.3: + d3-timer@3.0.1: resolution: { - integrity: sha512-ixkJoqQvAP88E6wLydLGGqCJsrFUnqoH6HnaczB8XmDH1oaWU+xxdptvikTgaEhtZ53Ky6YXiBuUI2WXLMCwjw==, + integrity: sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA==, } + engines: { node: '>=12' } - is-unicode-supported@2.1.0: + d3-transition@3.0.1: resolution: { - integrity: sha512-mE00Gnza5EEB3Ds0HfMyllZzbBrmLOX3vfWoj9A9PEnTfratQ/BcaJOuMhnkhjXvb2+FkY3VuHqtAGpTPmglFQ==, + integrity: sha512-ApKvfjsSR6tg06xrL434C0WydLr7JewBB3V+/39RMHsaXTOG0zmt/OAXeng5M5LBm0ojmxJrpomQVZ1aPvBL4w==, } - engines: { node: '>=18' } + engines: { node: '>=12' } + peerDependencies: + d3-selection: 2 - 3 - is-what@4.1.16: + d3-zoom@3.0.0: resolution: { - integrity: sha512-ZhMwEosbFJkA0YhFnNDgTM4ZxDRsS6HqTo7qsZM08fehyRYIYa0yHu5R6mgo1n/8MgaPBXiPimPD77baVFYg+A==, + integrity: sha512-b8AmV3kfQaqWAuacbPuNbL6vahnOJflOhexLzMMNLga62+/nh0JzvJ0aO/5a5MVgUFGS7Hu1P9P03o3fJkDCyw==, } - engines: { node: '>=12.13' } + engines: { node: '>=12' } - isoformat@0.2.1: + d3@7.9.0: resolution: { - integrity: sha512-tFLRAygk9NqrRPhJSnNGh7g7oaVWDwR0wKh/GM2LgmPa50Eg4UfyaCO4I8k6EqJHl1/uh2RAD6g06n5ygEnrjQ==, + integrity: sha512-e1U46jVP+w7Iut8Jt8ri1YsPOvFpg46k+K8TpCb0P+zjCkjkPnV7WzfDJzMHy1LnA+wj5pLT1wjO901gLXeEhA==, } + engines: { node: '>=12' } - js-tokens@4.0.0: + data-urls@7.0.0: resolution: { - integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==, + integrity: sha512-23XHcCF+coGYevirZceTVD7NdJOqVn+49IHyxgszm+JIiHLoB2TkmPtsYkNWT1pvRSGkc35L6NHs0yHkN2SumA==, } + engines: { node: ^20.19.0 || ^22.12.0 || >=24.0.0 } - jsdom@29.1.1: + dayjs@1.11.21: resolution: { - integrity: sha512-ECi4Fi2f7BdJtUKTflYRTiaMxIB0O6zfR1fX0GXpUrf6flp8QIYn1UT20YQqdSOfk2dfkCwS8LAFoJDEppNK5Q==, + integrity: sha512-98IT+HOahAisibz/yjKbzuOBwYcjJ7BCLPzARyHiyEBmRz4fatF+KPJszEHXsGYjUG234aH/cOjW1wwTbKUZlA==, + } + + debug@2.6.9: + resolution: + { + integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==, } - engines: { node: ^20.19.0 || ^22.13.0 || >=24.0.0 } peerDependencies: - canvas: ^3.0.0 + supports-color: '*' peerDependenciesMeta: - canvas: + supports-color: optional: true - jsesc@3.1.0: + debug@3.2.7: resolution: { - integrity: sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==, + integrity: sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==, } - engines: { node: '>=6' } - hasBin: true + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true - json-schema-traverse@1.0.0: + debug@4.4.3: resolution: { - integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==, + integrity: sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==, } + engines: { node: '>=6.0' } + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true - json5@2.2.3: + decamelize@1.2.0: resolution: { - integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==, + integrity: sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==, } - engines: { node: '>=6' } - hasBin: true + engines: { node: '>=0.10.0' } - jsonc-parser@3.3.1: + decimal.js-light@2.5.1: resolution: { - integrity: sha512-HUgH65KyejrUFPvHFPbqOY0rsFip3Bo5wb4ngvdi1EpCYWUQDC5V+Y7mZws+DLkr4M//zQJoanu1SP+87Dv1oQ==, + integrity: sha512-qIMFpTMZmny+MMIitAB6D7iVPEorVw6YQRWkvarTkT4tBeSLLiHzcwj6q0MmYSFCiVpiqPJTJEYIrpcPzVEIvg==, } - kleur@4.1.5: + decimal.js@10.6.0: resolution: { - integrity: sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==, + integrity: sha512-YpgQiITW3JXGntzdUmyUR1V812Hn8T1YVXhCu+wO3OpS4eU9l4YdD3qjyiKdV6mvV29zapkMeD390UVEf2lkUg==, } - engines: { node: '>=6' } - less@4.8.1: + dedent-js@1.0.1: resolution: { - integrity: sha512-jQ3lRIo1aUtiWVYXZ7mk4+V4BjCGswF3IxTLJ+4RUta8ZiHh8lhkig2G8dya2eCcyR1dYUvzuV46EkJN8PSwww==, + integrity: sha512-OUepMozQULMLUmhxS95Vudo0jb0UchLimi3+pQ2plj61Fcy8axbP9hbiD4Sz6DPqn6XG3kfmziVfQ1rSys5AJQ==, } - engines: { node: '>=18' } - hasBin: true - lightningcss-android-arm64@1.33.0: + deepmerge@4.3.1: resolution: { - integrity: sha512-gEpRTalKdosp4Bb8qWtc2iOgE5SeIHlpS1up9bFq2wAyYhl1UdTObYiHe98zEM9SQvSoqQZ1IQD0JNpg3Ml5pg==, + integrity: sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==, } - engines: { node: '>= 12.0.0' } - cpu: [arm64] - os: [android] + engines: { node: '>=0.10.0' } - lightningcss-darwin-arm64@1.33.0: + defaults@1.0.4: resolution: { - integrity: sha512-Sciaz8eenNTKn9b3t7+xr0ipTp9YxKQY4npwQ3mrRuL0BAVHBLyZxofhaKBAVtzmtRZ/zTyo0/to4B1uWG/Djg==, + integrity: sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==, } - engines: { node: '>= 12.0.0' } - cpu: [arm64] - os: [darwin] - lightningcss-darwin-x64@1.33.0: + delaunator@5.1.0: resolution: { - integrity: sha512-Z5UPAxzrjlWNNyGy6i65cJzzvgJ5D3T6wMvs+gWpY9d7qRhANrxqAp6LhxIgZhWEw18RfJTGcRxjuLIBr+m8XQ==, + integrity: sha512-AGrQ4QSgssa1NGmWmLPqN5NY2KajF5MqxetNEO+o0n3ZwZZeTmt7bBnvzHWrmkZFxGgr4HdyFgelzgi06otLuQ==, } - engines: { node: '>= 12.0.0' } - cpu: [x64] - os: [darwin] - lightningcss-freebsd-x64@1.33.0: + depd@2.0.0: resolution: { - integrity: sha512-QQM/Ti/hQajJwCY+RiWuCZ9sdtI/XQk7nDK5vC8kkdwixezOlDgvDx7+RT+QjK6FcFT4MpsuoBnHIo/O3StRRg==, + integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==, } - engines: { node: '>= 12.0.0' } - cpu: [x64] - os: [freebsd] + engines: { node: '>= 0.8' } - lightningcss-linux-arm-gnueabihf@1.33.0: + dependency-graph@1.0.0: resolution: { - integrity: sha512-N7FVBe6iS24MlM6R/4RBTxGhQheZGs7tiQ9U32UtF75NzP5Q7xWPRqLBCKxlRQRk3rY1jCIPLzx7WzOhuUIRLQ==, + integrity: sha512-cW3gggJ28HZ/LExwxP2B++aiKxhJXMSIt9K48FOXQkm+vuG5gyatXnLsONRJdzO/7VfjDIiaOOa/bs4l464Lwg==, } - engines: { node: '>= 12.0.0' } - cpu: [arm] - os: [linux] + engines: { node: '>=4' } - lightningcss-linux-arm64-gnu@1.33.0: + destroy@1.2.0: resolution: { - integrity: sha512-j2v/itmy4HlNxlc6voKXYgBqNi0Ng2LShg4z7GufpEgs05P+2suBVyi9I6YHq5uoVFx9ETin3eCEhLVyXGQnKg==, + integrity: sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==, } - engines: { node: '>= 12.0.0' } - cpu: [arm64] - os: [linux] - libc: [glibc] + engines: { node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16 } - lightningcss-linux-arm64-musl@1.33.0: + detect-libc@2.1.2: resolution: { - integrity: sha512-yiO5ROMuYQgXbC60yjZU5CYSFZGKXL0HFATXt9mHJn1+zW55oCtMI9NfcVhYLMFDL7gV7oBPon/EmMMGg2OvtQ==, + integrity: sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==, } - engines: { node: '>= 12.0.0' } - cpu: [arm64] - os: [linux] - libc: [musl] + engines: { node: '>=8' } - lightningcss-linux-x64-gnu@1.33.0: + devalue@5.8.2: resolution: { - integrity: sha512-ar+Ju7LmcN0Jo4FpL4hpFybwNG9/3A/Br5KW2n2jyODg3MEZXaDYADdemoNS+BDNfMgKvylJLj4S5tyRActuAg==, + integrity: sha512-DObPPAfdtFbXjxLqK8s2Xk9ZuWz5+ZoFEhC7J76es4GU/rEiXwHTmbImoCdyoCOcBH1UF3+Cz6Z2sYD4hyl5TA==, } - engines: { node: '>= 12.0.0' } - cpu: [x64] - os: [linux] - libc: [glibc] - lightningcss-linux-x64-musl@1.33.0: + dom-serializer@2.0.0: resolution: { - integrity: sha512-RYiYbkokw0trfKqqzfF55lginwEPrD3OJDfTuJzFs1MK6iFnDenaz1fqLLtX4ITG3OktJQXOeTaw1awrBAlZPw==, + integrity: sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==, } - engines: { node: '>= 12.0.0' } - cpu: [x64] - os: [linux] - libc: [musl] - lightningcss-win32-arm64-msvc@1.33.0: + domelementtype@2.3.0: resolution: { - integrity: sha512-1K+MPfLSFVpphzpdbfkhlWk6wBrTObBzS2T6db10PNOZgR9GoVsAWzwNyuhUYYbTp23j+4RrncfujZ4uAzXvwA==, + integrity: sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==, } - engines: { node: '>= 12.0.0' } - cpu: [arm64] - os: [win32] - lightningcss-win32-x64-msvc@1.33.0: + domhandler@5.0.3: resolution: { - integrity: sha512-OlEICDx/Xl0FqSp4bry8zFnCvGpig3Gl4gCquvYwHuqJKEC1+n9NgDniFvqHGmMv1ZkqDJrDqKKSykTDX+ehuA==, + integrity: sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==, } - engines: { node: '>= 12.0.0' } - cpu: [x64] - os: [win32] + engines: { node: '>= 4' } - lightningcss@1.33.0: + domutils@3.2.2: resolution: { - integrity: sha512-WkUDrojuJs0xkgGf2udWxa3yGBRxPtxUkB79i6aCZLRgc7PM8fZe9TosfPDcvEpQZbuFASnHYmRLBLUbmLOIIA==, + integrity: sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw==, } - engines: { node: '>= 12.0.0' } - lit-element@4.2.2: + dunder-proto@1.0.1: resolution: { - integrity: sha512-aFKhNToWxoyhkNDmWZwEva2SlQia+jfG0fjIWV//YeTaWrVnOxD89dPKfigCUspXFmjzOEUQpOkejH5Ly6sG0w==, + integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==, } + engines: { node: '>= 0.4' } - lit-html@3.3.3: + echarts@6.1.0: resolution: { - integrity: sha512-el8M6jK2o3RXBnrSHX3ZKrsN8zEV63pSExTO1wYJz7QndGYZ8353e2a5PPX+qHe2aGayfnchQmkAojaWAREOIA==, + integrity: sha512-q0yaFPggC9FUdsWH4blavRWFmxdrIodbkoKNAjJudAI6CA9gNPxHtV2RcZNEepZVlk4yvBYkOkbk6HIVpIyHZA==, } - lit@3.3.3: + ee-first@1.1.1: resolution: { - integrity: sha512-fycuvZg/hkpozL00lm1pEJH5nN/lr9ZXd6mJI2HSN4+Bzc+LDNdEApJ6HFbPkdFNHLvOplIIuJvxkS4XUxqirw==, + integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==, } - locate-character@3.0.0: + electron-to-chromium@1.5.397: resolution: { - integrity: sha512-SW13ws7BjaeJ6p7Q6CO2nchbYEc3X3J6WrmTTDto7yMPqVSZTUyY5Tjbid+Ab8gLnATtygYtiDIJGQRRn2ZOiA==, + integrity: sha512-khGTy9U9x02KEtsKM8vx5A62BsRmcOsIgDpWr1ImE32Ax8GxHGPHZf+Eu9H8zOOyHJnB0jTbseyTHbq2XCT8yw==, } - lodash.merge@4.6.2: + emoji-regex@10.6.0: resolution: { - integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==, + integrity: sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A==, } - log-symbols@7.0.1: + emoji-regex@8.0.0: resolution: { - integrity: sha512-ja1E3yCr9i/0hmBVaM0bfwDjnGy8I/s6PP4DFp+yP+a+mrHO4Rm7DtmnqROTUkHIkqffC84YY7AeqX6oFk0WFg==, + integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==, } - engines: { node: '>=18' } - lru-cache@11.5.2: + encodeurl@1.0.2: resolution: { - integrity: sha512-4pfM1Ff0x50o0tQwb5ucw/RzNyD0/YJME6IVcStalZuMWxdt3sR3huStTtxz4PUmvZfRguvDejasvQ2kifR11g==, + integrity: sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==, } - engines: { node: 20 || >=22 } + engines: { node: '>= 0.8' } - lru-cache@5.1.1: + encodeurl@2.0.0: resolution: { - integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==, + integrity: sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==, } + engines: { node: '>= 0.8' } - magic-string@0.30.21: + entities@4.5.0: resolution: { - integrity: sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==, + integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==, } + engines: { node: '>=0.12' } - make-dir@5.1.0: + entities@6.0.1: resolution: { - integrity: sha512-IfpFq6UM39dUNiphpA6uDezNx/AvWyhwfICWPR3t1VspkgkMZrL+Rk1RbN1bx+aeNYwOrqGJgEgV3yotk+ZUVw==, + integrity: sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==, } - engines: { node: '>=18' } + engines: { node: '>=0.12' } - mdn-data@2.27.1: + entities@7.0.1: resolution: { - integrity: sha512-9Yubnt3e8A0OKwxYSXyhLymGW4sCufcLG6VdiDdUGVkPhpqLxlvP5vl1983gQjJl3tqbrM731mjaZaP68AgosQ==, + integrity: sha512-TWrgLOFUQTH994YUyl1yT4uyavY5nNB5muff+RtWaqNVCAK408b5ZnnbNAUEWLTCpum9w6arT70i1XdQ4UeOPA==, } + engines: { node: '>=0.12' } - merge-anything@5.1.7: + entities@8.0.0: resolution: { - integrity: sha512-eRtbOb1N5iyH0tkQDAoQ4Ipsp/5qSR79Dzrz8hEPxRX10RWWR/iQXdoKmBSRCThY1Fh5EhISDtpSc93fpxUniQ==, + integrity: sha512-zwfzJecQ/Uej6tusMqwAqU/6KL2XaB2VZ2Jg54Je6ahNBGNH6Ek6g3jjNCF0fG9EWQKGZNddNjU5F1ZQn/sBnA==, } - engines: { node: '>=12.13' } + engines: { node: '>=20.19.0' } - mime@1.6.0: + env-paths@2.2.1: resolution: { - integrity: sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==, + integrity: sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==, } - engines: { node: '>=4' } - hasBin: true + engines: { node: '>=6' } - mimic-function@5.0.1: + envinfo@7.21.0: resolution: { - integrity: sha512-VP79XUPxV2CigYP3jWwAUFSku2aKqBH7uTAapFWCBqutsbmDo96KY5o8uh6U+/YSIn5OxJnXp73beVkpqMIGhA==, + integrity: sha512-Lw7I8Zp5YKHFCXL7+Dz95g4CcbMEpgvqZNNq3AmlT5XAV6CgAAk6gyAMqn2zjw08K9BHfcNuKrMiCPLByGafow==, } - engines: { node: '>=18' } + engines: { node: '>=4' } + hasBin: true - miniflare@4.20260617.1: + errno@0.1.8: resolution: { - integrity: sha512-Go3/gzStm99QHptsSgU+q1S+xDfLoRgwjJNY80kaTVi0ENhTyqKq+sc4xZiWBSbM7uUcJwmzm8+QFKtcYLJ9nw==, + integrity: sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A==, } - engines: { node: '>=22.0.0' } hasBin: true - mri@1.2.0: + error-ex@1.3.4: resolution: { - integrity: sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==, + integrity: sha512-sqQamAnR14VgCr1A618A3sGrygcpK+HEbenA/HiEAkkUwcZIIB/tgWqHFxWgOyDh4nB4JCRimh79dR5Ywc9MDQ==, } - engines: { node: '>=4' } - ms@2.0.0: + error-stack-parser-es@1.0.5: resolution: { - integrity: sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==, + integrity: sha512-5qucVt2XcuGMcEGgWI7i+yZpmpByQ8J1lHhcL7PwqCwu9FPP3VUXzT4ltHe5i2z9dePwEHcDVOAfSnHsOlCXRA==, } - ms@2.1.3: + error-stack-parser@2.1.4: resolution: { - integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==, + integrity: sha512-Sk5V6wVazPhq5MhpO+AUxJn5x7XSXGl1R93Vn7i+zS15KDVxQijejNCrz8340/2bgLBjR9GtEG8ZVKONDjcqGQ==, } - nanoid@3.3.16: + errorhandler@1.5.2: resolution: { - integrity: sha512-bzlKTyNJ7+LdGIIwy8ijFpIqEQIvafahV7eYykJ8Cvh42EdJeODoJ6gUJXpQJvej1BddH8OqTXZNE/KfbWAu8Q==, + integrity: sha512-kNAL7hESndBCrWwS72QyV3IVOTrVmj9D062FV5BQswNL5zEdeRmz/WJFyh6Aj/plvvSOrzddkxW57HgkZcR9Fw==, } - engines: { node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1 } - hasBin: true + engines: { node: '>= 0.8' } - needle@2.9.1: + es-define-property@1.0.1: resolution: { - integrity: sha512-6R9fqJ5Zcmf+uYaFgdIHmLwNldn5HbK8L5ybn7Uz+ylX/rnOsSp1AHcvQSrCaFN+qNM1wpymHqD7mVasEOlHGQ==, + integrity: sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==, } - engines: { node: '>= 4.4.x' } - hasBin: true + engines: { node: '>= 0.4' } - needle@3.5.0: + es-errors@1.3.0: resolution: { - integrity: sha512-jaQyPKKk2YokHrEg+vFDYxXIHTCBgiZwSHOoVx/8V3GIBS8/VN6NdVRmg8q1ERtPkMvmOvebsgga4sAj5hls/w==, + integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==, } - engines: { node: '>= 4.4.x' } - hasBin: true + engines: { node: '>= 0.4' } - ng-packagr@22.0.2: + es-module-lexer@2.3.1: resolution: { - integrity: sha512-8qQ+RWm0W3gK8Sch1kmo3EzIUiCTXIOP2gS7b+vtqCMBf4KBjBP0wFBikW5qRau9lGOzRTML0GPFGoARPR4+fw==, + integrity: sha512-shc1dbU90Yl/xq1QrC7QRtfcwURZuVRfPhZbDoldJ1cn1gzDvBaBWlv0eFolj5+0znnPJz5TXLxsN77X/12KTA==, } - engines: { node: ^22.22.3 || ^24.15.0 || >=26.0.0 } - hasBin: true - peerDependencies: - '@angular/compiler-cli': ^22.0.0 || ^22.1.0-next.0 - tailwindcss: ^2.0.0 || ^3.0.0 || ^4.0.0 - tslib: ^2.3.0 - typescript: '>=6.0 <6.1' - peerDependenciesMeta: - tailwindcss: - optional: true - node-addon-api@7.1.1: + es-object-atoms@1.1.2: resolution: { - integrity: sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ==, + integrity: sha512-HWcBoN6NileqtSydK2FqHbS/LoDd2pqrnQHLyJzBj4kOp/ky2MWMN694xOfkK8/SnUsW2DH7EfyVlydKCsm1Zw==, } + engines: { node: '>= 0.4' } - node-releases@2.0.51: + es-toolkit@1.50.0: resolution: { - integrity: sha512-wRNIrw4DmVLKQlbgOMdkMx27Wrpzes2hh5Jtbi2bjPd+4wJstWIqP5A+lscnqbm0xxmT5Bpg8Lec5ItEBwx6BQ==, + integrity: sha512-OyZKhUVvEep9ITEiwHn8GKnMRQIVqoSIX7WnRbkWgJkllCujilqP2rD0u979tkl8wqyc8ICwlc1UBVv/Sl1G6w==, } - engines: { node: '>=18' } - obug@2.1.4: + esbuild@0.27.7: resolution: { - integrity: sha512-4a+OsYv9UktOJKE+l1A4OufDgdRF9PifWj+tJnHURo/P+WOxpG4GzUFL9qCalmWauao6ogiG+QvnCovwPoyAWA==, + integrity: sha512-IxpibTjyVnmrIQo5aqNpCgoACA/dTKLTlhMHihVHhdkxKyPO1uBBthumT0rdHmcsk9uMonIWS0m4FljWzILh3w==, } - engines: { node: '>=12.20.0' } + engines: { node: '>=18' } + hasBin: true - octane@0.1.13: + esbuild@0.28.1: resolution: { - integrity: sha512-bjmuF0hjLnBPOqOLTWyOtq6U5tklKw/JKF/qbAlZ2gfAZsoL9NiK7tQSWibuIUSerXELvLfmPmpbyt0fItemsg==, + integrity: sha512-HrJrvZv5ayxBzPfwphOoNzkzOIIlifzk0KJrGK2c8R4+LKpMtpYLQeUdjnwjWv/LZlkH2laZk+4w78pi99D4Vw==, } - engines: { node: '>=22' } - peerDependencies: - react: ^19.0.0 - react-dom: ^19.0.0 - vite: ^8.0.16 - peerDependenciesMeta: - react: - optional: true - react-dom: - optional: true - vite: - optional: true + engines: { node: '>=18' } + hasBin: true - onetime@7.0.0: + escalade@3.2.0: resolution: { - integrity: sha512-VXJjc87FScF88uafS3JllDgvAm+c/Slfz06lorj2uAY34rlUu0Nt+v8wreiImcrgAjjIHp1rXpTDlLOGw29WwQ==, + integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==, } - engines: { node: '>=18' } + engines: { node: '>=6' } - ora@9.4.1: + escape-html@1.0.3: resolution: { - integrity: sha512-6VlU9MLXbjVQD04AZCMX28hVtA5bUoadvUqO76MUCVA0ilwJbMiHsITRPfyVm6p/BC0Av/BXMujx39WCe1LEqw==, + integrity: sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==, } - engines: { node: '>=20' } - parse-node-version@1.0.1: + escape-string-regexp@4.0.0: resolution: { - integrity: sha512-3YHlOa/JgH6Mnpr05jP9eDG254US9ek25LyIxZlDItp2iJtwyaXQb57lBYLdT3MowkUFYEV2XXNAYIPlESvJlA==, + integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==, } - engines: { node: '>= 0.10' } + engines: { node: '>=10' } - parse5@7.3.0: + esm-env@1.2.2: resolution: { - integrity: sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw==, + integrity: sha512-Epxrv+Nr/CaL4ZcFGPJIYLWFom+YeV1DqMLHJoEd9SYRxNbaFruBwfEX/kkHUJf55j2+TUbmDcmuilbP1TmXHA==, } - parse5@8.0.1: + esrap@2.3.0: resolution: { - integrity: sha512-z1e/HMG90obSGeidlli3hj7cbocou0/wa5HacvI3ASx34PecNjNQeaHNo5WIZpWofN9kgkqV1q5YvXe3F0FoPw==, + integrity: sha512-GQ/7RN8uOtEfNpzZzBMTzW9JBcX42oaSVtPzdF+6cEL8pqIL094iUpr9jzYGn4O4P/1S60dJ6izyT8F4LYARng==, } + peerDependencies: + '@typescript-eslint/types': ^8.2.0 + peerDependenciesMeta: + '@typescript-eslint/types': + optional: true - path-to-regexp@6.3.0: + estree-walker@2.0.2: resolution: { - integrity: sha512-Yhpw4T9C6hPpgPeA28us07OJeqZ5EzQTkbfwuhsUg0c237RomFoETJgmp2sa3F/41gfLE6G5cqcYwznmeEeOlQ==, + integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==, } - pathe@2.0.3: + estree-walker@3.0.3: resolution: { - integrity: sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==, + integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==, } - picocolors@1.1.1: + etag@1.8.1: resolution: { - integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==, + integrity: sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==, } + engines: { node: '>= 0.6' } - picomatch@4.0.5: + event-target-shim@5.0.1: resolution: { - integrity: sha512-RvwwcruNjI1ncT5xRakeyS9Lf8lcItv34KD+aif+VH9kduAyfYBipGh12274xtenIPZ119/R9BdTBa8gAwSh0A==, + integrity: sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==, } - engines: { node: '>=12' } + engines: { node: '>=6' } - piscina@5.3.0: + eventemitter3@5.0.4: resolution: { - integrity: sha512-9D3tPBayfoal6l9l4Y8NrMn1jkV718qJoYrla6P51+hh9h0Q+9/1c8KgEnoBQqhguyfgjay4biADI8HJG3pkoA==, + integrity: sha512-mlsTRyGaPBjPedk6Bvw+aqbsXDtoAyAzm5MO7JgU+yVRyMQ5O8bD4Kcci7BS85f93veegeCPkL8R4GLClnjLFw==, } - engines: { node: '>=20.x' } - pkg-dir@8.0.0: + execa@5.1.1: resolution: { - integrity: sha512-4peoBq4Wks0riS0z8741NVv+/8IiTvqnZAr8QGgtdifrtpdXbNw/FxRS1l6NFqm4EMzuS0EDqNNx4XGaz8cuyQ==, + integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==, } - engines: { node: '>=18' } + engines: { node: '>=10' } - playwright-core@1.62.0: + expect-type@1.4.0: resolution: { - integrity: sha512-nsNRyq0r2zsG8AcRHWknc9QRA5XCueC7gWMrs+Gx2tlZn9hcl8zudfh00lhJPY1DE7NmZ6bDsT9g2yey8mXljA==, + integrity: sha512-KfYbmpRm0VbLjEvVa9yGwCi9GI34xvi7A/HXYWQO65CSD2u3MczUJSuwXKFIxlGsgBQizV9q5J9NHj4VG0n+pA==, } - engines: { node: '>=20' } - hasBin: true + engines: { node: '>=12.0.0' } - playwright@1.62.0: + exponential-backoff@3.1.3: resolution: { - integrity: sha512-Z14dG305dgaLu6foB1TXQagFiW8JfSUIUaUuPaKQ6NtBPKF1P/qXcqfh6c6K/icPqdy37JmjbiBXf6JNg6Sylw==, + integrity: sha512-ZgEeZXj30q+I0EN+CbSSpIyPaJ5HVQD18Z1m+u1FXbAeT94mr1zw50q4q6jiiC447Nl/YTcIYSAftiGqetwXCA==, } - engines: { node: '>=20' } - hasBin: true - postcss@8.5.23: + fast-deep-equal@3.1.3: resolution: { - integrity: sha512-g50586zr4bZmwFiTlflMu8E0bDTb5I5gertgwAKmsdUlTQIhZtunzUlD1WSzwcVWPoAVpsrA6vlfCD7oXvRwgg==, + integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==, } - engines: { node: ^10 || ^12 || >=14 } - preact-render-to-string@6.7.0: + fast-glob@3.3.3: resolution: { - integrity: sha512-Z4WR8fmLMRpdYqJ9i7vrlXSsSrxVJydwrkEXHapexfARbWfGb7vGcnvNQnIzN0cXciMVOlz/XLoiMCi9gUsy9Q==, + integrity: sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==, } - peerDependencies: - preact: '>=10 || >= 11.0.0-0' + engines: { node: '>=8.6.0' } - preact@10.29.7: + fast-uri@3.1.4: resolution: { - integrity: sha512-DCHYrK/B10yUD3ZjLfhZ3WIE/9Vf9VFUODcRE2dRomTYDpJk6z6L9wecSfhfE6M9ZTHUdyQkoC46arIDhEV84Q==, + integrity: sha512-8JnbkQ4juDyvYs4mgFGQqg4yCYtFDtUtmp2QIQq11ZZe5CFQ5wcqm1rqDgAh/QdMySuBnPzMUiJUNZG5N/AiQw==, } - peerDependencies: - preact-render-to-string: '>=5' - peerDependenciesMeta: - preact-render-to-string: - optional: true - prettier@3.9.6: + fast-xml-parser@4.5.7: resolution: { - integrity: sha512-OpN0zzVdiaiAhxpuuj5efpIS4sY9j7bY6uR5mnj5yPzGkdkjNKSJeUThPb60Jw29QuAZgA4o+/iB49kFiaBX6g==, + integrity: sha512-a6Qh1RMCNbSrU1+sAyAAZH3rTe+OaWJbNZIq0S+ifZciUUOQtlVxBJwoTUE2bYhysmG/RYyI5WJFIKdBahJdrQ==, } - engines: { node: '>=14' } hasBin: true - probe-image-size@7.3.0: + fastq@1.20.1: resolution: { - integrity: sha512-7CaDeBwiAbh6ohXsvLbAZhO7wzsZAmaevfxe39qvCwRh8LyaZfDlBGGLU1CCTgrTLtCOdwBBhjOrIHaIIimHfQ==, + integrity: sha512-GGToxJ/w1x32s/D2EKND7kTil4n8OVk/9mycTc4VDza13lOvpUZTGX3mFSCtV9ksdGBVzvsyAVLM6mHFThxXxw==, } - prr@1.0.1: + fb-dotslash@0.5.8: resolution: { - integrity: sha512-yPw4Sng1gWghHQWj0B3ZggWUm4qVbPwPFcRG8KyxiU7J2OHFSoEHKS+EZ3fv5l1t9CyCiop6l/ZYeWbrgoQejw==, + integrity: sha512-XHYLKk9J4BupDxi9bSEhkfss0m+Vr9ChTrjhf9l2iw3jB5C7BnY4GVPoMcqbrTutsKJso6yj2nAB6BI/F2oZaA==, } + engines: { node: '>=20' } + hasBin: true - punycode@2.3.1: + fb-watchman@2.0.2: resolution: { - integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==, + integrity: sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==, } - engines: { node: '>=6' } - react-dom@19.2.3: + fdir@6.5.0: resolution: { - integrity: sha512-yELu4WmLPw5Mr/lmeEpox5rw3RETacE++JgHqQzd2dg+YbJuat3jH4ingc+WPZhxaoFzdv9y33G+F7Nl5O0GBg==, + integrity: sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==, } + engines: { node: '>=12.0.0' } peerDependencies: - react: ^19.2.3 + picomatch: ^3 || ^4 + peerDependenciesMeta: + picomatch: + optional: true - react-is@19.2.8: + fill-range@7.1.1: resolution: { - integrity: sha512-s5un28nYxKJw5gvUHyW5PCC28CvBqLu9r3cWgzHT4Vo/5fqqkFcdRYsGcKf50WMPpjjFZS5d76fn3YCo2njKwQ==, + integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==, } + engines: { node: '>=8' } - react-redux@9.3.0: + finalhandler@1.1.2: resolution: { - integrity: sha512-KQopgqFo/p/fgmAs5qz6p5RWaNAzq40WAu7fJIXnQpYxFPbJYtsJPWvGeF2rOBaY/kEuV77AVsX8TsQzKm+A/g==, + integrity: sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==, } - peerDependencies: - '@types/react': ^18.2.25 || ^19 - react: ^18.0 || ^19 - redux: ^5.0.0 - peerDependenciesMeta: - '@types/react': - optional: true - redux: - optional: true + engines: { node: '>= 0.8' } - react@19.2.3: + find-cache-directory@6.0.0: resolution: { - integrity: sha512-Ku/hhYbVjOQnXDZFv2+RibmLFGwFdeeKHFcOTlrt7xplBnya5OGn/hIRDsqDiSUcfORsDC7MPxwork8jBwsIWA==, + integrity: sha512-CvFd5ivA6HcSHbD+59P7CyzINHXzwhuQK8RY7CxJZtgDSAtRlHiCaQpZQ2lMR/WRyUIEmzUvL6G2AGurMfegZA==, } - engines: { node: '>=0.10.0' } + engines: { node: '>=20' } - readdirp@4.1.2: + find-up-simple@1.0.1: resolution: { - integrity: sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==, + integrity: sha512-afd4O7zpqHeRyg4PfDQsXmlDe2PfdHtJt6Akt8jOWaApLOZk5JXs6VMR29lz03pRe9mpykrRCYIYxaJYcfpncQ==, } - engines: { node: '>= 14.18.0' } + engines: { node: '>=18' } - readdirp@5.0.0: + find-up@4.1.0: resolution: { - integrity: sha512-9u/XQ1pvrQtYyMpZe7DXKv2p5CNvyVwzUB6uhLAnQwHMSgKMBR62lc7AHljaeteeHXn11XTAaLLUVZYVZyuRBQ==, + integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==, } - engines: { node: '>= 20.19.0' } + engines: { node: '>=8' } - recharts@3.10.1: + find-up@5.0.0: resolution: { - integrity: sha512-QXFrvt6IVcw7eeZCoyXTwkIJAX3Dv1nyVhMicXJ47GsGDDpcN8z6o644DibE9XjpBTThtsomLKnTV6lc+cVFUA==, + integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==, } - engines: { node: '>=18' } - peerDependencies: - react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 - react-dom: ^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 - react-is: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + engines: { node: '>=10' } - redux-thunk@3.1.0: + flow-enums-runtime@0.0.6: resolution: { - integrity: sha512-NW2r5T6ksUKXCabzhL9z+h206HQw/NJkcLm1GPImRQ8IzfXwRGqjVhKJGauHirT0DAuyy6hjdnMZaRoAcy0Klw==, + integrity: sha512-3PYnM29RFXwvAN6Pc/scUfkI7RwhQ/xqyLUyPNlXUp9S40zI8nup9tUSrTLSVnWGBN38FNiGWbwZOB6uR4OGdw==, } - peerDependencies: - redux: ^5.0.0 - redux@5.0.1: + fresh@0.5.2: resolution: { - integrity: sha512-M9/ELqF6fy8FwmkpnF0S3YKOqMyoWJ4+CS5Efg2ct3oY9daQvd/Pc71FpGZsVsbl3Cpb+IIcjBDUnnyBdQbq4w==, + integrity: sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==, } + engines: { node: '>= 0.6' } - reflect-metadata@0.2.2: + fs-extra@8.1.0: resolution: { - integrity: sha512-urBwgfrvVP/eAyXx4hluJivBKzuEbSQs9rKWCrCkbSxNv8mxPcUZKeuoF3Uy4mJl3Lwprp6yy5/39VWigZ4K6Q==, + integrity: sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==, } + engines: { node: '>=6 <7 || >=8' } - require-from-string@2.0.2: + fsevents@2.3.2: resolution: { - integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==, + integrity: sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==, } - engines: { node: '>=0.10.0' } + engines: { node: ^8.16.0 || ^10.6.0 || >=11.0.0 } + os: [darwin] - reselect@5.2.0: + fsevents@2.3.3: resolution: { - integrity: sha512-AgZ3UOZm3YndfrJ4OYjgrT7bmCm/1iqkjvEfH/oYjzh6PD2qw4QuT3jjnXIrpdt4MTpMXclMT3lXbmRY+XRakw==, + integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==, } + engines: { node: ^8.16.0 || ^10.6.0 || >=11.0.0 } + os: [darwin] - restore-cursor@5.1.0: + function-bind@1.1.2: resolution: { - integrity: sha512-oMA2dcrw6u0YfxJQXm342bFKX/E4sG9rbTzO9ptUcR/e8A33cHuvStiYOwH7fszkZlZ1z/ta9AAoPk2F4qIOHA==, + integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==, } - engines: { node: '>=18' } - robust-predicates@3.0.3: + gensync@1.0.0-beta.2: resolution: { - integrity: sha512-NS3levdsRIUOmiJ8FZWCP7LG3QpJyrs/TE0Zpf1yvZu8cAJJ6QMW92H1c7kWpdIHo8RvmLxN/o2JXTKHp74lUA==, + integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==, } + engines: { node: '>=6.9.0' } - rolldown@1.1.5: + get-caller-file@2.0.5: resolution: { - integrity: sha512-t9z29cJjXf/vxQ8dyhCSpt6H6aSwHTk8cT5I3iy6SMXuFpk5mB6PL6XfC8PCwrPTx93udwKUm9HRteAlTGBLiA==, + integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==, } - engines: { node: ^20.19.0 || >=22.12.0 } - hasBin: true + engines: { node: 6.* || 8.* || >= 10.* } - rollup-plugin-dts@6.4.1: + get-east-asian-width@1.6.0: resolution: { - integrity: sha512-l//F3Zf7ID5GoOfLfD8kroBjQKEKpy1qfhtAdnpibFZMffPaylrg1CoDC2vGkPeTeyxUe4bVFCln2EFuL7IGGg==, + integrity: sha512-QRbvDIbx6YklUe6RxeTeleMR0yv3cYH6PsPZHcnVn7xv7zO1BHN8r0XETu8n6Ye3Q+ahtSarc3WgtNWmehIBfA==, } - engines: { node: '>=20' } - peerDependencies: - rollup: ^3.29.4 || ^4 - typescript: ^4.5 || ^5.0 || ^6.0 + engines: { node: '>=18' } - rollup@4.62.3: + get-intrinsic@1.3.0: resolution: { - integrity: sha512-Gu0c0iH9FzgX1L1t7ByIbbS3Vmdz+6KHm/EsqmmC71gUQ82yvZRkTK6XzrFObSka91WUVdynqp6nsfilzr5k6Q==, + integrity: sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==, } - engines: { node: '>=18.0.0', npm: '>=8.0.0' } - hasBin: true + engines: { node: '>= 0.4' } - rw@1.3.3: + get-proto@1.0.1: resolution: { - integrity: sha512-PdhdWy89SiZogBLaw42zdeqtRJ//zFd2PgQavcICDUgJT5oW10QCRKbJ6bg4r0/UY2M6BWd5tkxuGFRvCkgfHQ==, + integrity: sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==, } + engines: { node: '>= 0.4' } - rxjs@7.8.2: + get-stream@6.0.1: resolution: { - integrity: sha512-dhKf903U/PQZY6boNNtAGdWbG85WAbjT/1xYoZIC7FAY0yWapOBQVsVrDl58W86//e1VpMNBtRV4MaXfdMySFA==, + integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==, } + engines: { node: '>=10' } - sade@1.8.1: + glob-parent@5.1.2: resolution: { - integrity: sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A==, + integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==, } - engines: { node: '>=6' } + engines: { node: '>= 6' } - safer-buffer@2.1.2: + gopd@1.2.0: resolution: { - integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==, + integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==, } + engines: { node: '>= 0.4' } - sass@1.102.0: + graceful-fs@4.2.11: resolution: { - integrity: sha512-NSOyTnaQF7rTAEOtI2fwb386vL+akyiQLBZu8Na7hXCb+umJy0GAqlcMIaqACZ6Z1VgTBS4K9PG6B3IdjHGJsw==, + integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==, } - engines: { node: '>=20.19.0' } - hasBin: true - sax@1.6.1: + has-flag@4.0.0: resolution: { - integrity: sha512-42tBVwLWnaQvW5zc4HbZrTuWccECCZfBi92FDuwtqxasH+JbPB3/FOKb1m222K42R4WxuxzzMsTswfzgtSu64Q==, + integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==, } - engines: { node: '>=11.0.0' } + engines: { node: '>=8' } - saxes@6.0.0: + has-symbols@1.1.0: resolution: { - integrity: sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA==, + integrity: sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==, } - engines: { node: '>=v12.22.7' } + engines: { node: '>= 0.4' } - scheduler@0.27.0: + hasown@2.0.4: resolution: { - integrity: sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q==, + integrity: sha512-T2UbfbBEF32wiepXIsMlTW9+dDYC6wMh/t/vYA4tuOMKqWz/n3vr1NFSxQiyP+zk2mXsoMA/i/7qV6LKut1t1A==, } + engines: { node: '>= 0.4' } - scule@1.3.0: + hermes-compiler@250829098.0.14: resolution: { - integrity: sha512-6FtHJEvt+pVMIB9IBY+IcCJ6Z5f1iQnytgyfKMhDKgmzYG+TeH/wx1y3l27rshSbLiSanrR9ffZDrEsmjlQF2g==, + integrity: sha512-5meXwsZxgiqFaJjNzwjzI9IyUkuGGBisu+z9BvQWmGVpjH6nz11hgqkyxe4dl8UAdyIV4lTbz91+Dlnjz0VxqA==, } - semver@6.3.1: + hermes-estree@0.35.0: resolution: { - integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==, + integrity: sha512-xVx5Opwy8Oo1I5yGpVRhCvWL/iV3M+ylksSKVNlxxD90cpDpR/AR1jLYqK8HWihm065a6UI3HeyAmYzwS8NOOg==, } - hasBin: true - semver@7.8.5: + hermes-estree@0.36.0: resolution: { - integrity: sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA==, + integrity: sha512-A1+8zn5oss2CFP7pKsOaxorQG6FNIz1WU1VDqruLPPZl3LVgeE2C5xfFg8Ow6/Ow4mSslLLtYP1J3n38eKyW9w==, } - engines: { node: '>=10' } - hasBin: true - seroval-plugins@1.5.6: + hermes-parser@0.35.0: resolution: { - integrity: sha512-HXuLAX2pu/UByPpaeo/TaMfvMIi+1QqIoPJYCcAtU8QkVNwgR6MPlGuCQTErV1JwraaMbYaWVIBX7mppzGLATQ==, + integrity: sha512-9JLjeHxBx8T4CAsydZR49PNZUaix+WpQJwu9p2010lu+7Kwl6D/7wYFFJxoz+aXkaaClp9Zfg6W6/zVlSJORaA==, } - engines: { node: '>=10' } - peerDependencies: - seroval: ^1.0 - seroval@1.5.6: + hermes-parser@0.36.0: resolution: { - integrity: sha512-rVQVWjjSvlINzaQPZH5JFqsqEsIWdTxY3iJZCnTL/5gQbXIRooVZKI60tVCkOVfzcRPejboxO2t0P89dg5mQaA==, + integrity: sha512-GdpwMmH5x6IpC1cijvcvYnlPB60Mh6kTSF/NFdYV/j56gYdi+0RIakYs+eqOV+bbO0SW7mgVVGSsTJxyPQfo3w==, } - engines: { node: '>=10' } - sharp@0.34.5: + html-encoding-sniffer@6.0.0: resolution: { - integrity: sha512-Ou9I5Ft9WNcCbXrU9cMgPBcCK8LiwLqcbywW3t4oDV37n1pzpuNLsYiAV8eODnjbtQlSDwZ2cUEeQz4E54Hltg==, + integrity: sha512-CV9TW3Y3f8/wT0BRFc1/KAVQ3TUHiXmaAb6VW9vtiMFf7SLoMd1PdAc4W3KFOFETBJUb90KatHqlsZMWV+R9Gg==, } - engines: { node: ^18.17.0 || ^20.3.0 || >=21.0.0 } + engines: { node: ^20.19.0 || ^22.12.0 || >=24.0.0 } - siginfo@2.0.0: + html-entities@2.3.3: resolution: { - integrity: sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==, + integrity: sha512-DV5Ln36z34NNTDgnz0EWGBLZENelNAtkiFA4kyNOG2tDI6Mz1uSWiq1wAKdyjnJwyDiDO7Fa2SO1CTxPXL8VxA==, } - signal-exit@4.1.0: + http-errors@2.0.1: resolution: { - integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==, + integrity: sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ==, } - engines: { node: '>=14' } + engines: { node: '>= 0.8' } - solid-js@1.9.14: + https-proxy-agent@7.0.6: resolution: { - integrity: sha512-sAEXC0Kk0S1EDg+8ysEWJDbYhA3RRoEjwuySUGlKIemeo0I5YZfOyumNjNs9Sv3y2nmhD+0rW66ag2HsMuQiGQ==, + integrity: sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==, } + engines: { node: '>= 14' } - solid-refresh@0.6.3: + human-signals@2.1.0: resolution: { - integrity: sha512-F3aPsX6hVw9ttm5LYlth8Q15x6MlI/J3Dn+o3EQyRTtTxidepSTwAYdozt01/YA+7ObcciagGEyXIopGZzQtbA==, + integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==, } - peerDependencies: - solid-js: ^1.3 + engines: { node: '>=10.17.0' } - source-map-js@1.2.1: + iconv-lite@0.4.24: resolution: { - integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==, + integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==, } engines: { node: '>=0.10.0' } - source-map@0.6.1: + iconv-lite@0.6.3: resolution: { - integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==, + integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==, } engines: { node: '>=0.10.0' } - stackback@0.0.2: + ieee754@1.2.1: resolution: { - integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==, + integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==, } - std-env@4.2.0: + image-size@1.2.1: resolution: { - integrity: sha512-oCUKSupKTHX53EyjDtuZQ64pjLJ6yYCtpmEw0goYxtjG9KpbRe8KAsl2tBUGU9DyMcJ0RwJ8GqJAFzMXcXW1Rw==, + integrity: sha512-rH+46sQJ2dlwfjfhCyNx5thzrv+dtmBIhPHk0zgRUukHzZ/kRueTJXoYYsclBaKcSMBWuGbOFXtioLpzTb5euw==, } + engines: { node: '>=16.x' } + hasBin: true - stdin-discarder@0.3.2: + immer@11.1.15: resolution: { - integrity: sha512-eCPu1qRxPVkl5605OTWF8Wz40b4Mf45NY5LQmVPQ599knfs5QhASUm9GbJ5BDMDOXgrnh0wyEdvzmL//YMlw0A==, + integrity: sha512-VrNANlmnWQnh5COXIIOQXM9oOJw7naGKlBT74ZOOR6lpVXc3gFEu9FJLDFcpCJ2j+NWr8TIwtWD//T6ZX6TKiQ==, } - engines: { node: '>=18' } - stream-parser@0.3.1: + immutable@5.1.9: resolution: { - integrity: sha512-bJ/HgKq41nlKvlhccD5kaCr/P+Hu0wPNKPJOH7en+YrJu/9EgqUF+88w5Jb6KNcjOFMhfX4B2asfeAtIGuHObQ==, + integrity: sha512-m8nVez3rwrgmWxtLMt1ZYXB2Lv7OKYn/disyxAlSDYAlKSlFoPPfIAmAM/M5xqL4m4C/wAPw7S2/CNaUii1Hxg==, } - string-width@7.2.0: + import-fresh@3.3.1: resolution: { - integrity: sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==, + integrity: sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==, } - engines: { node: '>=18' } + engines: { node: '>=6' } - string-width@8.2.2: + inherits@2.0.4: resolution: { - integrity: sha512-GaPUh5gfdrYzqeVNZvUfT23vYYxXzKYidUcnMtJg/3rxRV63EFZy3k6xfKlmfeJD0176lnUV/Usr3XcwSvFzpg==, + integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==, } - engines: { node: '>=20' } - strip-ansi@7.2.0: + injection-js@2.6.1: resolution: { - integrity: sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==, + integrity: sha512-dbR5bdhi7TWDoCye9cByZqeg/gAfamm8Vu3G1KZOTYkOif8WkuM8CD0oeDPtZYMzT5YH76JAFB7bkmyY9OJi2A==, } - engines: { node: '>=12' } - supports-color@10.2.2: + internmap@2.0.3: resolution: { - integrity: sha512-SS+jx45GF1QjgEXQx4NJZV9ImqmO2NPz5FNsIHrsDjh2YsHnawpan7SNQ1o8NuhrbHZy9AZhIoCUiCeaW/C80g==, + integrity: sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg==, } - engines: { node: '>=18' } + engines: { node: '>=12' } - svelte-check@4.7.4: + interval-tree-1d@1.0.4: resolution: { - integrity: sha512-IW9ot9YqAoyv8FvyN+eb4ZTe8zgcKZrJLNYU6dzSKkGwEBsSPc4K7lmQ8bKn8W2YMXM6WDfZSSVOaGtekyUfOQ==, + integrity: sha512-wY8QJH+6wNI0uh4pDQzMvl+478Qh7Rl4qLmqiluxALlNvl+I+o5x38Pw3/z7mDPTPS1dQalZJXsmbvxx5gclhQ==, } - engines: { node: '>= 18.0.0' } - hasBin: true - peerDependencies: - svelte: ^4.0.0 || ^5.0.0-next.0 - typescript: ^5.0.0 || ^6.0.0 - svelte2tsx@0.7.59: + invariant@2.2.4: resolution: { - integrity: sha512-Itj7Wz9WIiGFl/uJa58+rf43ajezaljKK/KTOHq5abUjto56xe+o5SOzLwSoeJ5hma9NZEstpZiazFW2q1nZPQ==, + integrity: sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==, } - peerDependencies: - svelte: ^3.55 || ^4.0.0-next.0 || ^4.0 || ^5.0.0-next.0 - typescript: ^4.9.4 || ^5.0.0 || ^6.0.0 - svelte@5.56.8: + is-arrayish@0.2.1: resolution: { - integrity: sha512-PY8LOw7xP6c8IOiVqdo0sbbZVYhXRSfklOQLAUyGBKqjTX0wx/z4l/9J+PmBpmlLnxzEb1NqltxQ5/wZme/Cmg==, + integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==, } - engines: { node: '>=18' } - symbol-tree@3.2.4: + is-core-module@2.16.2: resolution: { - integrity: sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==, + integrity: sha512-evOr8xfXKxE6qSR0hSXL2r3sd7ALj8+7jQEUvPYcm5sgZFdJ+AYzT6yNmJenvIYQBgIGwfwz08sL8zoL7yq2BA==, } + engines: { node: '>= 0.4' } - tiny-invariant@1.3.3: + is-docker@2.2.1: resolution: { - integrity: sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg==, + integrity: sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==, } + engines: { node: '>=8' } + hasBin: true - tinybench@2.9.0: + is-extglob@2.1.1: resolution: { - integrity: sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==, + integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==, } + engines: { node: '>=0.10.0' } - tinyexec@1.2.4: + is-fullwidth-code-point@2.0.0: resolution: { - integrity: sha512-SHf/r48b7vOrjve9PxJo3MN5v5yuyjHvdUcrQffT3WXMUfnGmHDVbC4k3sHJaJTgZCwpUplIaAo5ANtMyp3YHg==, + integrity: sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w==, } - engines: { node: '>=18' } + engines: { node: '>=4' } - tinyglobby@0.2.17: + is-fullwidth-code-point@3.0.0: resolution: { - integrity: sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g==, + integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==, } - engines: { node: '>=12.0.0' } + engines: { node: '>=8' } - tinyrainbow@3.1.0: + is-glob@4.0.3: resolution: { - integrity: sha512-Bf+ILmBgretUrdJxzXM0SgXLZ3XfiaUuOj/IKQHuTXip+05Xn+uyEYdVg0kYDipTBcLrCVyUzAPz7QmArb0mmw==, + integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==, } - engines: { node: '>=14.0.0' } + engines: { node: '>=0.10.0' } - tldts-core@7.4.9: + is-interactive@1.0.0: resolution: { - integrity: sha512-DxKfPBI52p2msTEu7MPhdpdDTBhhVQg1a/8PjQckeyAvO13eMYElX545grIp6nnTGIMZlRvFZPvFhvI/WIz2Vg==, + integrity: sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==, } + engines: { node: '>=8' } - tldts@7.4.9: + is-interactive@2.0.0: resolution: { - integrity: sha512-3kZ8wQQ/k5DrChD4X4FVvr2D7E5uoRgAqkPyLpSCGUvqOvqu+JEdr3mwMUaVWb+vMHZaKhF5fp2PBigKsui7hA==, + integrity: sha512-qP1vozQRI+BMOPcjFzrjXuQvdak2pHNUMZoeG2eRbiSqyvbEf/wQtEOTOX1guk6E3t36RkaqiSt8A/6YElNxLQ==, } - hasBin: true + engines: { node: '>=12' } - topojson-client@3.1.0: + is-number@7.0.0: resolution: { - integrity: sha512-605uxS6bcYxGXw9qi62XyrV6Q3xwbndjachmNxu8HWTtVPxZfEJN9fd/SZS1Q54Sn2y0TMyMxFj/cJINqGHrKw==, + integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==, } - hasBin: true + engines: { node: '>=0.12.0' } - tough-cookie@6.0.2: + is-potential-custom-element-name@1.0.1: resolution: { - integrity: sha512-exgYmnmL/sJpR3upZfXG5PoatXQii55xAiXGXzY+sROLZ/Y+SLcp9PgJNI9Vz37HpQ74WvDcLT8eqm+kV3FzrA==, + integrity: sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==, } - engines: { node: '>=16' } - tr46@6.0.0: + is-reference@3.0.3: resolution: { - integrity: sha512-bLVMLPtstlZ4iMQHpFHTR7GAGj2jxi8Dg0s2h2MafAE4uSWF98FC/3MomU51iQAMf8/qDUbKWf5GxuvvVcXEhw==, + integrity: sha512-ixkJoqQvAP88E6wLydLGGqCJsrFUnqoH6HnaczB8XmDH1oaWU+xxdptvikTgaEhtZ53Ky6YXiBuUI2WXLMCwjw==, } - engines: { node: '>=20' } - tslib@2.3.0: + is-stream@2.0.1: resolution: { - integrity: sha512-N82ooyxVNm6h1riLCoyS9e3fuJ3AMG2zIZs2Gd1ATcSFjSA23Q0fzjjZeh0jbJvWVDZ0cJT8yaNNaaXHzueNjg==, + integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==, } + engines: { node: '>=8' } - tslib@2.8.1: + is-unicode-supported@0.1.0: resolution: { - integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==, + integrity: sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==, } + engines: { node: '>=10' } - typescript@6.0.3: + is-unicode-supported@2.1.0: resolution: { - integrity: sha512-y2TvuxSZPDyQakkFRPZHKFm+KKVqIisdg9/CZwm9ftvKXLP8NRWj38/ODjNbr43SsoXqNuAisEf1GdCxqWcdBw==, + integrity: sha512-mE00Gnza5EEB3Ds0HfMyllZzbBrmLOX3vfWoj9A9PEnTfratQ/BcaJOuMhnkhjXvb2+FkY3VuHqtAGpTPmglFQ==, } - engines: { node: '>=14.17' } - hasBin: true + engines: { node: '>=18' } - undici-types@7.24.6: + is-what@4.1.16: resolution: { - integrity: sha512-WRNW+sJgj5OBN4/0JpHFqtqzhpbnV0GuB+OozA9gCL7a993SmU+1JBZCzLNxYsbMfIeDL+lTsphD5jN5N+n0zg==, + integrity: sha512-ZhMwEosbFJkA0YhFnNDgTM4ZxDRsS6HqTo7qsZM08fehyRYIYa0yHu5R6mgo1n/8MgaPBXiPimPD77baVFYg+A==, } + engines: { node: '>=12.13' } - undici@7.28.0: + is-wsl@1.1.0: resolution: { - integrity: sha512-cRZYrTDwWznlnRiPjggAGxZXanty6M8RV1ff8Wm4LWXBp7/IG8v5DnOm74DtUBp9OONpK75YlPnIjQqX0dBDtA==, + integrity: sha512-gfygJYZ2gLTDlmbWMI0CE2MwnFzSN/2SZfkMlItC4K/JBlsWVDB0bO6XhqcY13YXE7iMcAJnzTCJjPiTeJJ0Mw==, } - engines: { node: '>=20.18.1' } + engines: { node: '>=4' } - undici@7.29.0: + is-wsl@2.2.0: resolution: { - integrity: sha512-IDxfleLmmbSskfWSUATiN1nfn2rDuvnMOqb5CWR92iIfojA0Ud+ulOAAEQ57LPr9rWmsreUyf5lwyao+7GNNVw==, + integrity: sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==, } - engines: { node: '>=20.18.1' } + engines: { node: '>=8' } - unenv@2.0.0-rc.24: + isexe@2.0.0: resolution: { - integrity: sha512-i7qRCmY42zmCwnYlh9H2SvLEypEFGye5iRmEMKjcGi7zk9UquigRjFtTLz0TYqr0ZGLZhaMHl/foy1bZR+Cwlw==, + integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==, } - update-browserslist-db@1.2.3: + isoformat@0.2.1: resolution: { - integrity: sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w==, + integrity: sha512-tFLRAygk9NqrRPhJSnNGh7g7oaVWDwR0wKh/GM2LgmPa50Eg4UfyaCO4I8k6EqJHl1/uh2RAD6g06n5ygEnrjQ==, } - hasBin: true - peerDependencies: - browserslist: '>= 4.21.0' - us-atlas@3.0.1: + jest-get-type@29.6.3: resolution: { - integrity: sha512-wEIZCq0ImPvGblTd8gZMqNNCPkQshugMUG/8nkSWXb02+XqNFREg9atHOKP9w6prLZTpqcLhSvdBW81MkV3/0Q==, + integrity: sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==, } + engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } - use-sync-external-store@1.6.0: + jest-util@29.7.0: resolution: { - integrity: sha512-Pp6GSwGP/NrPIrxVFAIkOQeyw8lFenOHijQWkUTrDvrF4ALqylP2C/KCkeS9dpUM3KvYRQhna5vt7IL95+ZQ9w==, + integrity: sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==, } - peerDependencies: - react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } - victory-vendor@37.3.6: + jest-validate@29.7.0: resolution: { - integrity: sha512-SbPDPdDBYp+5MJHhBCAyI7wKM3d5ivekigc2Dk2s7pgbZ9wIgIBYGVw4zGHBml/qTFbexrofXW6Gu4noGxrOwQ==, + integrity: sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw==, } + engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } - vite-plugin-solid@2.11.14: + jest-worker@29.7.0: resolution: { - integrity: sha512-7ZVBt8rpoyqmlwin2kRIUveaHoF6/kulY7gsnD+qFh4nS29V4OPAnw+ojoAspXIjObiL9o1xh9a/nTuYHm02Rw==, + integrity: sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==, } - peerDependencies: - '@testing-library/jest-dom': ^5.16.6 || ^5.17.0 || ^6.0.0 || ^7.0.0 - solid-js: ^1.7.2 - vite: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0 || ^9.0.0 - peerDependenciesMeta: - '@testing-library/jest-dom': - optional: true + engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } - vite@8.1.5: + joi@17.13.4: resolution: { - integrity: sha512-7ULLwsCdYx/nRyrpiEwvqb5TFHrMVZyBt+rg/OAXT7rgj/z+DtTDyKFeLAdDkubDVDKD8jOsndmy7m55XcfUsw==, + integrity: sha512-1RuuER6kmt8K8I3nIWvPZKi5RQCb568ZPyY4Pwjlua+yo+63ZTmIwxLZH0heBmiKN4uxjvCiarDrjaeH84xicQ==, } - engines: { node: ^20.19.0 || >=22.12.0 } - hasBin: true - peerDependencies: - '@types/node': ^20.19.0 || >=22.12.0 - '@vitejs/devtools': ^0.3.0 - esbuild: ^0.27.0 || ^0.28.0 - jiti: '>=1.21.0' - less: ^4.0.0 - sass: ^1.70.0 - sass-embedded: ^1.70.0 - stylus: '>=0.54.8' - sugarss: ^5.0.0 - terser: ^5.16.0 - tsx: ^4.8.1 - yaml: ^2.4.2 - peerDependenciesMeta: - '@types/node': - optional: true - '@vitejs/devtools': - optional: true - esbuild: - optional: true - jiti: - optional: true - less: - optional: true - sass: - optional: true - sass-embedded: - optional: true - stylus: - optional: true - sugarss: - optional: true - terser: - optional: true - tsx: - optional: true - yaml: - optional: true - vitefu@1.1.3: + js-tokens@4.0.0: resolution: { - integrity: sha512-ub4okH7Z5KLjb6hDyjqrGXqWtWvoYdU3IGm/NorpgHncKoLTCfRIbvlhBm7r0YstIaQRYlp4yEbFqDcKSzXSSg==, + integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==, } - peerDependencies: - vite: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0 - peerDependenciesMeta: - vite: - optional: true - vitest@4.1.10: + js-yaml@4.3.0: resolution: { - integrity: sha512-R9jUTe5S4Qb0HCd4TNqpC7oGcrMssMRGXLW80ubjWsW9VH5GF8y1Y0SFLY9AbqSk6nt0PnOx4H4WNJYZ13GUPw==, + integrity: sha512-1td788aAnnZ5qs7V2QIRl1owjtYpbKt749Y3xauqQgwIIGF/xXWz1wMTEBx5O3LK3lXLVuqXPdPxj2BoFHaW9Q==, } - engines: { node: ^20.0.0 || ^22.0.0 || >=24.0.0 } hasBin: true - peerDependencies: - '@edge-runtime/vm': '*' - '@opentelemetry/api': ^1.9.0 + + jsc-safe-url@0.2.4: + resolution: + { + integrity: sha512-0wM3YBWtYePOjfyXQH5MWQ8H7sdk5EXSwZvmSLKk2RboVQ2Bu239jycHDz5J/8Blf3K0Qnoy2b6xD+z10MFB+Q==, + } + + jsdom@29.1.1: + resolution: + { + integrity: sha512-ECi4Fi2f7BdJtUKTflYRTiaMxIB0O6zfR1fX0GXpUrf6flp8QIYn1UT20YQqdSOfk2dfkCwS8LAFoJDEppNK5Q==, + } + engines: { node: ^20.19.0 || ^22.13.0 || >=24.0.0 } + peerDependencies: + canvas: ^3.0.0 + peerDependenciesMeta: + canvas: + optional: true + + jsesc@3.1.0: + resolution: + { + integrity: sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==, + } + engines: { node: '>=6' } + hasBin: true + + json-parse-even-better-errors@2.3.1: + resolution: + { + integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==, + } + + json-schema-traverse@1.0.0: + resolution: + { + integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==, + } + + json5@2.2.3: + resolution: + { + integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==, + } + engines: { node: '>=6' } + hasBin: true + + jsonc-parser@3.3.1: + resolution: + { + integrity: sha512-HUgH65KyejrUFPvHFPbqOY0rsFip3Bo5wb4ngvdi1EpCYWUQDC5V+Y7mZws+DLkr4M//zQJoanu1SP+87Dv1oQ==, + } + + jsonfile@4.0.0: + resolution: + { + integrity: sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==, + } + + kleur@3.0.3: + resolution: + { + integrity: sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==, + } + engines: { node: '>=6' } + + kleur@4.1.5: + resolution: + { + integrity: sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==, + } + engines: { node: '>=6' } + + launch-editor@2.14.1: + resolution: + { + integrity: sha512-QWBrQsMpH7gPr965dsKD/3cKWiNoTjpATQf++Xq63N6sKRGMwlVXz41O1IZTMfZQgBctD/K5Zt06+/I6pP6+HA==, + } + + less@4.8.1: + resolution: + { + integrity: sha512-jQ3lRIo1aUtiWVYXZ7mk4+V4BjCGswF3IxTLJ+4RUta8ZiHh8lhkig2G8dya2eCcyR1dYUvzuV46EkJN8PSwww==, + } + engines: { node: '>=18' } + hasBin: true + + leven@3.1.0: + resolution: + { + integrity: sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==, + } + engines: { node: '>=6' } + + lighthouse-logger@1.4.2: + resolution: + { + integrity: sha512-gPWxznF6TKmUHrOQjlVo2UbaL2EJ71mb2CCeRs/2qBpi4L/g4LUVc9+3lKQ6DTUZwJswfM7ainGrLO1+fOqa2g==, + } + + lightningcss-android-arm64@1.33.0: + resolution: + { + integrity: sha512-gEpRTalKdosp4Bb8qWtc2iOgE5SeIHlpS1up9bFq2wAyYhl1UdTObYiHe98zEM9SQvSoqQZ1IQD0JNpg3Ml5pg==, + } + engines: { node: '>= 12.0.0' } + cpu: [arm64] + os: [android] + + lightningcss-darwin-arm64@1.33.0: + resolution: + { + integrity: sha512-Sciaz8eenNTKn9b3t7+xr0ipTp9YxKQY4npwQ3mrRuL0BAVHBLyZxofhaKBAVtzmtRZ/zTyo0/to4B1uWG/Djg==, + } + engines: { node: '>= 12.0.0' } + cpu: [arm64] + os: [darwin] + + lightningcss-darwin-x64@1.33.0: + resolution: + { + integrity: sha512-Z5UPAxzrjlWNNyGy6i65cJzzvgJ5D3T6wMvs+gWpY9d7qRhANrxqAp6LhxIgZhWEw18RfJTGcRxjuLIBr+m8XQ==, + } + engines: { node: '>= 12.0.0' } + cpu: [x64] + os: [darwin] + + lightningcss-freebsd-x64@1.33.0: + resolution: + { + integrity: sha512-QQM/Ti/hQajJwCY+RiWuCZ9sdtI/XQk7nDK5vC8kkdwixezOlDgvDx7+RT+QjK6FcFT4MpsuoBnHIo/O3StRRg==, + } + engines: { node: '>= 12.0.0' } + cpu: [x64] + os: [freebsd] + + lightningcss-linux-arm-gnueabihf@1.33.0: + resolution: + { + integrity: sha512-N7FVBe6iS24MlM6R/4RBTxGhQheZGs7tiQ9U32UtF75NzP5Q7xWPRqLBCKxlRQRk3rY1jCIPLzx7WzOhuUIRLQ==, + } + engines: { node: '>= 12.0.0' } + cpu: [arm] + os: [linux] + + lightningcss-linux-arm64-gnu@1.33.0: + resolution: + { + integrity: sha512-j2v/itmy4HlNxlc6voKXYgBqNi0Ng2LShg4z7GufpEgs05P+2suBVyi9I6YHq5uoVFx9ETin3eCEhLVyXGQnKg==, + } + engines: { node: '>= 12.0.0' } + cpu: [arm64] + os: [linux] + libc: [glibc] + + lightningcss-linux-arm64-musl@1.33.0: + resolution: + { + integrity: sha512-yiO5ROMuYQgXbC60yjZU5CYSFZGKXL0HFATXt9mHJn1+zW55oCtMI9NfcVhYLMFDL7gV7oBPon/EmMMGg2OvtQ==, + } + engines: { node: '>= 12.0.0' } + cpu: [arm64] + os: [linux] + libc: [musl] + + lightningcss-linux-x64-gnu@1.33.0: + resolution: + { + integrity: sha512-ar+Ju7LmcN0Jo4FpL4hpFybwNG9/3A/Br5KW2n2jyODg3MEZXaDYADdemoNS+BDNfMgKvylJLj4S5tyRActuAg==, + } + engines: { node: '>= 12.0.0' } + cpu: [x64] + os: [linux] + libc: [glibc] + + lightningcss-linux-x64-musl@1.33.0: + resolution: + { + integrity: sha512-RYiYbkokw0trfKqqzfF55lginwEPrD3OJDfTuJzFs1MK6iFnDenaz1fqLLtX4ITG3OktJQXOeTaw1awrBAlZPw==, + } + engines: { node: '>= 12.0.0' } + cpu: [x64] + os: [linux] + libc: [musl] + + lightningcss-win32-arm64-msvc@1.33.0: + resolution: + { + integrity: sha512-1K+MPfLSFVpphzpdbfkhlWk6wBrTObBzS2T6db10PNOZgR9GoVsAWzwNyuhUYYbTp23j+4RrncfujZ4uAzXvwA==, + } + engines: { node: '>= 12.0.0' } + cpu: [arm64] + os: [win32] + + lightningcss-win32-x64-msvc@1.33.0: + resolution: + { + integrity: sha512-OlEICDx/Xl0FqSp4bry8zFnCvGpig3Gl4gCquvYwHuqJKEC1+n9NgDniFvqHGmMv1ZkqDJrDqKKSykTDX+ehuA==, + } + engines: { node: '>= 12.0.0' } + cpu: [x64] + os: [win32] + + lightningcss@1.33.0: + resolution: + { + integrity: sha512-WkUDrojuJs0xkgGf2udWxa3yGBRxPtxUkB79i6aCZLRgc7PM8fZe9TosfPDcvEpQZbuFASnHYmRLBLUbmLOIIA==, + } + engines: { node: '>= 12.0.0' } + + lines-and-columns@1.2.4: + resolution: + { + integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==, + } + + lit-element@4.2.2: + resolution: + { + integrity: sha512-aFKhNToWxoyhkNDmWZwEva2SlQia+jfG0fjIWV//YeTaWrVnOxD89dPKfigCUspXFmjzOEUQpOkejH5Ly6sG0w==, + } + + lit-html@3.3.3: + resolution: + { + integrity: sha512-el8M6jK2o3RXBnrSHX3ZKrsN8zEV63pSExTO1wYJz7QndGYZ8353e2a5PPX+qHe2aGayfnchQmkAojaWAREOIA==, + } + + lit@3.3.3: + resolution: + { + integrity: sha512-fycuvZg/hkpozL00lm1pEJH5nN/lr9ZXd6mJI2HSN4+Bzc+LDNdEApJ6HFbPkdFNHLvOplIIuJvxkS4XUxqirw==, + } + + locate-character@3.0.0: + resolution: + { + integrity: sha512-SW13ws7BjaeJ6p7Q6CO2nchbYEc3X3J6WrmTTDto7yMPqVSZTUyY5Tjbid+Ab8gLnATtygYtiDIJGQRRn2ZOiA==, + } + + locate-path@5.0.0: + resolution: + { + integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==, + } + engines: { node: '>=8' } + + locate-path@6.0.0: + resolution: + { + integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==, + } + engines: { node: '>=10' } + + lodash.debounce@4.0.8: + resolution: + { + integrity: sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==, + } + + lodash.merge@4.6.2: + resolution: + { + integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==, + } + + lodash.throttle@4.1.1: + resolution: + { + integrity: sha512-wIkUCfVKpVsWo3JSZlc+8MB5it+2AN5W8J7YVMST30UrvcQNZ1Okbj+rbVniijTWE6FGYy4XJq/rHkas8qJMLQ==, + } + + log-symbols@4.1.0: + resolution: + { + integrity: sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==, + } + engines: { node: '>=10' } + + log-symbols@7.0.1: + resolution: + { + integrity: sha512-ja1E3yCr9i/0hmBVaM0bfwDjnGy8I/s6PP4DFp+yP+a+mrHO4Rm7DtmnqROTUkHIkqffC84YY7AeqX6oFk0WFg==, + } + engines: { node: '>=18' } + + logkitty@0.7.1: + resolution: + { + integrity: sha512-/3ER20CTTbahrCrpYfPn7Xavv9diBROZpoXGVZDWMw4b/X4uuUwAC0ki85tgsdMRONURyIJbcOvS94QsUBYPbQ==, + } + hasBin: true + + loose-envify@1.4.0: + resolution: + { + integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==, + } + hasBin: true + + lru-cache@11.5.2: + resolution: + { + integrity: sha512-4pfM1Ff0x50o0tQwb5ucw/RzNyD0/YJME6IVcStalZuMWxdt3sR3huStTtxz4PUmvZfRguvDejasvQ2kifR11g==, + } + engines: { node: 20 || >=22 } + + lru-cache@5.1.1: + resolution: + { + integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==, + } + + magic-string@0.30.21: + resolution: + { + integrity: sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==, + } + + make-dir@5.1.0: + resolution: + { + integrity: sha512-IfpFq6UM39dUNiphpA6uDezNx/AvWyhwfICWPR3t1VspkgkMZrL+Rk1RbN1bx+aeNYwOrqGJgEgV3yotk+ZUVw==, + } + engines: { node: '>=18' } + + makeerror@1.0.12: + resolution: + { + integrity: sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==, + } + + marky@1.3.0: + resolution: + { + integrity: sha512-ocnPZQLNpvbedwTy9kNrQEsknEfgvcLMvOtz3sFeWApDq1MXH1TqkCIx58xlpESsfwQOnuBO9beyQuNGzVvuhQ==, + } + + math-intrinsics@1.1.0: + resolution: + { + integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==, + } + engines: { node: '>= 0.4' } + + mdn-data@2.0.14: + resolution: + { + integrity: sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==, + } + + mdn-data@2.27.1: + resolution: + { + integrity: sha512-9Yubnt3e8A0OKwxYSXyhLymGW4sCufcLG6VdiDdUGVkPhpqLxlvP5vl1983gQjJl3tqbrM731mjaZaP68AgosQ==, + } + + media-typer@0.3.0: + resolution: + { + integrity: sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==, + } + engines: { node: '>= 0.6' } + + memoize-one@5.2.1: + resolution: + { + integrity: sha512-zYiwtZUcYyXKo/np96AGZAckk+FWWsUdJ3cHGGmld7+AhvcWmQyGCYUh1hc4Q/pkOhb65dQR/pqCyK0cOaHz4Q==, + } + + merge-anything@5.1.7: + resolution: + { + integrity: sha512-eRtbOb1N5iyH0tkQDAoQ4Ipsp/5qSR79Dzrz8hEPxRX10RWWR/iQXdoKmBSRCThY1Fh5EhISDtpSc93fpxUniQ==, + } + engines: { node: '>=12.13' } + + merge-stream@2.0.0: + resolution: + { + integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==, + } + + merge2@1.4.1: + resolution: + { + integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==, + } + engines: { node: '>= 8' } + + metro-babel-transformer@0.84.4: + resolution: + { + integrity: sha512-rvCfz8snl9h20VcvpOHxZuHP1SlAkv4HXbzw7nyyVwu6Eqo5PRerbakQ9XmUCOsRy70spJ37O+G1TK8oMzo48g==, + } + engines: { node: ^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0 } + + metro-cache-key@0.84.4: + resolution: + { + integrity: sha512-wVO79aGrkYImpnaVS4+d5RrRBRPX31QtvKB3wKGBuiNSznduZTQHzsrJZRroFJSwnygrzdsGUtDQPuqqFjFdvw==, + } + engines: { node: ^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0 } + + metro-cache@0.84.4: + resolution: + { + integrity: sha512-gpcFQdSLUwUCk71saKoE64jLFbx2nwTfVCcPSULMNT8QYq0p1eZZE29Jvd0HtT/UlhC3ZOutLxJME5xqD2JUZg==, + } + engines: { node: ^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0 } + + metro-config@0.84.4: + resolution: + { + integrity: sha512-PMotGDjXcXLWo2TMRH+VR99phFNgYTwqh4OoieIKK3yTJa1Jmkl+fZJxDO0jfBvNF+WESHciHvpNuBtXaF3B0Q==, + } + engines: { node: ^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0 } + + metro-core@0.84.4: + resolution: + { + integrity: sha512-HONpWC5LGXZn3ffkd4Hu6AIrfE7j4Z0g0wMo/goV24WOB3lhuFZ40KgvaDiSw8iyQHloMYay5N/wPX+z8oN/PQ==, + } + engines: { node: ^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0 } + + metro-file-map@0.84.4: + resolution: + { + integrity: sha512-KSVDi/u60hKPx++NLu3MTIvyjzNoJnFAF8PQFxaj1jiSka/wjw+Ua6sNuJ0TDHQv+7AAoFQxeMgaRAe8Yic5wQ==, + } + engines: { node: ^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0 } + + metro-minify-terser@0.84.4: + resolution: + { + integrity: sha512-5qpbaVOMC7CPitIpuewzVeGw7E+C3ykbv2mqTjQLl85Z3annSVGlSCTcsZjqXZzjupfK4Ztj3dDc4kc44NZwtQ==, + } + engines: { node: ^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0 } + + metro-resolver@0.84.4: + resolution: + { + integrity: sha512-1qLgbxQ5ZGhhutuPot1Yp348ofDsATL2WkrHF65TobqTT9K3P9qJXw38bomk7ncp5B7OYMfWwtyBZo1lCV792A==, + } + engines: { node: ^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0 } + + metro-runtime@0.84.4: + resolution: + { + integrity: sha512-Jibypds4g7AhzdRKY+kDoj51s5EXMwgyp5ddtlreDAsWefMdOx+agWqgm0H2XSZ/ueanHHVM89fnf5OJnlxa8Q==, + } + engines: { node: ^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0 } + + metro-source-map@0.84.4: + resolution: + { + integrity: sha512-jbWkPxIesVuo1IWkvezmMJld6iu8nD62GsrZiV6jP37AOdbo4OBq1FJ+qkOg8sV05wAHB//jAbziuW0SlJfW4g==, + } + engines: { node: ^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0 } + + metro-symbolicate@0.84.4: + resolution: + { + integrity: sha512-OnfpacxUqGPZQ27t8qK9mFa7uqHIlVWeqRqkCbvMvreEBiamEeOn8krKtcwgP5M4cYDPwuSmCTopHMVthqG4zA==, + } + engines: { node: ^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0 } + hasBin: true + + metro-transform-plugins@0.84.4: + resolution: + { + integrity: sha512-kehr6HbAecqD0/a3xLXobELdPaAmRAl8bel0qagPF4vhZtux93nS8S4eq2kgKt6J2GnQpVjSoW1PXdst04mwow==, + } + engines: { node: ^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0 } + + metro-transform-worker@0.84.4: + resolution: + { + integrity: sha512-W1IYMvvXTu4MxYr7d9h7CeG2vpIr3bmLLIavkPY4O1ilzDrvS8z/NEe6y+pC44Ff7raMXQgYSfdqDUwN/i39gg==, + } + engines: { node: ^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0 } + + metro@0.84.4: + resolution: + { + integrity: sha512-8ETTubqfD6ornDy2zYDvRcKnVDOXdFJsjetYDBsY4oAsb6NJkiwFR+FaMESyGppFmQUyBQA4H4sFGxzcQSGtFA==, + } + engines: { node: ^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0 } + hasBin: true + + micromatch@4.0.8: + resolution: + { + integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==, + } + engines: { node: '>=8.6' } + + mime-db@1.52.0: + resolution: + { + integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==, + } + engines: { node: '>= 0.6' } + + mime-db@1.54.0: + resolution: + { + integrity: sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==, + } + engines: { node: '>= 0.6' } + + mime-types@2.1.35: + resolution: + { + integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==, + } + engines: { node: '>= 0.6' } + + mime-types@3.0.2: + resolution: + { + integrity: sha512-Lbgzdk0h4juoQ9fCKXW4by0UJqj+nOOrI9MJ1sSj4nI8aI2eo1qmvQEie4VD1glsS250n15LsWsYtCugiStS5A==, + } + engines: { node: '>=18' } + + mime@1.6.0: + resolution: + { + integrity: sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==, + } + engines: { node: '>=4' } + hasBin: true + + mime@2.6.0: + resolution: + { + integrity: sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==, + } + engines: { node: '>=4.0.0' } + hasBin: true + + mimic-fn@2.1.0: + resolution: + { + integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==, + } + engines: { node: '>=6' } + + mimic-function@5.0.1: + resolution: + { + integrity: sha512-VP79XUPxV2CigYP3jWwAUFSku2aKqBH7uTAapFWCBqutsbmDo96KY5o8uh6U+/YSIn5OxJnXp73beVkpqMIGhA==, + } + engines: { node: '>=18' } + + miniflare@4.20260617.1: + resolution: + { + integrity: sha512-Go3/gzStm99QHptsSgU+q1S+xDfLoRgwjJNY80kaTVi0ENhTyqKq+sc4xZiWBSbM7uUcJwmzm8+QFKtcYLJ9nw==, + } + engines: { node: '>=22.0.0' } + hasBin: true + + mkdirp@1.0.4: + resolution: + { + integrity: sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==, + } + engines: { node: '>=10' } + hasBin: true + + mri@1.2.0: + resolution: + { + integrity: sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==, + } + engines: { node: '>=4' } + + ms@2.0.0: + resolution: + { + integrity: sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==, + } + + ms@2.1.3: + resolution: + { + integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==, + } + + nanoid@3.3.16: + resolution: + { + integrity: sha512-bzlKTyNJ7+LdGIIwy8ijFpIqEQIvafahV7eYykJ8Cvh42EdJeODoJ6gUJXpQJvej1BddH8OqTXZNE/KfbWAu8Q==, + } + engines: { node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1 } + hasBin: true + + needle@2.9.1: + resolution: + { + integrity: sha512-6R9fqJ5Zcmf+uYaFgdIHmLwNldn5HbK8L5ybn7Uz+ylX/rnOsSp1AHcvQSrCaFN+qNM1wpymHqD7mVasEOlHGQ==, + } + engines: { node: '>= 4.4.x' } + hasBin: true + + needle@3.5.0: + resolution: + { + integrity: sha512-jaQyPKKk2YokHrEg+vFDYxXIHTCBgiZwSHOoVx/8V3GIBS8/VN6NdVRmg8q1ERtPkMvmOvebsgga4sAj5hls/w==, + } + engines: { node: '>= 4.4.x' } + hasBin: true + + negotiator@0.6.3: + resolution: + { + integrity: sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==, + } + engines: { node: '>= 0.6' } + + negotiator@0.6.4: + resolution: + { + integrity: sha512-myRT3DiWPHqho5PrJaIRyaMv2kgYf0mUVgBNOYMuCH5Ki1yEiQaf/ZJuQ62nvpc44wL5WDbTX7yGJi1Neevw8w==, + } + engines: { node: '>= 0.6' } + + negotiator@1.0.0: + resolution: + { + integrity: sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg==, + } + engines: { node: '>= 0.6' } + + ng-packagr@22.0.2: + resolution: + { + integrity: sha512-8qQ+RWm0W3gK8Sch1kmo3EzIUiCTXIOP2gS7b+vtqCMBf4KBjBP0wFBikW5qRau9lGOzRTML0GPFGoARPR4+fw==, + } + engines: { node: ^22.22.3 || ^24.15.0 || >=26.0.0 } + hasBin: true + peerDependencies: + '@angular/compiler-cli': ^22.0.0 || ^22.1.0-next.0 + tailwindcss: ^2.0.0 || ^3.0.0 || ^4.0.0 + tslib: ^2.3.0 + typescript: '>=6.0 <6.1' + peerDependenciesMeta: + tailwindcss: + optional: true + + nocache@3.0.4: + resolution: + { + integrity: sha512-WDD0bdg9mbq6F4mRxEYcPWwfA1vxd0mrvKOyxI7Xj/atfRHVeutzuWByG//jfm4uPzp0y4Kj051EORCBSQMycw==, + } + engines: { node: '>=12.0.0' } + + node-addon-api@7.1.1: + resolution: + { + integrity: sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ==, + } + + node-int64@0.4.0: + resolution: + { + integrity: sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==, + } + + node-releases@2.0.51: + resolution: + { + integrity: sha512-wRNIrw4DmVLKQlbgOMdkMx27Wrpzes2hh5Jtbi2bjPd+4wJstWIqP5A+lscnqbm0xxmT5Bpg8Lec5ItEBwx6BQ==, + } + engines: { node: '>=18' } + + node-stream-zip@1.16.0: + resolution: + { + integrity: sha512-ObaRrRoR8T68wF6suxHd7R4XQNamij6ZQHrwG7Dx1D2zeHcDNLsIOBcWrIwtDm7AsCXBguaPHgXhcjxDa2szrg==, + } + engines: { node: '>=0.12.0' } + + npm-run-path@4.0.1: + resolution: + { + integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==, + } + engines: { node: '>=8' } + + nth-check@2.1.1: + resolution: + { + integrity: sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==, + } + + nullthrows@1.1.1: + resolution: + { + integrity: sha512-2vPPEi+Z7WqML2jZYddDIfy5Dqb0r2fze2zTxNNknZaFpVHU3mFB3R+DWeJWGVx0ecvttSGlJTI+WG+8Z4cDWw==, + } + + ob1@0.84.4: + resolution: + { + integrity: sha512-eJXMpz4aQHXF/YBB9ddqZDIS+ooO91hObo9FoW/xBkr54/zCwYYCDqT/O54vNo8kOkWs5Ou/y28NgdrV0edQNA==, + } + engines: { node: ^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0 } + + object-inspect@1.13.4: + resolution: + { + integrity: sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==, + } + engines: { node: '>= 0.4' } + + obug@2.1.4: + resolution: + { + integrity: sha512-4a+OsYv9UktOJKE+l1A4OufDgdRF9PifWj+tJnHURo/P+WOxpG4GzUFL9qCalmWauao6ogiG+QvnCovwPoyAWA==, + } + engines: { node: '>=12.20.0' } + + octane@0.1.13: + resolution: + { + integrity: sha512-bjmuF0hjLnBPOqOLTWyOtq6U5tklKw/JKF/qbAlZ2gfAZsoL9NiK7tQSWibuIUSerXELvLfmPmpbyt0fItemsg==, + } + engines: { node: '>=22' } + peerDependencies: + react: ^19.0.0 + react-dom: ^19.0.0 + vite: ^8.0.16 + peerDependenciesMeta: + react: + optional: true + react-dom: + optional: true + vite: + optional: true + + on-finished@2.3.0: + resolution: + { + integrity: sha512-ikqdkGAAyf/X/gPhXGvfgAytDZtDbr+bkNUJ0N9h5MI/dmdgCs3l6hoHrcUv41sRKew3jIwrp4qQDXiK99Utww==, + } + engines: { node: '>= 0.8' } + + on-finished@2.4.1: + resolution: + { + integrity: sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==, + } + engines: { node: '>= 0.8' } + + on-headers@1.1.0: + resolution: + { + integrity: sha512-737ZY3yNnXy37FHkQxPzt4UZ2UWPWiCZWLvFZ4fu5cueciegX0zGPnrlY6bwRg4FdQOe9YU8MkmJwGhoMybl8A==, + } + engines: { node: '>= 0.8' } + + onetime@5.1.2: + resolution: + { + integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==, + } + engines: { node: '>=6' } + + onetime@7.0.0: + resolution: + { + integrity: sha512-VXJjc87FScF88uafS3JllDgvAm+c/Slfz06lorj2uAY34rlUu0Nt+v8wreiImcrgAjjIHp1rXpTDlLOGw29WwQ==, + } + engines: { node: '>=18' } + + open@6.4.0: + resolution: + { + integrity: sha512-IFenVPgF70fSm1keSd2iDBIDIBZkroLeuffXq+wKTzTJlBpesFWojV9lb8mzOfaAzM1sr7HQHuO0vtV0zYekGg==, + } + engines: { node: '>=8' } + + open@7.4.2: + resolution: + { + integrity: sha512-MVHddDVweXZF3awtlAS+6pgKLlm/JgxZ90+/NBurBoQctVOOB/zDdVjcyPzQ+0laDGbsWgrRkflI65sQeOgT9Q==, + } + engines: { node: '>=8' } + + ora@5.4.1: + resolution: + { + integrity: sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==, + } + engines: { node: '>=10' } + + ora@9.4.1: + resolution: + { + integrity: sha512-6VlU9MLXbjVQD04AZCMX28hVtA5bUoadvUqO76MUCVA0ilwJbMiHsITRPfyVm6p/BC0Av/BXMujx39WCe1LEqw==, + } + engines: { node: '>=20' } + + p-limit@2.3.0: + resolution: + { + integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==, + } + engines: { node: '>=6' } + + p-limit@3.1.0: + resolution: + { + integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==, + } + engines: { node: '>=10' } + + p-locate@4.1.0: + resolution: + { + integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==, + } + engines: { node: '>=8' } + + p-locate@5.0.0: + resolution: + { + integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==, + } + engines: { node: '>=10' } + + p-try@2.2.0: + resolution: + { + integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==, + } + engines: { node: '>=6' } + + parent-module@1.0.1: + resolution: + { + integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==, + } + engines: { node: '>=6' } + + parse-json@5.2.0: + resolution: + { + integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==, + } + engines: { node: '>=8' } + + parse-node-version@1.0.1: + resolution: + { + integrity: sha512-3YHlOa/JgH6Mnpr05jP9eDG254US9ek25LyIxZlDItp2iJtwyaXQb57lBYLdT3MowkUFYEV2XXNAYIPlESvJlA==, + } + engines: { node: '>= 0.10' } + + parse5@7.3.0: + resolution: + { + integrity: sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw==, + } + + parse5@8.0.1: + resolution: + { + integrity: sha512-z1e/HMG90obSGeidlli3hj7cbocou0/wa5HacvI3ASx34PecNjNQeaHNo5WIZpWofN9kgkqV1q5YvXe3F0FoPw==, + } + + parseurl@1.3.3: + resolution: + { + integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==, + } + engines: { node: '>= 0.8' } + + path-exists@4.0.0: + resolution: + { + integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==, + } + engines: { node: '>=8' } + + path-key@3.1.1: + resolution: + { + integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==, + } + engines: { node: '>=8' } + + path-parse@1.0.7: + resolution: + { + integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==, + } + + path-to-regexp@6.3.0: + resolution: + { + integrity: sha512-Yhpw4T9C6hPpgPeA28us07OJeqZ5EzQTkbfwuhsUg0c237RomFoETJgmp2sa3F/41gfLE6G5cqcYwznmeEeOlQ==, + } + + pathe@2.0.3: + resolution: + { + integrity: sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==, + } + + picocolors@1.1.1: + resolution: + { + integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==, + } + + picomatch@2.3.2: + resolution: + { + integrity: sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==, + } + engines: { node: '>=8.6' } + + picomatch@4.0.5: + resolution: + { + integrity: sha512-RvwwcruNjI1ncT5xRakeyS9Lf8lcItv34KD+aif+VH9kduAyfYBipGh12274xtenIPZ119/R9BdTBa8gAwSh0A==, + } + engines: { node: '>=12' } + + piscina@5.3.0: + resolution: + { + integrity: sha512-9D3tPBayfoal6l9l4Y8NrMn1jkV718qJoYrla6P51+hh9h0Q+9/1c8KgEnoBQqhguyfgjay4biADI8HJG3pkoA==, + } + engines: { node: '>=20.x' } + + pkg-dir@8.0.0: + resolution: + { + integrity: sha512-4peoBq4Wks0riS0z8741NVv+/8IiTvqnZAr8QGgtdifrtpdXbNw/FxRS1l6NFqm4EMzuS0EDqNNx4XGaz8cuyQ==, + } + engines: { node: '>=18' } + + playwright-core@1.62.0: + resolution: + { + integrity: sha512-nsNRyq0r2zsG8AcRHWknc9QRA5XCueC7gWMrs+Gx2tlZn9hcl8zudfh00lhJPY1DE7NmZ6bDsT9g2yey8mXljA==, + } + engines: { node: '>=20' } + hasBin: true + + playwright@1.62.0: + resolution: + { + integrity: sha512-Z14dG305dgaLu6foB1TXQagFiW8JfSUIUaUuPaKQ6NtBPKF1P/qXcqfh6c6K/icPqdy37JmjbiBXf6JNg6Sylw==, + } + engines: { node: '>=20' } + hasBin: true + + postcss@8.5.23: + resolution: + { + integrity: sha512-g50586zr4bZmwFiTlflMu8E0bDTb5I5gertgwAKmsdUlTQIhZtunzUlD1WSzwcVWPoAVpsrA6vlfCD7oXvRwgg==, + } + engines: { node: ^10 || ^12 || >=14 } + + preact-render-to-string@6.7.0: + resolution: + { + integrity: sha512-Z4WR8fmLMRpdYqJ9i7vrlXSsSrxVJydwrkEXHapexfARbWfGb7vGcnvNQnIzN0cXciMVOlz/XLoiMCi9gUsy9Q==, + } + peerDependencies: + preact: '>=10 || >= 11.0.0-0' + + preact@10.29.7: + resolution: + { + integrity: sha512-DCHYrK/B10yUD3ZjLfhZ3WIE/9Vf9VFUODcRE2dRomTYDpJk6z6L9wecSfhfE6M9ZTHUdyQkoC46arIDhEV84Q==, + } + peerDependencies: + preact-render-to-string: '>=5' + peerDependenciesMeta: + preact-render-to-string: + optional: true + + prettier@3.9.6: + resolution: + { + integrity: sha512-OpN0zzVdiaiAhxpuuj5efpIS4sY9j7bY6uR5mnj5yPzGkdkjNKSJeUThPb60Jw29QuAZgA4o+/iB49kFiaBX6g==, + } + engines: { node: '>=14' } + hasBin: true + + pretty-format@29.7.0: + resolution: + { + integrity: sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==, + } + engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } + + probe-image-size@7.3.0: + resolution: + { + integrity: sha512-7CaDeBwiAbh6ohXsvLbAZhO7wzsZAmaevfxe39qvCwRh8LyaZfDlBGGLU1CCTgrTLtCOdwBBhjOrIHaIIimHfQ==, + } + + promise@8.3.0: + resolution: + { + integrity: sha512-rZPNPKTOYVNEEKFaq1HqTgOwZD+4/YHS5ukLzQCypkj+OkYx7iv0mA91lJlpPPZ8vMau3IIGj5Qlwrx+8iiSmg==, + } + + prompts@2.4.2: + resolution: + { + integrity: sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==, + } + engines: { node: '>= 6' } + + prr@1.0.1: + resolution: + { + integrity: sha512-yPw4Sng1gWghHQWj0B3ZggWUm4qVbPwPFcRG8KyxiU7J2OHFSoEHKS+EZ3fv5l1t9CyCiop6l/ZYeWbrgoQejw==, + } + + punycode@2.3.1: + resolution: + { + integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==, + } + engines: { node: '>=6' } + + qs@6.15.3: + resolution: + { + integrity: sha512-O9gl3zCl5h5blw1KGUzQKhA5oUXSl8rwUIM5o0S3nCXMliSvy5Dzx7/DJcI+SwgICv+IneSZwhBh1oSyEHA71A==, + } + engines: { node: '>=0.6' } + + queue-microtask@1.2.3: + resolution: + { + integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==, + } + + queue@6.0.2: + resolution: + { + integrity: sha512-iHZWu+q3IdFZFX36ro/lKBkSvfkztY5Y7HMiPlOUjhupPcG2JMfst2KKEpu5XndviX/3UhFbRngUPNKtgvtZiA==, + } + + range-parser@1.2.1: + resolution: + { + integrity: sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==, + } + engines: { node: '>= 0.6' } + + raw-body@2.5.3: + resolution: + { + integrity: sha512-s4VSOf6yN0rvbRZGxs8Om5CWj6seneMwK3oDb4lWDH0UPhWcxwOWw5+qk24bxq87szX1ydrwylIOp2uG1ojUpA==, + } + engines: { node: '>= 0.8' } + + react-devtools-core@6.1.5: + resolution: + { + integrity: sha512-ePrwPfxAnB+7hgnEr8vpKxL9cmnp7F322t8oqcPshbIQQhDKgFDW4tjhF2wjVbdXF9O/nyuy3sQWd9JGpiLPvA==, + } + + react-dom@19.2.3: + resolution: + { + integrity: sha512-yELu4WmLPw5Mr/lmeEpox5rw3RETacE++JgHqQzd2dg+YbJuat3jH4ingc+WPZhxaoFzdv9y33G+F7Nl5O0GBg==, + } + peerDependencies: + react: ^19.2.3 + + react-is@18.3.1: + resolution: + { + integrity: sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==, + } + + react-is@19.2.8: + resolution: + { + integrity: sha512-s5un28nYxKJw5gvUHyW5PCC28CvBqLu9r3cWgzHT4Vo/5fqqkFcdRYsGcKf50WMPpjjFZS5d76fn3YCo2njKwQ==, + } + + react-native-svg@15.15.5: + resolution: + { + integrity: sha512-L4go5jA+GWutdJ/JucuN20cjAbMg1HmMtAP+wZ+3JLCf6Jd0bhXQHxciRP/AQm/FlrIEZwkMcHNZP+FXAiic0w==, + } + peerDependencies: + react: '*' + react-native: '*' + + react-native@0.86.0: + resolution: + { + integrity: sha512-17ALh/dd6AO4pgOVmOO5Axll5PbErEo3XFyLokyzW6usyi+OShIEPwUW26wLPlhVifgSOIfECCH0WN+0IqtJ1w==, + } + engines: { node: ^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0 } + hasBin: true + peerDependencies: + '@react-native/jest-preset': 0.86.0 + '@types/react': ^19.1.1 + react: ^19.2.3 + peerDependenciesMeta: + '@react-native/jest-preset': + optional: true + '@types/react': + optional: true + + react-redux@9.3.0: + resolution: + { + integrity: sha512-KQopgqFo/p/fgmAs5qz6p5RWaNAzq40WAu7fJIXnQpYxFPbJYtsJPWvGeF2rOBaY/kEuV77AVsX8TsQzKm+A/g==, + } + peerDependencies: + '@types/react': ^18.2.25 || ^19 + react: ^18.0 || ^19 + redux: ^5.0.0 + peerDependenciesMeta: + '@types/react': + optional: true + redux: + optional: true + + react-refresh@0.14.2: + resolution: + { + integrity: sha512-jCvmsr+1IUSMUyzOkRcvnVbX3ZYC6g9TDrDbFuFmRDq7PD4yaGbLKNQL6k2jnArV8hjYxh7hVhAZB6s9HDGpZA==, + } + engines: { node: '>=0.10.0' } + + react@19.2.3: + resolution: + { + integrity: sha512-Ku/hhYbVjOQnXDZFv2+RibmLFGwFdeeKHFcOTlrt7xplBnya5OGn/hIRDsqDiSUcfORsDC7MPxwork8jBwsIWA==, + } + engines: { node: '>=0.10.0' } + + readable-stream@3.6.2: + resolution: + { + integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==, + } + engines: { node: '>= 6' } + + readdirp@4.1.2: + resolution: + { + integrity: sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==, + } + engines: { node: '>= 14.18.0' } + + readdirp@5.0.0: + resolution: + { + integrity: sha512-9u/XQ1pvrQtYyMpZe7DXKv2p5CNvyVwzUB6uhLAnQwHMSgKMBR62lc7AHljaeteeHXn11XTAaLLUVZYVZyuRBQ==, + } + engines: { node: '>= 20.19.0' } + + recharts@3.10.1: + resolution: + { + integrity: sha512-QXFrvt6IVcw7eeZCoyXTwkIJAX3Dv1nyVhMicXJ47GsGDDpcN8z6o644DibE9XjpBTThtsomLKnTV6lc+cVFUA==, + } + engines: { node: '>=18' } + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + react-dom: ^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + react-is: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + + redux-thunk@3.1.0: + resolution: + { + integrity: sha512-NW2r5T6ksUKXCabzhL9z+h206HQw/NJkcLm1GPImRQ8IzfXwRGqjVhKJGauHirT0DAuyy6hjdnMZaRoAcy0Klw==, + } + peerDependencies: + redux: ^5.0.0 + + redux@5.0.1: + resolution: + { + integrity: sha512-M9/ELqF6fy8FwmkpnF0S3YKOqMyoWJ4+CS5Efg2ct3oY9daQvd/Pc71FpGZsVsbl3Cpb+IIcjBDUnnyBdQbq4w==, + } + + reflect-metadata@0.2.2: + resolution: + { + integrity: sha512-urBwgfrvVP/eAyXx4hluJivBKzuEbSQs9rKWCrCkbSxNv8mxPcUZKeuoF3Uy4mJl3Lwprp6yy5/39VWigZ4K6Q==, + } + + regenerate-unicode-properties@10.2.2: + resolution: + { + integrity: sha512-m03P+zhBeQd1RGnYxrGyDAPpWX/epKirLrp8e3qevZdVkKtnCrjjWczIbYc8+xd6vcTStVlqfycTx1KR4LOr0g==, + } + engines: { node: '>=4' } + + regenerate@1.4.2: + resolution: + { + integrity: sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==, + } + + regenerator-runtime@0.13.11: + resolution: + { + integrity: sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==, + } + + regexpu-core@6.4.0: + resolution: + { + integrity: sha512-0ghuzq67LI9bLXpOX/ISfve/Mq33a4aFRzoQYhnnok1JOFpmE/A2TBGkNVenOGEeSBCjIiWcc6MVOG5HEQv0sA==, + } + engines: { node: '>=4' } + + regjsgen@0.8.0: + resolution: + { + integrity: sha512-RvwtGe3d7LvWiDQXeQw8p5asZUmfU1G/l6WbUXeHta7Y2PEIvBTwH6E2EfmYUK8pxcxEdEmaomqyp0vZZ7C+3Q==, + } + + regjsparser@0.13.2: + resolution: + { + integrity: sha512-NgRBy2Nx/bE+9F27nVHnqcN5HjyLmecqsqx2PJHu3/IEtADD4WuxuXIVExD5PoSDFVrl78dOonfcOe5O+5nbzQ==, + } + hasBin: true + + require-directory@2.1.1: + resolution: + { + integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==, + } + engines: { node: '>=0.10.0' } + + require-from-string@2.0.2: + resolution: + { + integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==, + } + engines: { node: '>=0.10.0' } + + require-main-filename@2.0.0: + resolution: + { + integrity: sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==, + } + + reselect@5.2.0: + resolution: + { + integrity: sha512-AgZ3UOZm3YndfrJ4OYjgrT7bmCm/1iqkjvEfH/oYjzh6PD2qw4QuT3jjnXIrpdt4MTpMXclMT3lXbmRY+XRakw==, + } + + resolve-from@4.0.0: + resolution: + { + integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==, + } + engines: { node: '>=4' } + + resolve@1.22.12: + resolution: + { + integrity: sha512-TyeJ1zif53BPfHootBGwPRYT1RUt6oGWsaQr8UyZW/eAm9bKoijtvruSDEmZHm92CwS9nj7/fWttqPCgzep8CA==, + } + engines: { node: '>= 0.4' } + hasBin: true + + restore-cursor@3.1.0: + resolution: + { + integrity: sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==, + } + engines: { node: '>=8' } + + restore-cursor@5.1.0: + resolution: + { + integrity: sha512-oMA2dcrw6u0YfxJQXm342bFKX/E4sG9rbTzO9ptUcR/e8A33cHuvStiYOwH7fszkZlZ1z/ta9AAoPk2F4qIOHA==, + } + engines: { node: '>=18' } + + reusify@1.1.0: + resolution: + { + integrity: sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==, + } + engines: { iojs: '>=1.0.0', node: '>=0.10.0' } + + robust-predicates@3.0.3: + resolution: + { + integrity: sha512-NS3levdsRIUOmiJ8FZWCP7LG3QpJyrs/TE0Zpf1yvZu8cAJJ6QMW92H1c7kWpdIHo8RvmLxN/o2JXTKHp74lUA==, + } + + rolldown@1.1.5: + resolution: + { + integrity: sha512-t9z29cJjXf/vxQ8dyhCSpt6H6aSwHTk8cT5I3iy6SMXuFpk5mB6PL6XfC8PCwrPTx93udwKUm9HRteAlTGBLiA==, + } + engines: { node: ^20.19.0 || >=22.12.0 } + hasBin: true + + rollup-plugin-dts@6.4.1: + resolution: + { + integrity: sha512-l//F3Zf7ID5GoOfLfD8kroBjQKEKpy1qfhtAdnpibFZMffPaylrg1CoDC2vGkPeTeyxUe4bVFCln2EFuL7IGGg==, + } + engines: { node: '>=20' } + peerDependencies: + rollup: ^3.29.4 || ^4 + typescript: ^4.5 || ^5.0 || ^6.0 + + rollup@4.62.3: + resolution: + { + integrity: sha512-Gu0c0iH9FzgX1L1t7ByIbbS3Vmdz+6KHm/EsqmmC71gUQ82yvZRkTK6XzrFObSka91WUVdynqp6nsfilzr5k6Q==, + } + engines: { node: '>=18.0.0', npm: '>=8.0.0' } + hasBin: true + + run-parallel@1.2.0: + resolution: + { + integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==, + } + + rw@1.3.3: + resolution: + { + integrity: sha512-PdhdWy89SiZogBLaw42zdeqtRJ//zFd2PgQavcICDUgJT5oW10QCRKbJ6bg4r0/UY2M6BWd5tkxuGFRvCkgfHQ==, + } + + rxjs@7.8.2: + resolution: + { + integrity: sha512-dhKf903U/PQZY6boNNtAGdWbG85WAbjT/1xYoZIC7FAY0yWapOBQVsVrDl58W86//e1VpMNBtRV4MaXfdMySFA==, + } + + sade@1.8.1: + resolution: + { + integrity: sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A==, + } + engines: { node: '>=6' } + + safe-buffer@5.2.1: + resolution: + { + integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==, + } + + safer-buffer@2.1.2: + resolution: + { + integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==, + } + + sass@1.102.0: + resolution: + { + integrity: sha512-NSOyTnaQF7rTAEOtI2fwb386vL+akyiQLBZu8Na7hXCb+umJy0GAqlcMIaqACZ6Z1VgTBS4K9PG6B3IdjHGJsw==, + } + engines: { node: '>=20.19.0' } + hasBin: true + + sax@1.6.1: + resolution: + { + integrity: sha512-42tBVwLWnaQvW5zc4HbZrTuWccECCZfBi92FDuwtqxasH+JbPB3/FOKb1m222K42R4WxuxzzMsTswfzgtSu64Q==, + } + engines: { node: '>=11.0.0' } + + saxes@6.0.0: + resolution: + { + integrity: sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA==, + } + engines: { node: '>=v12.22.7' } + + scheduler@0.27.0: + resolution: + { + integrity: sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q==, + } + + scule@1.3.0: + resolution: + { + integrity: sha512-6FtHJEvt+pVMIB9IBY+IcCJ6Z5f1iQnytgyfKMhDKgmzYG+TeH/wx1y3l27rshSbLiSanrR9ffZDrEsmjlQF2g==, + } + + semver@6.3.1: + resolution: + { + integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==, + } + hasBin: true + + semver@7.8.5: + resolution: + { + integrity: sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA==, + } + engines: { node: '>=10' } + hasBin: true + + send@0.19.2: + resolution: + { + integrity: sha512-VMbMxbDeehAxpOtWJXlcUS5E8iXh6QmN+BkRX1GARS3wRaXEEgzCcB10gTQazO42tpNIya8xIyNx8fll1OFPrg==, + } + engines: { node: '>= 0.8.0' } + + serialize-error@2.1.0: + resolution: + { + integrity: sha512-ghgmKt5o4Tly5yEG/UJp8qTd0AN7Xalw4XBtDEKP655B699qMEtra1WlXeE6WIvdEG481JvRxULKsInq/iNysw==, + } + engines: { node: '>=0.10.0' } + + seroval-plugins@1.5.6: + resolution: + { + integrity: sha512-HXuLAX2pu/UByPpaeo/TaMfvMIi+1QqIoPJYCcAtU8QkVNwgR6MPlGuCQTErV1JwraaMbYaWVIBX7mppzGLATQ==, + } + engines: { node: '>=10' } + peerDependencies: + seroval: ^1.0 + + seroval@1.5.6: + resolution: + { + integrity: sha512-rVQVWjjSvlINzaQPZH5JFqsqEsIWdTxY3iJZCnTL/5gQbXIRooVZKI60tVCkOVfzcRPejboxO2t0P89dg5mQaA==, + } + engines: { node: '>=10' } + + serve-static@1.16.3: + resolution: + { + integrity: sha512-x0RTqQel6g5SY7Lg6ZreMmsOzncHFU7nhnRWkKgWuMTu5NN0DR5oruckMqRvacAN9d5w6ARnRBXl9xhDCgfMeA==, + } + engines: { node: '>= 0.8.0' } + + set-blocking@2.0.0: + resolution: + { + integrity: sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==, + } + + setprototypeof@1.2.0: + resolution: + { + integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==, + } + + sharp@0.34.5: + resolution: + { + integrity: sha512-Ou9I5Ft9WNcCbXrU9cMgPBcCK8LiwLqcbywW3t4oDV37n1pzpuNLsYiAV8eODnjbtQlSDwZ2cUEeQz4E54Hltg==, + } + engines: { node: ^18.17.0 || ^20.3.0 || >=21.0.0 } + + shebang-command@2.0.0: + resolution: + { + integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==, + } + engines: { node: '>=8' } + + shebang-regex@3.0.0: + resolution: + { + integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==, + } + engines: { node: '>=8' } + + shell-quote@1.10.0: + resolution: + { + integrity: sha512-w1aiOKwKuRgtwAReIIj89puqg+I7GvX4IbLrvmhXbzQsj1+Zwi4VO3+fa6ZF91TWSjIxoEkKnMeHcLEODK5ZXA==, + } + engines: { node: '>= 0.4' } + + side-channel-list@1.0.1: + resolution: + { + integrity: sha512-mjn/0bi/oUURjc5Xl7IaWi/OJJJumuoJFQJfDDyO46+hBWsfaVM65TBHq2eoZBhzl9EchxOijpkbRC8SVBQU0w==, + } + engines: { node: '>= 0.4' } + + side-channel-map@1.0.1: + resolution: + { + integrity: sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==, + } + engines: { node: '>= 0.4' } + + side-channel-weakmap@1.0.2: + resolution: + { + integrity: sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==, + } + engines: { node: '>= 0.4' } + + side-channel@1.1.1: + resolution: + { + integrity: sha512-6x6dK6zJdpTzF4sQeNYxwtvBzf6Eg4GtlesS94HOvTudUeyK2WXAaIfmDgsyslYrRBeFIlsi54AYsFGUuhmvrQ==, + } + engines: { node: '>= 0.4' } + + siginfo@2.0.0: + resolution: + { + integrity: sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==, + } + + signal-exit@3.0.7: + resolution: + { + integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==, + } + + signal-exit@4.1.0: + resolution: + { + integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==, + } + engines: { node: '>=14' } + + sisteransi@1.0.5: + resolution: + { + integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==, + } + + slice-ansi@2.1.0: + resolution: + { + integrity: sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ==, + } + engines: { node: '>=6' } + + solid-js@1.9.14: + resolution: + { + integrity: sha512-sAEXC0Kk0S1EDg+8ysEWJDbYhA3RRoEjwuySUGlKIemeo0I5YZfOyumNjNs9Sv3y2nmhD+0rW66ag2HsMuQiGQ==, + } + + solid-refresh@0.6.3: + resolution: + { + integrity: sha512-F3aPsX6hVw9ttm5LYlth8Q15x6MlI/J3Dn+o3EQyRTtTxidepSTwAYdozt01/YA+7ObcciagGEyXIopGZzQtbA==, + } + peerDependencies: + solid-js: ^1.3 + + source-map-js@1.2.1: + resolution: + { + integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==, + } + engines: { node: '>=0.10.0' } + + source-map-support@0.5.21: + resolution: + { + integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==, + } + + source-map@0.5.7: + resolution: + { + integrity: sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==, + } + engines: { node: '>=0.10.0' } + + source-map@0.6.1: + resolution: + { + integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==, + } + engines: { node: '>=0.10.0' } + + stackback@0.0.2: + resolution: + { + integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==, + } + + stackframe@1.3.4: + resolution: + { + integrity: sha512-oeVtt7eWQS+Na6F//S4kJ2K2VbRlS9D43mAlMyVpVWovy9o+jfgH8O9agzANzaiLjclA0oYzUXEM4PurhSUChw==, + } + + stacktrace-parser@0.1.11: + resolution: + { + integrity: sha512-WjlahMgHmCJpqzU8bIBy4qtsZdU9lRlcZE3Lvyej6t4tuOuv1vk57OW3MBrj6hXBFx/nNoC9MPMTcr5YA7NQbg==, + } + engines: { node: '>=6' } + + statuses@1.5.0: + resolution: + { + integrity: sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==, + } + engines: { node: '>= 0.6' } + + statuses@2.0.2: + resolution: + { + integrity: sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==, + } + engines: { node: '>= 0.8' } + + std-env@4.2.0: + resolution: + { + integrity: sha512-oCUKSupKTHX53EyjDtuZQ64pjLJ6yYCtpmEw0goYxtjG9KpbRe8KAsl2tBUGU9DyMcJ0RwJ8GqJAFzMXcXW1Rw==, + } + + stdin-discarder@0.3.2: + resolution: + { + integrity: sha512-eCPu1qRxPVkl5605OTWF8Wz40b4Mf45NY5LQmVPQ599knfs5QhASUm9GbJ5BDMDOXgrnh0wyEdvzmL//YMlw0A==, + } + engines: { node: '>=18' } + + stream-parser@0.3.1: + resolution: + { + integrity: sha512-bJ/HgKq41nlKvlhccD5kaCr/P+Hu0wPNKPJOH7en+YrJu/9EgqUF+88w5Jb6KNcjOFMhfX4B2asfeAtIGuHObQ==, + } + + string-width@4.2.3: + resolution: + { + integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==, + } + engines: { node: '>=8' } + + string-width@7.2.0: + resolution: + { + integrity: sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==, + } + engines: { node: '>=18' } + + string-width@8.2.2: + resolution: + { + integrity: sha512-GaPUh5gfdrYzqeVNZvUfT23vYYxXzKYidUcnMtJg/3rxRV63EFZy3k6xfKlmfeJD0176lnUV/Usr3XcwSvFzpg==, + } + engines: { node: '>=20' } + + string_decoder@1.3.0: + resolution: + { + integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==, + } + + strip-ansi@5.2.0: + resolution: + { + integrity: sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==, + } + engines: { node: '>=6' } + + strip-ansi@6.0.1: + resolution: + { + integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==, + } + engines: { node: '>=8' } + + strip-ansi@7.2.0: + resolution: + { + integrity: sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==, + } + engines: { node: '>=12' } + + strip-final-newline@2.0.0: + resolution: + { + integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==, + } + engines: { node: '>=6' } + + strnum@1.1.2: + resolution: + { + integrity: sha512-vrN+B7DBIoTTZjnPNewwhx6cBA/H+IS7rfW68n7XxC1y7uoiGQBxaKzqucGUgavX15dJgiGztLJ8vxuEzwqBdA==, + } + + supports-color@10.2.2: + resolution: + { + integrity: sha512-SS+jx45GF1QjgEXQx4NJZV9ImqmO2NPz5FNsIHrsDjh2YsHnawpan7SNQ1o8NuhrbHZy9AZhIoCUiCeaW/C80g==, + } + engines: { node: '>=18' } + + supports-color@7.2.0: + resolution: + { + integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==, + } + engines: { node: '>=8' } + + supports-color@8.1.1: + resolution: + { + integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==, + } + engines: { node: '>=10' } + + supports-preserve-symlinks-flag@1.0.0: + resolution: + { + integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==, + } + engines: { node: '>= 0.4' } + + svelte-check@4.7.4: + resolution: + { + integrity: sha512-IW9ot9YqAoyv8FvyN+eb4ZTe8zgcKZrJLNYU6dzSKkGwEBsSPc4K7lmQ8bKn8W2YMXM6WDfZSSVOaGtekyUfOQ==, + } + engines: { node: '>= 18.0.0' } + hasBin: true + peerDependencies: + svelte: ^4.0.0 || ^5.0.0-next.0 + typescript: ^5.0.0 || ^6.0.0 + + svelte2tsx@0.7.59: + resolution: + { + integrity: sha512-Itj7Wz9WIiGFl/uJa58+rf43ajezaljKK/KTOHq5abUjto56xe+o5SOzLwSoeJ5hma9NZEstpZiazFW2q1nZPQ==, + } + peerDependencies: + svelte: ^3.55 || ^4.0.0-next.0 || ^4.0 || ^5.0.0-next.0 + typescript: ^4.9.4 || ^5.0.0 || ^6.0.0 + + svelte@5.56.8: + resolution: + { + integrity: sha512-PY8LOw7xP6c8IOiVqdo0sbbZVYhXRSfklOQLAUyGBKqjTX0wx/z4l/9J+PmBpmlLnxzEb1NqltxQ5/wZme/Cmg==, + } + engines: { node: '>=18' } + + symbol-tree@3.2.4: + resolution: + { + integrity: sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==, + } + + terser@5.49.0: + resolution: + { + integrity: sha512-SNiDnXyHSrxVcIOtVbULzcTmniUiwcV7Nwdyj1twVubeTmbjoa8p69KKDpfkdoOavuM4/GRm1+ykI8qqnavHoA==, + } + engines: { node: '>=10' } + hasBin: true + + throat@5.0.0: + resolution: + { + integrity: sha512-fcwX4mndzpLQKBS1DVYhGAcYaYt7vsHNIvQV+WXMvnow5cgjPphq5CaayLaGsjRdSCKZFNGt7/GYAuXaNOiYCA==, + } + + tiny-invariant@1.3.3: + resolution: + { + integrity: sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg==, + } + + tinybench@2.9.0: + resolution: + { + integrity: sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==, + } + + tinyexec@1.2.4: + resolution: + { + integrity: sha512-SHf/r48b7vOrjve9PxJo3MN5v5yuyjHvdUcrQffT3WXMUfnGmHDVbC4k3sHJaJTgZCwpUplIaAo5ANtMyp3YHg==, + } + engines: { node: '>=18' } + + tinyglobby@0.2.17: + resolution: + { + integrity: sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g==, + } + engines: { node: '>=12.0.0' } + + tinyrainbow@3.1.0: + resolution: + { + integrity: sha512-Bf+ILmBgretUrdJxzXM0SgXLZ3XfiaUuOj/IKQHuTXip+05Xn+uyEYdVg0kYDipTBcLrCVyUzAPz7QmArb0mmw==, + } + engines: { node: '>=14.0.0' } + + tldts-core@7.4.9: + resolution: + { + integrity: sha512-DxKfPBI52p2msTEu7MPhdpdDTBhhVQg1a/8PjQckeyAvO13eMYElX545grIp6nnTGIMZlRvFZPvFhvI/WIz2Vg==, + } + + tldts@7.4.9: + resolution: + { + integrity: sha512-3kZ8wQQ/k5DrChD4X4FVvr2D7E5uoRgAqkPyLpSCGUvqOvqu+JEdr3mwMUaVWb+vMHZaKhF5fp2PBigKsui7hA==, + } + hasBin: true + + tmpl@1.0.5: + resolution: + { + integrity: sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==, + } + + to-regex-range@5.0.1: + resolution: + { + integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==, + } + engines: { node: '>=8.0' } + + toidentifier@1.0.1: + resolution: + { + integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==, + } + engines: { node: '>=0.6' } + + topojson-client@3.1.0: + resolution: + { + integrity: sha512-605uxS6bcYxGXw9qi62XyrV6Q3xwbndjachmNxu8HWTtVPxZfEJN9fd/SZS1Q54Sn2y0TMyMxFj/cJINqGHrKw==, + } + hasBin: true + + tough-cookie@6.0.2: + resolution: + { + integrity: sha512-exgYmnmL/sJpR3upZfXG5PoatXQii55xAiXGXzY+sROLZ/Y+SLcp9PgJNI9Vz37HpQ74WvDcLT8eqm+kV3FzrA==, + } + engines: { node: '>=16' } + + tr46@6.0.0: + resolution: + { + integrity: sha512-bLVMLPtstlZ4iMQHpFHTR7GAGj2jxi8Dg0s2h2MafAE4uSWF98FC/3MomU51iQAMf8/qDUbKWf5GxuvvVcXEhw==, + } + engines: { node: '>=20' } + + tslib@2.3.0: + resolution: + { + integrity: sha512-N82ooyxVNm6h1riLCoyS9e3fuJ3AMG2zIZs2Gd1ATcSFjSA23Q0fzjjZeh0jbJvWVDZ0cJT8yaNNaaXHzueNjg==, + } + + tslib@2.8.1: + resolution: + { + integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==, + } + + type-fest@0.7.1: + resolution: + { + integrity: sha512-Ne2YiiGN8bmrmJJEuTWTLJR32nh/JdL1+PSicowtNb0WFpn59GK8/lfD61bVtzguz7b3PBt74nxpv/Pw5po5Rg==, + } + engines: { node: '>=8' } + + type-is@1.6.18: + resolution: + { + integrity: sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==, + } + engines: { node: '>= 0.6' } + + typescript@6.0.3: + resolution: + { + integrity: sha512-y2TvuxSZPDyQakkFRPZHKFm+KKVqIisdg9/CZwm9ftvKXLP8NRWj38/ODjNbr43SsoXqNuAisEf1GdCxqWcdBw==, + } + engines: { node: '>=14.17' } + hasBin: true + + undici-types@7.24.6: + resolution: + { + integrity: sha512-WRNW+sJgj5OBN4/0JpHFqtqzhpbnV0GuB+OozA9gCL7a993SmU+1JBZCzLNxYsbMfIeDL+lTsphD5jN5N+n0zg==, + } + + undici@7.28.0: + resolution: + { + integrity: sha512-cRZYrTDwWznlnRiPjggAGxZXanty6M8RV1ff8Wm4LWXBp7/IG8v5DnOm74DtUBp9OONpK75YlPnIjQqX0dBDtA==, + } + engines: { node: '>=20.18.1' } + + undici@7.29.0: + resolution: + { + integrity: sha512-IDxfleLmmbSskfWSUATiN1nfn2rDuvnMOqb5CWR92iIfojA0Ud+ulOAAEQ57LPr9rWmsreUyf5lwyao+7GNNVw==, + } + engines: { node: '>=20.18.1' } + + unenv@2.0.0-rc.24: + resolution: + { + integrity: sha512-i7qRCmY42zmCwnYlh9H2SvLEypEFGye5iRmEMKjcGi7zk9UquigRjFtTLz0TYqr0ZGLZhaMHl/foy1bZR+Cwlw==, + } + + unicode-canonical-property-names-ecmascript@2.0.1: + resolution: + { + integrity: sha512-dA8WbNeb2a6oQzAQ55YlT5vQAWGV9WXOsi3SskE3bcCdM0P4SDd+24zS/OCacdRq5BkdsRj9q3Pg6YyQoxIGqg==, + } + engines: { node: '>=4' } + + unicode-match-property-ecmascript@2.0.0: + resolution: + { + integrity: sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==, + } + engines: { node: '>=4' } + + unicode-match-property-value-ecmascript@2.2.1: + resolution: + { + integrity: sha512-JQ84qTuMg4nVkx8ga4A16a1epI9H6uTXAknqxkGF/aFfRLw1xC/Bp24HNLaZhHSkWd3+84t8iXnp1J0kYcZHhg==, + } + engines: { node: '>=4' } + + unicode-property-aliases-ecmascript@2.2.0: + resolution: + { + integrity: sha512-hpbDzxUY9BFwX+UeBnxv3Sh1q7HFxj48DTmXchNgRa46lO8uj3/1iEn3MiNUYTg1g9ctIqXCCERn8gYZhHC5lQ==, + } + engines: { node: '>=4' } + + universalify@0.1.2: + resolution: + { + integrity: sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==, + } + engines: { node: '>= 4.0.0' } + + unpipe@1.0.0: + resolution: + { + integrity: sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==, + } + engines: { node: '>= 0.8' } + + update-browserslist-db@1.2.3: + resolution: + { + integrity: sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w==, + } + hasBin: true + peerDependencies: + browserslist: '>= 4.21.0' + + us-atlas@3.0.1: + resolution: + { + integrity: sha512-wEIZCq0ImPvGblTd8gZMqNNCPkQshugMUG/8nkSWXb02+XqNFREg9atHOKP9w6prLZTpqcLhSvdBW81MkV3/0Q==, + } + + use-sync-external-store@1.6.0: + resolution: + { + integrity: sha512-Pp6GSwGP/NrPIrxVFAIkOQeyw8lFenOHijQWkUTrDvrF4ALqylP2C/KCkeS9dpUM3KvYRQhna5vt7IL95+ZQ9w==, + } + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + + util-deprecate@1.0.2: + resolution: + { + integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==, + } + + utils-merge@1.0.1: + resolution: + { + integrity: sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==, + } + engines: { node: '>= 0.4.0' } + + vary@1.1.2: + resolution: + { + integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==, + } + engines: { node: '>= 0.8' } + + victory-vendor@37.3.6: + resolution: + { + integrity: sha512-SbPDPdDBYp+5MJHhBCAyI7wKM3d5ivekigc2Dk2s7pgbZ9wIgIBYGVw4zGHBml/qTFbexrofXW6Gu4noGxrOwQ==, + } + + vite-plugin-solid@2.11.14: + resolution: + { + integrity: sha512-7ZVBt8rpoyqmlwin2kRIUveaHoF6/kulY7gsnD+qFh4nS29V4OPAnw+ojoAspXIjObiL9o1xh9a/nTuYHm02Rw==, + } + peerDependencies: + '@testing-library/jest-dom': ^5.16.6 || ^5.17.0 || ^6.0.0 || ^7.0.0 + solid-js: ^1.7.2 + vite: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0 || ^9.0.0 + peerDependenciesMeta: + '@testing-library/jest-dom': + optional: true + + vite@8.1.5: + resolution: + { + integrity: sha512-7ULLwsCdYx/nRyrpiEwvqb5TFHrMVZyBt+rg/OAXT7rgj/z+DtTDyKFeLAdDkubDVDKD8jOsndmy7m55XcfUsw==, + } + engines: { node: ^20.19.0 || >=22.12.0 } + hasBin: true + peerDependencies: + '@types/node': ^20.19.0 || >=22.12.0 + '@vitejs/devtools': ^0.3.0 + esbuild: ^0.27.0 || ^0.28.0 + jiti: '>=1.21.0' + less: ^4.0.0 + sass: ^1.70.0 + sass-embedded: ^1.70.0 + stylus: '>=0.54.8' + sugarss: ^5.0.0 + terser: ^5.16.0 + tsx: ^4.8.1 + yaml: ^2.4.2 + peerDependenciesMeta: + '@types/node': + optional: true + '@vitejs/devtools': + optional: true + esbuild: + optional: true + jiti: + optional: true + less: + optional: true + sass: + optional: true + sass-embedded: + optional: true + stylus: + optional: true + sugarss: + optional: true + terser: + optional: true + tsx: + optional: true + yaml: + optional: true + + vitefu@1.1.3: + resolution: + { + integrity: sha512-ub4okH7Z5KLjb6hDyjqrGXqWtWvoYdU3IGm/NorpgHncKoLTCfRIbvlhBm7r0YstIaQRYlp4yEbFqDcKSzXSSg==, + } + peerDependencies: + vite: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0 + peerDependenciesMeta: + vite: + optional: true + + vitest@4.1.10: + resolution: + { + integrity: sha512-R9jUTe5S4Qb0HCd4TNqpC7oGcrMssMRGXLW80ubjWsW9VH5GF8y1Y0SFLY9AbqSk6nt0PnOx4H4WNJYZ13GUPw==, + } + engines: { node: ^20.0.0 || ^22.0.0 || >=24.0.0 } + hasBin: true + peerDependencies: + '@edge-runtime/vm': '*' + '@opentelemetry/api': ^1.9.0 '@types/node': ^20.0.0 || ^22.0.0 || >=24.0.0 '@vitest/browser-playwright': 4.1.10 '@vitest/browser-preview': 4.1.10 @@ -5064,6 +7786,12 @@ packages: jsdom: optional: true + vlq@1.0.1: + resolution: + { + integrity: sha512-gQpnTgkubC6hQgdIcRdYGDSDc+SaujOdyesZQMv6JlfQee/9Mp0Qhnys6WxDWvQnL5WZdT7o2Ul187aSt0Rq+w==, + } + vue@3.5.40: resolution: { @@ -5082,6 +7810,18 @@ packages: } engines: { node: '>=18' } + walker@1.0.8: + resolution: + { + integrity: sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==, + } + + wcwidth@1.0.1: + resolution: + { + integrity: sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==, + } + webidl-conversions@8.0.1: resolution: { @@ -5089,6 +7829,12 @@ packages: } engines: { node: '>=20' } + whatwg-fetch@3.6.20: + resolution: + { + integrity: sha512-EqhiFU6daOA8kpjOWTL0olhVOF3i7OrFzSYiGsEMB8GcXS+RrzauAERX65xMeNWVqxA6HXH2m69Z9LaKKdisfg==, + } + whatwg-mimetype@5.0.0: resolution: { @@ -5103,6 +7849,20 @@ packages: } engines: { node: ^20.19.0 || ^22.12.0 || >=24.0.0 } + which-module@2.0.1: + resolution: + { + integrity: sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ==, + } + + which@2.0.2: + resolution: + { + integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==, + } + engines: { node: '>= 8' } + hasBin: true + why-is-node-running@2.3.0: resolution: { @@ -5133,17 +7893,60 @@ packages: engines: { node: '>=22.0.0' } hasBin: true peerDependencies: - '@cloudflare/workers-types': ^4.20260617.1 + '@cloudflare/workers-types': ^4.20260617.1 + peerDependenciesMeta: + '@cloudflare/workers-types': + optional: true + + wrap-ansi@6.2.0: + resolution: + { + integrity: sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==, + } + engines: { node: '>=8' } + + wrap-ansi@7.0.0: + resolution: + { + integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==, + } + engines: { node: '>=10' } + + wrap-ansi@9.0.2: + resolution: + { + integrity: sha512-42AtmgqjV+X1VpdOfyTGOYRi0/zsoLqtXQckTmqTeybT+BDIbM/Guxo7x3pE2vtpr1ok6xRqM9OpBe+Jyoqyww==, + } + engines: { node: '>=18' } + + ws@6.2.6: + resolution: + { + integrity: sha512-XTrf1gv7kXoVf1hbC3PAyAiPgR8Wz1blcrYIjEsUmr08BLksT41R8KbjmS9408C2ERx7v1JDLD/BkpLEttjfKA==, + } + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: ^5.0.2 peerDependenciesMeta: - '@cloudflare/workers-types': + bufferutil: + optional: true + utf-8-validate: optional: true - wrap-ansi@9.0.2: + ws@7.5.13: resolution: { - integrity: sha512-42AtmgqjV+X1VpdOfyTGOYRi0/zsoLqtXQckTmqTeybT+BDIbM/Guxo7x3pE2vtpr1ok6xRqM9OpBe+Jyoqyww==, + integrity: sha512-rsKI6xDBFVf4r/x8XyChGK04QR/XHroxs/jUcoWvtEZM8TPU/X/uIY9B1CsSzYws9ZJb/6bbBu7dPhFW00CAoA==, } - engines: { node: '>=18' } + engines: { node: '>=8.3.0' } + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: ^5.0.2 + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true ws@8.21.0: resolution: @@ -5173,6 +7976,12 @@ packages: integrity: sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==, } + y18n@4.0.3: + resolution: + { + integrity: sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==, + } + y18n@5.0.8: resolution: { @@ -5186,6 +7995,28 @@ packages: integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==, } + yaml@2.9.0: + resolution: + { + integrity: sha512-2AvhNX3mb8zd6Zy7INTtSpl1F15HW6Wnqj0srWlkKLcpYl/gMIMJiyuGq2KeI2YFxUPjdlB+3Lc10seMLtL4cA==, + } + engines: { node: '>= 14.6' } + hasBin: true + + yargs-parser@18.1.3: + resolution: + { + integrity: sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==, + } + engines: { node: '>=6' } + + yargs-parser@21.1.1: + resolution: + { + integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==, + } + engines: { node: '>=12' } + yargs-parser@22.0.0: resolution: { @@ -5193,6 +8024,20 @@ packages: } engines: { node: ^20.19.0 || ^22.12.0 || >=23 } + yargs@15.4.1: + resolution: + { + integrity: sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==, + } + engines: { node: '>=8' } + + yargs@17.7.3: + resolution: + { + integrity: sha512-GZtjxm/J/4TSxuL3FNYjCmLktBTnIw/rVmKSIyKeYAZpmJB2ig9VauCC5xsa82GNKVKDAqpOn3KVzNt0zmrU0g==, + } + engines: { node: '>=12' } + yargs@18.1.0: resolution: { @@ -5200,6 +8045,13 @@ packages: } engines: { node: ^20.19.0 || ^22.12.0 || >=23 } + yocto-queue@0.1.0: + resolution: + { + integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==, + } + engines: { node: '>=10' } + yoctocolors@2.2.0: resolution: { @@ -5304,94 +8156,384 @@ snapshots: '@asamuzakjp/nwsapi@2.3.9': {} - '@babel/code-frame@7.29.7': + '@babel/code-frame@7.29.7': + dependencies: + '@babel/helper-validator-identifier': 7.29.7 + js-tokens: 4.0.0 + picocolors: 1.1.1 + + '@babel/compat-data@7.29.7': {} + + '@babel/core@7.29.7(supports-color@10.2.2)': + dependencies: + '@babel/code-frame': 7.29.7 + '@babel/generator': 7.29.7 + '@babel/helper-compilation-targets': 7.29.7 + '@babel/helper-module-transforms': 7.29.7(@babel/core@7.29.7(supports-color@10.2.2))(supports-color@10.2.2) + '@babel/helpers': 7.29.7 + '@babel/parser': 7.29.7 + '@babel/template': 7.29.7 + '@babel/traverse': 7.29.7(supports-color@10.2.2) + '@babel/types': 7.29.7 + '@jridgewell/remapping': 2.3.5 + convert-source-map: 2.0.0 + debug: 4.4.3(supports-color@10.2.2) + gensync: 1.0.0-beta.2 + json5: 2.2.3 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + + '@babel/generator@7.29.7': + dependencies: + '@babel/parser': 7.29.7 + '@babel/types': 7.29.7 + '@jridgewell/gen-mapping': 0.3.13 + '@jridgewell/trace-mapping': 0.3.31 + jsesc: 3.1.0 + + '@babel/helper-annotate-as-pure@7.29.7': + dependencies: + '@babel/types': 7.29.7 + + '@babel/helper-compilation-targets@7.29.7': + dependencies: + '@babel/compat-data': 7.29.7 + '@babel/helper-validator-option': 7.29.7 + browserslist: 4.28.7 + lru-cache: 5.1.1 + semver: 6.3.1 + + '@babel/helper-create-class-features-plugin@7.29.7(@babel/core@7.29.7(supports-color@10.2.2))(supports-color@10.2.2)': + dependencies: + '@babel/core': 7.29.7(supports-color@10.2.2) + '@babel/helper-annotate-as-pure': 7.29.7 + '@babel/helper-member-expression-to-functions': 7.29.7(supports-color@10.2.2) + '@babel/helper-optimise-call-expression': 7.29.7 + '@babel/helper-replace-supers': 7.29.7(@babel/core@7.29.7(supports-color@10.2.2))(supports-color@10.2.2) + '@babel/helper-skip-transparent-expression-wrappers': 7.29.7(supports-color@10.2.2) + '@babel/traverse': 7.29.7(supports-color@10.2.2) + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + + '@babel/helper-create-regexp-features-plugin@7.29.7(@babel/core@7.29.7(supports-color@10.2.2))': + dependencies: + '@babel/core': 7.29.7(supports-color@10.2.2) + '@babel/helper-annotate-as-pure': 7.29.7 + regexpu-core: 6.4.0 + semver: 6.3.1 + + '@babel/helper-define-polyfill-provider@0.6.8(@babel/core@7.29.7(supports-color@10.2.2))(supports-color@10.2.2)': + dependencies: + '@babel/core': 7.29.7(supports-color@10.2.2) + '@babel/helper-compilation-targets': 7.29.7 + '@babel/helper-plugin-utils': 7.29.7 + debug: 4.4.3(supports-color@10.2.2) + lodash.debounce: 4.0.8 + resolve: 1.22.12 + transitivePeerDependencies: + - supports-color + + '@babel/helper-globals@7.29.7': {} + + '@babel/helper-member-expression-to-functions@7.29.7(supports-color@10.2.2)': + dependencies: + '@babel/traverse': 7.29.7(supports-color@10.2.2) + '@babel/types': 7.29.7 + transitivePeerDependencies: + - supports-color + + '@babel/helper-module-imports@7.18.6': + dependencies: + '@babel/types': 7.29.7 + + '@babel/helper-module-imports@7.29.7(supports-color@10.2.2)': + dependencies: + '@babel/traverse': 7.29.7(supports-color@10.2.2) + '@babel/types': 7.29.7 + transitivePeerDependencies: + - supports-color + + '@babel/helper-module-transforms@7.29.7(@babel/core@7.29.7(supports-color@10.2.2))(supports-color@10.2.2)': + dependencies: + '@babel/core': 7.29.7(supports-color@10.2.2) + '@babel/helper-module-imports': 7.29.7(supports-color@10.2.2) + '@babel/helper-validator-identifier': 7.29.7 + '@babel/traverse': 7.29.7(supports-color@10.2.2) + transitivePeerDependencies: + - supports-color + + '@babel/helper-optimise-call-expression@7.29.7': + dependencies: + '@babel/types': 7.29.7 + + '@babel/helper-plugin-utils@7.29.7': {} + + '@babel/helper-remap-async-to-generator@7.29.7(@babel/core@7.29.7(supports-color@10.2.2))(supports-color@10.2.2)': + dependencies: + '@babel/core': 7.29.7(supports-color@10.2.2) + '@babel/helper-annotate-as-pure': 7.29.7 + '@babel/helper-wrap-function': 7.29.7(supports-color@10.2.2) + '@babel/traverse': 7.29.7(supports-color@10.2.2) + transitivePeerDependencies: + - supports-color + + '@babel/helper-replace-supers@7.29.7(@babel/core@7.29.7(supports-color@10.2.2))(supports-color@10.2.2)': + dependencies: + '@babel/core': 7.29.7(supports-color@10.2.2) + '@babel/helper-member-expression-to-functions': 7.29.7(supports-color@10.2.2) + '@babel/helper-optimise-call-expression': 7.29.7 + '@babel/traverse': 7.29.7(supports-color@10.2.2) + transitivePeerDependencies: + - supports-color + + '@babel/helper-skip-transparent-expression-wrappers@7.29.7(supports-color@10.2.2)': + dependencies: + '@babel/traverse': 7.29.7(supports-color@10.2.2) + '@babel/types': 7.29.7 + transitivePeerDependencies: + - supports-color + + '@babel/helper-string-parser@7.29.7': {} + + '@babel/helper-validator-identifier@7.29.7': {} + + '@babel/helper-validator-option@7.29.7': {} + + '@babel/helper-wrap-function@7.29.7(supports-color@10.2.2)': + dependencies: + '@babel/template': 7.29.7 + '@babel/traverse': 7.29.7(supports-color@10.2.2) + '@babel/types': 7.29.7 + transitivePeerDependencies: + - supports-color + + '@babel/helpers@7.29.7': + dependencies: + '@babel/template': 7.29.7 + '@babel/types': 7.29.7 + + '@babel/parser@7.29.7': + dependencies: + '@babel/types': 7.29.7 + + '@babel/plugin-proposal-export-default-from@7.29.7(@babel/core@7.29.7(supports-color@10.2.2))': + dependencies: + '@babel/core': 7.29.7(supports-color@10.2.2) + '@babel/helper-plugin-utils': 7.29.7 + + '@babel/plugin-syntax-dynamic-import@7.8.3(@babel/core@7.29.7(supports-color@10.2.2))': + dependencies: + '@babel/core': 7.29.7(supports-color@10.2.2) + '@babel/helper-plugin-utils': 7.29.7 + + '@babel/plugin-syntax-export-default-from@7.29.7(@babel/core@7.29.7(supports-color@10.2.2))': + dependencies: + '@babel/core': 7.29.7(supports-color@10.2.2) + '@babel/helper-plugin-utils': 7.29.7 + + '@babel/plugin-syntax-flow@7.29.7(@babel/core@7.29.7(supports-color@10.2.2))': + dependencies: + '@babel/core': 7.29.7(supports-color@10.2.2) + '@babel/helper-plugin-utils': 7.29.7 + + '@babel/plugin-syntax-jsx@7.29.7(@babel/core@7.29.7(supports-color@10.2.2))': + dependencies: + '@babel/core': 7.29.7(supports-color@10.2.2) + '@babel/helper-plugin-utils': 7.29.7 + + '@babel/plugin-syntax-nullish-coalescing-operator@7.8.3(@babel/core@7.29.7(supports-color@10.2.2))': + dependencies: + '@babel/core': 7.29.7(supports-color@10.2.2) + '@babel/helper-plugin-utils': 7.29.7 + + '@babel/plugin-syntax-optional-chaining@7.8.3(@babel/core@7.29.7(supports-color@10.2.2))': + dependencies: + '@babel/core': 7.29.7(supports-color@10.2.2) + '@babel/helper-plugin-utils': 7.29.7 + + '@babel/plugin-syntax-typescript@7.29.7(@babel/core@7.29.7(supports-color@10.2.2))': + dependencies: + '@babel/core': 7.29.7(supports-color@10.2.2) + '@babel/helper-plugin-utils': 7.29.7 + + '@babel/plugin-transform-async-generator-functions@7.29.7(@babel/core@7.29.7(supports-color@10.2.2))(supports-color@10.2.2)': + dependencies: + '@babel/core': 7.29.7(supports-color@10.2.2) + '@babel/helper-plugin-utils': 7.29.7 + '@babel/helper-remap-async-to-generator': 7.29.7(@babel/core@7.29.7(supports-color@10.2.2))(supports-color@10.2.2) + '@babel/traverse': 7.29.7(supports-color@10.2.2) + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-async-to-generator@7.29.7(@babel/core@7.29.7(supports-color@10.2.2))(supports-color@10.2.2)': + dependencies: + '@babel/core': 7.29.7(supports-color@10.2.2) + '@babel/helper-module-imports': 7.29.7(supports-color@10.2.2) + '@babel/helper-plugin-utils': 7.29.7 + '@babel/helper-remap-async-to-generator': 7.29.7(@babel/core@7.29.7(supports-color@10.2.2))(supports-color@10.2.2) + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-block-scoping@7.29.7(@babel/core@7.29.7(supports-color@10.2.2))': + dependencies: + '@babel/core': 7.29.7(supports-color@10.2.2) + '@babel/helper-plugin-utils': 7.29.7 + + '@babel/plugin-transform-class-properties@7.29.7(@babel/core@7.29.7(supports-color@10.2.2))(supports-color@10.2.2)': + dependencies: + '@babel/core': 7.29.7(supports-color@10.2.2) + '@babel/helper-create-class-features-plugin': 7.29.7(@babel/core@7.29.7(supports-color@10.2.2))(supports-color@10.2.2) + '@babel/helper-plugin-utils': 7.29.7 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-classes@7.29.7(@babel/core@7.29.7(supports-color@10.2.2))(supports-color@10.2.2)': + dependencies: + '@babel/core': 7.29.7(supports-color@10.2.2) + '@babel/helper-annotate-as-pure': 7.29.7 + '@babel/helper-compilation-targets': 7.29.7 + '@babel/helper-globals': 7.29.7 + '@babel/helper-plugin-utils': 7.29.7 + '@babel/helper-replace-supers': 7.29.7(@babel/core@7.29.7(supports-color@10.2.2))(supports-color@10.2.2) + '@babel/traverse': 7.29.7(supports-color@10.2.2) + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-destructuring@7.29.7(@babel/core@7.29.7(supports-color@10.2.2))(supports-color@10.2.2)': + dependencies: + '@babel/core': 7.29.7(supports-color@10.2.2) + '@babel/helper-plugin-utils': 7.29.7 + '@babel/traverse': 7.29.7(supports-color@10.2.2) + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-flow-strip-types@7.29.7(@babel/core@7.29.7(supports-color@10.2.2))': dependencies: - '@babel/helper-validator-identifier': 7.29.7 - js-tokens: 4.0.0 - picocolors: 1.1.1 + '@babel/core': 7.29.7(supports-color@10.2.2) + '@babel/helper-plugin-utils': 7.29.7 + '@babel/plugin-syntax-flow': 7.29.7(@babel/core@7.29.7(supports-color@10.2.2)) - '@babel/compat-data@7.29.7': {} + '@babel/plugin-transform-for-of@7.29.7(@babel/core@7.29.7(supports-color@10.2.2))(supports-color@10.2.2)': + dependencies: + '@babel/core': 7.29.7(supports-color@10.2.2) + '@babel/helper-plugin-utils': 7.29.7 + '@babel/helper-skip-transparent-expression-wrappers': 7.29.7(supports-color@10.2.2) + transitivePeerDependencies: + - supports-color - '@babel/core@7.29.7(supports-color@10.2.2)': + '@babel/plugin-transform-modules-commonjs@7.29.7(@babel/core@7.29.7(supports-color@10.2.2))(supports-color@10.2.2)': dependencies: - '@babel/code-frame': 7.29.7 - '@babel/generator': 7.29.7 - '@babel/helper-compilation-targets': 7.29.7 + '@babel/core': 7.29.7(supports-color@10.2.2) '@babel/helper-module-transforms': 7.29.7(@babel/core@7.29.7(supports-color@10.2.2))(supports-color@10.2.2) - '@babel/helpers': 7.29.7 - '@babel/parser': 7.29.7 - '@babel/template': 7.29.7 - '@babel/traverse': 7.29.7(supports-color@10.2.2) - '@babel/types': 7.29.7 - '@jridgewell/remapping': 2.3.5 - convert-source-map: 2.0.0 - debug: 4.4.3(supports-color@10.2.2) - gensync: 1.0.0-beta.2 - json5: 2.2.3 - semver: 6.3.1 + '@babel/helper-plugin-utils': 7.29.7 transitivePeerDependencies: - supports-color - '@babel/generator@7.29.7': + '@babel/plugin-transform-named-capturing-groups-regex@7.29.7(@babel/core@7.29.7(supports-color@10.2.2))': dependencies: - '@babel/parser': 7.29.7 - '@babel/types': 7.29.7 - '@jridgewell/gen-mapping': 0.3.13 - '@jridgewell/trace-mapping': 0.3.31 - jsesc: 3.1.0 + '@babel/core': 7.29.7(supports-color@10.2.2) + '@babel/helper-create-regexp-features-plugin': 7.29.7(@babel/core@7.29.7(supports-color@10.2.2)) + '@babel/helper-plugin-utils': 7.29.7 - '@babel/helper-compilation-targets@7.29.7': + '@babel/plugin-transform-nullish-coalescing-operator@7.29.7(@babel/core@7.29.7(supports-color@10.2.2))': dependencies: - '@babel/compat-data': 7.29.7 - '@babel/helper-validator-option': 7.29.7 - browserslist: 4.28.7 - lru-cache: 5.1.1 - semver: 6.3.1 - - '@babel/helper-globals@7.29.7': {} + '@babel/core': 7.29.7(supports-color@10.2.2) + '@babel/helper-plugin-utils': 7.29.7 - '@babel/helper-module-imports@7.18.6': + '@babel/plugin-transform-optional-catch-binding@7.29.7(@babel/core@7.29.7(supports-color@10.2.2))': dependencies: - '@babel/types': 7.29.7 + '@babel/core': 7.29.7(supports-color@10.2.2) + '@babel/helper-plugin-utils': 7.29.7 - '@babel/helper-module-imports@7.29.7(supports-color@10.2.2)': + '@babel/plugin-transform-optional-chaining@7.29.7(@babel/core@7.29.7(supports-color@10.2.2))(supports-color@10.2.2)': dependencies: - '@babel/traverse': 7.29.7(supports-color@10.2.2) - '@babel/types': 7.29.7 + '@babel/core': 7.29.7(supports-color@10.2.2) + '@babel/helper-plugin-utils': 7.29.7 + '@babel/helper-skip-transparent-expression-wrappers': 7.29.7(supports-color@10.2.2) transitivePeerDependencies: - supports-color - '@babel/helper-module-transforms@7.29.7(@babel/core@7.29.7(supports-color@10.2.2))(supports-color@10.2.2)': + '@babel/plugin-transform-private-methods@7.29.7(@babel/core@7.29.7(supports-color@10.2.2))(supports-color@10.2.2)': dependencies: '@babel/core': 7.29.7(supports-color@10.2.2) - '@babel/helper-module-imports': 7.29.7(supports-color@10.2.2) - '@babel/helper-validator-identifier': 7.29.7 - '@babel/traverse': 7.29.7(supports-color@10.2.2) + '@babel/helper-create-class-features-plugin': 7.29.7(@babel/core@7.29.7(supports-color@10.2.2))(supports-color@10.2.2) + '@babel/helper-plugin-utils': 7.29.7 transitivePeerDependencies: - supports-color - '@babel/helper-plugin-utils@7.29.7': {} + '@babel/plugin-transform-private-property-in-object@7.29.7(@babel/core@7.29.7(supports-color@10.2.2))(supports-color@10.2.2)': + dependencies: + '@babel/core': 7.29.7(supports-color@10.2.2) + '@babel/helper-annotate-as-pure': 7.29.7 + '@babel/helper-create-class-features-plugin': 7.29.7(@babel/core@7.29.7(supports-color@10.2.2))(supports-color@10.2.2) + '@babel/helper-plugin-utils': 7.29.7 + transitivePeerDependencies: + - supports-color - '@babel/helper-string-parser@7.29.7': {} + '@babel/plugin-transform-react-display-name@7.29.7(@babel/core@7.29.7(supports-color@10.2.2))': + dependencies: + '@babel/core': 7.29.7(supports-color@10.2.2) + '@babel/helper-plugin-utils': 7.29.7 - '@babel/helper-validator-identifier@7.29.7': {} + '@babel/plugin-transform-react-jsx-self@7.29.7(@babel/core@7.29.7(supports-color@10.2.2))': + dependencies: + '@babel/core': 7.29.7(supports-color@10.2.2) + '@babel/helper-plugin-utils': 7.29.7 - '@babel/helper-validator-option@7.29.7': {} + '@babel/plugin-transform-react-jsx-source@7.29.7(@babel/core@7.29.7(supports-color@10.2.2))': + dependencies: + '@babel/core': 7.29.7(supports-color@10.2.2) + '@babel/helper-plugin-utils': 7.29.7 - '@babel/helpers@7.29.7': + '@babel/plugin-transform-react-jsx@7.29.7(@babel/core@7.29.7(supports-color@10.2.2))(supports-color@10.2.2)': dependencies: - '@babel/template': 7.29.7 + '@babel/core': 7.29.7(supports-color@10.2.2) + '@babel/helper-annotate-as-pure': 7.29.7 + '@babel/helper-module-imports': 7.29.7(supports-color@10.2.2) + '@babel/helper-plugin-utils': 7.29.7 + '@babel/plugin-syntax-jsx': 7.29.7(@babel/core@7.29.7(supports-color@10.2.2)) '@babel/types': 7.29.7 + transitivePeerDependencies: + - supports-color - '@babel/parser@7.29.7': + '@babel/plugin-transform-regenerator@7.29.7(@babel/core@7.29.7(supports-color@10.2.2))': dependencies: - '@babel/types': 7.29.7 + '@babel/core': 7.29.7(supports-color@10.2.2) + '@babel/helper-plugin-utils': 7.29.7 - '@babel/plugin-syntax-jsx@7.29.7(@babel/core@7.29.7(supports-color@10.2.2))': + '@babel/plugin-transform-runtime@7.29.7(@babel/core@7.29.7(supports-color@10.2.2))(supports-color@10.2.2)': + dependencies: + '@babel/core': 7.29.7(supports-color@10.2.2) + '@babel/helper-module-imports': 7.29.7(supports-color@10.2.2) + '@babel/helper-plugin-utils': 7.29.7 + babel-plugin-polyfill-corejs2: 0.4.17(@babel/core@7.29.7(supports-color@10.2.2))(supports-color@10.2.2) + babel-plugin-polyfill-corejs3: 0.13.0(@babel/core@7.29.7(supports-color@10.2.2))(supports-color@10.2.2) + babel-plugin-polyfill-regenerator: 0.6.8(@babel/core@7.29.7(supports-color@10.2.2))(supports-color@10.2.2) + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-typescript@7.29.7(@babel/core@7.29.7(supports-color@10.2.2))(supports-color@10.2.2)': + dependencies: + '@babel/core': 7.29.7(supports-color@10.2.2) + '@babel/helper-annotate-as-pure': 7.29.7 + '@babel/helper-create-class-features-plugin': 7.29.7(@babel/core@7.29.7(supports-color@10.2.2))(supports-color@10.2.2) + '@babel/helper-plugin-utils': 7.29.7 + '@babel/helper-skip-transparent-expression-wrappers': 7.29.7(supports-color@10.2.2) + '@babel/plugin-syntax-typescript': 7.29.7(@babel/core@7.29.7(supports-color@10.2.2)) + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-unicode-regex@7.29.7(@babel/core@7.29.7(supports-color@10.2.2))': dependencies: '@babel/core': 7.29.7(supports-color@10.2.2) + '@babel/helper-create-regexp-features-plugin': 7.29.7(@babel/core@7.29.7(supports-color@10.2.2)) '@babel/helper-plugin-utils': 7.29.7 + '@babel/runtime@7.29.7': {} + '@babel/template@7.29.7': dependencies: '@babel/code-frame': 7.29.7 @@ -5646,6 +8788,12 @@ snapshots: optionalDependencies: '@noble/hashes': 2.2.0 + '@hapi/hoek@9.3.0': {} + + '@hapi/topo@5.1.0': + dependencies: + '@hapi/hoek': 9.3.0 + '@img/colour@1.1.0': {} '@img/sharp-darwin-arm64@0.34.5': @@ -5742,6 +8890,21 @@ snapshots: '@img/sharp-win32-x64@0.34.5': optional: true + '@isaacs/ttlcache@1.4.1': {} + + '@jest/schemas@29.6.3': + dependencies: + '@sinclair/typebox': 0.27.12 + + '@jest/types@29.6.3': + dependencies: + '@jest/schemas': 29.6.3 + '@types/istanbul-lib-coverage': 2.0.6 + '@types/istanbul-reports': 3.0.4 + '@types/node': 25.9.5 + '@types/yargs': 17.0.35 + chalk: 4.1.2 + '@jridgewell/gen-mapping@0.3.13': dependencies: '@jridgewell/sourcemap-codec': 1.5.5 @@ -5754,6 +8917,11 @@ snapshots: '@jridgewell/resolve-uri@3.1.2': {} + '@jridgewell/source-map@0.3.11': + dependencies: + '@jridgewell/gen-mapping': 0.3.13 + '@jridgewell/trace-mapping': 0.3.31 + '@jridgewell/sourcemap-codec@1.5.5': {} '@jridgewell/trace-mapping@0.3.31': @@ -5855,84 +9023,367 @@ snapshots: '@noble/hashes@2.2.0': {} + '@nodelib/fs.scandir@2.1.5': + dependencies: + '@nodelib/fs.stat': 2.0.5 + run-parallel: 1.2.0 + + '@nodelib/fs.stat@2.0.5': {} + + '@nodelib/fs.walk@1.2.8': + dependencies: + '@nodelib/fs.scandir': 2.1.5 + fastq: 1.20.1 + '@observablehq/plot@0.6.17': dependencies: d3: 7.9.0 interval-tree-1d: 1.0.4 isoformat: 0.2.1 - '@observablehq/sample-datasets@1.0.1': {} + '@observablehq/sample-datasets@1.0.1': {} + + '@oxc-project/types@0.139.0': {} + + '@parcel/watcher-android-arm64@2.6.0': + optional: true + + '@parcel/watcher-darwin-arm64@2.6.0': + optional: true + + '@parcel/watcher-darwin-x64@2.6.0': + optional: true + + '@parcel/watcher-freebsd-x64@2.6.0': + optional: true + + '@parcel/watcher-linux-arm-glibc@2.6.0': + optional: true + + '@parcel/watcher-linux-arm-musl@2.6.0': + optional: true + + '@parcel/watcher-linux-arm64-glibc@2.6.0': + optional: true + + '@parcel/watcher-linux-arm64-musl@2.6.0': + optional: true + + '@parcel/watcher-linux-x64-glibc@2.6.0': + optional: true + + '@parcel/watcher-linux-x64-musl@2.6.0': + optional: true + + '@parcel/watcher-win32-arm64@2.6.0': + optional: true + + '@parcel/watcher-win32-x64@2.6.0': + optional: true + + '@parcel/watcher@2.6.0': + dependencies: + detect-libc: 2.1.2 + is-glob: 4.0.3 + node-addon-api: 7.1.1 + picomatch: 4.0.5 + optionalDependencies: + '@parcel/watcher-android-arm64': 2.6.0 + '@parcel/watcher-darwin-arm64': 2.6.0 + '@parcel/watcher-darwin-x64': 2.6.0 + '@parcel/watcher-freebsd-x64': 2.6.0 + '@parcel/watcher-linux-arm-glibc': 2.6.0 + '@parcel/watcher-linux-arm-musl': 2.6.0 + '@parcel/watcher-linux-arm64-glibc': 2.6.0 + '@parcel/watcher-linux-arm64-musl': 2.6.0 + '@parcel/watcher-linux-x64-glibc': 2.6.0 + '@parcel/watcher-linux-x64-musl': 2.6.0 + '@parcel/watcher-win32-arm64': 2.6.0 + '@parcel/watcher-win32-x64': 2.6.0 + optional: true + + '@poppinss/colors@4.1.6': + dependencies: + kleur: 4.1.5 + + '@poppinss/dumper@0.6.5': + dependencies: + '@poppinss/colors': 4.1.6 + '@sindresorhus/is': 7.2.0 + supports-color: 10.2.2 + + '@poppinss/exception@1.2.3': {} + + '@react-native-community/cli-clean@20.1.0': + dependencies: + '@react-native-community/cli-tools': 20.1.0 + execa: 5.1.1 + fast-glob: 3.3.3 + picocolors: 1.1.1 + + '@react-native-community/cli-config-android@20.1.0': + dependencies: + '@react-native-community/cli-tools': 20.1.0 + fast-glob: 3.3.3 + fast-xml-parser: 4.5.7 + picocolors: 1.1.1 + + '@react-native-community/cli-config-apple@20.1.0': + dependencies: + '@react-native-community/cli-tools': 20.1.0 + execa: 5.1.1 + fast-glob: 3.3.3 + picocolors: 1.1.1 + + '@react-native-community/cli-config@20.1.0(typescript@6.0.3)': + dependencies: + '@react-native-community/cli-tools': 20.1.0 + cosmiconfig: 9.0.2(typescript@6.0.3) + deepmerge: 4.3.1 + fast-glob: 3.3.3 + joi: 17.13.4 + picocolors: 1.1.1 + transitivePeerDependencies: + - typescript + + '@react-native-community/cli-doctor@20.1.0(typescript@6.0.3)': + dependencies: + '@react-native-community/cli-config': 20.1.0(typescript@6.0.3) + '@react-native-community/cli-platform-android': 20.1.0 + '@react-native-community/cli-platform-apple': 20.1.0 + '@react-native-community/cli-platform-ios': 20.1.0 + '@react-native-community/cli-tools': 20.1.0 + command-exists: 1.2.9 + deepmerge: 4.3.1 + envinfo: 7.21.0 + execa: 5.1.1 + node-stream-zip: 1.16.0 + ora: 5.4.1 + picocolors: 1.1.1 + semver: 7.8.5 + wcwidth: 1.0.1 + yaml: 2.9.0 + transitivePeerDependencies: + - typescript + + '@react-native-community/cli-platform-android@20.1.0': + dependencies: + '@react-native-community/cli-config-android': 20.1.0 + '@react-native-community/cli-tools': 20.1.0 + execa: 5.1.1 + logkitty: 0.7.1 + picocolors: 1.1.1 + + '@react-native-community/cli-platform-apple@20.1.0': + dependencies: + '@react-native-community/cli-config-apple': 20.1.0 + '@react-native-community/cli-tools': 20.1.0 + execa: 5.1.1 + fast-xml-parser: 4.5.7 + picocolors: 1.1.1 + + '@react-native-community/cli-platform-ios@20.1.0': + dependencies: + '@react-native-community/cli-platform-apple': 20.1.0 + + '@react-native-community/cli-server-api@20.1.0(supports-color@10.2.2)': + dependencies: + '@react-native-community/cli-tools': 20.1.0 + body-parser: 1.20.6(supports-color@10.2.2) + compression: 1.8.1(supports-color@10.2.2) + connect: 3.7.0(supports-color@10.2.2) + errorhandler: 1.5.2 + nocache: 3.0.4 + open: 6.4.0 + pretty-format: 29.7.0 + serve-static: 1.16.3(supports-color@10.2.2) + ws: 6.2.6 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + + '@react-native-community/cli-tools@20.1.0': + dependencies: + '@vscode/sudo-prompt': 9.3.2 + appdirsjs: 1.2.8 + execa: 5.1.1 + find-up: 5.0.0 + launch-editor: 2.14.1 + mime: 2.6.0 + ora: 5.4.1 + picocolors: 1.1.1 + prompts: 2.4.2 + semver: 7.8.5 + + '@react-native-community/cli-types@20.1.0': + dependencies: + joi: 17.13.4 + + '@react-native-community/cli@20.1.0(supports-color@10.2.2)(typescript@6.0.3)': + dependencies: + '@react-native-community/cli-clean': 20.1.0 + '@react-native-community/cli-config': 20.1.0(typescript@6.0.3) + '@react-native-community/cli-doctor': 20.1.0(typescript@6.0.3) + '@react-native-community/cli-server-api': 20.1.0(supports-color@10.2.2) + '@react-native-community/cli-tools': 20.1.0 + '@react-native-community/cli-types': 20.1.0 + commander: 9.5.0 + deepmerge: 4.3.1 + execa: 5.1.1 + find-up: 5.0.0 + fs-extra: 8.1.0 + graceful-fs: 4.2.11 + picocolors: 1.1.1 + prompts: 2.4.2 + semver: 7.8.5 + transitivePeerDependencies: + - bufferutil + - supports-color + - typescript + - utf-8-validate + + '@react-native/assets-registry@0.86.0': {} - '@oxc-project/types@0.139.0': {} + '@react-native/babel-plugin-codegen@0.86.0(@babel/core@7.29.7(supports-color@10.2.2))(supports-color@10.2.2)': + dependencies: + '@babel/traverse': 7.29.7(supports-color@10.2.2) + '@react-native/codegen': 0.86.0(@babel/core@7.29.7(supports-color@10.2.2)) + transitivePeerDependencies: + - '@babel/core' + - supports-color - '@parcel/watcher-android-arm64@2.6.0': - optional: true + '@react-native/babel-preset@0.86.0(@babel/core@7.29.7(supports-color@10.2.2))(supports-color@10.2.2)': + dependencies: + '@babel/core': 7.29.7(supports-color@10.2.2) + '@babel/plugin-proposal-export-default-from': 7.29.7(@babel/core@7.29.7(supports-color@10.2.2)) + '@babel/plugin-syntax-dynamic-import': 7.8.3(@babel/core@7.29.7(supports-color@10.2.2)) + '@babel/plugin-syntax-export-default-from': 7.29.7(@babel/core@7.29.7(supports-color@10.2.2)) + '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.29.7(supports-color@10.2.2)) + '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.29.7(supports-color@10.2.2)) + '@babel/plugin-transform-async-generator-functions': 7.29.7(@babel/core@7.29.7(supports-color@10.2.2))(supports-color@10.2.2) + '@babel/plugin-transform-async-to-generator': 7.29.7(@babel/core@7.29.7(supports-color@10.2.2))(supports-color@10.2.2) + '@babel/plugin-transform-block-scoping': 7.29.7(@babel/core@7.29.7(supports-color@10.2.2)) + '@babel/plugin-transform-class-properties': 7.29.7(@babel/core@7.29.7(supports-color@10.2.2))(supports-color@10.2.2) + '@babel/plugin-transform-classes': 7.29.7(@babel/core@7.29.7(supports-color@10.2.2))(supports-color@10.2.2) + '@babel/plugin-transform-destructuring': 7.29.7(@babel/core@7.29.7(supports-color@10.2.2))(supports-color@10.2.2) + '@babel/plugin-transform-flow-strip-types': 7.29.7(@babel/core@7.29.7(supports-color@10.2.2)) + '@babel/plugin-transform-for-of': 7.29.7(@babel/core@7.29.7(supports-color@10.2.2))(supports-color@10.2.2) + '@babel/plugin-transform-modules-commonjs': 7.29.7(@babel/core@7.29.7(supports-color@10.2.2))(supports-color@10.2.2) + '@babel/plugin-transform-named-capturing-groups-regex': 7.29.7(@babel/core@7.29.7(supports-color@10.2.2)) + '@babel/plugin-transform-nullish-coalescing-operator': 7.29.7(@babel/core@7.29.7(supports-color@10.2.2)) + '@babel/plugin-transform-optional-catch-binding': 7.29.7(@babel/core@7.29.7(supports-color@10.2.2)) + '@babel/plugin-transform-optional-chaining': 7.29.7(@babel/core@7.29.7(supports-color@10.2.2))(supports-color@10.2.2) + '@babel/plugin-transform-private-methods': 7.29.7(@babel/core@7.29.7(supports-color@10.2.2))(supports-color@10.2.2) + '@babel/plugin-transform-private-property-in-object': 7.29.7(@babel/core@7.29.7(supports-color@10.2.2))(supports-color@10.2.2) + '@babel/plugin-transform-react-display-name': 7.29.7(@babel/core@7.29.7(supports-color@10.2.2)) + '@babel/plugin-transform-react-jsx': 7.29.7(@babel/core@7.29.7(supports-color@10.2.2))(supports-color@10.2.2) + '@babel/plugin-transform-react-jsx-self': 7.29.7(@babel/core@7.29.7(supports-color@10.2.2)) + '@babel/plugin-transform-react-jsx-source': 7.29.7(@babel/core@7.29.7(supports-color@10.2.2)) + '@babel/plugin-transform-regenerator': 7.29.7(@babel/core@7.29.7(supports-color@10.2.2)) + '@babel/plugin-transform-runtime': 7.29.7(@babel/core@7.29.7(supports-color@10.2.2))(supports-color@10.2.2) + '@babel/plugin-transform-typescript': 7.29.7(@babel/core@7.29.7(supports-color@10.2.2))(supports-color@10.2.2) + '@babel/plugin-transform-unicode-regex': 7.29.7(@babel/core@7.29.7(supports-color@10.2.2)) + '@react-native/babel-plugin-codegen': 0.86.0(@babel/core@7.29.7(supports-color@10.2.2))(supports-color@10.2.2) + babel-plugin-syntax-hermes-parser: 0.36.0 + babel-plugin-transform-flow-enums: 0.0.2(@babel/core@7.29.7(supports-color@10.2.2)) + react-refresh: 0.14.2 + transitivePeerDependencies: + - supports-color - '@parcel/watcher-darwin-arm64@2.6.0': - optional: true + '@react-native/codegen@0.86.0(@babel/core@7.29.7(supports-color@10.2.2))': + dependencies: + '@babel/core': 7.29.7(supports-color@10.2.2) + '@babel/parser': 7.29.7 + hermes-parser: 0.36.0 + invariant: 2.2.4 + nullthrows: 1.1.1 + tinyglobby: 0.2.17 + yargs: 17.7.3 - '@parcel/watcher-darwin-x64@2.6.0': - optional: true + '@react-native/community-cli-plugin@0.86.0(@react-native-community/cli@20.1.0(supports-color@10.2.2)(typescript@6.0.3))(@react-native/metro-config@0.86.0(@babel/core@7.29.7(supports-color@10.2.2))(supports-color@10.2.2))(supports-color@10.2.2)': + dependencies: + '@react-native/dev-middleware': 0.86.0(supports-color@10.2.2) + debug: 4.4.3(supports-color@10.2.2) + invariant: 2.2.4 + metro: 0.84.4(supports-color@10.2.2) + metro-config: 0.84.4(supports-color@10.2.2) + metro-core: 0.84.4 + semver: 7.8.5 + optionalDependencies: + '@react-native-community/cli': 20.1.0(supports-color@10.2.2)(typescript@6.0.3) + '@react-native/metro-config': 0.86.0(@babel/core@7.29.7(supports-color@10.2.2))(supports-color@10.2.2) + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate - '@parcel/watcher-freebsd-x64@2.6.0': - optional: true + '@react-native/debugger-frontend@0.86.0': {} - '@parcel/watcher-linux-arm-glibc@2.6.0': - optional: true + '@react-native/debugger-shell@0.86.0(supports-color@10.2.2)': + dependencies: + cross-spawn: 7.0.6 + debug: 4.4.3(supports-color@10.2.2) + fb-dotslash: 0.5.8 + transitivePeerDependencies: + - supports-color - '@parcel/watcher-linux-arm-musl@2.6.0': - optional: true + '@react-native/dev-middleware@0.86.0(supports-color@10.2.2)': + dependencies: + '@isaacs/ttlcache': 1.4.1 + '@react-native/debugger-frontend': 0.86.0 + '@react-native/debugger-shell': 0.86.0(supports-color@10.2.2) + chrome-launcher: 0.15.2(supports-color@10.2.2) + chromium-edge-launcher: 0.3.0(supports-color@10.2.2) + connect: 3.7.0(supports-color@10.2.2) + debug: 4.4.3(supports-color@10.2.2) + invariant: 2.2.4 + nullthrows: 1.1.1 + open: 7.4.2 + serve-static: 1.16.3(supports-color@10.2.2) + ws: 7.5.13 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate - '@parcel/watcher-linux-arm64-glibc@2.6.0': - optional: true + '@react-native/gradle-plugin@0.86.0': {} - '@parcel/watcher-linux-arm64-musl@2.6.0': - optional: true + '@react-native/js-polyfills@0.86.0': {} - '@parcel/watcher-linux-x64-glibc@2.6.0': - optional: true + '@react-native/metro-babel-transformer@0.86.0(@babel/core@7.29.7(supports-color@10.2.2))(supports-color@10.2.2)': + dependencies: + '@babel/core': 7.29.7(supports-color@10.2.2) + '@react-native/babel-preset': 0.86.0(@babel/core@7.29.7(supports-color@10.2.2))(supports-color@10.2.2) + hermes-parser: 0.36.0 + nullthrows: 1.1.1 + transitivePeerDependencies: + - supports-color - '@parcel/watcher-linux-x64-musl@2.6.0': - optional: true + '@react-native/metro-config@0.86.0(@babel/core@7.29.7(supports-color@10.2.2))(supports-color@10.2.2)': + dependencies: + '@react-native/js-polyfills': 0.86.0 + '@react-native/metro-babel-transformer': 0.86.0(@babel/core@7.29.7(supports-color@10.2.2))(supports-color@10.2.2) + metro-config: 0.84.4(supports-color@10.2.2) + metro-runtime: 0.84.4 + transitivePeerDependencies: + - '@babel/core' + - bufferutil + - supports-color + - utf-8-validate - '@parcel/watcher-win32-arm64@2.6.0': - optional: true + '@react-native/normalize-colors@0.86.0': {} - '@parcel/watcher-win32-x64@2.6.0': - optional: true + '@react-native/typescript-config@0.86.0': {} - '@parcel/watcher@2.6.0': + '@react-native/virtualized-lists@0.86.0(@types/react@19.2.17)(react-native@0.86.0(@babel/core@7.29.7(supports-color@10.2.2))(@react-native-community/cli@20.1.0(supports-color@10.2.2)(typescript@6.0.3))(@react-native/metro-config@0.86.0(@babel/core@7.29.7(supports-color@10.2.2))(supports-color@10.2.2))(@types/react@19.2.17)(react@19.2.3)(supports-color@10.2.2))(react@19.2.3)': dependencies: - detect-libc: 2.1.2 - is-glob: 4.0.3 - node-addon-api: 7.1.1 - picomatch: 4.0.5 + invariant: 2.2.4 + nullthrows: 1.1.1 + react: 19.2.3 + react-native: 0.86.0(@babel/core@7.29.7(supports-color@10.2.2))(@react-native-community/cli@20.1.0(supports-color@10.2.2)(typescript@6.0.3))(@react-native/metro-config@0.86.0(@babel/core@7.29.7(supports-color@10.2.2))(supports-color@10.2.2))(@types/react@19.2.17)(react@19.2.3)(supports-color@10.2.2) optionalDependencies: - '@parcel/watcher-android-arm64': 2.6.0 - '@parcel/watcher-darwin-arm64': 2.6.0 - '@parcel/watcher-darwin-x64': 2.6.0 - '@parcel/watcher-freebsd-x64': 2.6.0 - '@parcel/watcher-linux-arm-glibc': 2.6.0 - '@parcel/watcher-linux-arm-musl': 2.6.0 - '@parcel/watcher-linux-arm64-glibc': 2.6.0 - '@parcel/watcher-linux-arm64-musl': 2.6.0 - '@parcel/watcher-linux-x64-glibc': 2.6.0 - '@parcel/watcher-linux-x64-musl': 2.6.0 - '@parcel/watcher-win32-arm64': 2.6.0 - '@parcel/watcher-win32-x64': 2.6.0 - optional: true - - '@poppinss/colors@4.1.6': - dependencies: - kleur: 4.1.5 - - '@poppinss/dumper@0.6.5': - dependencies: - '@poppinss/colors': 4.1.6 - '@sindresorhus/is': 7.2.0 - supports-color: 10.2.2 - - '@poppinss/exception@1.2.3': {} + '@types/react': 19.2.17 '@reduxjs/toolkit@2.12.0(react-redux@9.3.0(@types/react@19.2.17)(react@19.2.3)(redux@5.0.1))(react@19.2.3)': dependencies: @@ -6092,6 +9543,16 @@ snapshots: optionalDependencies: fsevents: 2.3.3 + '@sideway/address@4.1.5': + dependencies: + '@hapi/hoek': 9.3.0 + + '@sideway/formula@3.0.1': {} + + '@sideway/pinpoint@2.0.0': {} + + '@sinclair/typebox@0.27.12': {} + '@sindresorhus/is@7.2.0': {} '@speed-highlight/core@1.2.17': {} @@ -6117,23 +9578,23 @@ snapshots: transitivePeerDependencies: - typescript - '@sveltejs/vite-plugin-svelte@7.2.0(svelte@5.56.8)(vite@8.1.5(@types/node@25.9.5)(esbuild@0.27.7)(less@4.8.1(supports-color@10.2.2))(sass@1.102.0))': + '@sveltejs/vite-plugin-svelte@7.2.0(svelte@5.56.8)(vite@8.1.5(@types/node@25.9.5)(esbuild@0.27.7)(less@4.8.1(supports-color@10.2.2))(sass@1.102.0)(terser@5.49.0)(yaml@2.9.0))': dependencies: deepmerge: 4.3.1 magic-string: 0.30.21 obug: 2.1.4 svelte: 5.56.8 - vite: 8.1.5(@types/node@25.9.5)(esbuild@0.27.7)(less@4.8.1(supports-color@10.2.2))(sass@1.102.0) - vitefu: 1.1.3(vite@8.1.5(@types/node@25.9.5)(esbuild@0.27.7)(less@4.8.1(supports-color@10.2.2))(sass@1.102.0)) + vite: 8.1.5(@types/node@25.9.5)(esbuild@0.27.7)(less@4.8.1(supports-color@10.2.2))(sass@1.102.0)(terser@5.49.0)(yaml@2.9.0) + vitefu: 1.1.3(vite@8.1.5(@types/node@25.9.5)(esbuild@0.27.7)(less@4.8.1(supports-color@10.2.2))(sass@1.102.0)(terser@5.49.0)(yaml@2.9.0)) - '@sveltejs/vite-plugin-svelte@7.2.0(svelte@5.56.8)(vite@8.1.5(@types/node@25.9.5)(esbuild@0.28.1)(less@4.8.1(supports-color@10.2.2))(sass@1.102.0))': + '@sveltejs/vite-plugin-svelte@7.2.0(svelte@5.56.8)(vite@8.1.5(@types/node@25.9.5)(esbuild@0.28.1)(less@4.8.1(supports-color@10.2.2))(sass@1.102.0)(terser@5.49.0)(yaml@2.9.0))': dependencies: deepmerge: 4.3.1 magic-string: 0.30.21 obug: 2.1.4 svelte: 5.56.8 - vite: 8.1.5(@types/node@25.9.5)(esbuild@0.28.1)(less@4.8.1(supports-color@10.2.2))(sass@1.102.0) - vitefu: 1.1.3(vite@8.1.5(@types/node@25.9.5)(esbuild@0.28.1)(less@4.8.1(supports-color@10.2.2))(sass@1.102.0)) + vite: 8.1.5(@types/node@25.9.5)(esbuild@0.28.1)(less@4.8.1(supports-color@10.2.2))(sass@1.102.0)(terser@5.49.0)(yaml@2.9.0) + vitefu: 1.1.3(vite@8.1.5(@types/node@25.9.5)(esbuild@0.28.1)(less@4.8.1(supports-color@10.2.2))(sass@1.102.0)(terser@5.49.0)(yaml@2.9.0)) '@tsrx/core@0.1.48': dependencies: @@ -6249,6 +9710,16 @@ snapshots: '@types/geojson@7946.0.16': {} + '@types/istanbul-lib-coverage@2.0.6': {} + + '@types/istanbul-lib-report@3.0.3': + dependencies: + '@types/istanbul-lib-coverage': 2.0.6 + + '@types/istanbul-reports@3.0.4': + dependencies: + '@types/istanbul-lib-report': 3.0.3 + '@types/jsdom@27.0.0': dependencies: '@types/node': 25.9.5 @@ -6282,10 +9753,16 @@ snapshots: '@types/use-sync-external-store@0.0.6': {} - '@vitejs/plugin-react@6.0.4(vite@8.1.5(@types/node@25.9.5)(esbuild@0.27.7)(less@4.8.1(supports-color@10.2.2))(sass@1.102.0))': + '@types/yargs-parser@21.0.3': {} + + '@types/yargs@17.0.35': + dependencies: + '@types/yargs-parser': 21.0.3 + + '@vitejs/plugin-react@6.0.4(vite@8.1.5(@types/node@25.9.5)(esbuild@0.27.7)(less@4.8.1(supports-color@10.2.2))(sass@1.102.0)(terser@5.49.0)(yaml@2.9.0))': dependencies: '@rolldown/pluginutils': 1.0.1 - vite: 8.1.5(@types/node@25.9.5)(esbuild@0.27.7)(less@4.8.1(supports-color@10.2.2))(sass@1.102.0) + vite: 8.1.5(@types/node@25.9.5)(esbuild@0.27.7)(less@4.8.1(supports-color@10.2.2))(sass@1.102.0)(terser@5.49.0)(yaml@2.9.0) '@vitest/expect@4.1.10': dependencies: @@ -6296,13 +9773,13 @@ snapshots: chai: 6.2.2 tinyrainbow: 3.1.0 - '@vitest/mocker@4.1.10(vite@8.1.5(@types/node@25.9.5)(esbuild@0.27.7)(less@4.8.1(supports-color@10.2.2))(sass@1.102.0))': + '@vitest/mocker@4.1.10(vite@8.1.5(@types/node@25.9.5)(esbuild@0.27.7)(less@4.8.1(supports-color@10.2.2))(sass@1.102.0)(terser@5.49.0)(yaml@2.9.0))': dependencies: '@vitest/spy': 4.1.10 estree-walker: 3.0.3 magic-string: 0.30.21 optionalDependencies: - vite: 8.1.5(@types/node@25.9.5)(esbuild@0.27.7)(less@4.8.1(supports-color@10.2.2))(sass@1.102.0) + vite: 8.1.5(@types/node@25.9.5)(esbuild@0.27.7)(less@4.8.1(supports-color@10.2.2))(sass@1.102.0)(terser@5.49.0)(yaml@2.9.0) '@vitest/pretty-format@4.1.10': dependencies: @@ -6328,6 +9805,8 @@ snapshots: convert-source-map: 2.0.0 tinyrainbow: 3.1.0 + '@vscode/sudo-prompt@9.3.2': {} + '@vue/compiler-core@3.5.40': dependencies: '@babel/parser': 7.29.7 @@ -6388,8 +9867,24 @@ snapshots: '@vue/shared@3.5.40': {} + abort-controller@3.0.0: + dependencies: + event-target-shim: 5.0.1 + + accepts@1.3.8: + dependencies: + mime-types: 2.1.35 + negotiator: 0.6.3 + + accepts@2.0.0: + dependencies: + mime-types: 3.0.2 + negotiator: 1.0.0 + acorn@8.17.0: {} + agent-base@7.1.4: {} + ajv@8.20.0: dependencies: fast-deep-equal: 3.1.3 @@ -6401,14 +9896,46 @@ snapshots: dependencies: '@vue/reactivity': 3.1.5 + anser@1.4.10: {} + + ansi-fragments@0.2.1: + dependencies: + colorette: 1.4.0 + slice-ansi: 2.1.0 + strip-ansi: 5.2.0 + + ansi-regex@4.1.1: {} + + ansi-regex@5.0.1: {} + ansi-regex@6.2.2: {} + ansi-styles@3.2.1: + dependencies: + color-convert: 1.9.3 + + ansi-styles@4.3.0: + dependencies: + color-convert: 2.0.1 + + ansi-styles@5.2.0: {} + ansi-styles@6.2.3: {} + appdirsjs@1.2.8: {} + + argparse@2.0.1: {} + aria-query@5.3.1: {} + asap@2.0.6: {} + assertion-error@2.0.1: {} + astral-regex@1.0.0: {} + + async-limiter@1.0.1: {} + axobject-query@4.1.0: {} babel-plugin-jsx-dom-expressions@0.40.7(@babel/core@7.29.7(supports-color@10.2.2)): @@ -6420,6 +9947,40 @@ snapshots: html-entities: 2.3.3 parse5: 7.3.0 + babel-plugin-polyfill-corejs2@0.4.17(@babel/core@7.29.7(supports-color@10.2.2))(supports-color@10.2.2): + dependencies: + '@babel/compat-data': 7.29.7 + '@babel/core': 7.29.7(supports-color@10.2.2) + '@babel/helper-define-polyfill-provider': 0.6.8(@babel/core@7.29.7(supports-color@10.2.2))(supports-color@10.2.2) + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + + babel-plugin-polyfill-corejs3@0.13.0(@babel/core@7.29.7(supports-color@10.2.2))(supports-color@10.2.2): + dependencies: + '@babel/core': 7.29.7(supports-color@10.2.2) + '@babel/helper-define-polyfill-provider': 0.6.8(@babel/core@7.29.7(supports-color@10.2.2))(supports-color@10.2.2) + core-js-compat: 3.49.0 + transitivePeerDependencies: + - supports-color + + babel-plugin-polyfill-regenerator@0.6.8(@babel/core@7.29.7(supports-color@10.2.2))(supports-color@10.2.2): + dependencies: + '@babel/core': 7.29.7(supports-color@10.2.2) + '@babel/helper-define-polyfill-provider': 0.6.8(@babel/core@7.29.7(supports-color@10.2.2))(supports-color@10.2.2) + transitivePeerDependencies: + - supports-color + + babel-plugin-syntax-hermes-parser@0.36.0: + dependencies: + hermes-parser: 0.36.0 + + babel-plugin-transform-flow-enums@0.0.2(@babel/core@7.29.7(supports-color@10.2.2)): + dependencies: + '@babel/plugin-syntax-flow': 7.29.7(@babel/core@7.29.7(supports-color@10.2.2)) + transitivePeerDependencies: + - '@babel/core' + babel-preset-solid@1.9.12(@babel/core@7.29.7(supports-color@10.2.2))(solid-js@1.9.14): dependencies: '@babel/core': 7.29.7(supports-color@10.2.2) @@ -6427,6 +9988,8 @@ snapshots: optionalDependencies: solid-js: 1.9.14 + base64-js@1.5.1: {} + baseline-browser-mapping@2.11.5: {} bidi-js@1.0.3: @@ -6435,8 +9998,37 @@ snapshots: binary-search-bounds@2.0.5: {} + bl@4.1.0: + dependencies: + buffer: 5.7.1 + inherits: 2.0.4 + readable-stream: 3.6.2 + blake3-wasm@2.1.5: {} + body-parser@1.20.6(supports-color@10.2.2): + dependencies: + bytes: 3.1.2 + content-type: 1.0.5 + debug: 2.6.9(supports-color@10.2.2) + depd: 2.0.0 + destroy: 1.2.0 + http-errors: 2.0.1 + iconv-lite: 0.4.24 + on-finished: 2.4.1 + qs: 6.15.3 + raw-body: 2.5.3 + type-is: 1.6.18 + unpipe: 1.0.0 + transitivePeerDependencies: + - supports-color + + boolbase@1.0.0: {} + + braces@3.0.3: + dependencies: + fill-range: 7.1.1 + browserslist@4.28.7: dependencies: baseline-browser-mapping: 2.11.5 @@ -6445,10 +10037,44 @@ snapshots: node-releases: 2.0.51 update-browserslist-db: 1.2.3(browserslist@4.28.7) + bser@2.1.1: + dependencies: + node-int64: 0.4.0 + + buffer-from@1.1.2: {} + + buffer@5.7.1: + dependencies: + base64-js: 1.5.1 + ieee754: 1.2.1 + + bytes@3.1.2: {} + + call-bind-apply-helpers@1.0.2: + dependencies: + es-errors: 1.3.0 + function-bind: 1.1.2 + + call-bound@1.0.4: + dependencies: + call-bind-apply-helpers: 1.0.2 + get-intrinsic: 1.3.0 + + callsites@3.1.0: {} + + camelcase@5.3.1: {} + + camelcase@6.3.0: {} + caniuse-lite@1.0.30001806: {} chai@6.2.2: {} + chalk@4.1.2: + dependencies: + ansi-styles: 4.3.0 + supports-color: 7.2.0 + chalk@5.6.2: {} chart.js@4.5.1: @@ -6463,28 +10089,118 @@ snapshots: dependencies: readdirp: 5.0.0 + chrome-launcher@0.15.2(supports-color@10.2.2): + dependencies: + '@types/node': 25.9.5 + escape-string-regexp: 4.0.0 + is-wsl: 2.2.0 + lighthouse-logger: 1.4.2(supports-color@10.2.2) + transitivePeerDependencies: + - supports-color + + chromium-edge-launcher@0.3.0(supports-color@10.2.2): + dependencies: + '@types/node': 25.9.5 + escape-string-regexp: 4.0.0 + is-wsl: 2.2.0 + lighthouse-logger: 1.4.2(supports-color@10.2.2) + mkdirp: 1.0.4 + transitivePeerDependencies: + - supports-color + + ci-info@2.0.0: {} + + ci-info@3.9.0: {} + + cli-cursor@3.1.0: + dependencies: + restore-cursor: 3.1.0 + cli-cursor@5.0.0: dependencies: restore-cursor: 5.1.0 + cli-spinners@2.9.2: {} + cli-spinners@3.4.0: {} + cliui@6.0.0: + dependencies: + string-width: 4.2.3 + strip-ansi: 6.0.1 + wrap-ansi: 6.2.0 + + cliui@8.0.1: + dependencies: + string-width: 4.2.3 + strip-ansi: 6.0.1 + wrap-ansi: 7.0.0 + cliui@9.0.1: dependencies: string-width: 7.2.0 strip-ansi: 7.2.0 wrap-ansi: 9.0.2 + clone@1.0.4: {} + clsx@2.1.1: {} + color-convert@1.9.3: + dependencies: + color-name: 1.1.3 + + color-convert@2.0.1: + dependencies: + color-name: 1.1.4 + + color-name@1.1.3: {} + + color-name@1.1.4: {} + + colorette@1.4.0: {} + + command-exists@1.2.9: {} + + commander@12.1.0: {} + commander@14.0.3: {} commander@2.20.3: {} commander@7.2.0: {} + commander@9.5.0: {} + common-path-prefix@3.0.0: {} + compressible@2.0.18: + dependencies: + mime-db: 1.54.0 + + compression@1.8.1(supports-color@10.2.2): + dependencies: + bytes: 3.1.2 + compressible: 2.0.18 + debug: 2.6.9(supports-color@10.2.2) + negotiator: 0.6.4 + on-headers: 1.1.0 + safe-buffer: 5.2.1 + vary: 1.1.2 + transitivePeerDependencies: + - supports-color + + connect@3.7.0(supports-color@10.2.2): + dependencies: + debug: 2.6.9(supports-color@10.2.2) + finalhandler: 1.1.2(supports-color@10.2.2) + parseurl: 1.3.3 + utils-merge: 1.0.1 + transitivePeerDependencies: + - supports-color + + content-type@1.0.5: {} + convert-source-map@1.9.0: {} convert-source-map@2.0.0: {} @@ -6495,11 +10211,45 @@ snapshots: dependencies: is-what: 4.1.16 + core-js-compat@3.49.0: + dependencies: + browserslist: 4.28.7 + + cosmiconfig@9.0.2(typescript@6.0.3): + dependencies: + env-paths: 2.2.1 + import-fresh: 3.3.1 + js-yaml: 4.3.0 + parse-json: 5.2.0 + optionalDependencies: + typescript: 6.0.3 + + cross-spawn@7.0.6: + dependencies: + path-key: 3.1.1 + shebang-command: 2.0.0 + which: 2.0.2 + + css-select@5.2.2: + dependencies: + boolbase: 1.0.0 + css-what: 6.2.2 + domhandler: 5.0.3 + domutils: 3.2.2 + nth-check: 2.1.1 + + css-tree@1.1.3: + dependencies: + mdn-data: 2.0.14 + source-map: 0.6.1 + css-tree@3.2.1: dependencies: mdn-data: 2.27.1 source-map-js: 1.2.1 + css-what@6.2.2: {} + csstype@3.2.3: {} d3-array@3.2.4: @@ -6663,12 +10413,13 @@ snapshots: transitivePeerDependencies: - '@noble/hashes' + dayjs@1.11.21: {} + debug@2.6.9(supports-color@10.2.2): dependencies: ms: 2.0.0 optionalDependencies: supports-color: 10.2.2 - optional: true debug@3.2.7(supports-color@10.2.2): dependencies: @@ -6683,6 +10434,8 @@ snapshots: optionalDependencies: supports-color: 10.2.2 + decamelize@1.2.0: {} + decimal.js-light@2.5.1: {} decimal.js@10.6.0: {} @@ -6691,40 +10444,107 @@ snapshots: deepmerge@4.3.1: {} + defaults@1.0.4: + dependencies: + clone: 1.0.4 + delaunator@5.1.0: dependencies: robust-predicates: 3.0.3 + depd@2.0.0: {} + dependency-graph@1.0.0: {} - detect-libc@2.1.2: {} + destroy@1.2.0: {} + + detect-libc@2.1.2: {} + + devalue@5.8.2: {} + + dom-serializer@2.0.0: + dependencies: + domelementtype: 2.3.0 + domhandler: 5.0.3 + entities: 4.5.0 + + domelementtype@2.3.0: {} + + domhandler@5.0.3: + dependencies: + domelementtype: 2.3.0 + + domutils@3.2.2: + dependencies: + dom-serializer: 2.0.0 + domelementtype: 2.3.0 + domhandler: 5.0.3 - devalue@5.8.2: {} + dunder-proto@1.0.1: + dependencies: + call-bind-apply-helpers: 1.0.2 + es-errors: 1.3.0 + gopd: 1.2.0 echarts@6.1.0: dependencies: tslib: 2.3.0 zrender: 6.1.0 + ee-first@1.1.1: {} + electron-to-chromium@1.5.397: {} emoji-regex@10.6.0: {} + emoji-regex@8.0.0: {} + + encodeurl@1.0.2: {} + + encodeurl@2.0.0: {} + + entities@4.5.0: {} + entities@6.0.1: {} entities@7.0.1: {} entities@8.0.0: {} + env-paths@2.2.1: {} + + envinfo@7.21.0: {} + errno@0.1.8: dependencies: prr: 1.0.1 optional: true + error-ex@1.3.4: + dependencies: + is-arrayish: 0.2.1 + error-stack-parser-es@1.0.5: {} + error-stack-parser@2.1.4: + dependencies: + stackframe: 1.3.4 + + errorhandler@1.5.2: + dependencies: + accepts: 1.3.8 + escape-html: 1.0.3 + + es-define-property@1.0.1: {} + + es-errors@1.3.0: {} + es-module-lexer@2.3.1: {} + es-object-atoms@1.1.2: + dependencies: + es-errors: 1.3.0 + es-toolkit@1.50.0: {} esbuild@0.27.7: @@ -6787,6 +10607,10 @@ snapshots: escalade@3.2.0: {} + escape-html@1.0.3: {} + + escape-string-regexp@4.0.0: {} + esm-env@1.2.2: {} esrap@2.3.0: @@ -6799,18 +10623,74 @@ snapshots: dependencies: '@types/estree': 1.0.9 + etag@1.8.1: {} + + event-target-shim@5.0.1: {} + eventemitter3@5.0.4: {} + execa@5.1.1: + dependencies: + cross-spawn: 7.0.6 + get-stream: 6.0.1 + human-signals: 2.1.0 + is-stream: 2.0.1 + merge-stream: 2.0.0 + npm-run-path: 4.0.1 + onetime: 5.1.2 + signal-exit: 3.0.7 + strip-final-newline: 2.0.0 + expect-type@1.4.0: {} + exponential-backoff@3.1.3: {} + fast-deep-equal@3.1.3: {} + fast-glob@3.3.3: + dependencies: + '@nodelib/fs.stat': 2.0.5 + '@nodelib/fs.walk': 1.2.8 + glob-parent: 5.1.2 + merge2: 1.4.1 + micromatch: 4.0.8 + fast-uri@3.1.4: {} + fast-xml-parser@4.5.7: + dependencies: + strnum: 1.1.2 + + fastq@1.20.1: + dependencies: + reusify: 1.1.0 + + fb-dotslash@0.5.8: {} + + fb-watchman@2.0.2: + dependencies: + bser: 2.1.1 + fdir@6.5.0(picomatch@4.0.5): optionalDependencies: picomatch: 4.0.5 + fill-range@7.1.1: + dependencies: + to-regex-range: 5.0.1 + + finalhandler@1.1.2(supports-color@10.2.2): + dependencies: + debug: 2.6.9(supports-color@10.2.2) + encodeurl: 1.0.2 + escape-html: 1.0.3 + on-finished: 2.3.0 + parseurl: 1.3.3 + statuses: 1.5.0 + unpipe: 1.0.0 + transitivePeerDependencies: + - supports-color + find-cache-directory@6.0.0: dependencies: common-path-prefix: 3.0.0 @@ -6818,20 +10698,89 @@ snapshots: find-up-simple@1.0.1: {} + find-up@4.1.0: + dependencies: + locate-path: 5.0.0 + path-exists: 4.0.0 + + find-up@5.0.0: + dependencies: + locate-path: 6.0.0 + path-exists: 4.0.0 + + flow-enums-runtime@0.0.6: {} + + fresh@0.5.2: {} + + fs-extra@8.1.0: + dependencies: + graceful-fs: 4.2.11 + jsonfile: 4.0.0 + universalify: 0.1.2 + fsevents@2.3.2: optional: true fsevents@2.3.3: optional: true + function-bind@1.1.2: {} + gensync@1.0.0-beta.2: {} get-caller-file@2.0.5: {} get-east-asian-width@1.6.0: {} - graceful-fs@4.2.11: - optional: true + get-intrinsic@1.3.0: + dependencies: + call-bind-apply-helpers: 1.0.2 + es-define-property: 1.0.1 + es-errors: 1.3.0 + es-object-atoms: 1.1.2 + function-bind: 1.1.2 + get-proto: 1.0.1 + gopd: 1.2.0 + has-symbols: 1.1.0 + hasown: 2.0.4 + math-intrinsics: 1.1.0 + + get-proto@1.0.1: + dependencies: + dunder-proto: 1.0.1 + es-object-atoms: 1.1.2 + + get-stream@6.0.1: {} + + glob-parent@5.1.2: + dependencies: + is-glob: 4.0.3 + + gopd@1.2.0: {} + + graceful-fs@4.2.11: {} + + has-flag@4.0.0: {} + + has-symbols@1.1.0: {} + + hasown@2.0.4: + dependencies: + function-bind: 1.1.2 + + hermes-compiler@250829098.0.14: {} + + hermes-estree@0.35.0: {} + + hermes-estree@0.36.0: {} + + hermes-parser@0.35.0: + dependencies: + hermes-estree: 0.35.0 + + hermes-parser@0.36.0: + dependencies: + hermes-estree: 0.36.0 html-encoding-sniffer@6.0.0(@noble/hashes@2.2.0): dependencies: @@ -6841,19 +10790,48 @@ snapshots: html-entities@2.3.3: {} + http-errors@2.0.1: + dependencies: + depd: 2.0.0 + inherits: 2.0.4 + setprototypeof: 1.2.0 + statuses: 2.0.2 + toidentifier: 1.0.1 + + https-proxy-agent@7.0.6(supports-color@10.2.2): + dependencies: + agent-base: 7.1.4 + debug: 4.4.3(supports-color@10.2.2) + transitivePeerDependencies: + - supports-color + + human-signals@2.1.0: {} + iconv-lite@0.4.24: dependencies: safer-buffer: 2.1.2 - optional: true iconv-lite@0.6.3: dependencies: safer-buffer: 2.1.2 + ieee754@1.2.1: {} + + image-size@1.2.1: + dependencies: + queue: 6.0.2 + immer@11.1.15: {} immutable@5.1.9: {} + import-fresh@3.3.1: + dependencies: + parent-module: 1.0.1 + resolve-from: 4.0.0 + + inherits@2.0.4: {} + injection-js@2.6.1: dependencies: tslib: 2.8.1 @@ -6864,30 +10842,101 @@ snapshots: dependencies: binary-search-bounds: 2.0.5 - is-extglob@2.1.1: - optional: true + invariant@2.2.4: + dependencies: + loose-envify: 1.4.0 + + is-arrayish@0.2.1: {} + + is-core-module@2.16.2: + dependencies: + hasown: 2.0.4 + + is-docker@2.2.1: {} + + is-extglob@2.1.1: {} + + is-fullwidth-code-point@2.0.0: {} + + is-fullwidth-code-point@3.0.0: {} is-glob@4.0.3: dependencies: is-extglob: 2.1.1 - optional: true + + is-interactive@1.0.0: {} is-interactive@2.0.0: {} + is-number@7.0.0: {} + is-potential-custom-element-name@1.0.1: {} is-reference@3.0.3: dependencies: '@types/estree': 1.0.9 + is-stream@2.0.1: {} + + is-unicode-supported@0.1.0: {} + is-unicode-supported@2.1.0: {} is-what@4.1.16: {} + is-wsl@1.1.0: {} + + is-wsl@2.2.0: + dependencies: + is-docker: 2.2.1 + + isexe@2.0.0: {} + isoformat@0.2.1: {} + jest-get-type@29.6.3: {} + + jest-util@29.7.0: + dependencies: + '@jest/types': 29.6.3 + '@types/node': 25.9.5 + chalk: 4.1.2 + ci-info: 3.9.0 + graceful-fs: 4.2.11 + picomatch: 2.3.2 + + jest-validate@29.7.0: + dependencies: + '@jest/types': 29.6.3 + camelcase: 6.3.0 + chalk: 4.1.2 + jest-get-type: 29.6.3 + leven: 3.1.0 + pretty-format: 29.7.0 + + jest-worker@29.7.0: + dependencies: + '@types/node': 25.9.5 + jest-util: 29.7.0 + merge-stream: 2.0.0 + supports-color: 8.1.1 + + joi@17.13.4: + dependencies: + '@hapi/hoek': 9.3.0 + '@hapi/topo': 5.1.0 + '@sideway/address': 4.1.5 + '@sideway/formula': 3.0.1 + '@sideway/pinpoint': 2.0.0 + js-tokens@4.0.0: {} + js-yaml@4.3.0: + dependencies: + argparse: 2.0.1 + + jsc-safe-url@0.2.4: {} + jsdom@29.1.1(@noble/hashes@2.2.0): dependencies: '@asamuzakjp/css-color': 5.1.11 @@ -6916,14 +10965,27 @@ snapshots: jsesc@3.1.0: {} + json-parse-even-better-errors@2.3.1: {} + json-schema-traverse@1.0.0: {} json5@2.2.3: {} jsonc-parser@3.3.1: {} + jsonfile@4.0.0: + optionalDependencies: + graceful-fs: 4.2.11 + + kleur@3.0.3: {} + kleur@4.1.5: {} + launch-editor@2.14.1: + dependencies: + picocolors: 1.1.1 + shell-quote: 1.10.0 + less@4.8.1(supports-color@10.2.2): dependencies: copy-anything: 3.0.5 @@ -6939,6 +11001,15 @@ snapshots: transitivePeerDependencies: - supports-color + leven@3.1.0: {} + + lighthouse-logger@1.4.2(supports-color@10.2.2): + dependencies: + debug: 2.6.9(supports-color@10.2.2) + marky: 1.3.0 + transitivePeerDependencies: + - supports-color + lightningcss-android-arm64@1.33.0: optional: true @@ -6988,6 +11059,8 @@ snapshots: lightningcss-win32-arm64-msvc: 1.33.0 lightningcss-win32-x64-msvc: 1.33.0 + lines-and-columns@1.2.4: {} + lit-element@4.2.2: dependencies: '@lit-labs/ssr-dom-shim': 1.6.0 @@ -6998,43 +11071,282 @@ snapshots: dependencies: '@types/trusted-types': 2.0.7 - lit@3.3.3: + lit@3.3.3: + dependencies: + '@lit/reactive-element': 2.1.2 + lit-element: 4.2.2 + lit-html: 3.3.3 + + locate-character@3.0.0: {} + + locate-path@5.0.0: + dependencies: + p-locate: 4.1.0 + + locate-path@6.0.0: + dependencies: + p-locate: 5.0.0 + + lodash.debounce@4.0.8: {} + + lodash.merge@4.6.2: + optional: true + + lodash.throttle@4.1.1: {} + + log-symbols@4.1.0: + dependencies: + chalk: 4.1.2 + is-unicode-supported: 0.1.0 + + log-symbols@7.0.1: + dependencies: + is-unicode-supported: 2.1.0 + yoctocolors: 2.2.0 + + logkitty@0.7.1: + dependencies: + ansi-fragments: 0.2.1 + dayjs: 1.11.21 + yargs: 15.4.1 + + loose-envify@1.4.0: + dependencies: + js-tokens: 4.0.0 + + lru-cache@11.5.2: {} + + lru-cache@5.1.1: + dependencies: + yallist: 3.1.1 + + magic-string@0.30.21: + dependencies: + '@jridgewell/sourcemap-codec': 1.5.5 + + make-dir@5.1.0: + optional: true + + makeerror@1.0.12: + dependencies: + tmpl: 1.0.5 + + marky@1.3.0: {} + + math-intrinsics@1.1.0: {} + + mdn-data@2.0.14: {} + + mdn-data@2.27.1: {} + + media-typer@0.3.0: {} + + memoize-one@5.2.1: {} + + merge-anything@5.1.7: + dependencies: + is-what: 4.1.16 + + merge-stream@2.0.0: {} + + merge2@1.4.1: {} + + metro-babel-transformer@0.84.4(supports-color@10.2.2): + dependencies: + '@babel/core': 7.29.7(supports-color@10.2.2) + flow-enums-runtime: 0.0.6 + hermes-parser: 0.35.0 + metro-cache-key: 0.84.4 + nullthrows: 1.1.1 + transitivePeerDependencies: + - supports-color + + metro-cache-key@0.84.4: + dependencies: + flow-enums-runtime: 0.0.6 + + metro-cache@0.84.4(supports-color@10.2.2): + dependencies: + exponential-backoff: 3.1.3 + flow-enums-runtime: 0.0.6 + https-proxy-agent: 7.0.6(supports-color@10.2.2) + metro-core: 0.84.4 + transitivePeerDependencies: + - supports-color + + metro-config@0.84.4(supports-color@10.2.2): + dependencies: + connect: 3.7.0(supports-color@10.2.2) + flow-enums-runtime: 0.0.6 + jest-validate: 29.7.0 + metro: 0.84.4(supports-color@10.2.2) + metro-cache: 0.84.4(supports-color@10.2.2) + metro-core: 0.84.4 + metro-runtime: 0.84.4 + yaml: 2.9.0 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + + metro-core@0.84.4: + dependencies: + flow-enums-runtime: 0.0.6 + lodash.throttle: 4.1.1 + metro-resolver: 0.84.4 + + metro-file-map@0.84.4(supports-color@10.2.2): + dependencies: + debug: 4.4.3(supports-color@10.2.2) + fb-watchman: 2.0.2 + flow-enums-runtime: 0.0.6 + graceful-fs: 4.2.11 + invariant: 2.2.4 + jest-worker: 29.7.0 + micromatch: 4.0.8 + nullthrows: 1.1.1 + walker: 1.0.8 + transitivePeerDependencies: + - supports-color + + metro-minify-terser@0.84.4: + dependencies: + flow-enums-runtime: 0.0.6 + terser: 5.49.0 + + metro-resolver@0.84.4: + dependencies: + flow-enums-runtime: 0.0.6 + + metro-runtime@0.84.4: + dependencies: + '@babel/runtime': 7.29.7 + flow-enums-runtime: 0.0.6 + + metro-source-map@0.84.4(supports-color@10.2.2): + dependencies: + '@babel/traverse': 7.29.7(supports-color@10.2.2) + '@babel/types': 7.29.7 + flow-enums-runtime: 0.0.6 + invariant: 2.2.4 + metro-symbolicate: 0.84.4(supports-color@10.2.2) + nullthrows: 1.1.1 + ob1: 0.84.4 + source-map: 0.5.7 + vlq: 1.0.1 + transitivePeerDependencies: + - supports-color + + metro-symbolicate@0.84.4(supports-color@10.2.2): + dependencies: + flow-enums-runtime: 0.0.6 + invariant: 2.2.4 + metro-source-map: 0.84.4(supports-color@10.2.2) + nullthrows: 1.1.1 + source-map: 0.5.7 + vlq: 1.0.1 + transitivePeerDependencies: + - supports-color + + metro-transform-plugins@0.84.4(supports-color@10.2.2): + dependencies: + '@babel/core': 7.29.7(supports-color@10.2.2) + '@babel/generator': 7.29.7 + '@babel/template': 7.29.7 + '@babel/traverse': 7.29.7(supports-color@10.2.2) + flow-enums-runtime: 0.0.6 + nullthrows: 1.1.1 + transitivePeerDependencies: + - supports-color + + metro-transform-worker@0.84.4(supports-color@10.2.2): + dependencies: + '@babel/core': 7.29.7(supports-color@10.2.2) + '@babel/generator': 7.29.7 + '@babel/parser': 7.29.7 + '@babel/types': 7.29.7 + flow-enums-runtime: 0.0.6 + metro: 0.84.4(supports-color@10.2.2) + metro-babel-transformer: 0.84.4(supports-color@10.2.2) + metro-cache: 0.84.4(supports-color@10.2.2) + metro-cache-key: 0.84.4 + metro-minify-terser: 0.84.4 + metro-source-map: 0.84.4(supports-color@10.2.2) + metro-transform-plugins: 0.84.4(supports-color@10.2.2) + nullthrows: 1.1.1 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + + metro@0.84.4(supports-color@10.2.2): dependencies: - '@lit/reactive-element': 2.1.2 - lit-element: 4.2.2 - lit-html: 3.3.3 - - locate-character@3.0.0: {} - - lodash.merge@4.6.2: - optional: true + '@babel/code-frame': 7.29.7 + '@babel/core': 7.29.7(supports-color@10.2.2) + '@babel/generator': 7.29.7 + '@babel/parser': 7.29.7 + '@babel/template': 7.29.7 + '@babel/traverse': 7.29.7(supports-color@10.2.2) + '@babel/types': 7.29.7 + accepts: 2.0.0 + ci-info: 2.0.0 + connect: 3.7.0(supports-color@10.2.2) + debug: 4.4.3(supports-color@10.2.2) + error-stack-parser: 2.1.4 + flow-enums-runtime: 0.0.6 + graceful-fs: 4.2.11 + hermes-parser: 0.35.0 + image-size: 1.2.1 + invariant: 2.2.4 + jest-worker: 29.7.0 + jsc-safe-url: 0.2.4 + lodash.throttle: 4.1.1 + metro-babel-transformer: 0.84.4(supports-color@10.2.2) + metro-cache: 0.84.4(supports-color@10.2.2) + metro-cache-key: 0.84.4 + metro-config: 0.84.4(supports-color@10.2.2) + metro-core: 0.84.4 + metro-file-map: 0.84.4(supports-color@10.2.2) + metro-resolver: 0.84.4 + metro-runtime: 0.84.4 + metro-source-map: 0.84.4(supports-color@10.2.2) + metro-symbolicate: 0.84.4(supports-color@10.2.2) + metro-transform-plugins: 0.84.4(supports-color@10.2.2) + metro-transform-worker: 0.84.4(supports-color@10.2.2) + mime-types: 3.0.2 + nullthrows: 1.1.1 + serialize-error: 2.1.0 + source-map: 0.5.7 + throat: 5.0.0 + ws: 7.5.13 + yargs: 17.7.3 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate - log-symbols@7.0.1: + micromatch@4.0.8: dependencies: - is-unicode-supported: 2.1.0 - yoctocolors: 2.2.0 + braces: 3.0.3 + picomatch: 2.3.2 - lru-cache@11.5.2: {} + mime-db@1.52.0: {} - lru-cache@5.1.1: - dependencies: - yallist: 3.1.1 + mime-db@1.54.0: {} - magic-string@0.30.21: + mime-types@2.1.35: dependencies: - '@jridgewell/sourcemap-codec': 1.5.5 + mime-db: 1.52.0 - make-dir@5.1.0: - optional: true + mime-types@3.0.2: + dependencies: + mime-db: 1.54.0 - mdn-data@2.27.1: {} + mime@1.6.0: {} - merge-anything@5.1.7: - dependencies: - is-what: 4.1.16 + mime@2.6.0: {} - mime@1.6.0: - optional: true + mimic-fn@2.1.0: {} mimic-function@5.0.1: {} @@ -7050,10 +11362,11 @@ snapshots: - bufferutil - utf-8-validate + mkdirp@1.0.4: {} + mri@1.2.0: {} - ms@2.0.0: - optional: true + ms@2.0.0: {} ms@2.1.3: {} @@ -7074,6 +11387,12 @@ snapshots: sax: 1.6.1 optional: true + negotiator@0.6.3: {} + + negotiator@0.6.4: {} + + negotiator@1.0.0: {} + ng-packagr@22.0.2(@angular/compiler-cli@22.0.8(@angular/compiler@22.0.8)(supports-color@10.2.2)(typescript@6.0.3))(supports-color@10.2.2)(tslib@2.8.1)(typescript@6.0.3): dependencies: '@ampproject/remapping': 2.3.0 @@ -7104,14 +11423,36 @@ snapshots: transitivePeerDependencies: - supports-color + nocache@3.0.4: {} + node-addon-api@7.1.1: optional: true + node-int64@0.4.0: {} + node-releases@2.0.51: {} + node-stream-zip@1.16.0: {} + + npm-run-path@4.0.1: + dependencies: + path-key: 3.1.1 + + nth-check@2.1.1: + dependencies: + boolbase: 1.0.0 + + nullthrows@1.1.1: {} + + ob1@0.84.4: + dependencies: + flow-enums-runtime: 0.0.6 + + object-inspect@1.13.4: {} + obug@2.1.4: {} - octane@0.1.13(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(vite@8.1.5(@types/node@25.9.5)(esbuild@0.27.7)(less@4.8.1(supports-color@10.2.2))(sass@1.102.0)): + octane@0.1.13(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(vite@8.1.5(@types/node@25.9.5)(esbuild@0.27.7)(less@4.8.1(supports-color@10.2.2))(sass@1.102.0)(terser@5.49.0)(yaml@2.9.0)): dependencies: '@tsrx/core': 0.1.48 '@types/react': 19.2.17 @@ -7120,11 +11461,11 @@ snapshots: optionalDependencies: react: 19.2.3 react-dom: 19.2.3(react@19.2.3) - vite: 8.1.5(@types/node@25.9.5)(esbuild@0.27.7)(less@4.8.1(supports-color@10.2.2))(sass@1.102.0) + vite: 8.1.5(@types/node@25.9.5)(esbuild@0.27.7)(less@4.8.1(supports-color@10.2.2))(sass@1.102.0)(terser@5.49.0)(yaml@2.9.0) transitivePeerDependencies: - '@typescript-eslint/types' - octane@0.1.13(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(vite@8.1.5(@types/node@25.9.5)(esbuild@0.28.1)(less@4.8.1(supports-color@10.2.2))(sass@1.102.0)): + octane@0.1.13(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(vite@8.1.5(@types/node@25.9.5)(esbuild@0.28.1)(less@4.8.1(supports-color@10.2.2))(sass@1.102.0)(terser@5.49.0)(yaml@2.9.0)): dependencies: '@tsrx/core': 0.1.48 '@types/react': 19.2.17 @@ -7133,14 +11474,49 @@ snapshots: optionalDependencies: react: 19.2.3 react-dom: 19.2.3(react@19.2.3) - vite: 8.1.5(@types/node@25.9.5)(esbuild@0.28.1)(less@4.8.1(supports-color@10.2.2))(sass@1.102.0) + vite: 8.1.5(@types/node@25.9.5)(esbuild@0.28.1)(less@4.8.1(supports-color@10.2.2))(sass@1.102.0)(terser@5.49.0)(yaml@2.9.0) transitivePeerDependencies: - '@typescript-eslint/types' + on-finished@2.3.0: + dependencies: + ee-first: 1.1.1 + + on-finished@2.4.1: + dependencies: + ee-first: 1.1.1 + + on-headers@1.1.0: {} + + onetime@5.1.2: + dependencies: + mimic-fn: 2.1.0 + onetime@7.0.0: dependencies: mimic-function: 5.0.1 + open@6.4.0: + dependencies: + is-wsl: 1.1.0 + + open@7.4.2: + dependencies: + is-docker: 2.2.1 + is-wsl: 2.2.0 + + ora@5.4.1: + dependencies: + bl: 4.1.0 + chalk: 4.1.2 + cli-cursor: 3.1.0 + cli-spinners: 2.9.2 + is-interactive: 1.0.0 + is-unicode-supported: 0.1.0 + log-symbols: 4.1.0 + strip-ansi: 6.0.1 + wcwidth: 1.0.1 + ora@9.4.1: dependencies: chalk: 5.6.2 @@ -7152,6 +11528,35 @@ snapshots: stdin-discarder: 0.3.2 string-width: 8.2.2 + p-limit@2.3.0: + dependencies: + p-try: 2.2.0 + + p-limit@3.1.0: + dependencies: + yocto-queue: 0.1.0 + + p-locate@4.1.0: + dependencies: + p-limit: 2.3.0 + + p-locate@5.0.0: + dependencies: + p-limit: 3.1.0 + + p-try@2.2.0: {} + + parent-module@1.0.1: + dependencies: + callsites: 3.1.0 + + parse-json@5.2.0: + dependencies: + '@babel/code-frame': 7.29.7 + error-ex: 1.3.4 + json-parse-even-better-errors: 2.3.1 + lines-and-columns: 1.2.4 + parse-node-version@1.0.1: {} parse5@7.3.0: @@ -7162,12 +11567,22 @@ snapshots: dependencies: entities: 8.0.0 + parseurl@1.3.3: {} + + path-exists@4.0.0: {} + + path-key@3.1.1: {} + + path-parse@1.0.7: {} + path-to-regexp@6.3.0: {} pathe@2.0.3: {} picocolors@1.1.1: {} + picomatch@2.3.2: {} + picomatch@4.0.5: {} piscina@5.3.0: @@ -7202,6 +11617,12 @@ snapshots: prettier@3.9.6: {} + pretty-format@29.7.0: + dependencies: + '@jest/schemas': 29.6.3 + ansi-styles: 5.2.0 + react-is: 18.3.1 + probe-image-size@7.3.0(supports-color@10.2.2): dependencies: lodash.merge: 4.6.2 @@ -7211,18 +11632,109 @@ snapshots: - supports-color optional: true + promise@8.3.0: + dependencies: + asap: 2.0.6 + + prompts@2.4.2: + dependencies: + kleur: 3.0.3 + sisteransi: 1.0.5 + prr@1.0.1: optional: true punycode@2.3.1: {} + qs@6.15.3: + dependencies: + es-define-property: 1.0.1 + side-channel: 1.1.1 + + queue-microtask@1.2.3: {} + + queue@6.0.2: + dependencies: + inherits: 2.0.4 + + range-parser@1.2.1: {} + + raw-body@2.5.3: + dependencies: + bytes: 3.1.2 + http-errors: 2.0.1 + iconv-lite: 0.4.24 + unpipe: 1.0.0 + + react-devtools-core@6.1.5: + dependencies: + shell-quote: 1.10.0 + ws: 7.5.13 + transitivePeerDependencies: + - bufferutil + - utf-8-validate + react-dom@19.2.3(react@19.2.3): dependencies: react: 19.2.3 scheduler: 0.27.0 + react-is@18.3.1: {} + react-is@19.2.8: {} + react-native-svg@15.15.5(react-native@0.86.0(@babel/core@7.29.7(supports-color@10.2.2))(@react-native-community/cli@20.1.0(supports-color@10.2.2)(typescript@6.0.3))(@react-native/metro-config@0.86.0(@babel/core@7.29.7(supports-color@10.2.2))(supports-color@10.2.2))(@types/react@19.2.17)(react@19.2.3)(supports-color@10.2.2))(react@19.2.3): + dependencies: + css-select: 5.2.2 + css-tree: 1.1.3 + react: 19.2.3 + react-native: 0.86.0(@babel/core@7.29.7(supports-color@10.2.2))(@react-native-community/cli@20.1.0(supports-color@10.2.2)(typescript@6.0.3))(@react-native/metro-config@0.86.0(@babel/core@7.29.7(supports-color@10.2.2))(supports-color@10.2.2))(@types/react@19.2.17)(react@19.2.3)(supports-color@10.2.2) + + react-native@0.86.0(@babel/core@7.29.7(supports-color@10.2.2))(@react-native-community/cli@20.1.0(supports-color@10.2.2)(typescript@6.0.3))(@react-native/metro-config@0.86.0(@babel/core@7.29.7(supports-color@10.2.2))(supports-color@10.2.2))(@types/react@19.2.17)(react@19.2.3)(supports-color@10.2.2): + dependencies: + '@react-native/assets-registry': 0.86.0 + '@react-native/codegen': 0.86.0(@babel/core@7.29.7(supports-color@10.2.2)) + '@react-native/community-cli-plugin': 0.86.0(@react-native-community/cli@20.1.0(supports-color@10.2.2)(typescript@6.0.3))(@react-native/metro-config@0.86.0(@babel/core@7.29.7(supports-color@10.2.2))(supports-color@10.2.2))(supports-color@10.2.2) + '@react-native/gradle-plugin': 0.86.0 + '@react-native/js-polyfills': 0.86.0 + '@react-native/normalize-colors': 0.86.0 + '@react-native/virtualized-lists': 0.86.0(@types/react@19.2.17)(react-native@0.86.0(@babel/core@7.29.7(supports-color@10.2.2))(@react-native-community/cli@20.1.0(supports-color@10.2.2)(typescript@6.0.3))(@react-native/metro-config@0.86.0(@babel/core@7.29.7(supports-color@10.2.2))(supports-color@10.2.2))(@types/react@19.2.17)(react@19.2.3)(supports-color@10.2.2))(react@19.2.3) + abort-controller: 3.0.0 + anser: 1.4.10 + ansi-regex: 5.0.1 + babel-plugin-syntax-hermes-parser: 0.36.0 + base64-js: 1.5.1 + commander: 12.1.0 + flow-enums-runtime: 0.0.6 + hermes-compiler: 250829098.0.14 + invariant: 2.2.4 + memoize-one: 5.2.1 + metro-runtime: 0.84.4 + metro-source-map: 0.84.4(supports-color@10.2.2) + nullthrows: 1.1.1 + pretty-format: 29.7.0 + promise: 8.3.0 + react: 19.2.3 + react-devtools-core: 6.1.5 + react-refresh: 0.14.2 + regenerator-runtime: 0.13.11 + scheduler: 0.27.0 + semver: 7.8.5 + stacktrace-parser: 0.1.11 + tinyglobby: 0.2.17 + whatwg-fetch: 3.6.20 + ws: 7.5.13 + yargs: 17.7.3 + optionalDependencies: + '@types/react': 19.2.17 + transitivePeerDependencies: + - '@babel/core' + - '@react-native-community/cli' + - '@react-native/metro-config' + - bufferutil + - supports-color + - utf-8-validate + react-redux@9.3.0(@types/react@19.2.17)(react@19.2.3)(redux@5.0.1): dependencies: '@types/use-sync-external-store': 0.0.6 @@ -7232,8 +11744,16 @@ snapshots: '@types/react': 19.2.17 redux: 5.0.1 + react-refresh@0.14.2: {} + react@19.2.3: {} + readable-stream@3.6.2: + dependencies: + inherits: 2.0.4 + string_decoder: 1.3.0 + util-deprecate: 1.0.2 + readdirp@4.1.2: {} readdirp@5.0.0: {} @@ -7266,15 +11786,58 @@ snapshots: reflect-metadata@0.2.2: {} + regenerate-unicode-properties@10.2.2: + dependencies: + regenerate: 1.4.2 + + regenerate@1.4.2: {} + + regenerator-runtime@0.13.11: {} + + regexpu-core@6.4.0: + dependencies: + regenerate: 1.4.2 + regenerate-unicode-properties: 10.2.2 + regjsgen: 0.8.0 + regjsparser: 0.13.2 + unicode-match-property-ecmascript: 2.0.0 + unicode-match-property-value-ecmascript: 2.2.1 + + regjsgen@0.8.0: {} + + regjsparser@0.13.2: + dependencies: + jsesc: 3.1.0 + + require-directory@2.1.1: {} + require-from-string@2.0.2: {} + require-main-filename@2.0.0: {} + reselect@5.2.0: {} + resolve-from@4.0.0: {} + + resolve@1.22.12: + dependencies: + es-errors: 1.3.0 + is-core-module: 2.16.2 + path-parse: 1.0.7 + supports-preserve-symlinks-flag: 1.0.0 + + restore-cursor@3.1.0: + dependencies: + onetime: 5.1.2 + signal-exit: 3.0.7 + restore-cursor@5.1.0: dependencies: onetime: 7.0.0 signal-exit: 4.1.0 + reusify@1.1.0: {} + robust-predicates@3.0.3: {} rolldown@1.1.5: @@ -7340,6 +11903,10 @@ snapshots: '@rollup/rollup-win32-x64-msvc': 4.62.3 fsevents: 2.3.3 + run-parallel@1.2.0: + dependencies: + queue-microtask: 1.2.3 + rw@1.3.3: {} rxjs@7.8.2: @@ -7350,6 +11917,8 @@ snapshots: dependencies: mri: 1.2.0 + safe-buffer@5.2.1: {} + safer-buffer@2.1.2: {} sass@1.102.0: @@ -7375,12 +11944,45 @@ snapshots: semver@7.8.5: {} + send@0.19.2(supports-color@10.2.2): + dependencies: + debug: 2.6.9(supports-color@10.2.2) + depd: 2.0.0 + destroy: 1.2.0 + encodeurl: 2.0.0 + escape-html: 1.0.3 + etag: 1.8.1 + fresh: 0.5.2 + http-errors: 2.0.1 + mime: 1.6.0 + ms: 2.1.3 + on-finished: 2.4.1 + range-parser: 1.2.1 + statuses: 2.0.2 + transitivePeerDependencies: + - supports-color + + serialize-error@2.1.0: {} + seroval-plugins@1.5.6(seroval@1.5.6): dependencies: seroval: 1.5.6 seroval@1.5.6: {} + serve-static@1.16.3(supports-color@10.2.2): + dependencies: + encodeurl: 2.0.0 + escape-html: 1.0.3 + parseurl: 1.3.3 + send: 0.19.2(supports-color@10.2.2) + transitivePeerDependencies: + - supports-color + + set-blocking@2.0.0: {} + + setprototypeof@1.2.0: {} + sharp@0.34.5: dependencies: '@img/colour': 1.1.0 @@ -7412,10 +12014,56 @@ snapshots: '@img/sharp-win32-ia32': 0.34.5 '@img/sharp-win32-x64': 0.34.5 + shebang-command@2.0.0: + dependencies: + shebang-regex: 3.0.0 + + shebang-regex@3.0.0: {} + + shell-quote@1.10.0: {} + + side-channel-list@1.0.1: + dependencies: + es-errors: 1.3.0 + object-inspect: 1.13.4 + + side-channel-map@1.0.1: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + get-intrinsic: 1.3.0 + object-inspect: 1.13.4 + + side-channel-weakmap@1.0.2: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + get-intrinsic: 1.3.0 + object-inspect: 1.13.4 + side-channel-map: 1.0.1 + + side-channel@1.1.1: + dependencies: + es-errors: 1.3.0 + object-inspect: 1.13.4 + side-channel-list: 1.0.1 + side-channel-map: 1.0.1 + side-channel-weakmap: 1.0.2 + siginfo@2.0.0: {} + signal-exit@3.0.7: {} + signal-exit@4.1.0: {} + sisteransi@1.0.5: {} + + slice-ansi@2.1.0: + dependencies: + ansi-styles: 3.2.1 + astral-regex: 1.0.0 + is-fullwidth-code-point: 2.0.0 + solid-js@1.9.14: dependencies: csstype: 3.2.3 @@ -7433,11 +12081,27 @@ snapshots: source-map-js@1.2.1: {} - source-map@0.6.1: - optional: true + source-map-support@0.5.21: + dependencies: + buffer-from: 1.1.2 + source-map: 0.6.1 + + source-map@0.5.7: {} + + source-map@0.6.1: {} stackback@0.0.2: {} + stackframe@1.3.4: {} + + stacktrace-parser@0.1.11: + dependencies: + type-fest: 0.7.1 + + statuses@1.5.0: {} + + statuses@2.0.2: {} + std-env@4.2.0: {} stdin-discarder@0.3.2: {} @@ -7449,6 +12113,12 @@ snapshots: - supports-color optional: true + string-width@4.2.3: + dependencies: + emoji-regex: 8.0.0 + is-fullwidth-code-point: 3.0.0 + strip-ansi: 6.0.1 + string-width@7.2.0: dependencies: emoji-regex: 10.6.0 @@ -7460,12 +12130,38 @@ snapshots: get-east-asian-width: 1.6.0 strip-ansi: 7.2.0 + string_decoder@1.3.0: + dependencies: + safe-buffer: 5.2.1 + + strip-ansi@5.2.0: + dependencies: + ansi-regex: 4.1.1 + + strip-ansi@6.0.1: + dependencies: + ansi-regex: 5.0.1 + strip-ansi@7.2.0: dependencies: ansi-regex: 6.2.2 + strip-final-newline@2.0.0: {} + + strnum@1.1.2: {} + supports-color@10.2.2: {} + supports-color@7.2.0: + dependencies: + has-flag: 4.0.0 + + supports-color@8.1.1: + dependencies: + has-flag: 4.0.0 + + supports-preserve-symlinks-flag@1.0.0: {} + svelte-check@4.7.4(picomatch@4.0.5)(svelte@5.56.8)(typescript@6.0.3): dependencies: '@jridgewell/trace-mapping': 0.3.31 @@ -7509,6 +12205,15 @@ snapshots: symbol-tree@3.2.4: {} + terser@5.49.0: + dependencies: + '@jridgewell/source-map': 0.3.11 + acorn: 8.17.0 + commander: 2.20.3 + source-map-support: 0.5.21 + + throat@5.0.0: {} + tiny-invariant@1.3.3: {} tinybench@2.9.0: {} @@ -7528,6 +12233,14 @@ snapshots: dependencies: tldts-core: 7.4.9 + tmpl@1.0.5: {} + + to-regex-range@5.0.1: + dependencies: + is-number: 7.0.0 + + toidentifier@1.0.1: {} + topojson-client@3.1.0: dependencies: commander: 2.20.3 @@ -7544,6 +12257,13 @@ snapshots: tslib@2.8.1: {} + type-fest@0.7.1: {} + + type-is@1.6.18: + dependencies: + media-typer: 0.3.0 + mime-types: 2.1.35 + typescript@6.0.3: {} undici-types@7.24.6: {} @@ -7556,6 +12276,21 @@ snapshots: dependencies: pathe: 2.0.3 + unicode-canonical-property-names-ecmascript@2.0.1: {} + + unicode-match-property-ecmascript@2.0.0: + dependencies: + unicode-canonical-property-names-ecmascript: 2.0.1 + unicode-property-aliases-ecmascript: 2.2.0 + + unicode-match-property-value-ecmascript@2.2.1: {} + + unicode-property-aliases-ecmascript@2.2.0: {} + + universalify@0.1.2: {} + + unpipe@1.0.0: {} + update-browserslist-db@1.2.3(browserslist@4.28.7): dependencies: browserslist: 4.28.7 @@ -7568,6 +12303,12 @@ snapshots: dependencies: react: 19.2.3 + util-deprecate@1.0.2: {} + + utils-merge@1.0.1: {} + + vary@1.1.2: {} + victory-vendor@37.3.6: dependencies: '@types/d3-array': 3.2.2 @@ -7585,7 +12326,7 @@ snapshots: d3-time: 3.1.0 d3-timer: 3.0.1 - vite-plugin-solid@2.11.14(solid-js@1.9.14)(supports-color@10.2.2)(vite@8.1.5(@types/node@25.9.5)(esbuild@0.27.7)(less@4.8.1(supports-color@10.2.2))(sass@1.102.0)): + vite-plugin-solid@2.11.14(solid-js@1.9.14)(supports-color@10.2.2)(vite@8.1.5(@types/node@25.9.5)(esbuild@0.27.7)(less@4.8.1(supports-color@10.2.2))(sass@1.102.0)(terser@5.49.0)(yaml@2.9.0)): dependencies: '@babel/core': 7.29.7(supports-color@10.2.2) '@types/babel__core': 7.20.5 @@ -7593,12 +12334,12 @@ snapshots: merge-anything: 5.1.7 solid-js: 1.9.14 solid-refresh: 0.6.3(solid-js@1.9.14)(supports-color@10.2.2) - vite: 8.1.5(@types/node@25.9.5)(esbuild@0.27.7)(less@4.8.1(supports-color@10.2.2))(sass@1.102.0) - vitefu: 1.1.3(vite@8.1.5(@types/node@25.9.5)(esbuild@0.27.7)(less@4.8.1(supports-color@10.2.2))(sass@1.102.0)) + vite: 8.1.5(@types/node@25.9.5)(esbuild@0.27.7)(less@4.8.1(supports-color@10.2.2))(sass@1.102.0)(terser@5.49.0)(yaml@2.9.0) + vitefu: 1.1.3(vite@8.1.5(@types/node@25.9.5)(esbuild@0.27.7)(less@4.8.1(supports-color@10.2.2))(sass@1.102.0)(terser@5.49.0)(yaml@2.9.0)) transitivePeerDependencies: - supports-color - vite-plugin-solid@2.11.14(solid-js@1.9.14)(supports-color@10.2.2)(vite@8.1.5(@types/node@25.9.5)(esbuild@0.28.1)(less@4.8.1(supports-color@10.2.2))(sass@1.102.0)): + vite-plugin-solid@2.11.14(solid-js@1.9.14)(supports-color@10.2.2)(vite@8.1.5(@types/node@25.9.5)(esbuild@0.28.1)(less@4.8.1(supports-color@10.2.2))(sass@1.102.0)(terser@5.49.0)(yaml@2.9.0)): dependencies: '@babel/core': 7.29.7(supports-color@10.2.2) '@types/babel__core': 7.20.5 @@ -7606,12 +12347,12 @@ snapshots: merge-anything: 5.1.7 solid-js: 1.9.14 solid-refresh: 0.6.3(solid-js@1.9.14)(supports-color@10.2.2) - vite: 8.1.5(@types/node@25.9.5)(esbuild@0.28.1)(less@4.8.1(supports-color@10.2.2))(sass@1.102.0) - vitefu: 1.1.3(vite@8.1.5(@types/node@25.9.5)(esbuild@0.28.1)(less@4.8.1(supports-color@10.2.2))(sass@1.102.0)) + vite: 8.1.5(@types/node@25.9.5)(esbuild@0.28.1)(less@4.8.1(supports-color@10.2.2))(sass@1.102.0)(terser@5.49.0)(yaml@2.9.0) + vitefu: 1.1.3(vite@8.1.5(@types/node@25.9.5)(esbuild@0.28.1)(less@4.8.1(supports-color@10.2.2))(sass@1.102.0)(terser@5.49.0)(yaml@2.9.0)) transitivePeerDependencies: - supports-color - vite@8.1.5(@types/node@25.9.5)(esbuild@0.27.7)(less@4.8.1(supports-color@10.2.2))(sass@1.102.0): + vite@8.1.5(@types/node@25.9.5)(esbuild@0.27.7)(less@4.8.1(supports-color@10.2.2))(sass@1.102.0)(terser@5.49.0)(yaml@2.9.0): dependencies: lightningcss: 1.33.0 picomatch: 4.0.5 @@ -7624,8 +12365,10 @@ snapshots: fsevents: 2.3.3 less: 4.8.1(supports-color@10.2.2) sass: 1.102.0 + terser: 5.49.0 + yaml: 2.9.0 - vite@8.1.5(@types/node@25.9.5)(esbuild@0.28.1)(less@4.8.1(supports-color@10.2.2))(sass@1.102.0): + vite@8.1.5(@types/node@25.9.5)(esbuild@0.28.1)(less@4.8.1(supports-color@10.2.2))(sass@1.102.0)(terser@5.49.0)(yaml@2.9.0): dependencies: lightningcss: 1.33.0 picomatch: 4.0.5 @@ -7638,19 +12381,21 @@ snapshots: fsevents: 2.3.3 less: 4.8.1(supports-color@10.2.2) sass: 1.102.0 + terser: 5.49.0 + yaml: 2.9.0 - vitefu@1.1.3(vite@8.1.5(@types/node@25.9.5)(esbuild@0.27.7)(less@4.8.1(supports-color@10.2.2))(sass@1.102.0)): + vitefu@1.1.3(vite@8.1.5(@types/node@25.9.5)(esbuild@0.27.7)(less@4.8.1(supports-color@10.2.2))(sass@1.102.0)(terser@5.49.0)(yaml@2.9.0)): optionalDependencies: - vite: 8.1.5(@types/node@25.9.5)(esbuild@0.27.7)(less@4.8.1(supports-color@10.2.2))(sass@1.102.0) + vite: 8.1.5(@types/node@25.9.5)(esbuild@0.27.7)(less@4.8.1(supports-color@10.2.2))(sass@1.102.0)(terser@5.49.0)(yaml@2.9.0) - vitefu@1.1.3(vite@8.1.5(@types/node@25.9.5)(esbuild@0.28.1)(less@4.8.1(supports-color@10.2.2))(sass@1.102.0)): + vitefu@1.1.3(vite@8.1.5(@types/node@25.9.5)(esbuild@0.28.1)(less@4.8.1(supports-color@10.2.2))(sass@1.102.0)(terser@5.49.0)(yaml@2.9.0)): optionalDependencies: - vite: 8.1.5(@types/node@25.9.5)(esbuild@0.28.1)(less@4.8.1(supports-color@10.2.2))(sass@1.102.0) + vite: 8.1.5(@types/node@25.9.5)(esbuild@0.28.1)(less@4.8.1(supports-color@10.2.2))(sass@1.102.0)(terser@5.49.0)(yaml@2.9.0) - vitest@4.1.10(@types/node@25.9.5)(jsdom@29.1.1(@noble/hashes@2.2.0))(vite@8.1.5(@types/node@25.9.5)(esbuild@0.27.7)(less@4.8.1(supports-color@10.2.2))(sass@1.102.0)): + vitest@4.1.10(@types/node@25.9.5)(jsdom@29.1.1(@noble/hashes@2.2.0))(vite@8.1.5(@types/node@25.9.5)(esbuild@0.27.7)(less@4.8.1(supports-color@10.2.2))(sass@1.102.0)(terser@5.49.0)(yaml@2.9.0)): dependencies: '@vitest/expect': 4.1.10 - '@vitest/mocker': 4.1.10(vite@8.1.5(@types/node@25.9.5)(esbuild@0.27.7)(less@4.8.1(supports-color@10.2.2))(sass@1.102.0)) + '@vitest/mocker': 4.1.10(vite@8.1.5(@types/node@25.9.5)(esbuild@0.27.7)(less@4.8.1(supports-color@10.2.2))(sass@1.102.0)(terser@5.49.0)(yaml@2.9.0)) '@vitest/pretty-format': 4.1.10 '@vitest/runner': 4.1.10 '@vitest/snapshot': 4.1.10 @@ -7667,7 +12412,7 @@ snapshots: tinyexec: 1.2.4 tinyglobby: 0.2.17 tinyrainbow: 3.1.0 - vite: 8.1.5(@types/node@25.9.5)(esbuild@0.27.7)(less@4.8.1(supports-color@10.2.2))(sass@1.102.0) + vite: 8.1.5(@types/node@25.9.5)(esbuild@0.27.7)(less@4.8.1(supports-color@10.2.2))(sass@1.102.0)(terser@5.49.0)(yaml@2.9.0) why-is-node-running: 2.3.0 optionalDependencies: '@types/node': 25.9.5 @@ -7675,6 +12420,8 @@ snapshots: transitivePeerDependencies: - msw + vlq@1.0.1: {} + vue@3.5.40(typescript@6.0.3): dependencies: '@vue/compiler-dom': 3.5.40 @@ -7689,8 +12436,18 @@ snapshots: dependencies: xml-name-validator: 5.0.0 + walker@1.0.8: + dependencies: + makeerror: 1.0.12 + + wcwidth@1.0.1: + dependencies: + defaults: 1.0.4 + webidl-conversions@8.0.1: {} + whatwg-fetch@3.6.20: {} + whatwg-mimetype@5.0.0: {} whatwg-url@16.0.1(@noble/hashes@2.2.0): @@ -7701,6 +12458,12 @@ snapshots: transitivePeerDependencies: - '@noble/hashes' + which-module@2.0.1: {} + + which@2.0.2: + dependencies: + isexe: 2.0.0 + why-is-node-running@2.3.0: dependencies: siginfo: 2.0.0 @@ -7732,24 +12495,77 @@ snapshots: - bufferutil - utf-8-validate + wrap-ansi@6.2.0: + dependencies: + ansi-styles: 4.3.0 + string-width: 4.2.3 + strip-ansi: 6.0.1 + + wrap-ansi@7.0.0: + dependencies: + ansi-styles: 4.3.0 + string-width: 4.2.3 + strip-ansi: 6.0.1 + wrap-ansi@9.0.2: dependencies: ansi-styles: 6.2.3 string-width: 7.2.0 strip-ansi: 7.2.0 + ws@6.2.6: + dependencies: + async-limiter: 1.0.1 + + ws@7.5.13: {} + ws@8.21.0: {} xml-name-validator@5.0.0: {} xmlchars@2.2.0: {} + y18n@4.0.3: {} + y18n@5.0.8: {} yallist@3.1.1: {} + yaml@2.9.0: {} + + yargs-parser@18.1.3: + dependencies: + camelcase: 5.3.1 + decamelize: 1.2.0 + + yargs-parser@21.1.1: {} + yargs-parser@22.0.0: {} + yargs@15.4.1: + dependencies: + cliui: 6.0.0 + decamelize: 1.2.0 + find-up: 4.1.0 + get-caller-file: 2.0.5 + require-directory: 2.1.1 + require-main-filename: 2.0.0 + set-blocking: 2.0.0 + string-width: 4.2.3 + which-module: 2.0.1 + y18n: 4.0.3 + yargs-parser: 18.1.3 + + yargs@17.7.3: + dependencies: + cliui: 8.0.1 + escalade: 3.2.0 + get-caller-file: 2.0.5 + require-directory: 2.1.1 + string-width: 4.2.3 + y18n: 5.0.8 + yargs-parser: 21.1.1 + yargs@18.1.0: dependencies: cliui: 9.0.1 @@ -7759,6 +12575,8 @@ snapshots: y18n: 5.0.8 yargs-parser: 22.0.0 + yocto-queue@0.1.0: {} + yoctocolors@2.2.0: {} youch-core@0.3.3: diff --git a/scripts/check-react-native-types.mjs b/scripts/check-react-native-types.mjs new file mode 100644 index 0000000..a524b05 --- /dev/null +++ b/scripts/check-react-native-types.mjs @@ -0,0 +1,60 @@ +import { spawnSync } from 'node:child_process' +import { resolve } from 'node:path' + +const root = resolve(import.meta.dirname, '..') +const tsc = resolve(root, 'node_modules/typescript/bin/tsc') +const passingConfigs = [ + 'packages/react-native-charts/tsconfig.json', + 'examples/charts-react-native/tsconfig.json', +] + +for (const config of passingConfigs) { + const result = runTypeScript(config) + if (result.status !== 0) { + process.stderr.write(result.output) + throw new Error(`TypeScript failed for ${config}`) + } +} + +const strictConfig = 'examples/charts-react-native/tsconfig.strict.json' +const strict = runTypeScript(strictConfig) +if (strict.status === 0) { + console.log('React Native source and strict consumer typechecks passed.') + process.exit(0) +} + +const diagnostics = strict.output + .split(/\r?\n/) + .map((line) => line.trim()) + .filter(Boolean) +const expected = diagnostics.every( + (line) => + line.includes('/@types/d3-array/') && + line.includes("Cannot find name 'ImageData'."), +) + +if (!expected || diagnostics.length !== 2) { + process.stderr.write(strict.output) + throw new Error( + 'The strict React Native consumer has diagnostics beyond the known @types/d3-array ImageData boundary.', + ) +} + +console.log( + 'React Native source and consumer typechecks passed; strict dependency checking reached only the two known @types/d3-array ImageData diagnostics.', +) + +function runTypeScript(config) { + const result = spawnSync( + process.execPath, + [tsc, '--noEmit', '-p', config, '--pretty', 'false'], + { + cwd: root, + encoding: 'utf8', + }, + ) + return { + status: result.status, + output: `${result.stdout ?? ''}${result.stderr ?? ''}`, + } +} diff --git a/scripts/measure-bundles.mjs b/scripts/measure-bundles.mjs index ea20362..0f6bd44 100644 --- a/scripts/measure-bundles.mjs +++ b/scripts/measure-bundles.mjs @@ -27,7 +27,38 @@ const rendererBoundaryModules = { 'packages/charts-core/src/svg.ts', 'packages/react-charts/src/Chart.tsx', ], + native: [ + 'packages/react-native-charts/src/Chart.tsx', + 'packages/react-native-charts/src/FocusOverlay.tsx', + 'packages/react-native-charts/src/SvgScene.tsx', + 'packages/react-native-charts/src/Tooltip.tsx', + ], + browser: [ + 'packages/charts-core/src/adapter.ts', + 'packages/charts-core/src/adapter-renderer.ts', + 'packages/charts-core/src/canvas.ts', + 'packages/charts-core/src/dom.ts', + 'packages/charts-core/src/dom-text.ts', + 'packages/charts-core/src/export.ts', + 'packages/charts-core/src/reconcile.ts', + 'packages/charts-core/src/renderer.ts', + 'packages/charts-core/src/svg-renderer.ts', + 'packages/charts-core/src/svg-resources.ts', + 'packages/charts-core/src/svg-surface.ts', + 'packages/charts-core/src/svg.ts', + 'packages/react-charts/src/CanvasChart.tsx', + 'packages/react-charts/src/Chart.tsx', + 'packages/react-charts/src/RendererChart.tsx', + ], } +const nativeExternals = [ + 'react', + 'react/jsx-runtime', + 'react-native', + 'react-native/*', + 'react-native-svg', + 'react-native-svg/*', +] const entries = [ measured('Core host', 'benchmarks/entries/core.ts'), locked('D3-scale line scene', 'benchmarks/entries/charts-core.ts'), @@ -149,6 +180,26 @@ const entries = [ locked('React line consumer', 'benchmarks/entries/charts-react-line.ts', { external: ['react', 'react/jsx-runtime', 'react-dom'], }), + measured( + 'React Native SVG host', + 'benchmarks/entries/charts-react-native.ts', + { + external: nativeExternals, + rendererBoundary: 'native', + platform: 'neutral', + conditions: ['react-native', 'import'], + }, + ), + measured( + 'React Native line consumer', + 'benchmarks/entries/charts-react-native-line.ts', + { + external: nativeExternals, + rendererBoundary: 'native', + platform: 'neutral', + conditions: ['react-native', 'import'], + }, + ), budgeted( 'Stats parity surface', 'benchmarks/entries/charts-stats-parity.ts', @@ -298,6 +349,8 @@ for (const { alias, policy, rendererBoundary, + platform, + conditions, } of entries) { const outfile = resolve( outputDirectory, @@ -309,13 +362,14 @@ for (const { bundle: true, minify: true, treeShaking: true, - platform: 'browser', + platform: platform ?? 'browser', format: 'esm', target: 'es2022', legalComments: 'none', logLevel: 'silent', external, alias, + conditions, metafile: true, }) assertRendererBoundary(label, result.metafile.inputs, rendererBoundary) @@ -409,6 +463,8 @@ function createEntry(label, entry, policy, options) { external: options.external, alias: options.alias, rendererBoundary: options.rendererBoundary, + platform: options.platform, + conditions: options.conditions, } } @@ -417,6 +473,9 @@ function assertRendererBoundary(label, inputs, boundary) { const paths = Object.keys(inputs).map((input) => input.replaceAll('\\', '/')) const canvas = matchingModules(paths, rendererBoundaryModules.canvas) const svg = matchingModules(paths, rendererBoundaryModules.svg) + const native = matchingModules(paths, rendererBoundaryModules.native) + const browser = matchingModules(paths, rendererBoundaryModules.browser) + const reactDom = paths.filter((input) => input.includes('/react-dom/')) const failures = [] if (boundary === 'neutral') { @@ -428,6 +487,14 @@ function assertRendererBoundary(label, inputs, boundary) { } else if (boundary === 'svg') { if (!svg.length) failures.push('did not include the SVG renderer') if (canvas.length) failures.push(`included Canvas: ${canvas.join(', ')}`) + } else if (boundary === 'native') { + if (!native.length) failures.push('did not include the native SVG host') + if (browser.length) { + failures.push(`included browser modules: ${browser.join(', ')}`) + } + if (reactDom.length) { + failures.push(`included react-dom: ${reactDom.join(', ')}`) + } } else { failures.push(`uses unknown renderer boundary ${boundary}`) } diff --git a/scripts/measure-react-native-poc.mjs b/scripts/measure-react-native-poc.mjs new file mode 100644 index 0000000..8a2c06d --- /dev/null +++ b/scripts/measure-react-native-poc.mjs @@ -0,0 +1,160 @@ +import { spawn } from 'node:child_process' +import { mkdir, readFile, writeFile } from 'node:fs/promises' +import { gzipSync } from 'node:zlib' +import { resolve } from 'node:path' + +const root = resolve(import.meta.dirname, '..') +const example = resolve(root, 'examples/charts-react-native') +const output = resolve(root, '.bundle-output') +const cli = resolve(example, 'node_modules/.bin/react-native') +const skipBuild = process.argv.includes('--skip-build') +const forbiddenSources = [ + 'packages/charts-core/src/adapter.ts', + 'packages/charts-core/src/adapter-renderer.ts', + 'packages/charts-core/src/canvas.ts', + 'packages/charts-core/src/dom.ts', + 'packages/charts-core/src/dom-text.ts', + 'packages/charts-core/src/export.ts', + 'packages/charts-core/src/reconcile.ts', + 'packages/charts-core/src/renderer.ts', + 'packages/charts-core/src/svg-renderer.ts', + 'packages/charts-core/src/svg-resources.ts', + 'packages/charts-core/src/svg-surface.ts', + 'packages/charts-core/src/svg.ts', + 'packages/react-charts/', + 'react-dom/', +] +const variants = { + blank: 'index.blank.js', + svg: 'index.svg.js', + core: 'index.core.js', + chart: 'index.js', +} + +await mkdir(output, { recursive: true }) + +const bundles = [] +for (const platform of ['ios', 'android']) { + for (const [variant, entry] of Object.entries(variants)) { + const bundle = resolve( + output, + `react-native-${variant}.${platform}.jsbundle`, + ) + const sourceMap = resolve(output, `react-native-${variant}.${platform}.map`) + if (!skipBuild) { + await run(cli, [ + 'bundle', + '--entry-file', + entry, + '--platform', + platform, + '--dev', + 'false', + '--minify', + 'true', + '--bundle-output', + bundle, + '--sourcemap-output', + sourceMap, + '--config', + resolve(example, 'metro.config.cjs'), + ]) + } + const contents = await readFile(bundle) + const map = JSON.parse(await readFile(sourceMap, 'utf8')) + const sources = map.sources.map(normalize) + if (variant === 'chart') assertNativeBoundary(platform, sources) + bundles.push({ + platform, + variant, + bytes: contents.byteLength, + gzip: gzipSync(contents).byteLength, + modules: sources.length, + }) + } +} + +const rows = [ + '| Platform | Full chart JS delta | RNSVG-only gzip delta | Core line gzip delta | Full chart gzip delta |', +] +rows.push('| --- | ---: | ---: | ---: | ---: |') +for (const platform of ['ios', 'android']) { + const blank = bundles.find( + (bundle) => bundle.platform === platform && bundle.variant === 'blank', + ) + const chart = bundles.find( + (bundle) => bundle.platform === platform && bundle.variant === 'chart', + ) + const svg = bundles.find( + (bundle) => bundle.platform === platform && bundle.variant === 'svg', + ) + const core = bundles.find( + (bundle) => bundle.platform === platform && bundle.variant === 'core', + ) + if (!blank || !chart || !svg || !core) { + throw new Error(`Missing ${platform} bundle result`) + } + rows.push( + `| ${platform} | ${format(chart.bytes - blank.bytes)} | ${format(svg.gzip - blank.gzip)} | ${format(core.gzip - blank.gzip)} | ${format(chart.gzip - blank.gzip)} |`, + ) +} + +console.log(rows.join('\n')) +await writeFile( + resolve(output, 'react-native-poc.json'), + `${JSON.stringify( + { + schemaVersion: 1, + note: 'Metro production JS only. This excludes react-native-svg native binary code.', + bundles, + }, + null, + 2, + )}\n`, +) + +function assertNativeBoundary(platform, sources) { + const nativeSources = sources.filter((source) => + source.includes('packages/react-native-charts/src/'), + ) + if (!nativeSources.length) { + throw new Error(`${platform} bundle did not include the native host`) + } + const forbidden = sources.filter((source) => + forbiddenSources.some((candidate) => source.includes(candidate)), + ) + if (forbidden.length) { + throw new Error( + `${platform} bundle crossed the browser boundary:\n${forbidden.join('\n')}`, + ) + } +} + +function run(command, args) { + return new Promise((resolvePromise, reject) => { + const child = spawn(command, args, { + cwd: example, + stdio: 'inherit', + }) + child.on('error', reject) + child.on('exit', (code, signal) => { + if (code === 0) resolvePromise() + else { + reject( + new Error( + `${command} exited with ${signal ? `signal ${signal}` : `code ${code}`}`, + ), + ) + } + }) + }) +} + +function normalize(value) { + return value.replaceAll('\\', '/') +} + +function format(bytes) { + const sign = bytes < 0 ? '-' : '' + return `${sign}${(Math.abs(bytes) / 1024).toFixed(2)} kB` +}